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, Serialize, Deserialize)]
pub struct GetFileStatisticsRequest {
pub file_token: String,
pub file_type: String,
}
impl GetFileStatisticsRequest {
pub fn new(file_token: impl Into<String>, file_type: impl Into<String>) -> Self {
Self {
file_token: file_token.into(),
file_type: file_type.into(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileStatistics {
pub uv: i32,
pub pv: i32,
pub like_count: i32,
pub timestamp: i32,
pub uv_today: i32,
pub pv_today: i32,
pub like_count_today: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetFileStatisticsResponse {
pub file_token: String,
pub file_type: String,
pub statistics: FileStatistics,
}
impl ApiResponseTrait for GetFileStatisticsResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
pub async fn get_file_statistics(
request: GetFileStatisticsRequest,
config: &Config,
option: Option<openlark_core::req_option::RequestOption>,
) -> SDKResult<GetFileStatisticsResponse> {
if request.file_token.is_empty() {
return Err(openlark_core::error::validation_error(
"file_token",
"file_token 不能为空",
));
}
if request.file_type.is_empty() {
return Err(openlark_core::error::validation_error(
"file_type",
"file_type 不能为空",
));
}
match request.file_type.as_str() {
"doc" | "sheet" | "mindnote" | "bitable" | "wiki" | "file" | "docx" => {}
_ => {
return Err(openlark_core::error::validation_error(
"file_type",
"file_type 仅支持 doc/sheet/mindnote/bitable/wiki/file/docx",
));
}
}
let url = DriveApi::GetFileStatistics(request.file_token.clone()).to_url();
let mut api_request: ApiRequest<GetFileStatisticsResponse> = ApiRequest::get(&url);
api_request = api_request.query("file_type", &request.file_type);
let response = Transport::request(api_request, config, option).await?;
extract_response_data(response, "获取文件统计信息")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_file_statistics_request_builder() {
let request = GetFileStatisticsRequest::new("file_token", "doc");
assert_eq!(request.file_token, "file_token");
assert_eq!(request.file_type, "doc");
}
#[test]
fn test_file_statistics_structure() {
let stats = FileStatistics {
uv: 10,
pv: 15,
like_count: 2,
timestamp: 1627367349,
uv_today: 1,
pv_today: 1,
like_count_today: 1,
};
assert_eq!(stats.uv, 10);
assert_eq!(stats.pv, 15);
assert_eq!(stats.like_count, 2);
}
#[test]
fn test_response_trait() {
assert_eq!(
GetFileStatisticsResponse::data_format(),
ResponseFormat::Data
);
}
#[test]
fn test_sheet_file_type() {
let request = GetFileStatisticsRequest::new("sheet_token", "sheet");
assert_eq!(request.file_type, "sheet");
}
#[test]
fn test_bitable_file_type() {
let request = GetFileStatisticsRequest::new("bitable_token", "bitable");
assert_eq!(request.file_type, "bitable");
}
#[test]
fn test_unsupported_like_count() {
let stats = FileStatistics {
uv: 100,
pv: 200,
like_count: -1, timestamp: 1627367349,
uv_today: 5,
pv_today: 10,
like_count_today: 0,
};
assert_eq!(stats.like_count, -1);
}
#[test]
fn test_today_statistics() {
let stats = FileStatistics {
uv: 100,
pv: 200,
like_count: 10,
timestamp: 1627367349,
uv_today: 5,
pv_today: 8,
like_count_today: 2,
};
assert_eq!(stats.uv_today, 5);
assert_eq!(stats.pv_today, 8);
assert_eq!(stats.like_count_today, 2);
}
}