use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::{
core::{
api_req::ApiRequest,
api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
config::Config,
constants::AccessTokenType,
endpoints::{EndpointBuilder, Endpoints},
http::Transport,
req_option::RequestOption,
trait_system::Service,
SDKResult,
},
service::okr::models::{ProgressAttachment, ProgressRecord, ProgressRecordType},
};
pub struct ProgressRecordService {
pub config: Config,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ProgressRecordCreateResponse {
pub progress_record: ProgressRecord,
}
impl ApiResponseTrait for ProgressRecordCreateResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ProgressRecordDeleteResponse {
pub success: bool,
}
impl ApiResponseTrait for ProgressRecordDeleteResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ProgressRecordUpdateResponse {
pub progress_record: ProgressRecord,
}
impl ApiResponseTrait for ProgressRecordUpdateResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ProgressRecordGetResponse {
pub progress_record: ProgressRecord,
}
impl ApiResponseTrait for ProgressRecordGetResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ImageUploadResponse {
pub attachment: ProgressAttachment,
}
impl ApiResponseTrait for ImageUploadResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl ProgressRecordService {
pub fn new(config: Config) -> Self {
Self { config }
}
pub async fn create_progress_record(
&self,
request: ProgressRecordCreateRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<ProgressRecordCreateResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: Endpoints::OKR_V1_PROGRESS_RECORDS.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn delete_progress_record(
&self,
progress_id: &str,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<ProgressRecordDeleteResponse>> {
let api_req = ApiRequest {
http_method: Method::DELETE,
api_path: EndpointBuilder::replace_param(
Endpoints::OKR_V1_PROGRESS_RECORD_OPERATION,
"progress_id",
progress_id,
),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: vec![],
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn update_progress_record(
&self,
progress_id: &str,
request: ProgressRecordUpdateRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<ProgressRecordUpdateResponse>> {
let api_req = ApiRequest {
http_method: Method::PUT,
api_path: EndpointBuilder::replace_param(
Endpoints::OKR_V1_PROGRESS_RECORD_OPERATION,
"progress_id",
progress_id,
),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn get_progress_record(
&self,
progress_id: &str,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<ProgressRecordGetResponse>> {
let api_req = ApiRequest {
http_method: Method::GET,
api_path: EndpointBuilder::replace_param(
Endpoints::OKR_V1_PROGRESS_RECORD_OPERATION,
"progress_id",
progress_id,
),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: vec![],
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn upload_progress_image(
&self,
request: ImageUploadRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<ImageUploadResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: Endpoints::OKR_V1_PROGRESS_RECORDS_UPLOAD.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
}
impl Service for ProgressRecordService {
fn config(&self) -> &Config {
&self.config
}
fn service_name() -> &'static str {
"progress_record"
}
fn service_version() -> &'static str {
"v1"
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProgressRecordCreateRequest {
pub okr_id: String,
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub record_type: Option<ProgressRecordType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub progress_rate: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachment_ids: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProgressRecordUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub progress_rate: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachment_ids: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImageUploadRequest {
pub file_name: String,
pub file_content: String,
pub file_type: String,
}