use openlark_core::{
SDKResult,
api::{ApiRequest, ApiResponseTrait, ResponseFormat},
config::Config,
http::Transport,
};
use serde::{Deserialize, Serialize};
use crate::common::{api_endpoints::DriveApi, api_utils::*};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PatchCommentRequest {
pub file_token: String,
pub comment_id: String,
pub is_solved: bool,
pub file_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id_type: Option<String>,
}
impl PatchCommentRequest {
pub fn new(
file_token: impl Into<String>,
comment_id: impl Into<String>,
is_solved: bool,
file_type: impl Into<String>,
) -> Self {
Self {
file_token: file_token.into(),
comment_id: comment_id.into(),
is_solved,
file_type: file_type.into(),
user_id_type: None,
}
}
pub fn user_id_type(mut self, user_id_type: impl Into<String>) -> Self {
self.user_id_type = Some(user_id_type.into());
self
}
}
#[derive(Debug, Serialize)]
struct PatchCommentRequestBody {
is_solved: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PatchCommentResponse {}
impl ApiResponseTrait for PatchCommentResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
pub async fn patch_comment(
request: PatchCommentRequest,
config: &Config,
option: Option<openlark_core::req_option::RequestOption>,
) -> SDKResult<PatchCommentResponse> {
if request.file_token.trim().is_empty() {
return Err(openlark_core::error::validation_error(
"file_token",
"file_token 不能为空",
));
}
if request.comment_id.trim().is_empty() {
return Err(openlark_core::error::validation_error(
"comment_id",
"comment_id 不能为空",
));
}
if request.file_type.trim().is_empty() {
return Err(openlark_core::error::validation_error(
"file_type",
"file_type 不能为空",
));
}
super::validate_comment_file_type_for_list_like(&request.file_type)?;
let api_endpoint =
DriveApi::PatchComment(request.file_token.clone(), request.comment_id.clone());
let mut api_request: ApiRequest<PatchCommentResponse> =
ApiRequest::patch(&api_endpoint.to_url()).body(serialize_params(
&PatchCommentRequestBody {
is_solved: request.is_solved,
},
"解决/恢复评论",
)?);
api_request = api_request.query("file_type", &request.file_type);
if let Some(user_id_type) = &request.user_id_type {
api_request = api_request.query("user_id_type", user_id_type);
}
let response = Transport::request(api_request, config, option).await?;
extract_response_data(response, "解决/恢复评论")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_patch_comment_request_builder() {
let request = PatchCommentRequest::new("file_token", "comment_123", true, "docx");
assert_eq!(request.file_token, "file_token");
assert_eq!(request.comment_id, "comment_123");
assert!(request.is_solved);
assert_eq!(request.file_type, "docx");
}
#[test]
fn test_patch_comment_request_with_user_id_type() {
let request = PatchCommentRequest::new("file_token", "comment_123", false, "sheet")
.user_id_type("union_id");
assert_eq!(request.user_id_type, Some("union_id".to_string()));
assert!(!request.is_solved);
}
#[test]
fn test_response_trait() {
assert_eq!(PatchCommentResponse::data_format(), ResponseFormat::Data);
}
#[test]
fn test_patch_comment_response_empty() {
let response = PatchCommentResponse {};
let _ = response;
}
#[test]
fn test_patch_comment_solve_flag() {
let solve_request = PatchCommentRequest::new("file", "comment", true, "docx");
let unsolve_request = PatchCommentRequest::new("file", "comment", false, "docx");
assert!(solve_request.is_solved);
assert!(!unsolve_request.is_solved);
}
#[test]
fn test_patch_comment_file_types() {
let types = vec!["docx", "sheet", "bitable", "file"];
for file_type in types {
let request = PatchCommentRequest::new("file", "comment", true, file_type);
assert_eq!(request.file_type, file_type);
}
}
}