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#[derive(Builder)]
24pub struct GetOriginProtection<'a> {
25 #[builder(start_fn)]
26 pub(crate) client: &'a Client,
27 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 pub added_ip_whitelist: IpWhitelist,
79 #[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}
117impl 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#[derive(Builder)]
156pub struct UpdateOriginProtectionIpWhiteList<'a> {
157 #[builder(start_fn)]
158 pub(crate) client: &'a Client,
159 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}