use crate::domain::entities::user::User; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use utoipa::ToSchema; use uuid::Uuid; #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct UserDto { pub id: String, pub username: String, pub email: String, pub role: String, pub storage_quota_bytes: i64, pub storage_used_bytes: i64, pub created_at: DateTime, pub updated_at: DateTime, pub last_login_at: Option>, pub active: bool, pub auth_provider: String, pub image: Option, pub can_edit_image: bool, /// `true` for grant-only external recipients (magic-link, OIDC-only, /// future OCM federated). External users have no home folder and /// can't own storage; their quota is always 0. Internal users /// default to `false`. pub is_external: bool, } impl From for UserDto { fn from(user: User) -> Self { Self { id: user.id().to_string(), username: user.username().to_string(), email: user.email().to_string(), role: format!("{}", user.role()), storage_quota_bytes: user.storage_quota_bytes(), storage_used_bytes: user.storage_used_bytes(), created_at: user.created_at(), updated_at: user.updated_at(), last_login_at: user.last_login_at(), active: user.is_active(), auth_provider: user.oidc_provider().unwrap_or("local").to_string(), image: user.image().map(|s| s.to_string()), can_edit_image: !user.is_oidc_user(), is_external: user.is_external(), } } } #[derive(Debug, Serialize, Deserialize, Clone, ToSchema)] pub struct LoginDto { pub username: String, pub password: String, } #[derive(Debug, Serialize, Deserialize, Clone, ToSchema)] pub struct RegisterDto { pub username: String, pub email: String, pub password: String, } /// DTO for the one-time initial admin setup endpoint (`/api/setup`). /// Available only when the system is not yet initialized (no admin exists). #[derive(Debug, Serialize, Deserialize, Clone, ToSchema)] pub struct SetupAdminDto { pub username: String, pub email: String, pub password: String, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct AuthResponseDto { pub user: UserDto, pub access_token: String, pub refresh_token: String, pub token_type: String, pub expires_in: i64, } #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct ChangePasswordDto { pub current_password: String, pub new_password: String, } #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct RefreshTokenDto { pub refresh_token: String, } /// Authenticated current user data (for use in application services) #[derive(Clone, Debug, Serialize, Deserialize, ToSchema)] pub struct CurrentUser { pub id: Uuid, pub username: String, pub email: String, pub role: String, } // ============================================================================ // App Password DTOs // ============================================================================ #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct CreateAppPasswordDto { pub label: String, } #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct AppPasswordCreatedDto { pub id: String, pub label: String, pub password: String, } #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct AppPasswordDto { pub id: String, pub label: String, pub created_at: DateTime, pub last_used_at: Option>, } // ============================================================================ // OIDC DTOs // ============================================================================ /// Response with the OIDC authorization URL for client redirect #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct OidcAuthorizeResponseDto { pub authorize_url: String, pub state: String, } /// Query parameters received on the OIDC callback #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct OidcCallbackQueryDto { pub code: String, pub state: String, } /// Request body for the OIDC one-time code exchange endpoint #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct OidcExchangeDto { pub code: String, } /// Information about available OIDC providers #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct OidcProviderInfoDto { pub enabled: bool, pub provider_name: String, pub authorize_endpoint: String, pub password_login_enabled: bool, } /// Claims extracted from the validated OIDC ID token #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct OidcUserInfoDto { pub sub: String, pub preferred_username: Option, pub email: Option, pub name: Option, pub groups: Vec, }