use openlark_core::config::Config;
use serde::{Deserialize, Serialize};
pub struct AppService {
pub config: Config,
}
impl AppService {
pub fn new(config: Config) -> Self {
Self { config }
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct App {
pub app_token: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_table_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub folder_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub create_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub update_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_deleted: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_settings: Option<AppSettings>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct AppSettings {
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CreateAppRequest {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub folder_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_settings: Option<AppSettings>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CreateAppResponse {
pub app: App,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CopyAppRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub folder_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub without_content: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CopyAppResponse {
pub app: App,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct GetAppResponse {
pub app: App,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct UpdateAppRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_settings: Option<AppSettings>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct UpdateAppResponse {
pub app: App,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DeleteAppResponse {
pub success: bool,
}
impl CreateAppRequest {
pub fn validate(&self) -> openlark_core::SDKResult<()> {
use openlark_core::validate_required;
validate_required!(self.name, "应用名称不能为空");
if self.name.len() > 100 {
return Err(openlark_core::CoreError::validation_msg(
"应用名称长度不能超过100个字符",
));
}
Ok(())
}
}
impl CopyAppRequest {
pub fn validate(&self) -> openlark_core::SDKResult<()> {
use openlark_core::validate_required;
if let Some(ref name) = self.name {
validate_required!(name, "新应用名称不能为空");
if name.len() > 100 {
return Err(openlark_core::CoreError::validation_msg(
"应用名称长度不能超过100个字符",
));
}
}
Ok(())
}
}
impl UpdateAppRequest {
pub fn validate(&self) -> openlark_core::SDKResult<()> {
use openlark_core::validate_required;
if let Some(ref name) = self.name {
validate_required!(name, "应用名称不能为空");
if name.len() > 100 {
return Err(openlark_core::CoreError::validation_msg(
"应用名称长度不能超过100个字符",
));
}
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use serde_json;
#[test]
fn test_serialization_roundtrip() {
let json = r#"{"test": "value"}"#;
assert!(serde_json::from_str::<serde_json::Value>(json).is_ok());
}
#[test]
fn test_deserialization_from_json() {
let json = r#"{"field": "data"}"#;
let value: serde_json::Value = serde_json::from_str(json).expect("JSON 反序列化失败");
assert_eq!(value["field"], "data");
}
}