using System.ComponentModel.DataAnnotations; namespace ROLAC.API.DTOs.Settings; // ── Site settings ────────────────────────────────────────────────────────── public class SiteSettingDto { public string SiteTitle { get; set; } = ""; public string? SiteTitleZh { get; set; } public string DefaultLanguage { get; set; } = "en"; public string TimeZone { get; set; } = ""; public string DateFormat { get; set; } = ""; public string Currency { get; set; } = ""; } public class UpdateSiteSettingRequest { [Required, MaxLength(200)] public string SiteTitle { get; set; } = ""; [MaxLength(200)] public string? SiteTitleZh { get; set; } [Required, MaxLength(10)] public string DefaultLanguage { get; set; } = "en"; [Required, MaxLength(100)] public string TimeZone { get; set; } = ""; [Required, MaxLength(50)] public string DateFormat { get; set; } = ""; [Required, MaxLength(10)] public string Currency { get; set; } = ""; } // ── Notification settings ────────────────────────────────────────────────── // Secrets are never returned. The DTO exposes only whether each secret is configured; the UI // shows a write-only field where a blank value on update means "keep the stored secret". public class NotificationSettingDto { public bool EnableEmail { get; set; } public string SmtpHost { get; set; } = ""; public int SmtpPort { get; set; } public bool SmtpUseSsl { get; set; } public string SmtpUser { get; set; } = ""; public string FromAddress { get; set; } = ""; public string FromName { get; set; } = ""; public bool HasSmtpPassword { get; set; } public bool EnableLine { get; set; } public bool HasLineChannelAccessToken { get; set; } public bool HasLineChannelSecret { get; set; } /// Read-only webhook URL to register in the Line console (derived from the request). public string WebhookUrl { get; set; } = ""; } public class UpdateNotificationSettingRequest { public bool EnableEmail { get; set; } [MaxLength(200)] public string SmtpHost { get; set; } = ""; [Range(0, 65535)] public int SmtpPort { get; set; } = 587; public bool SmtpUseSsl { get; set; } = true; [MaxLength(200)] public string SmtpUser { get; set; } = ""; [MaxLength(200)] public string? FromAddress { get; set; } [MaxLength(200)] public string? FromName { get; set; } /// Blank = keep the stored password unchanged. [MaxLength(500)] public string? SmtpPassword { get; set; } public bool EnableLine { get; set; } /// Blank = keep the stored token unchanged. [MaxLength(500)] public string? LineChannelAccessToken { get; set; } /// Blank = keep the stored secret unchanged. [MaxLength(200)] public string? LineChannelSecret { get; set; } } // ── Test-send requests ───────────────────────────────────────────────────── public class TestEmailRequest { /// Optional override; defaults to the current user's email when omitted. [MaxLength(200), EmailAddress] public string? ToAddress { get; set; } } public class TestLineRequest { public int? MemberId { get; set; } public int? GroupId { get; set; } }