Request.cs 23 KB

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