namespace Domain.Entities.Common
{
public sealed class Config
{
public int ID { get; private set; }
public DateTime LastUpdatedAt { get; private set; } = DateTime.UtcNow;
public byte[] RowVersion { get; private set; } = [];
public BasicConfig Basic { get; private set; } = new();
public ImagesConfig Images { get; private set; } = new();
public MetaConfig Meta { get; private set; } = new();
public CompanyConfig Company { get; private set; } = new();
public AccountConfig Account { get; private set; } = new();
public EmailTemplateConfig EmailTemplate { get; private set; } = new();
public ExternalApiConfig External { get; private set; } = new();
public PaymentConfig Payment { get; private set; } = new();
public CryptoConfig Crypto { get; private set; } = new();
private Config() { }
public static Config Create()
{
return new();
}
public void Update(
BasicConfig basic,
ImagesConfig images,
MetaConfig meta,
CompanyConfig company,
AccountConfig account,
EmailTemplateConfig emailTemplate,
ExternalApiConfig external,
PaymentConfig payment,
CryptoConfig crypto
) {
Basic = basic ?? throw new ArgumentNullException(nameof(basic));
Images = images ?? throw new ArgumentNullException(nameof(images));
Meta = meta ?? throw new ArgumentNullException(nameof(meta));
Company = company ?? throw new ArgumentNullException(nameof(company));
Account = account ?? throw new ArgumentNullException(nameof(account));
EmailTemplate = emailTemplate ?? throw new ArgumentNullException(nameof(emailTemplate));
External = external ?? throw new ArgumentNullException(nameof(external));
Payment = payment ?? throw new ArgumentNullException(nameof(payment));
Crypto = crypto ?? throw new ArgumentNullException(nameof(crypto));
LastUpdatedAt = DateTime.UtcNow;
}
}
#region Owned Groups
// ==================================================
// 기본 정보 (Basic)
// ==================================================
public sealed class BasicConfig
{
public string? SiteName { get; set; }
public string? SiteURL { get; set; }
public string? RootID { get; set; }
public string? FromEmail { get; set; }
public string? FromName { get; set; }
public string? SmtpServer { get; set; }
public int? SmtpPort { get; set; }
public bool SmtpEnableSSL { get; set; }
public string? SmtpUsername { get; set; }
public string? SmtpPassword { get; set; }
public string? AdminWhiteIPList { get; set; }
public string? FrontWhiteIPList { get; set; }
public string? BlockAlertTitle { get; set; }
public string? BlockAlertContent { get; set; }
public bool IsMaintenance { get; set; } = false;
public string? MaintenanceContent { get; set; }
}
// ==================================================
// 기본 이미지 (Images)
// ==================================================
public sealed class ImagesConfig
{
public string? Favicon { get; set; }
public string? LogoSquare { get; set; }
public string? LogoHorizontal { get; set; }
public string? OgDefault { get; set; }
public string? TwitterImage { get; set; }
public string? AppleTouchIcon { get; set; }
public string? AppIcon_192 { get; set; }
public string? AppIcon_512 { get; set; }
}
// ==================================================
// 메타 태그 (Meta)
// ==================================================
public sealed class MetaConfig
{
public string? Keywords { get; set; }
public string? Description { get; set; }
public string? Author { get; set; }
public string? Viewport { get; set; }
public string? ApplicationName { get; set; }
public string? Generator { get; set; }
public string? Robots { get; set; }
public string? Adds { get; set; }
}
// ==================================================
// 회사 정보 (Company)
// ==================================================
public sealed class CompanyConfig
{
public string? Name { get; set; }
public string? RegNo { get; set; }
public string? Address { get; set; }
public string? ZipCode { get; set; }
public string? Owner { get; set; }
public string? Tel { get; set; }
public string? Fax { get; set; }
public string? RetailSaleNo { get; set; }
public string? AddedSaleNo { get; set; }
public string? Hosting { get; set; }
public string? AdminName { get; set; }
public string? AdminEmail { get; set; }
public string? SiteUrl { get; set; }
public string? BankCode { get; set; }
public string? BankOwner { get; set; }
public string? BankNumber { get; set; }
}
// ==================================================
// 회원가입 설정 (Account)
// ==================================================
public sealed class AccountConfig
{
// 회원 가입 시
public bool IsRegisterBlock { get; set; } = false;
public bool IsRegisterEmailAuth { get; set; } = false;
public ushort? PasswordMinLength { get; set; }
public ushort? PasswordUppercaseLength { get; set; }
public ushort? PasswordNumbersLength { get; set; }
public ushort? PasswordSpecialcharsLength { get; set; }
public string? DeniedEmailList { get; set; }
public string? DeniedNameList { get; set; }
// 회원 수정 시
public ushort? ChangeEmailDay { get; set; }
public ushort? ChangeNameDay { get; set; }
public ushort? ChangeSummaryDay { get; set; }
public ushort? ChangeIntroDay { get; set; }
public ushort? ChangePasswordDay { get; set; }
// 로그인 시
public bool IsLoginEmailVerifiedOnly { get; set; } = false;
public ushort? MaxLoginTryCount { get; set; }
public ushort? MaxLoginTryLimitSecond { get; set; }
}
// ==================================================
// 알림 발송 양식 - 이메일 (EmailTemplate)
// ==================================================
public sealed class EmailTemplateConfig
{
public string? RegisterEmailFormTitle { get; set; }
public string? RegisterEmailFormContent { get; set; }
public string? RegistrationEmailFormTitle { get; set; }
public string? RegistrationEmailFormContent { get; set; }
public string? ResetPasswordEmailFormTitle { get; set; }
public string? ResetPasswordEmailFormContent { get; set; }
public string? ChangedPasswordEmailFormTitle { get; set; }
public string? ChangedPasswordEmailFormContent { get; set; }
public string? WithdrawEmailFormTitle { get; set; }
public string? WithdrawEmailFormContent { get; set; }
public string? EmailVerifyFormTitle { get; set; }
public string? EmailVerifyFormContent { get; set; }
public string? ChangedEmailFormTitle { get; set; }
public string? ChangedEmailFormContent { get; set; }
}
// ==================================================
// 외부 API 설정 (External)
// ==================================================
public sealed class ExternalApiConfig
{
/** YouTube **/
public string? YouTubeApiKeyEnc { get; set; }
public string? YouTubeApiName { get; set; }
/** 구글 **/
public string? GoogleClientId { get; set; }
public string? GoogleClientSecretEnc { get; set; }
public string? GoogleAppId { get; set; }
/** 다날 페이 **/
/// Danal 결제 환경 (test / live)
public string? DanalPayMode { get; set; }
/// Danal Test CPID
public string? DanalTestCpid { get; set; }
/// Danal Test Client Key (암호화 저장 권장)
public string? DanalTestClientKeyEnc { get; set; }
/// Danal Test Secret Key (암호화 저장 권장)
public string? DanalTestSecretKeyEnc { get; set; }
/// Danal Live CPID
public string? DanalLiveCpid { get; set; }
/// Danal Live Client Key (암호화 저장 권장)
public string? DanalLiveClientKeyEnc { get; set; }
/// Danal Live Secret Key (암호화 저장 권장)
public string? DanalLiveSecretKeyEnc { get; set; }
}
// ==================================================
// 결제 설정 (Payment)
// ==================================================
public sealed class PaymentConfig
{
/** 다날 페이 수수료 **/
/// 다날 신용카드 수수료(%)
public decimal? DanalCardFeeRate { get; set; }
/// 다날 신용카드 수수료(원)
public decimal? DanalCardFeeAmount { get; set; }
/// 다날 계좌이체 수수료(%)
public decimal? DanalTransferFeeRate { get; set; }
/// 다날 계좌이체 수수료(원)
public decimal? DanalTransferFeeAmount { get; set; }
/// 다날 가상계좌 수수료(%)
public decimal? DanalVbankFeeRate { get; set; }
/// 다날 가상계좌 수수료(원)
public decimal? DanalVbankFeeAmount { get; set; }
/// 다날 간편결제 수수료(%)
public decimal? DanalSimpleFeeRate { get; set; }
/// 다날 간편결제 수수료(원)
public decimal? DanalSimpleFeeAmount { get; set; }
}
// ==================================================
// 코인/시세 설정 (Crypto)
// ==================================================
public sealed class CryptoConfig
{
public int TickerRefreshSeconds { get; set; } = 5;
public decimal SurgeThreshold { get; set; } = 5.0m;
public decimal PlungeThreshold { get; set; } = -5.0m;
public int MainPageCoinCount { get; set; } = 10;
}
#endregion
}