use anyhow::anyhow; use app_error::AppError; use chrono::{DateTime, Utc}; use database_entity::dto::{AFAccessLevel, AFRole, AFUserProfile, AFWorkspace}; use serde::{Deserialize, Serialize}; use sqlx::FromRow; use uuid::Uuid; /// Represent the row of the af_workspace table #[derive(Debug, Clone, FromRow, Serialize, Deserialize)] pub struct AFWorkspaceRow { pub workspace_id: Uuid, pub database_storage_id: Option, pub owner_uid: Option, pub created_at: Option>, pub workspace_type: i32, pub deleted_at: Option>, pub workspace_name: Option, pub icon: Option, } impl TryFrom for AFWorkspace { type Error = AppError; fn try_from(value: AFWorkspaceRow) -> Result { let owner_uid = value .owner_uid .ok_or(AppError::Internal(anyhow!("Unexpected empty owner_uid")))?; let database_storage_id = value .database_storage_id .ok_or(AppError::Internal(anyhow!("Unexpected empty workspace_id")))?; let workspace_name = value.workspace_name.unwrap_or_default(); let created_at = value.created_at.unwrap_or_else(Utc::now); let icon = value.icon.unwrap_or_default(); Ok(Self { workspace_id: value.workspace_id, database_storage_id, owner_uid, workspace_type: value.workspace_type, workspace_name, created_at, icon, }) } } /// Represent the row of the af_user table #[derive(Debug, FromRow, Deserialize, Serialize, Clone)] pub struct AFUserRow { pub uid: i64, pub uuid: Option, pub email: Option, pub password: Option, pub name: Option, pub metadata: Option, pub encryption_sign: Option, pub deleted_at: Option>, pub updated_at: Option>, pub created_at: Option>, } #[derive(Debug, FromRow)] pub struct AFUserIdRow { pub uid: i64, pub uuid: Uuid, } /// Represent the row of the af_user_profile_view #[derive(Debug, FromRow, Deserialize, Serialize)] pub struct AFUserProfileRow { pub uid: Option, pub uuid: Option, pub email: Option, pub password: Option, pub name: Option, pub metadata: Option, pub encryption_sign: Option, pub deleted_at: Option>, pub updated_at: Option>, pub created_at: Option>, pub latest_workspace_id: Option, } impl TryFrom for AFUserProfile { type Error = AppError; fn try_from(value: AFUserProfileRow) -> Result { let uid = value .uid .ok_or(AppError::Internal(anyhow!("Unexpected empty uid")))?; let uuid = value .uuid .ok_or(AppError::Internal(anyhow!("Unexpected empty uuid")))?; let latest_workspace_id = value.latest_workspace_id.ok_or(AppError::Internal(anyhow!( "Unexpected empty latest_workspace_id" )))?; Ok(Self { uid, uuid, email: value.email, password: value.password, name: value.name, metadata: value.metadata, encryption_sign: value.encryption_sign, latest_workspace_id, updated_at: value.updated_at.map(|v| v.timestamp()).unwrap_or(0), }) } } #[derive(FromRow, Serialize, Deserialize)] pub struct AFWorkspaceMemberPermRow { pub uid: i64, pub role: AFRole, pub workspace_id: Uuid, } #[derive(Debug, FromRow, Serialize, Deserialize)] pub struct AFWorkspaceMemberRow { pub uid: i64, pub name: String, pub email: String, pub role: AFRole, } #[derive(FromRow)] pub struct AFCollabMemberAccessLevelRow { pub uid: i64, pub oid: String, pub access_level: AFAccessLevel, } #[derive(FromRow, Clone, Debug, Serialize, Deserialize)] pub struct AFCollabMemberRow { pub uid: i64, pub oid: String, pub permission_id: i64, } #[derive(Debug, FromRow, Serialize, Deserialize)] pub struct AFBlobMetadataRow { pub workspace_id: Uuid, pub file_id: String, pub file_type: String, pub file_size: i64, pub modified_at: DateTime, } #[derive(Debug, Deserialize, Serialize, Clone)] pub struct AFUserNotification { pub payload: Option, } #[derive(FromRow, Debug, Clone)] pub struct AFPermissionRow { pub id: i32, pub name: String, pub access_level: AFAccessLevel, pub description: Option, } #[derive(FromRow, Serialize, Deserialize)] pub struct AFSnapshotRow { pub sid: i64, pub oid: String, pub blob: Vec, pub len: Option, pub encrypt: Option, pub deleted_at: Option>, pub created_at: DateTime, pub workspace_id: Uuid, }