using foodmarket.Domain.Common; namespace foodmarket.Domain.Platform; /// Платформенные настройки (singleton, single-row). Хранят SMTP-креды /// для отправки писем (forgot-password, инвайты, нотификации). Не tenant-scoped — /// общий конфиг для всей платформы, видны и меняются только Супер-администратором. /// /// SmtpPassword хранится зашифрованным через DataProtection API /// (`IDataProtectionProvider.CreateProtector("foodmarket.smtp")`); снаружи /// (контроллер) — никогда не возвращается в открытом виде, только has-password флаг. public class PlatformSettings : Entity { /// SMTP-сервер для отправки исходящей почты (НЕ IMAP — IMAP это /// для чтения входящей). public string? SmtpHost { get; set; } public int? SmtpPort { get; set; } /// Implicit TLS (SMTPS, обычно порт 465). Взаимоисключающий /// со SmtpStartTls (587). public bool SmtpUseSsl { get; set; } /// STARTTLS upgrade (обычно порт 587). По дефолту true в большинстве /// современных провайдеров (Gmail/Yandex/Mailgun). public bool SmtpStartTls { get; set; } = true; public string? SmtpUsername { get; set; } /// Зашифрованный SmtpPassword (base64 через DataProtection). /// Никогда не отдаётся в API-ответах. Установка только через PUT с /// явно переданным new-password полем. public string? SmtpPasswordEncrypted { get; set; } public string? FromEmail { get; set; } public string? FromName { get; set; } // ── Web Push (VAPID) ────────────────────────────────────────────────────── // Пара ключей VAPID генерируется один раз при первом обращении и хранится // здесь (стабильна между рестартами). Публичный ключ отдаётся фронту для // подписки; приватный — только серверу (в API-ответах не возвращается). public string? WebPushVapidPublicKey { get; set; } public string? WebPushVapidPrivateKey { get; set; } /// VAPID subject — mailto:/URL контакта оператора push (по умолчанию mailto:). public string? WebPushVapidSubject { get; set; } }