use serde::{Deserialize, Serialize}; use utoipa::ToSchema; // ============================================================================ // OIDC Settings DTOs (Admin Panel) // ============================================================================ /// Current OIDC settings returned to admin UI (secrets masked) #[derive(Debug, Serialize, Deserialize)] pub struct OidcSettingsDto { pub enabled: bool, pub issuer_url: String, pub client_id: String, /// True if a client secret is configured (never reveals the actual value) pub client_secret_set: bool, pub scopes: String, pub auto_provision: bool, pub admin_groups: String, pub disable_password_login: bool, pub provider_name: String, /// Auto-generated callback URL the admin must register in their IdP pub callback_url: String, /// Field names overridden by environment variables (read-only in UI) pub env_overrides: Vec, } /// Request body for saving OIDC settings from the admin panel #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct SaveOidcSettingsDto { pub enabled: bool, pub issuer_url: String, pub client_id: String, /// Only update if provided and non-empty (None = keep existing) pub client_secret: Option, pub scopes: Option, pub auto_provision: Option, pub admin_groups: Option, pub disable_password_login: Option, pub provider_name: Option, } /// Request body for testing OIDC discovery #[derive(Debug, Serialize, Deserialize)] pub struct TestOidcConnectionDto { pub issuer_url: String, } /// Result of OIDC connection test #[derive(Debug, Serialize, Deserialize)] pub struct OidcTestResultDto { pub success: bool, pub message: String, pub issuer: Option, pub authorization_endpoint: Option, pub token_endpoint: Option, pub userinfo_endpoint: Option, /// Suggested provider name (derived from issuer hostname) pub provider_name_suggestion: Option, } // ============================================================================ // Admin User Management DTOs // ============================================================================ /// Request body for updating a user's role #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct UpdateUserRoleDto { pub role: String, } /// Request body for updating a user's active status #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct UpdateUserActiveDto { pub active: bool, } /// Request body for updating a user's storage quota #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct UpdateUserQuotaDto { /// Quota in bytes. Use 0 for unlimited. pub quota_bytes: i64, } /// Request body for admin-created users #[derive(Debug, Serialize, Deserialize, Clone, ToSchema)] pub struct AdminCreateUserDto { pub username: String, pub password: String, /// Optional — if omitted, a placeholder email is generated pub email: Option, /// "admin" or "user"; defaults to "user" pub role: Option, /// Storage quota in bytes; 0 = unlimited. If omitted, uses role default. pub quota_bytes: Option, /// Whether the account is active; defaults to true pub active: Option, } /// Request body for admin password reset #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct AdminResetPasswordDto { pub new_password: String, } /// Query parameters for listing users #[derive(Debug, Serialize, Deserialize)] pub struct ListUsersQueryDto { pub limit: Option, pub offset: Option, } /// Dashboard statistics #[derive(Debug, Serialize, Deserialize)] pub struct DashboardStatsDto { // System info pub server_version: String, pub auth_enabled: bool, pub oidc_configured: bool, pub quotas_enabled: bool, // User stats pub total_users: i64, pub active_users: i64, pub admin_users: i64, // Storage stats pub total_quota_bytes: i64, pub total_used_bytes: i64, pub storage_usage_percent: f64, pub users_over_80_percent: i64, pub users_over_quota: i64, pub registration_enabled: bool, } // ============================================================================ // Storage Settings DTOs (Admin Panel) // ============================================================================ /// Current storage settings returned to admin UI (secrets masked) #[derive(Debug, Serialize, Deserialize)] pub struct StorageSettingsDto { /// Active backend type: "local" or "s3" pub backend: String, pub s3_endpoint_url: Option, pub s3_bucket: Option, pub s3_region: Option, /// True if an access key is configured (never reveals the actual value) pub s3_access_key_set: bool, /// True if a secret key is configured (never reveals the actual value) pub s3_secret_key_set: bool, pub s3_force_path_style: bool, /// Field names overridden by environment variables (read-only in UI) pub env_overrides: Vec, // ── Current stats ── pub current_backend: String, pub total_blobs: u64, pub total_bytes_stored: u64, pub dedup_ratio: f64, } /// Request body for saving storage settings from the admin panel #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct SaveStorageSettingsDto { pub backend: String, pub s3_endpoint_url: Option, pub s3_bucket: Option, pub s3_region: Option, /// Only update if provided and non-empty (None = keep existing) pub s3_access_key: Option, /// Only update if provided and non-empty (None = keep existing) pub s3_secret_key: Option, pub s3_force_path_style: Option, } /// Request body for testing a storage connection #[derive(Debug, Serialize, Deserialize)] pub struct TestStorageConnectionDto { pub backend: String, pub s3_endpoint_url: Option, pub s3_bucket: Option, pub s3_region: Option, pub s3_access_key: Option, pub s3_secret_key: Option, pub s3_force_path_style: Option, } /// Result of a storage connection test #[derive(Debug, Serialize, Deserialize)] pub struct StorageTestResultDto { pub connected: bool, pub message: String, pub backend_type: String, pub available_bytes: Option, } // ============================================================================ // Migration DTOs (Admin Panel — Storage Migration) // ============================================================================ /// Migration progress returned by `GET /api/admin/storage/migration`. /// Re-exports the `MigrationState` shape for the admin UI. #[derive(Debug, Serialize, Deserialize)] pub struct MigrationStateDto { pub status: String, pub total_blobs: u64, pub migrated_blobs: u64, pub migrated_bytes: u64, pub failed_blobs: Vec, pub started_at: Option, pub completed_at: Option, /// Estimated throughput in bytes/sec (for UI ETA calculation). pub throughput_bytes_per_sec: Option, } /// Request body for `POST /api/admin/storage/migration/start`. #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct StartMigrationDto { /// How many blobs to copy in parallel (default: 4). pub concurrency: Option, } /// Request body (empty) for `POST /api/admin/storage/migration/verify`. #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct VerifyMigrationDto { /// Number of random blobs to sample-check (default: 100). pub sample_size: Option, }