#![allow(unused_imports)]
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 async fn create(
bucket: &str,
object: &str,
new_object_access_control: &NewObjectAccessControl,
) -> crate::Result<Self> {
let url = format!("{}/b/{}/o/{}/acl", crate::BASE_URL, bucket, object);
let result: GoogleResponse<Self> = reqwest::Client::new()
.post(&url)
.headers(crate::get_headers().await?)
.json(new_object_access_control)
.send()
.await?
.json()
.await?;
match result {
GoogleResponse::Success(s) => Ok(s),
GoogleResponse::Error(e) => Err(e.into()),
}
}
#[cfg(feature = "sync")]
#[tokio::main]
pub async fn create_sync(
bucket: &str,
object: &str,
new_object_access_control: &NewObjectAccessControl,
) -> crate::Result<Self> {
Self::create(bucket, object, new_object_access_control).await
}
pub async fn list(bucket: &str, object: &str) -> crate::Result<Vec<Self>> {
let url = format!("{}/b/{}/o/{}/acl", crate::BASE_URL, bucket, object);
let result: GoogleResponse<ListResponse<Self>> = reqwest::Client::new()
.get(&url)
.headers(crate::get_headers().await?)
.send()
.await?
.json()
.await?;
match result {
GoogleResponse::Success(s) => Ok(s.items),
GoogleResponse::Error(e) => Err(e.into()),
}
}
#[cfg(feature = "sync")]
#[tokio::main]
pub async fn list_sync(bucket: &str, object: &str) -> crate::Result<Vec<Self>> {
Self::list(bucket, object).await
}
pub async fn read(bucket: &str, object: &str, entity: &Entity) -> crate::Result<Self> {
let url = format!(
"{}/b/{}/o/{}/acl/{}",
crate::BASE_URL,
bucket,
object,
entity
);
let result: GoogleResponse<Self> = reqwest::Client::new()
.get(&url)
.headers(crate::get_headers().await?)
.send()
.await?
.json()
.await?;
match result {
GoogleResponse::Success(s) => Ok(s),
GoogleResponse::Error(e) => Err(e.into()),
}
}
#[cfg(feature = "sync")]
#[tokio::main]
pub async fn read_sync(bucket: &str, object: &str, entity: &Entity) -> crate::Result<Self> {
Self::read(bucket, object, entity).await
}
pub async fn update(&self) -> crate::Result<Self> {
let url = format!(
"{}/b/{}/o/{}/acl/{}",
crate::BASE_URL,
self.bucket,
self.object,
self.entity,
);
let result: GoogleResponse<Self> = reqwest::Client::new()
.put(&url)
.headers(crate::get_headers().await?)
.json(self)
.send()
.await?
.json()
.await?;
match result {
GoogleResponse::Success(s) => Ok(s),
GoogleResponse::Error(e) => Err(e.into()),
}
}
#[cfg(feature = "sync")]
#[tokio::main]
pub async fn update_sync(&self) -> crate::Result<Self> {
self.update().await
}
pub async fn delete(self) -> crate::Result<()> {
let url = format!(
"{}/b/{}/o/{}/acl/{}",
crate::BASE_URL,
self.bucket,
self.object,
self.entity,
);
let response = reqwest::Client::new()
.delete(&url)
.headers(crate::get_headers().await?)
.send()
.await?;
if response.status().is_success() {
Ok(())
} else {
Err(crate::Error::Google(response.json().await?))
}
}
#[cfg(feature = "sync")]
#[tokio::main]
pub async fn delete_sync(self) -> crate::Result<()> {
self.delete().await
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Object;
#[tokio::test]
async fn create() {
let bucket = crate::read_test_bucket().await;
Object::create(
&bucket.name,
&[0, 1],
"test-object-access-controls-create",
"text/plain",
)
.await
.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,
)
.await
.unwrap();
}
#[tokio::test]
async fn list() {
let bucket = crate::read_test_bucket().await;
Object::create(
&bucket.name,
&[0, 1],
"test-object-access-controls-list",
"text/plain",
)
.await
.unwrap();
ObjectAccessControl::list(&bucket.name, "test-object-access-controls-list")
.await
.unwrap();
}
#[tokio::test]
async fn read() {
let bucket = crate::read_test_bucket().await;
Object::create(
&bucket.name,
&[0, 1],
"test-object-access-controls-read",
"text/plain",
)
.await
.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,
)
.await
.unwrap();
ObjectAccessControl::read(
&bucket.name,
"test-object-access-controls-read",
&Entity::AllUsers,
)
.await
.unwrap();
}
#[tokio::test]
async fn update() {
let bucket = crate::create_test_bucket("test-object-access-controls-update").await;
let new_bucket_access_control = NewObjectAccessControl {
entity: Entity::AllUsers,
role: Role::Reader,
};
Object::create(&bucket.name, &[0, 1], "test-update", "text/plain")
.await
.unwrap();
ObjectAccessControl::create(&bucket.name, "test-update", &new_bucket_access_control)
.await
.unwrap();
let mut acl = ObjectAccessControl::read(&bucket.name, "test-update", &Entity::AllUsers)
.await
.unwrap();
acl.entity = Entity::AllAuthenticatedUsers;
acl.update().await.unwrap();
Object::delete(&bucket.name, "test-update").await.unwrap();
bucket.delete().await.unwrap();
}
#[tokio::test]
async fn delete() {
let bucket = crate::create_test_bucket("test-object-access-controls-delete").await;
let new_bucket_access_control = NewObjectAccessControl {
entity: Entity::AllUsers,
role: Role::Reader,
};
Object::create(&bucket.name, &[0, 1], "test-delete", "text/plain")
.await
.unwrap();
ObjectAccessControl::create(&bucket.name, "test-delete", &new_bucket_access_control)
.await
.unwrap();
let acl = ObjectAccessControl::read(&bucket.name, "test-delete", &Entity::AllUsers)
.await
.unwrap();
acl.delete().await.unwrap();
Object::delete(&bucket.name, "test-delete").await.unwrap();
bucket.delete().await.unwrap();
}
#[cfg(feature = "sync")]
mod sync {
use super::*;
#[test]
fn create() {
let bucket = crate::read_test_bucket_sync();
Object::create_sync(
&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_sync(
&bucket.name,
"test-object-access-controls-create",
&new_bucket_access_control,
)
.unwrap();
}
#[test]
fn list() {
let bucket = crate::read_test_bucket_sync();
Object::create_sync(
&bucket.name,
&[0, 1],
"test-object-access-controls-list",
"text/plain",
)
.unwrap();
ObjectAccessControl::list_sync(&bucket.name, "test-object-access-controls-list")
.unwrap();
}
#[test]
fn read() {
let bucket = crate::read_test_bucket_sync();
Object::create_sync(
&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_sync(
&bucket.name,
"test-object-access-controls-read",
&new_bucket_access_control,
)
.unwrap();
ObjectAccessControl::read_sync(
&bucket.name,
"test-object-access-controls-read",
&Entity::AllUsers,
)
.unwrap();
}
#[test]
fn update() {
let bucket = crate::create_test_bucket_sync("test-object-access-controls-update");
let new_bucket_access_control = NewObjectAccessControl {
entity: Entity::AllUsers,
role: Role::Reader,
};
Object::create_sync(&bucket.name, &[0, 1], "test-update", "text/plain").unwrap();
ObjectAccessControl::create_sync(
&bucket.name,
"test-update",
&new_bucket_access_control,
)
.unwrap();
let mut acl =
ObjectAccessControl::read_sync(&bucket.name, "test-update", &Entity::AllUsers)
.unwrap();
acl.entity = Entity::AllAuthenticatedUsers;
acl.update_sync().unwrap();
Object::delete_sync(&bucket.name, "test-update").unwrap();
bucket.delete_sync().unwrap();
}
#[test]
fn delete() {
let bucket = crate::create_test_bucket_sync("test-object-access-controls-delete");
let new_bucket_access_control = NewObjectAccessControl {
entity: Entity::AllUsers,
role: Role::Reader,
};
Object::create_sync(&bucket.name, &[0, 1], "test-delete", "text/plain").unwrap();
ObjectAccessControl::create_sync(
&bucket.name,
"test-delete",
&new_bucket_access_control,
)
.unwrap();
let acl =
ObjectAccessControl::read_sync(&bucket.name, "test-delete", &Entity::AllUsers)
.unwrap();
acl.delete_sync().unwrap();
Object::delete_sync(&bucket.name, "test-delete").unwrap();
bucket.delete_sync().unwrap();
}
}
}