use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
pub struct SecurityConfig {
pub app_id: String,
pub app_secret: String,
pub base_url: String,
}
impl SecurityConfig {
pub fn new(app_id: impl Into<String>, app_secret: impl Into<String>) -> Self {
Self {
app_id: app_id.into(),
app_secret: app_secret.into(),
base_url: "https://open.feishu.cn".to_string(),
}
}
pub fn with_base_url(mut self, base_url: &str) -> Self {
self.base_url = base_url.to_string();
self
}
pub async fn get_app_access_token(&self) -> crate::SecurityResult<String> {
use openlark_auth::AuthTokenProvider;
use openlark_core::{
auth::{TokenProvider, TokenRequest},
config::Config,
};
let config = Config::builder()
.app_id(&self.app_id)
.app_secret(&self.app_secret)
.base_url(&self.base_url)
.build();
let token_provider = AuthTokenProvider::new(config);
let token: String = token_provider
.get_token(TokenRequest::app())
.await
.map_err(|e: openlark_core::CoreError| {
openlark_core::error::authentication_error(e.to_string())
})?;
Ok(token)
}
}
impl Default for SecurityConfig {
fn default() -> Self {
Self {
app_id: "".to_string(),
app_secret: "".to_string(),
base_url: "https://open.feishu.cn".to_string(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PageRequest {
pub page_size: Option<i32>,
pub page_token: Option<String>,
}
impl Default for PageRequest {
fn default() -> Self {
Self {
page_size: Some(20),
page_token: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PageResponse<T> {
pub has_more: bool,
pub page_token: Option<String>,
pub data: Vec<T>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiResponse<T> {
pub code: i32,
pub msg: String,
pub data: Option<T>,
}
pub type Timestamp = i64;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum Status {
Active,
Disabled,
Pending,
Deleted,
Expired,
}
pub mod acs;
pub mod common;
pub use acs::{
AccessRecord, AccessResult, DeviceBindRuleRequest, DeviceInfo, DeviceStatus, DeviceType,
FaceImageInfo, HostInfo, PermissionRuleInfo, PermissionRuleRequest, UserInfo, UserListResponse,
UserRequest, VerificationMethod, VisitorInfo, VisitorRequest, VisitorStatus,
};
pub mod security_and_compliance;
pub use security_and_compliance::{
ApplyStatus, ComplianceCheckResult, ComplianceResult, ComplianceRuleType, ComplianceStatus,
DeviceApplyRecord, DeviceApplyRecordApproveRequest, DeviceComplianceRule, DeviceRecord,
DeviceRecordRequest, DeviceRecordStatus, DeviceRecordUpdateRequest, OpenApiLog,
OpenApiLogQueryRequest,
};
pub use common::{
BatchOperationError, BatchOperationRequest, BatchOperationResponse, DeviceBase, ExtensionMap,
FileUploadResponse, GeoLocation, KeyValue, OperationResponse, PermissionBase, QueryCondition,
SortCondition, SortDirection, TimeRange, UserBase,
};
#[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");
}
}