Skip to main content

u_sdk/esa/
origin_protection.rs

1use super::utils::{de_option_empty_string_as_none, parse_json_response};
2use super::{Client, Error, OPENAPI_STYLE, OPENAPI_VERSION};
3use bon::Builder;
4use serde::Deserialize;
5use std::collections::HashMap;
6use u_sdk_common::helper::into_header_map;
7use u_sdk_common::open_api_sign::{SignParams, get_openapi_request_header};
8
9impl Client {
10    pub fn get_origin_protection(&self) -> GetOriginProtectionBuilder<'_> {
11        GetOriginProtection::builder(self)
12    }
13
14    pub fn update_origin_protection_ip_white_list(
15        &self,
16    ) -> UpdateOriginProtectionIpWhiteListBuilder<'_> {
17        UpdateOriginProtectionIpWhiteList::builder(self)
18    }
19}
20
21// region GetOriginProtection request
22/// [GetOriginProtection](https://help.aliyun.com/zh/edge-security-acceleration/esa/api-esa-2024-09-10-getoriginprotection)
23#[derive(Builder)]
24pub struct GetOriginProtection<'a> {
25    #[builder(start_fn)]
26    pub(crate) client: &'a Client,
27    /// 站点 ID,可通过调用 ListSites 接口获取。
28    pub(crate) site_id: i64,
29}
30
31#[derive(Debug, Deserialize)]
32#[serde(rename_all = "PascalCase")]
33pub struct GetOriginProtectionResponse {
34    pub request_id: String,
35
36    #[serde(rename = "CurrentIPWhitelist")]
37    pub current_ip_whitelist: IpWhitelist,
38    #[serde(rename = "LatestIPWhitelist")]
39    pub latest_ip_whitelist: IpWhitelist,
40
41    #[serde(rename = "DiffIPWhitelist")]
42    pub diff_ip_whitelist: DiffIpWhitelist,
43
44    #[serde(rename = "RegionalCurrentIPWhitelist")]
45    pub regional_current_ip_whitelist: RegionalIpWhitelist,
46    #[serde(rename = "RegionalLatestIPWhitelist")]
47    pub regional_latest_ip_whitelist: RegionalIpWhitelist,
48
49    #[serde(rename = "RegionalDiffIPWhitelist")]
50    pub regional_diff_ip_whitelist: RegionalDiffIpWhitelist,
51
52    pub need_update: bool,
53    #[serde(deserialize_with = "de_option_empty_string_as_none")]
54    pub origin_protection: Option<Switch>,
55    #[serde(deserialize_with = "de_option_empty_string_as_none")]
56    pub origin_converge: Option<Switch>,
57    pub site_id: i64,
58
59    #[serde(
60        rename = "AutoConfirmIPList",
61        deserialize_with = "de_option_empty_string_as_none"
62    )]
63    pub auto_confirm_ip_list: Option<Switch>,
64}
65
66#[derive(Debug, Deserialize, Default)]
67pub struct IpWhitelist {
68    #[serde(rename = "IPv4", default)]
69    pub ipv4: Vec<String>,
70    #[serde(rename = "IPv6", default)]
71    pub ipv6: Vec<String>,
72}
73
74#[derive(Debug, Deserialize)]
75pub struct DiffIpWhitelist {
76    #[serde(rename = "AddedIPWhitelist", default)]
77    // 会出现 `"AddedIPWhitelist": {}` 的情况,所以加上 default
78    pub added_ip_whitelist: IpWhitelist,
79    // 注意看,这里rename为xxx_Ip_xxx
80    #[serde(rename = "NoChangeIpWhitelist", default)]
81    pub no_change_ip_whitelist: IpWhitelist,
82    #[serde(rename = "RemovedIPWhitelist", default)]
83    pub removed_ip_whitelist: IpWhitelist,
84}
85
86#[derive(Debug, Deserialize)]
87pub struct RegionalIpWhitelist {
88    #[serde(rename = "RegionalIPv4", default)]
89    pub regional_ipv4: Vec<RegionalCidr>,
90    #[serde(rename = "RegionalIPv6", default)]
91    pub regional_ipv6: Vec<RegionalCidr>,
92}
93
94#[derive(Debug, Deserialize)]
95#[serde(rename_all = "PascalCase")]
96pub struct RegionalCidr {
97    pub cidr: String,
98    pub region: String,
99}
100
101#[derive(Debug, Deserialize)]
102pub struct RegionalDiffIpWhitelist {
103    #[serde(rename = "AddedIPRegionWhitelist")]
104    pub added_ip_region_whitelist: RegionalIpWhitelist,
105    #[serde(rename = "NoChangeIpWhitelist")]
106    pub no_change_ip_whitelist: RegionalIpWhitelist,
107    #[serde(rename = "RemovedIPRegionWhitelist")]
108    pub removed_ip_region_whitelist: RegionalIpWhitelist,
109}
110
111#[derive(Debug, Deserialize, PartialEq, Eq, Clone, Copy)]
112#[serde(rename_all = "lowercase")]
113pub enum Switch {
114    On,
115    Off,
116}
117// endregion
118
119impl GetOriginProtection<'_> {
120    pub async fn send(&self) -> Result<GetOriginProtectionResponse, Error> {
121        let client = self.client;
122        let creds = client.credentials_provider.load().await?;
123
124        let sign_params = SignParams {
125            req_method: "GET",
126            host: &client.host,
127            query_map: HashMap::from([("SiteId", self.site_id.to_string())]),
128            x_acs_action: "GetOriginProtection",
129            x_acs_version: OPENAPI_VERSION,
130            x_acs_security_token: creds.sts_security_token.as_deref(),
131            request_body: None,
132            style: &OPENAPI_STYLE,
133        };
134
135        let (common_headers, url_) =
136            get_openapi_request_header(&creds.access_key_secret, &creds.access_key_id, sign_params)
137                .map_err(|e| {
138                    Error::Common(format!("failed to get openapi request header: {}", e))
139                })?;
140        let header_map = into_header_map(common_headers);
141
142        let resp = client
143            .http_client
144            .get(url_)
145            .headers(header_map)
146            .send()
147            .await?;
148
149        let data = parse_json_response(resp).await?;
150        Ok(data)
151    }
152}
153
154/// [UpdateOriginProtectionIpWhiteList](https://help.aliyun.com/zh/edge-security-acceleration/esa/api-esa-2024-09-10-updateoriginprotectionipwhitelist)
155#[derive(Builder)]
156pub struct UpdateOriginProtectionIpWhiteList<'a> {
157    #[builder(start_fn)]
158    pub(crate) client: &'a Client,
159    /// 站点 ID,可通过调用 ListSites 接口获取。
160    pub(crate) site_id: i64,
161}
162
163#[derive(Debug, Deserialize)]
164#[serde(rename_all = "PascalCase")]
165pub struct UpdateOriginProtectionIpWhiteListResponse {
166    pub request_id: String,
167}
168
169impl UpdateOriginProtectionIpWhiteList<'_> {
170    pub async fn send(&self) -> Result<UpdateOriginProtectionIpWhiteListResponse, Error> {
171        let client = self.client;
172        let creds = client.credentials_provider.load().await?;
173
174        let sign_params = SignParams {
175            req_method: "POST",
176            host: &client.host,
177            query_map: HashMap::from([("SiteId", self.site_id.to_string())]),
178            x_acs_action: "UpdateOriginProtectionIpWhiteList",
179            x_acs_version: OPENAPI_VERSION,
180            x_acs_security_token: creds.sts_security_token.as_deref(),
181            request_body: None,
182            style: &OPENAPI_STYLE,
183        };
184
185        let (common_headers, url_) =
186            get_openapi_request_header(&creds.access_key_secret, &creds.access_key_id, sign_params)
187                .map_err(|e| {
188                    Error::Common(format!("failed to get openapi request header: {}", e))
189                })?;
190        let header_map = into_header_map(common_headers);
191
192        let resp = client
193            .http_client
194            .post(url_)
195            .headers(header_map)
196            .send()
197            .await?;
198
199        let data = parse_json_response(resp).await?;
200        Ok(data)
201    }
202}