//! Shared model types for the admin UI. //! //! These are client-side DTOs (Data Transfer Objects) for API responses. //! They are separate from the database models in `chattyness_db`. use serde::{Deserialize, Serialize}; use uuid::Uuid; // ============================================================================= // User Models // ============================================================================= /// User summary for list display. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct UserSummary { pub id: String, pub username: String, pub display_name: String, pub email: Option, pub status: String, pub created_at: String, } /// User detail from API. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct UserDetail { pub id: String, pub username: String, pub display_name: String, pub email: Option, pub status: String, pub server_role: Option, pub created_at: String, pub updated_at: String, } /// Response for user creation. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct CreateUserResponse { pub id: String, pub username: String, pub temporary_password: String, } /// Response for password reset. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct PasswordResetResponse { pub user_id: String, pub temporary_password: String, } // ============================================================================= // Staff Models // ============================================================================= /// Staff member for list display. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct StaffMemberSummary { pub user_id: String, pub username: String, pub display_name: String, pub email: Option, pub role: String, pub appointed_at: String, } // ============================================================================= // Realm Models // ============================================================================= /// Realm summary for list display. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct RealmSummary { pub id: String, pub slug: String, pub name: String, pub tagline: Option, pub privacy: String, pub is_nsfw: bool, pub owner_id: String, pub owner_username: String, pub member_count: i64, pub current_user_count: i64, pub created_at: String, } /// Realm detail from API. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct RealmDetail { pub id: String, pub slug: String, pub name: String, pub tagline: Option, pub description: Option, pub privacy: String, pub is_nsfw: bool, pub allow_guest_access: bool, pub max_users: i32, pub theme_color: Option, pub owner_id: String, pub owner_username: String, pub owner_display_name: String, pub member_count: i64, pub current_user_count: i64, pub created_at: String, pub updated_at: String, } /// Response for realm creation. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct CreateRealmResponse { pub realm_id: String, pub slug: String, pub owner_id: String, pub owner_temporary_password: Option, } // ============================================================================= // Scene Models // ============================================================================= /// Scene summary for list display. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct SceneSummary { pub id: Uuid, pub name: String, pub slug: String, pub sort_order: i32, pub is_entry_point: bool, pub is_hidden: bool, pub background_color: Option, pub background_image_path: Option, } /// Scene detail from API. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct SceneDetail { pub id: Uuid, pub realm_id: Uuid, pub name: String, pub slug: String, pub description: Option, pub background_image_path: Option, pub background_color: Option, pub bounds_wkt: String, pub dimension_mode: String, pub sort_order: i32, pub is_entry_point: bool, pub is_hidden: bool, pub created_at: String, pub updated_at: String, } /// Response for image dimensions. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct ImageDimensionsResponse { pub width: u32, pub height: u32, } // ============================================================================= // Dashboard Models // ============================================================================= /// Dashboard stats from server. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct DashboardStats { pub total_users: i64, pub active_users: i64, pub total_realms: i64, pub online_users: i64, pub staff_count: i64, } // ============================================================================= // Server Config Models // ============================================================================= /// Server configuration from API. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct ServerConfig { pub id: String, pub name: String, pub description: Option, pub welcome_message: Option, pub max_users_per_channel: i32, pub message_rate_limit: i32, pub message_rate_window_seconds: i32, pub allow_guest_access: bool, pub allow_user_uploads: bool, pub require_email_verification: bool, pub created_at: String, pub updated_at: String, } // ============================================================================= // Common Response Types // ============================================================================= /// Generic error response from API. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct ErrorResponse { pub error: String, } /// Generic success response. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct SuccessResponse { pub success: bool, } // ============================================================================= // Prop Models // ============================================================================= /// Prop summary for list display. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct PropSummary { pub id: String, pub name: String, pub slug: String, pub asset_path: String, pub default_layer: Option, pub is_active: bool, pub created_at: String, } /// Prop detail from API. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct PropDetail { pub id: String, pub name: String, pub slug: String, pub description: Option, pub tags: Vec, pub asset_path: String, pub thumbnail_path: Option, pub default_layer: Option, /// Grid position (0-8): top row 0,1,2 / middle 3,4,5 / bottom 6,7,8 pub default_position: Option, pub is_unique: bool, pub is_transferable: bool, pub is_portable: bool, pub is_active: bool, pub available_from: Option, pub available_until: Option, pub created_at: String, pub updated_at: String, } /// Response for prop creation. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct CreatePropResponse { pub id: String, pub name: String, pub slug: String, pub asset_path: String, }