Request.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. using Microsoft.AspNetCore.Http;
  2. using System.ComponentModel;
  3. using System.ComponentModel.DataAnnotations;
  4. namespace Application.Features.Config.Update;
  5. public sealed class Request
  6. {
  7. public int ID { get; init; }
  8. public BasicConfigDto Basic { get; init; } = new();
  9. public ImagesConfigDto Images { get; init; } = new();
  10. public MetaConfigDto Meta { get; init; } = new();
  11. public CompanyConfigDto Company { get; init; } = new();
  12. public AccountConfigDto Account { get; init; } = new();
  13. public EmailTemplateConfigDto EmailTemplate { get; init; } = new();
  14. public ExternalApiConfigDto External { get; init; } = new();
  15. public TossConfigDto Toss { get; init; } = new();
  16. public AttendanceConfigDto? Attendance { get; init; }
  17. public SignupRewardConfigDto? SignupReward { get; init; }
  18. public ActivityTokenConfigDto? ActivityToken { get; init; }
  19. // 기본 설정
  20. public sealed class BasicConfigDto
  21. {
  22. [MaxLength(100)]
  23. [DisplayName("사이트 이름")]
  24. public string? SiteName { get; init; }
  25. [MaxLength(100)]
  26. [DataType(DataType.Url)]
  27. [DisplayName("사이트 주소")]
  28. public string? SiteURL { get; init; }
  29. [DisplayName("최고 관리자 ID")]
  30. public string? RootID { get; init; }
  31. [MaxLength(100)]
  32. [DataType(DataType.EmailAddress)]
  33. [DisplayName("발송자 이메일")]
  34. public string? FromEmail { get; init; }
  35. [MaxLength(30)]
  36. [DisplayName("발송자 이름")]
  37. public string? FromName { get; init; }
  38. [MaxLength(200)]
  39. [DisplayName("SMTP Server")]
  40. public string? SmtpServer { get; init; }
  41. [Range(1, 65535)]
  42. [DisplayName("SMTP Port")]
  43. public int? SmtpPort { get; set; }
  44. [DisplayName("SMTP Enable SSL")]
  45. public bool SmtpEnableSSL { get; init; } = false;
  46. [MaxLength(100)]
  47. [DisplayName("SMTP Username")]
  48. public string? SmtpUsername { get; init; }
  49. [MaxLength(200)]
  50. [DataType(DataType.Password)]
  51. [DisplayName("SMTP Password")]
  52. public string? SmtpPassword { get; init; }
  53. [MaxLength(200)]
  54. [DataType(DataType.MultilineText)]
  55. [DisplayName("관리자단 접근 가능 IP")]
  56. public string? AdminWhiteIPList { get; init; }
  57. [MaxLength(200)]
  58. [DataType(DataType.MultilineText)]
  59. [DisplayName("사용자단 접근 가능 IP")]
  60. public string? FrontWhiteIPList { get; init; }
  61. [MaxLength(200)]
  62. [DisplayName("차단 시 안내문 제목")]
  63. public string? BlockAlertTitle { get; init; }
  64. [MaxLength(5000)]
  65. [DataType(DataType.MultilineText)]
  66. [DisplayName("차단 시 안내문 내용")]
  67. public string? BlockAlertContent { get; init; }
  68. [DisplayName("점검 여부")]
  69. public bool IsMaintenance { get; init; } = false;
  70. [MaxLength(5000)]
  71. [DataType(DataType.MultilineText)]
  72. [DisplayName("점검 내용")]
  73. public string? MaintenanceContent { get; init; }
  74. [Range(0, 100)]
  75. [DisplayName("쪽지 일일 발송 제한")]
  76. public int NoteDailySendLimit { get; init; } = 3;
  77. }
  78. // 이미지 경로 및 업로드 입력
  79. public sealed class ImagesConfigDto
  80. {
  81. // ====== DB에 저장/표기할 경로(문자열) ======
  82. [MaxLength(255)]
  83. [DisplayName("Favicon")]
  84. public string? FaviconPath { get; init; }
  85. [MaxLength(255)]
  86. [DisplayName("Logo-square")]
  87. public string? LogoSquarePath { get; init; }
  88. [MaxLength(255)]
  89. [DisplayName("Logo-horizontal")]
  90. public string? LogoHorizontalPath { get; init; }
  91. [MaxLength(255)]
  92. [DisplayName("og-default")]
  93. public string? OgDefaultPath { get; init; }
  94. [MaxLength(255)]
  95. [DisplayName("Twitter-image")]
  96. public string? TwitterImagePath { get; init; }
  97. [MaxLength(255)]
  98. [DisplayName("Apple-touch-icon")]
  99. public string? AppleTouchIconPath { get; init; }
  100. [MaxLength(255)]
  101. [DisplayName("App-icon-192")]
  102. public string? AppIcon192Path { get; init; }
  103. [MaxLength(255)]
  104. [DisplayName("App-icon-512")]
  105. public string? AppIcon512Path { get; init; }
  106. // ====== 업로드 입력(새 업로드용) ======
  107. [DataType(DataType.Upload)]
  108. [DisplayName("Favicon 업로드")]
  109. public IFormFile? FaviconFile { get; init; }
  110. [DataType(DataType.Upload)]
  111. [DisplayName("Logo-square 업로드")]
  112. public IFormFile? LogoSquareFile { get; init; }
  113. [DataType(DataType.Upload)]
  114. [DisplayName("Logo-horizontal 업로드")]
  115. public IFormFile? LogoHorizontalFile { get; init; }
  116. [DataType(DataType.Upload)]
  117. [DisplayName("og-default 업로드")]
  118. public IFormFile? OgDefaultFile { get; init; }
  119. [DataType(DataType.Upload)]
  120. [DisplayName("Twitter-image 업로드")]
  121. public IFormFile? TwitterImageFile { get; init; }
  122. [DataType(DataType.Upload)]
  123. [DisplayName("Apple-touch-icon 업로드")]
  124. public IFormFile? AppleTouchIconFile { get; init; }
  125. [DataType(DataType.Upload)]
  126. [DisplayName("App-icon-192 업로드")]
  127. public IFormFile? AppIcon192File { get; init; }
  128. [DataType(DataType.Upload)]
  129. [DisplayName("App-icon-512 업로드")]
  130. public IFormFile? AppIcon512File { get; init; }
  131. }
  132. // 메타 태그
  133. public sealed class MetaConfigDto
  134. {
  135. [MaxLength(255)]
  136. [DisplayName("Meta Keywords")]
  137. public string? Keywords { get; init; }
  138. [MaxLength(255)]
  139. [DisplayName("Meta Description")]
  140. public string? Description { get; init; }
  141. [MaxLength(255)]
  142. [DisplayName("Meta Author")]
  143. public string? Author { get; init; }
  144. [MaxLength(255)]
  145. [DisplayName("Meta Viewport")]
  146. public string? Viewport { get; init; }
  147. [MaxLength(255)]
  148. [DisplayName("Meta ApplicationName")]
  149. public string? ApplicationName { get; init; }
  150. [MaxLength(255)]
  151. [DisplayName("Meta Generator")]
  152. public string? Generator { get; init; }
  153. [MaxLength(255)]
  154. [DisplayName("Meta Robots")]
  155. public string? Robots { get; init; }
  156. [MaxLength(3000)]
  157. [DataType(DataType.MultilineText)]
  158. [DisplayName("Meta Adds")]
  159. public string? Adds { get; init; }
  160. }
  161. // 회사 정보
  162. public sealed class CompanyConfigDto
  163. {
  164. [MaxLength(70)]
  165. [DisplayName("상호 명")]
  166. public string? Name { get; init; }
  167. [MaxLength(100)]
  168. [DisplayName("사업자 등록 번호")]
  169. public string? RegNo { get; init; }
  170. [MaxLength(255)]
  171. [DisplayName("사업장 소재지")]
  172. public string? Address { get; init; }
  173. [MaxLength(8)]
  174. [DataType(DataType.PostalCode)]
  175. [DisplayName("우편번호")]
  176. public string? ZipCode { get; init; }
  177. [MaxLength(50)]
  178. [DisplayName("대표자 명")]
  179. public string? Owner { get; init; }
  180. [MaxLength(20)]
  181. [DisplayName("대표 전화번호")]
  182. public string? Tel { get; init; }
  183. [MaxLength(20)]
  184. [DisplayName("FAX")]
  185. public string? Fax { get; init; }
  186. [MaxLength(20)]
  187. [DisplayName("통신판매업 신고번호")]
  188. public string? RetailSaleNo { get; init; }
  189. [MaxLength(20)]
  190. [DisplayName("부가통신 사업자번호")]
  191. public string? AddedSaleNo { get; init; }
  192. [MaxLength(100)]
  193. [DisplayName("호스팅 서비스")]
  194. public string? Hosting { get; init; }
  195. [MaxLength(70)]
  196. [DisplayName("정보관리책임자")]
  197. public string? AdminName { get; init; }
  198. [MaxLength(100)]
  199. [DataType(DataType.EmailAddress)]
  200. [DisplayName("정보관리책임자 이메일")]
  201. public string? AdminEmail { get; init; }
  202. [MaxLength(200)]
  203. [DataType(DataType.Url)]
  204. [DisplayName("사이트 주소")]
  205. public string? SiteUrl { get; init; }
  206. [MaxLength(10)]
  207. [DisplayName("입금계좌 - 은행")]
  208. public string? BankCode { get; init; }
  209. [MaxLength(70)]
  210. [DisplayName("입금계좌 - 예금주")]
  211. public string? BankOwner { get; init; }
  212. [MaxLength(100)]
  213. [DisplayName("입금계좌 - 계좌번호")]
  214. public string? BankNumber { get; init; }
  215. }
  216. // 회원 설정
  217. public sealed class AccountConfigDto
  218. {
  219. [DisplayName("회원가입 시 - 가입 차단")]
  220. public bool IsRegisterBlock { get; init; } = false;
  221. [DisplayName("회원가입 시 - 이메일 인증 여부")]
  222. public bool IsRegisterEmailAuth { get; init; } = false;
  223. [Range(0, 100)]
  224. [DisplayName("회원가입 시 - 비밀번호 최소 길이")]
  225. public ushort? PasswordMinLength { get; init; }
  226. [Range(0, 100)]
  227. [DisplayName("회원가입 시 - 비밀번호 대문자 최소 길이")]
  228. public ushort? PasswordUppercaseLength { get; init; }
  229. [Range(0, 100)]
  230. [DisplayName("회원가입 시 - 비밀번호 숫자 최소 길이")]
  231. public ushort? PasswordNumbersLength { get; init; }
  232. [Range(0, 100)]
  233. [DisplayName("회원가입 시 - 비밀번호 특수문자 최소 길이")]
  234. public ushort? PasswordSpecialcharsLength { get; init; }
  235. [MaxLength(4000)]
  236. [DisplayName("회원가입 시 - 금지 이메일")]
  237. public string? DeniedEmailList { get; init; }
  238. [MaxLength(4000)]
  239. [DisplayName("회원가입 시 - 금지 별명")]
  240. public string? DeniedNameList { get; init; }
  241. [Range(0, 365)]
  242. [DisplayName("회원가입 시 - 이메일 갱신 주기")]
  243. public ushort? ChangeEmailDay { get; init; }
  244. [Range(0, 365)]
  245. [DisplayName("회원가입 시 - 별명 갱신 주기")]
  246. public ushort? ChangeNameDay { get; init; }
  247. [Range(0, 365)]
  248. [DisplayName("회원가입 시 - 한마디 갱신 주기")]
  249. public ushort? ChangeSummaryDay { get; init; }
  250. [Range(0, 365)]
  251. [DisplayName("회원가입 시 - 자기소개 갱신 주기")]
  252. public ushort? ChangeIntroDay { get; init; }
  253. [Range(0, 365)]
  254. [DisplayName("회원가입 시 - 비밀번호 갱신 주기")]
  255. public ushort? ChangePasswordDay { get; init; }
  256. [DisplayName("로그인 시 - 이메일 인증 필요")]
  257. public bool IsLoginEmailVerifiedOnly { get; init; } = false;
  258. [Range(0, 100)]
  259. [DisplayName("로그인 시 - 로그인 시도(회)")]
  260. public ushort? MaxLoginTryCount { get; init; }
  261. [Range(0, 86400)]
  262. [DisplayName("로그인 시 - 로그인 제한(초)")]
  263. public ushort? MaxLoginTryLimitSecond { get; init; }
  264. }
  265. // 알림 발송 양식
  266. public sealed class EmailTemplateConfigDto
  267. {
  268. [MaxLength(4000)]
  269. [DisplayName("회원가입 시 - 제목")]
  270. public string? RegisterEmailFormTitle { get; init; }
  271. [MaxLength(4000)]
  272. [DisplayName("회원가입 시 - 내용")]
  273. public string? RegisterEmailFormContent { get; init; }
  274. [MaxLength(4000)]
  275. [DisplayName("회원가입 완료 - 제목")]
  276. public string? RegistrationEmailFormTitle { get; init; }
  277. [MaxLength(4000)]
  278. [DisplayName("회원가입 완료 - 내용")]
  279. public string? RegistrationEmailFormContent { get; init; }
  280. [MaxLength(4000)]
  281. [DisplayName("비밀번호 재설정 - 제목")]
  282. public string? ResetPasswordEmailFormTitle { get; init; }
  283. [MaxLength(4000)]
  284. [DisplayName("비밀번호 재설정 - 내용")]
  285. public string? ResetPasswordEmailFormContent { get; init; }
  286. [MaxLength(4000)]
  287. [DisplayName("비밀번호 변경 완료 - 제목")]
  288. public string? ChangedPasswordEmailFormTitle { get; init; }
  289. [MaxLength(4000)]
  290. [DisplayName("비밀번호 변경 완료 - 내용")]
  291. public string? ChangedPasswordEmailFormContent { get; init; }
  292. [MaxLength(4000)]
  293. [DisplayName("회원탈퇴 시 - 제목")]
  294. public string? WithdrawEmailFormTitle { get; init; }
  295. [MaxLength(4000)]
  296. [DisplayName("회원탈퇴 시 - 내용")]
  297. public string? WithdrawEmailFormContent { get; init; }
  298. [MaxLength(4000)]
  299. [DisplayName("회원탈퇴 인증 - 제목")]
  300. public string? WithdrawVerifyEmailFormTitle { get; init; }
  301. [MaxLength(4000)]
  302. [DisplayName("회원탈퇴 인증 - 내용")]
  303. public string? WithdrawVerifyEmailFormContent { get; init; }
  304. [MaxLength(4000)]
  305. [DisplayName("이메일 변경 시 - 제목")]
  306. public string? EmailVerifyFormTitle { get; init; }
  307. [MaxLength(4000)]
  308. [DisplayName("이메일 변경 시 - 내용")]
  309. public string? EmailVerifyFormContent { get; init; }
  310. [MaxLength(4000)]
  311. [DisplayName("이메일 변경 완료 - 제목")]
  312. public string? ChangedEmailFormTitle { get; init; }
  313. [MaxLength(4000)]
  314. [DisplayName("이메일 변경 완료 - 내용")]
  315. public string? ChangedEmailFormContent { get; init; }
  316. }
  317. // API 정보
  318. public sealed class ExternalApiConfigDto
  319. {
  320. [MaxLength(500)]
  321. [DisplayName("YouTube - API Name")]
  322. public string? YouTubeApiKeyEnc { get; init; }
  323. [MaxLength(500)]
  324. [DisplayName("YouTube - API Key")]
  325. public string? YouTubeApiName { get; init; }
  326. [MaxLength(500)]
  327. [DisplayName("Google - Client ID")]
  328. public string? GoogleClientId { get; init; }
  329. [MaxLength(500)]
  330. [DisplayName("Google - Client Secret")]
  331. public string? GoogleClientSecretEnc { get; init; }
  332. [MaxLength(500)]
  333. [DisplayName("Google - App ID")]
  334. public string? GoogleAppId { get; init; }
  335. }
  336. // 토스페이먼츠 결제 설정 (결제 설정 화면 전용)
  337. // 키 입력값은 저장 시 암호화되며, 빈 값으로 제출하면 기존 저장 키를 유지한다.
  338. public sealed class TossConfigDto
  339. {
  340. [DisplayName("토스 - 결제 환경")]
  341. public string? TossPayMode { get; init; }
  342. [MaxLength(500)]
  343. [DisplayName("토스 - Test Client Key")]
  344. public string? TestClientKey { get; init; }
  345. [MaxLength(500)]
  346. [DisplayName("토스 - Test Secret Key")]
  347. public string? TestSecretKey { get; init; }
  348. [MaxLength(500)]
  349. [DisplayName("토스 - Live Client Key")]
  350. public string? LiveClientKey { get; init; }
  351. [MaxLength(500)]
  352. [DisplayName("토스 - Live Secret Key")]
  353. public string? LiveSecretKey { get; init; }
  354. }
  355. // 출석 설정
  356. public sealed class AttendanceConfigDto
  357. {
  358. [DisplayName("출석 기능 활성화")]
  359. public bool IsEnabled { get; init; } = false;
  360. [Range(0, 100000)]
  361. [DisplayName("기본 경험치")]
  362. public int BaseExp { get; init; } = 0;
  363. [Range(0, 100000)]
  364. [DisplayName("기본 코인")]
  365. public int BasePoint { get; init; } = 0;
  366. [DisplayName("연속 출석 가중치 사용")]
  367. public bool UseStreakBonus { get; init; } = false;
  368. [Range(0, 10000)]
  369. [DisplayName("1일당 추가 경험치")]
  370. public int StreakBonusPerDay { get; init; } = 0;
  371. [Range(0, 10000)]
  372. [DisplayName("1일당 추가 코인")]
  373. public int StreakBonusPointPerDay { get; init; } = 0;
  374. [Range(0, 365)]
  375. [DisplayName("가중치 최대 적용 일수")]
  376. public int StreakBonusMaxDays { get; init; } = 0;
  377. [DisplayName("순위 보상 사용")]
  378. public bool UseRankBonus { get; init; } = false;
  379. [MaxLength(2000)]
  380. [DisplayName("순위별 보상 설정 (JSON)")]
  381. public string? RankBonusConfig { get; init; }
  382. }
  383. // 가입 축하 보상 설정
  384. public sealed class SignupRewardConfigDto
  385. {
  386. [DisplayName("가입 축하 보상 활성화")]
  387. public bool Enabled { get; init; } = false;
  388. [Range(0, 100000000)]
  389. [DisplayName("지급 코인")]
  390. public int CoinAmount { get; init; } = 0;
  391. [Range(0, 100000000)]
  392. [DisplayName("지급 캐시")]
  393. public int CashAmount { get; init; } = 0;
  394. [Range(0, 100000)]
  395. [DisplayName("지급 경험치")]
  396. public int ExpAmount { get; init; } = 0;
  397. }
  398. // 활동 토큰 보상 설정
  399. public sealed class ActivityTokenConfigDto
  400. {
  401. [Range(0, 100000000)]
  402. [DisplayName("게시글 토큰")]
  403. public int PostToken { get; init; } = 0;
  404. [Range(0, 100000000)]
  405. [DisplayName("댓글 토큰")]
  406. public int CommentToken { get; init; } = 0;
  407. [Range(0, 100000000)]
  408. [DisplayName("일일 토큰 상한")]
  409. public int DailyTokenCap { get; init; } = 0;
  410. }
  411. public static Request From(Get.Response src) => new()
  412. {
  413. ID = src.ID,
  414. Basic = new BasicConfigDto
  415. {
  416. SiteName = src.Basic.SiteName,
  417. SiteURL = src.Basic.SiteURL,
  418. RootID = src.Basic.RootID,
  419. FromEmail = src.Basic.FromEmail,
  420. FromName = src.Basic.FromName,
  421. SmtpServer = src.Basic.SmtpServer,
  422. SmtpPort = src.Basic.SmtpPort,
  423. SmtpEnableSSL = src.Basic.SmtpEnableSSL,
  424. SmtpUsername = src.Basic.SmtpUsername,
  425. SmtpPassword = src.Basic.SmtpPassword,
  426. AdminWhiteIPList = src.Basic.AdminWhiteIPList,
  427. FrontWhiteIPList = src.Basic.FrontWhiteIPList,
  428. BlockAlertTitle = src.Basic.BlockAlertTitle,
  429. BlockAlertContent = src.Basic.BlockAlertContent,
  430. IsMaintenance = src.Basic.IsMaintenance,
  431. MaintenanceContent = src.Basic.MaintenanceContent,
  432. NoteDailySendLimit = src.Basic.NoteDailySendLimit
  433. },
  434. Images = new ImagesConfigDto
  435. {
  436. FaviconPath = src.Images.FaviconPath,
  437. LogoSquarePath = src.Images.LogoSquarePath,
  438. LogoHorizontalPath = src.Images.LogoHorizontalPath,
  439. OgDefaultPath = src.Images.OgDefaultPath,
  440. TwitterImagePath = src.Images.TwitterImagePath,
  441. AppleTouchIconPath = src.Images.AppleTouchIconPath,
  442. AppIcon192Path = src.Images.AppIcon192Path,
  443. AppIcon512Path = src.Images.AppIcon512Path
  444. },
  445. Meta = new MetaConfigDto
  446. {
  447. Keywords = src.Meta.Keywords,
  448. Description = src.Meta.Description,
  449. Author = src.Meta.Author,
  450. Viewport = src.Meta.Viewport,
  451. ApplicationName = src.Meta.ApplicationName,
  452. Generator = src.Meta.Generator,
  453. Robots = src.Meta.Robots,
  454. Adds = src.Meta.Adds
  455. },
  456. Company = new CompanyConfigDto
  457. {
  458. Name = src.Company.Name,
  459. RegNo = src.Company.RegNo,
  460. Address = src.Company.Address,
  461. ZipCode = src.Company.ZipCode,
  462. Owner = src.Company.Owner,
  463. Tel = src.Company.Tel,
  464. Fax = src.Company.Fax,
  465. RetailSaleNo = src.Company.RetailSaleNo,
  466. AddedSaleNo = src.Company.AddedSaleNo,
  467. Hosting = src.Company.Hosting,
  468. AdminName = src.Company.AdminName,
  469. AdminEmail = src.Company.AdminEmail,
  470. SiteUrl = src.Company.SiteUrl,
  471. BankCode = src.Company.BankCode,
  472. BankOwner = src.Company.BankOwner,
  473. BankNumber = src.Company.BankNumber
  474. },
  475. Account = new AccountConfigDto
  476. {
  477. IsRegisterBlock = src.Account.IsRegisterBlock,
  478. IsRegisterEmailAuth = src.Account.IsRegisterEmailAuth,
  479. PasswordMinLength = src.Account.PasswordMinLength,
  480. PasswordUppercaseLength = src.Account.PasswordUppercaseLength,
  481. PasswordNumbersLength = src.Account.PasswordNumbersLength,
  482. PasswordSpecialcharsLength = src.Account.PasswordSpecialcharsLength,
  483. DeniedEmailList = src.Account.DeniedEmailList,
  484. DeniedNameList = src.Account.DeniedNameList,
  485. ChangeEmailDay = src.Account.ChangeEmailDay,
  486. ChangeNameDay = src.Account.ChangeNameDay,
  487. ChangeSummaryDay = src.Account.ChangeSummaryDay,
  488. ChangeIntroDay = src.Account.ChangeIntroDay,
  489. ChangePasswordDay = src.Account.ChangePasswordDay,
  490. IsLoginEmailVerifiedOnly = src.Account.IsLoginEmailVerifiedOnly,
  491. MaxLoginTryCount = src.Account.MaxLoginTryCount,
  492. MaxLoginTryLimitSecond = src.Account.MaxLoginTryLimitSecond
  493. },
  494. EmailTemplate = new EmailTemplateConfigDto
  495. {
  496. RegisterEmailFormTitle = src.EmailTemplate.RegisterEmailFormTitle,
  497. RegisterEmailFormContent = src.EmailTemplate.RegisterEmailFormContent,
  498. RegistrationEmailFormTitle = src.EmailTemplate.RegistrationEmailFormTitle,
  499. RegistrationEmailFormContent = src.EmailTemplate.RegistrationEmailFormContent,
  500. ResetPasswordEmailFormTitle = src.EmailTemplate.ResetPasswordEmailFormTitle,
  501. ResetPasswordEmailFormContent = src.EmailTemplate.ResetPasswordEmailFormContent,
  502. ChangedPasswordEmailFormTitle = src.EmailTemplate.ChangedPasswordEmailFormTitle,
  503. ChangedPasswordEmailFormContent = src.EmailTemplate.ChangedPasswordEmailFormContent,
  504. WithdrawEmailFormTitle = src.EmailTemplate.WithdrawEmailFormTitle,
  505. WithdrawEmailFormContent = src.EmailTemplate.WithdrawEmailFormContent,
  506. WithdrawVerifyEmailFormTitle = src.EmailTemplate.WithdrawVerifyEmailFormTitle,
  507. WithdrawVerifyEmailFormContent = src.EmailTemplate.WithdrawVerifyEmailFormContent,
  508. EmailVerifyFormTitle = src.EmailTemplate.EmailVerifyFormTitle,
  509. EmailVerifyFormContent = src.EmailTemplate.EmailVerifyFormContent,
  510. ChangedEmailFormTitle = src.EmailTemplate.ChangedEmailFormTitle,
  511. ChangedEmailFormContent = src.EmailTemplate.ChangedEmailFormContent
  512. },
  513. External = new ExternalApiConfigDto
  514. {
  515. YouTubeApiKeyEnc = src.External.YouTubeApiKeyEnc,
  516. YouTubeApiName = src.External.YouTubeApiName,
  517. GoogleClientId = src.External.GoogleClientId,
  518. GoogleClientSecretEnc = src.External.GoogleClientSecretEnc,
  519. GoogleAppId = src.External.GoogleAppId
  520. },
  521. // 토스 키는 화면에 되돌리지 않는다 (암호문 재제출로 인한 이중 암호화 방지 — 빈 값 = 기존 유지)
  522. Toss = new TossConfigDto
  523. {
  524. TossPayMode = src.Toss.TossPayMode
  525. },
  526. Attendance = new AttendanceConfigDto
  527. {
  528. IsEnabled = src.Attendance.IsEnabled,
  529. BaseExp = src.Attendance.BaseExp,
  530. BasePoint = src.Attendance.BasePoint,
  531. UseStreakBonus = src.Attendance.UseStreakBonus,
  532. StreakBonusPerDay = src.Attendance.StreakBonusPerDay,
  533. StreakBonusPointPerDay = src.Attendance.StreakBonusPointPerDay,
  534. StreakBonusMaxDays = src.Attendance.StreakBonusMaxDays,
  535. UseRankBonus = src.Attendance.UseRankBonus,
  536. RankBonusConfig = src.Attendance.RankBonusConfig
  537. },
  538. SignupReward = new SignupRewardConfigDto
  539. {
  540. Enabled = src.SignupReward.Enabled,
  541. CoinAmount = src.SignupReward.CoinAmount,
  542. CashAmount = src.SignupReward.CashAmount,
  543. ExpAmount = src.SignupReward.ExpAmount
  544. },
  545. ActivityToken = new ActivityTokenConfigDto
  546. {
  547. PostToken = src.ActivityToken.PostToken,
  548. CommentToken = src.ActivityToken.CommentToken,
  549. DailyTokenCap = src.ActivityToken.DailyTokenCap
  550. }
  551. };
  552. }