use crate::error::GoogleResponse;
use crate::resources::common::ListResponse;
pub use crate::resources::common::{Entity, ProjectTeam, Role};
#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ObjectAccessControl {
pub kind: String,
pub id: String,
pub self_link: String,
pub bucket: String,
pub object: String,
pub generation: Option<String>,
pub entity: Entity,
pub role: Role,
pub email: Option<String>,
pub entity_id: Option<String>,
pub domain: Option<String>,
pub project_team: Option<ProjectTeam>,
pub etag: String,
}
#[derive(Debug, PartialEq, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct NewObjectAccessControl {
pub entity: Entity,
pub role: Role,
}
#[allow(unused)]
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
struct ObjectAccessControlList {
kind: String,
items: Vec<ObjectAccessControl>,
}
impl ObjectAccessControl {
pub fn create(
bucket: &str,
object: &str,
new_object_access_control: &NewObjectAccessControl,
) -> Result<Self, crate::Error> {
let url = format!("{}/b/{}/o/{}/acl", crate::BASE_URL, bucket, object);
let client = reqwest::blocking::Client::new();
let result: GoogleResponse<Self> = client
.post(&url)
.headers(crate::get_headers()?)
.json(new_object_access_control)
.send()?
.json()?;
Ok(result?)
}
pub fn list(bucket: &str, object: &str) -> Result<Vec<Self>, crate::Error> {
let url = format!("{}/b/{}/o/{}/acl", crate::BASE_URL, bucket, object);
let client = reqwest::blocking::Client::new();
let result: GoogleResponse<ListResponse<Self>> = client
.get(&url)
.headers(crate::get_headers()?)
.send()?
.json()?;
Ok(result?.items)
}
pub fn read(bucket: &str, object: &str, entity: &Entity) -> Result<Self, crate::Error> {
let url = format!(
"{}/b/{}/o/{}/acl/{}",
crate::BASE_URL,
bucket,
object,
entity
);
let client = reqwest::blocking::Client::new();
let result: GoogleResponse<Self> = client
.get(&url)
.headers(crate::get_headers()?)
.send()?
.json()?;
Ok(result?)
}
pub fn update(&self) -> Result<Self, crate::Error> {
let url = format!(
"{}/b/{}/o/{}/acl/{}",
crate::BASE_URL,
self.bucket,
self.object,
self.entity,
);
let client = reqwest::blocking::Client::new();
let result: GoogleResponse<Self> = client
.put(&url)
.headers(crate::get_headers()?)
.json(self)
.send()?
.json()?;
Ok(result?)
}
pub fn delete(self) -> Result<(), crate::Error> {
let url = format!(
"{}/b/{}/o/{}/acl/{}",
crate::BASE_URL,
self.bucket,
self.object,
self.entity,
);
let client = reqwest::blocking::Client::new();
let response = client.delete(&url).headers(crate::get_headers()?).send()?;
if response.status().is_success() {
Ok(())
} else {
Err(crate::Error::Google(response.json()?))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Object;
#[test]
fn create() {
let bucket = crate::read_test_bucket();
Object::create(
&bucket.name,
&[0, 1],
"test-object-access-controls-create",
"text/plain",
)
.unwrap();
let new_bucket_access_control = NewObjectAccessControl {
entity: Entity::AllUsers,
role: Role::Reader,
};
ObjectAccessControl::create(
&bucket.name,
"test-object-access-controls-create",
&new_bucket_access_control,
)
.unwrap();
}
#[test]
fn list() {
let bucket = crate::read_test_bucket();
Object::create(
&bucket.name,
&[0, 1],
"test-object-access-controls-list",
"text/plain",
)
.unwrap();
ObjectAccessControl::list(&bucket.name, "test-object-access-controls-list").unwrap();
}
#[test]
fn read() {
let bucket = crate::read_test_bucket();
Object::create(
&bucket.name,
&[0, 1],
"test-object-access-controls-read",
"text/plain",
)
.unwrap();
let new_bucket_access_control = NewObjectAccessControl {
entity: Entity::AllUsers,
role: Role::Reader,
};
ObjectAccessControl::create(
&bucket.name,
"test-object-access-controls-read",
&new_bucket_access_control,
)
.unwrap();
ObjectAccessControl::read(
&bucket.name,
"test-object-access-controls-read",
&Entity::AllUsers,
)
.unwrap();
}
#[test]
fn update() {
let bucket = dbg!(crate::create_test_bucket(
"test-object-access-controls-update"
));
let new_bucket_access_control = NewObjectAccessControl {
entity: Entity::AllUsers,
role: Role::Reader,
};
let object = dbg!(Object::create(
&bucket.name,
&[0, 1],
"test-update",
"text/plain"
))
.unwrap();
dbg!(ObjectAccessControl::create(
&bucket.name,
"test-update",
&new_bucket_access_control
))
.unwrap();
let mut acl = dbg!(ObjectAccessControl::read(
&bucket.name,
"test-update",
&Entity::AllUsers
))
.unwrap();
acl.entity = Entity::AllAuthenticatedUsers;
dbg!(acl.update()).unwrap();
dbg!(object.delete()).unwrap();
dbg!(bucket.delete()).unwrap();
}
#[test]
fn delete() {
let bucket = crate::create_test_bucket("test-object-access-controls-delete");
let new_bucket_access_control = NewObjectAccessControl {
entity: Entity::AllUsers,
role: Role::Reader,
};
let object = Object::create(&bucket.name, &[0, 1], "test-delete", "text/plain").unwrap();
ObjectAccessControl::create(&bucket.name, "test-delete", &new_bucket_access_control)
.unwrap();
let acl =
ObjectAccessControl::read(&bucket.name, "test-delete", &Entity::AllUsers).unwrap();
acl.delete().unwrap();
object.delete().unwrap();
bucket.delete().unwrap();
}
}