Handler.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Microsoft.EntityFrameworkCore;
  4. using Application.Abstractions.Cache;
  5. namespace Application.Features.Config.Get;
  6. public sealed class Handler(IAppDbContext db, ICacheService cache) : IQueryHandler<Query, Response?>
  7. {
  8. public async Task<Response?> Handle(Query request, CancellationToken ct)
  9. {
  10. var cached = await cache.GetAsync<Response>(CacheKeys.Config, ct);
  11. if (cached is not null)
  12. {
  13. return cached;
  14. }
  15. var config = await db.Config.AsNoTracking().OrderByDescending(x => x.ID).FirstOrDefaultAsync(ct);
  16. if (config is null)
  17. {
  18. return null;
  19. }
  20. var response = new Response
  21. {
  22. ID = config.ID,
  23. Basic = new Response.BasicConfigDto
  24. {
  25. SiteName = config.Basic.SiteName,
  26. SiteURL = config.Basic.SiteURL,
  27. RootID = config.Basic.RootID,
  28. FromEmail = config.Basic.FromEmail,
  29. FromName = config.Basic.FromName,
  30. SmtpServer = config.Basic.SmtpServer,
  31. SmtpPort = config.Basic.SmtpPort,
  32. SmtpEnableSSL = config.Basic.SmtpEnableSSL,
  33. SmtpUsername = config.Basic.SmtpUsername,
  34. SmtpPassword = config.Basic.SmtpPassword,
  35. AdminWhiteIPList = config.Basic.AdminWhiteIPList,
  36. FrontWhiteIPList = config.Basic.FrontWhiteIPList,
  37. BlockAlertTitle = config.Basic.BlockAlertTitle,
  38. BlockAlertContent = config.Basic.BlockAlertContent,
  39. IsMaintenance = config.Basic.IsMaintenance,
  40. MaintenanceContent = config.Basic.MaintenanceContent,
  41. NoteDailySendLimit = config.Basic.NoteDailySendLimit
  42. },
  43. Images = new Response.ImagesConfigDto
  44. {
  45. FaviconPath = config.Images.Favicon,
  46. LogoSquarePath = config.Images.LogoSquare,
  47. LogoHorizontalPath = config.Images.LogoHorizontal,
  48. OgDefaultPath = config.Images.OgDefault,
  49. TwitterImagePath = config.Images.TwitterImage,
  50. AppleTouchIconPath = config.Images.AppleTouchIcon,
  51. AppIcon192Path = config.Images.AppIcon_192,
  52. AppIcon512Path = config.Images.AppIcon_512
  53. },
  54. Meta = new Response.MetaConfigDto
  55. {
  56. Keywords = config.Meta.Keywords,
  57. Description = config.Meta.Description,
  58. Author = config.Meta.Author,
  59. Viewport = config.Meta.Viewport,
  60. ApplicationName = config.Meta.ApplicationName,
  61. Generator = config.Meta.Generator,
  62. Robots = config.Meta.Robots,
  63. Adds = config.Meta.Adds
  64. },
  65. Company = new Response.CompanyConfigDto
  66. {
  67. Name = config.Company.Name,
  68. RegNo = config.Company.RegNo,
  69. Address = config.Company.Address,
  70. ZipCode = config.Company.ZipCode,
  71. Owner = config.Company.Owner,
  72. Tel = config.Company.Tel,
  73. Fax = config.Company.Fax,
  74. RetailSaleNo = config.Company.RetailSaleNo,
  75. AddedSaleNo = config.Company.AddedSaleNo,
  76. Hosting = config.Company.Hosting,
  77. AdminName = config.Company.AdminName,
  78. AdminEmail = config.Company.AdminEmail,
  79. SiteUrl = config.Company.SiteUrl,
  80. BankCode = config.Company.BankCode,
  81. BankOwner = config.Company.BankOwner,
  82. BankNumber = config.Company.BankNumber
  83. },
  84. Account = new Response.AccountConfigDto
  85. {
  86. IsRegisterBlock = config.Account.IsRegisterBlock,
  87. IsRegisterEmailAuth = config.Account.IsRegisterEmailAuth,
  88. PasswordMinLength = config.Account.PasswordMinLength,
  89. PasswordUppercaseLength = config.Account.PasswordUppercaseLength,
  90. PasswordNumbersLength = config.Account.PasswordNumbersLength,
  91. PasswordSpecialcharsLength = config.Account.PasswordSpecialcharsLength,
  92. DeniedEmailList = config.Account.DeniedEmailList,
  93. DeniedNameList = config.Account.DeniedNameList,
  94. ChangeEmailDay = config.Account.ChangeEmailDay,
  95. ChangeNameDay = config.Account.ChangeNameDay,
  96. ChangeSummaryDay = config.Account.ChangeSummaryDay,
  97. ChangeIntroDay = config.Account.ChangeIntroDay,
  98. ChangeThumbDay = config.Account.ChangeThumbDay,
  99. ChangePasswordDay = config.Account.ChangePasswordDay,
  100. IsLoginEmailVerifiedOnly = config.Account.IsLoginEmailVerifiedOnly,
  101. MaxLoginTryCount = config.Account.MaxLoginTryCount,
  102. MaxLoginTryLimitSecond = config.Account.MaxLoginTryLimitSecond
  103. },
  104. EmailTemplate = new Response.EmailTemplateConfigDto
  105. {
  106. RegisterEmailFormTitle = config.EmailTemplate.RegisterEmailFormTitle,
  107. RegisterEmailFormContent = config.EmailTemplate.RegisterEmailFormContent,
  108. RegistrationEmailFormTitle = config.EmailTemplate.RegistrationEmailFormTitle,
  109. RegistrationEmailFormContent = config.EmailTemplate.RegistrationEmailFormContent,
  110. ResetPasswordEmailFormTitle = config.EmailTemplate.ResetPasswordEmailFormTitle,
  111. ResetPasswordEmailFormContent = config.EmailTemplate.ResetPasswordEmailFormContent,
  112. ChangedPasswordEmailFormTitle = config.EmailTemplate.ChangedPasswordEmailFormTitle,
  113. ChangedPasswordEmailFormContent = config.EmailTemplate.ChangedPasswordEmailFormContent,
  114. WithdrawEmailFormTitle = config.EmailTemplate.WithdrawEmailFormTitle,
  115. WithdrawEmailFormContent = config.EmailTemplate.WithdrawEmailFormContent,
  116. WithdrawVerifyEmailFormTitle = config.EmailTemplate.WithdrawVerifyEmailFormTitle,
  117. WithdrawVerifyEmailFormContent = config.EmailTemplate.WithdrawVerifyEmailFormContent,
  118. EmailVerifyFormTitle = config.EmailTemplate.EmailVerifyFormTitle,
  119. EmailVerifyFormContent = config.EmailTemplate.EmailVerifyFormContent,
  120. ChangedEmailFormTitle = config.EmailTemplate.ChangedEmailFormTitle,
  121. ChangedEmailFormContent = config.EmailTemplate.ChangedEmailFormContent
  122. },
  123. External = new Response.ExternalApiConfigDto
  124. {
  125. YouTubeApiKeyEnc = config.External.YouTubeApiKeyEnc,
  126. YouTubeApiName = config.External.YouTubeApiName,
  127. GoogleClientId = config.External.GoogleClientId,
  128. GoogleClientSecretEnc = config.External.GoogleClientSecretEnc,
  129. GoogleAppId = config.External.GoogleAppId,
  130. NaverClientId = config.External.NaverClientId,
  131. NaverClientSecret = config.External.NaverClientSecretEnc,
  132. KakaoRestApiKey = config.External.KakaoRestApiKeyEnc,
  133. KakaoJavascriptKey = config.External.KakaoJavascriptKey,
  134. KakaoAdminKey = config.External.KakaoAdminKeyEnc,
  135. NaverSearchClientId = config.External.NaverSearchClientId,
  136. NaverSearchClientSecret = config.External.NaverSearchClientSecretEnc
  137. // 공개(/api/config)에는 암호문(enc) 그대로 — 복호화는 Admin PageModel 에서만
  138. },
  139. Toss = new Response.TossConfigDto
  140. {
  141. TossPayMode = config.External.TossPayMode,
  142. HasTestClientKey = !string.IsNullOrEmpty(config.External.TossTestClientKeyEnc),
  143. HasTestSecretKey = !string.IsNullOrEmpty(config.External.TossTestSecretKeyEnc),
  144. HasLiveClientKey = !string.IsNullOrEmpty(config.External.TossLiveClientKeyEnc),
  145. HasLiveSecretKey = !string.IsNullOrEmpty(config.External.TossLiveSecretKeyEnc)
  146. },
  147. Attendance = new Response.AttendanceConfigDto
  148. {
  149. IsEnabled = config.Attendance.IsEnabled,
  150. BaseExp = config.Attendance.BaseExp,
  151. BasePoint = config.Attendance.BasePoint,
  152. UseStreakBonus = config.Attendance.UseStreakBonus,
  153. StreakBonusPerDay = config.Attendance.StreakBonusPerDay,
  154. StreakBonusPointPerDay = config.Attendance.StreakBonusPointPerDay,
  155. StreakBonusMaxDays = config.Attendance.StreakBonusMaxDays,
  156. UseRankBonus = config.Attendance.UseRankBonus,
  157. RankBonusConfig = config.Attendance.RankBonusConfig
  158. },
  159. SignupReward = new Response.SignupRewardConfigDto
  160. {
  161. Enabled = config.SignupReward.Enabled,
  162. CoinAmount = config.SignupReward.CoinAmount,
  163. CashAmount = config.SignupReward.CashAmount,
  164. ExpAmount = config.SignupReward.ExpAmount
  165. },
  166. Reward = new Response.RewardConfigDto
  167. {
  168. PostExp = config.Reward.PostExp,
  169. PostPoint = config.Reward.PostPoint,
  170. CommentExp = config.Reward.CommentExp,
  171. CommentPoint = config.Reward.CommentPoint,
  172. LikeGivenExp = config.Reward.LikeGivenExp,
  173. LikeReceivedPoint = config.Reward.LikeReceivedPoint,
  174. MinPostLength = config.Reward.MinPostLength,
  175. MinCommentLength = config.Reward.MinCommentLength,
  176. NewMemberHoldDays = config.Reward.NewMemberHoldDays,
  177. PostDailyCount = config.Reward.PostDailyCount,
  178. PostDailyExp = config.Reward.PostDailyExp,
  179. PostDailyPoint = config.Reward.PostDailyPoint,
  180. CommentDailyCount = config.Reward.CommentDailyCount,
  181. CommentDailyExp = config.Reward.CommentDailyExp,
  182. CommentDailyPoint = config.Reward.CommentDailyPoint,
  183. LikeGivenDailyCount = config.Reward.LikeGivenDailyCount,
  184. LikeGivenDailyExp = config.Reward.LikeGivenDailyExp,
  185. LikeReceivedDailyCount = config.Reward.LikeReceivedDailyCount,
  186. LikeReceivedDailyPoint = config.Reward.LikeReceivedDailyPoint,
  187. ChatDailyCount = config.Reward.ChatDailyCount,
  188. ChatDailyExp = config.Reward.ChatDailyExp,
  189. CheerFeePercent = config.Reward.CheerFeePercent,
  190. CheerMinAmount = config.Reward.CheerMinAmount,
  191. CheerDailyMax = config.Reward.CheerDailyMax
  192. },
  193. Paper = new Response.PaperConfigDto
  194. {
  195. Enabled = config.Paper.Enabled,
  196. FeeRateBp = config.Paper.FeeRateBp,
  197. TaxRateBp = config.Paper.TaxRateBp,
  198. MinDeposit = config.Paper.MinDeposit,
  199. MaxHolding = config.Paper.MaxHolding,
  200. WithdrawProfitBurnBp = config.Paper.WithdrawProfitBurnBp,
  201. OrderMaxPctBp = config.Paper.OrderMaxPctBp,
  202. MinFillsForRank = config.Paper.MinFillsForRank
  203. },
  204. DataCollection = new Response.DataCollectionConfigDto
  205. {
  206. // 공개(/api/config)에는 암호문(enc) 그대로 — 복호화는 Admin PageModel 에서만
  207. DataGoKrServiceKey = config.DataCollection.DataGoKrServiceKeyEnc,
  208. KrxApiKey = config.DataCollection.KrxApiKeyEnc,
  209. OpenDartApiKey = config.DataCollection.OpenDartApiKeyEnc,
  210. KoreaEximExchangeKey = config.DataCollection.KoreaEximExchangeKeyEnc,
  211. KoreaEximLoanRateKey = config.DataCollection.KoreaEximLoanRateKeyEnc,
  212. KoreaEximIntlRateKey = config.DataCollection.KoreaEximIntlRateKeyEnc,
  213. SeibroApiKey = config.DataCollection.SeibroApiKeyEnc,
  214. KosisApiKey = config.DataCollection.KosisApiKeyEnc,
  215. StockDataMasterSync = config.DataCollection.StockDataMasterSync,
  216. StockDataDailyPriceSync = config.DataCollection.StockDataDailyPriceSync,
  217. KrxIndexSync = config.DataCollection.KrxIndexSync,
  218. KrxBondIndexSync = config.DataCollection.KrxBondIndexSync,
  219. KrxStockSync = config.DataCollection.KrxStockSync,
  220. KrxEtpSync = config.DataCollection.KrxEtpSync,
  221. KrxWarrantSync = config.DataCollection.KrxWarrantSync,
  222. KrxBondSync = config.DataCollection.KrxBondSync,
  223. KrxDerivativeSync = config.DataCollection.KrxDerivativeSync,
  224. KrxCommoditySync = config.DataCollection.KrxCommoditySync,
  225. KrxEsgSync = config.DataCollection.KrxEsgSync,
  226. OpenDartDisclosureSync = config.DataCollection.OpenDartDisclosureSync,
  227. KoreaEximMacroSync = config.DataCollection.KoreaEximMacroSync,
  228. KosisSync = config.DataCollection.KosisSync,
  229. WorldIndexEnabled = config.DataCollection.WorldIndexEnabled,
  230. MarketQuoteEnabled = config.DataCollection.MarketQuoteEnabled,
  231. SeibroIssuerSync = config.DataCollection.SeibroIssuerSync,
  232. SeibroDividendSync = config.DataCollection.SeibroDividendSync,
  233. SeibroSupplySync = config.DataCollection.SeibroSupplySync,
  234. SeibroCorpActionSync = config.DataCollection.SeibroCorpActionSync,
  235. SeibroBondSync = config.DataCollection.SeibroBondSync,
  236. SeibroDerivSync = config.DataCollection.SeibroDerivSync,
  237. SeibroForeignSync = config.DataCollection.SeibroForeignSync
  238. }
  239. };
  240. await cache.SetAsync(CacheKeys.Config, response, ct);
  241. return response;
  242. }
  243. }