1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use crate::oss::{
    self,
    api::{self, insert_custom_header, ApiResponseFrom},
    entities::{acl::AccessControlPolicy, OssAcl},
    http,
};

#[derive(Debug)]
pub struct PutBucketAclBuilder<'a> {
    client: &'a oss::Client<'a>,
    acl: OssAcl,
}

#[allow(unused)]
impl<'a> PutBucketAclBuilder<'a> {
    pub fn new(client: &'a oss::Client, acl: OssAcl) -> Self {
        Self { client, acl }
    }

    pub async fn execute(&self) -> api::ApiResult<()> {
        let res = format!("/{}/?{}", self.client.bucket(), "acl");
        let url = { format!("{}/?{}", self.client.base_url(), "acl") };

        let mut headers = http::HeaderMap::new();
        insert_custom_header(&mut headers, "x-oss-acl", self.acl.to_string());

        let resp = self
            .client
            .request
            .task()
            .with_url(&url)
            .with_method(http::Method::PUT)
            .with_headers(headers)
            .with_resource(&res)
            .execute_timeout(self.client.timeout())
            .await?;

        Ok(ApiResponseFrom(resp).to_empty().await)
    }
}

pub struct GetBucketAclBuilder<'a> {
    client: &'a oss::Client<'a>,
}

impl<'a> GetBucketAclBuilder<'a> {
    pub(crate) fn new(client: &'a oss::Client) -> Self {
        Self { client }
    }

    pub async fn execute(&self) -> api::ApiResult<AccessControlPolicy> {
        let res = format!("/{}/?{}", self.client.bucket(), "acl");
        let url = format!("{}/?{}", self.client.base_url(), "acl");

        let resp = self
            .client
            .request
            .task()
            .with_url(&url)
            .with_resource(&res)
            .execute_timeout(self.client.timeout())
            .await?;
        Ok(ApiResponseFrom(resp).to_type().await)
    }
}

/// # 权限控制`ACL``
#[allow(non_snake_case)]
impl<'a> oss::Client<'a> {
    /// PutBucketAcl接口用于设置或修改存储空间`Bucket`的访问权限`ACL`。
    ///
    /// - [official docs](https://help.aliyun.com/zh/oss/developer-reference/putbucketacl)
    /// - [xtoss example](https://github.com/isme-sun/xt_oss/blob/main/examples/api_bucket_acl_put.rs)
    pub fn PutBucketAcl(&self, acl: OssAcl) -> PutBucketAclBuilder {
        PutBucketAclBuilder::new(self, acl)
    }

    /// GetBucketAcl接口用于获取某个存储空间`Bucket`的访问权限`ACL`。
    /// 只有Bucket的拥有者才能获取Bucket的访问权限。
    ///
    /// - [official docs](https://help.aliyun.com/zh/oss/developer-reference/getbucketacl)
    /// - [xtoss example](https://github.com/isme-sun/xt_oss/blob/main/examples/api_bucket_acl_get.rs)
    pub fn GetBucketAcl(&self) -> GetBucketAclBuilder {
        GetBucketAclBuilder::new(&self)
    }
}