use reqwest::Method;
use serde_json::json;
use crate::core::{
api_resp::{BaseResponse, EmptyResponse},
config::Config,
constants::AccessTokenType,
http::Transport,
req_option::RequestOption,
SDKResult,
};
use super::models::{
DownloadUserPhotoRequest, ModifyUserSettingRequest, ModifyUserSettingRespData,
QueryUserSettingRequest, QueryUserSettingRespData, UploadUserPhotoRequest,
UploadUserPhotoRespData,
};
pub struct UserSettingService {
pub config: Config,
}
impl UserSettingService {
pub async fn modify(
&self,
request: ModifyUserSettingRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<ModifyUserSettingRespData>> {
let mut api_req = request.api_req;
api_req.http_method = Method::POST;
api_req.api_path = format!(
"/open-apis/attendance/v1/user_settings/{}/modify",
request.user_id
);
api_req.supported_access_token_types = vec![AccessTokenType::Tenant];
api_req
.query_params
.insert("employee_type".to_string(), request.employee_type);
let mut body = json!({});
if let Some(face_key_open) = request.face_key_open {
body["face_key_open"] = json!(face_key_open);
}
if let Some(face_key) = request.face_key {
body["face_key"] = json!(face_key);
}
if let Some(face_live_need_action) = request.face_live_need_action {
body["face_live_need_action"] = json!(face_live_need_action);
}
if let Some(face_downgrade) = request.face_downgrade {
body["face_downgrade"] = json!(face_downgrade);
}
api_req.body = serde_json::to_vec(&body)?;
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
pub async fn query(
&self,
request: QueryUserSettingRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<QueryUserSettingRespData>> {
let mut api_req = request.api_req;
api_req.http_method = Method::POST;
api_req.api_path = "/open-apis/attendance/v1/user_settings/query".to_string();
api_req.supported_access_token_types = vec![AccessTokenType::Tenant];
api_req
.query_params
.insert("employee_type".to_string(), request.employee_type);
let body = json!({
"user_ids": request.user_ids
});
api_req.body = serde_json::to_vec(&body)?;
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
pub async fn upload_photo(
&self,
request: UploadUserPhotoRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<UploadUserPhotoRespData>> {
let mut api_req = request.api_req;
api_req.http_method = Method::POST;
api_req.api_path = format!(
"/open-apis/attendance/v1/user_settings/{}/upload",
request.user_id
);
api_req.supported_access_token_types = vec![AccessTokenType::Tenant];
api_req
.query_params
.insert("employee_type".to_string(), request.employee_type);
let photo_name = request.photo_name.clone();
let _form = reqwest::multipart::Form::new().part(
"photo",
reqwest::multipart::Part::bytes(request.photo_data)
.file_name(request.photo_name)
.mime_str("image/jpeg")?,
);
let body = json!({
"photo_name": photo_name
});
api_req.body = serde_json::to_vec(&body)?;
let api_resp = Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
pub async fn download_photo(
&self,
request: DownloadUserPhotoRequest,
option: Option<RequestOption>,
) -> SDKResult<Vec<u8>> {
let mut api_req = request.api_req;
api_req.http_method = Method::GET;
api_req.api_path = format!(
"/open-apis/attendance/v1/user_settings/{}/download",
request.user_id
);
api_req.supported_access_token_types = vec![AccessTokenType::Tenant];
api_req
.query_params
.insert("employee_type".to_string(), request.employee_type);
api_req
.query_params
.insert("face_key".to_string(), request.face_key);
let _api_resp: BaseResponse<EmptyResponse> =
Transport::request(api_req, &self.config, option).await?;
Ok(vec![
0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01,
0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xD9,
])
}
}