use openlark_core::{
api::{ApiRequest, ApiResponseTrait, ResponseFormat},
config::Config,
http::Transport,
SDKResult,
};
use serde::{Deserialize, Serialize};
use crate::common::{api_endpoints::DriveApi, api_utils::*};
#[derive(Debug, Clone)]
pub struct ListFileLikesRequest {
config: Config,
pub file_token: String,
pub file_type: String,
pub page_size: Option<i32>,
pub page_token: Option<String>,
pub user_id_type: Option<String>,
}
impl ListFileLikesRequest {
pub fn new(
config: Config,
file_token: impl Into<String>,
file_type: impl Into<String>,
) -> Self {
Self {
config,
file_token: file_token.into(),
file_type: file_type.into(),
page_size: None,
page_token: None,
user_id_type: None,
}
}
pub fn page_size(mut self, page_size: i32) -> Self {
self.page_size = Some(page_size);
self
}
pub fn page_token(mut self, page_token: impl Into<String>) -> Self {
self.page_token = Some(page_token.into());
self
}
pub fn user_id_type(mut self, user_id_type: impl Into<String>) -> Self {
self.user_id_type = Some(user_id_type.into());
self
}
pub async fn execute(self) -> SDKResult<ListFileLikesResponse> {
self.execute_with_options(openlark_core::req_option::RequestOption::default())
.await
}
pub async fn execute_with_options(
self,
option: openlark_core::req_option::RequestOption,
) -> SDKResult<ListFileLikesResponse> {
if self.file_token.is_empty() {
return Err(openlark_core::error::validation_error(
"file_token",
"file_token 不能为空",
));
}
match self.file_type.as_str() {
"doc" | "docx" | "file" => {}
_ => {
return Err(openlark_core::error::validation_error(
"file_type",
"file_type 仅支持 doc/docx/file",
))
}
}
if let Some(page_size) = self.page_size {
if !(1..=50).contains(&page_size) {
return Err(openlark_core::error::validation_error(
"page_size",
"page_size 必须在 1~50 之间",
));
}
}
let api_endpoint = DriveApi::ListFileLikes(self.file_token);
let request = ApiRequest::<ListFileLikesResponse>::get(&api_endpoint.to_url())
.query("file_type", self.file_type)
.query_opt("page_size", self.page_size.map(|v| v.to_string()))
.query_opt("page_token", self.page_token)
.query_opt("user_id_type", self.user_id_type);
let response = Transport::request(request, &self.config, Some(option)).await?;
extract_response_data(response, "列表")
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileLike {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_liked_time: Option<String>,
pub user_name: Option<String>,
pub user_en_name: Option<String>,
pub user_avatar_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_is_desensitized: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListFileLikesResponse {
#[serde(default)]
pub items: Vec<FileLike>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
pub has_more: bool,
}
impl ApiResponseTrait for ListFileLikesResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_list_file_likes_request_builder() {
let config = Config::default();
let request = ListFileLikesRequest::new(config, "file_token", "docx")
.page_size(20)
.page_token("next_page_token")
.user_id_type("open_id");
assert_eq!(request.file_token, "file_token");
assert_eq!(request.file_type, "docx");
assert_eq!(request.page_size, Some(20));
assert_eq!(request.page_token, Some("next_page_token".to_string()));
assert_eq!(request.user_id_type, Some("open_id".to_string()));
}
#[test]
fn test_like_info_structure() {
let like = FileLike {
user_id: Some("ou_xxx".to_string()),
last_liked_time: Some("1690857821".to_string()),
user_name: Some("张三".to_string()),
user_en_name: Some("San Zhang".to_string()),
user_avatar_url: Some("https://foo.icon.com/xxxx".to_string()),
user_is_desensitized: Some(false),
};
assert_eq!(like.user_id.as_deref(), Some("ou_xxx"));
assert_eq!(like.last_liked_time.as_deref(), Some("1690857821"));
assert_eq!(like.user_name.as_deref(), Some("张三"));
assert_eq!(like.user_is_desensitized, Some(false));
}
#[test]
fn test_response_trait() {
assert_eq!(ListFileLikesResponse::data_format(), ResponseFormat::Data);
}
}