UpdateConfigCommandHandler.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using Application.Abstractions.Data;
  2. using Domain.Entities.Common;
  3. using MediatR;
  4. using Microsoft.AspNetCore.Http;
  5. using Microsoft.EntityFrameworkCore;
  6. using SharedKernel.Storage;
  7. using DomainConfig = Domain.Entities.Common.Config;
  8. namespace Application.Features.Config.Commands;
  9. public sealed class UpdateConfigCommandHandler(IAppDbContext db, IFileStorage storage, IEditorImageService editorImage) : IRequestHandler<UpdateConfigCommand>
  10. {
  11. public async Task Handle(UpdateConfigCommand request, CancellationToken ct)
  12. {
  13. var config = await db.Config.OrderByDescending(x => x.ID).FirstOrDefaultAsync(ct);
  14. if (config is null)
  15. {
  16. config = DomainConfig.Create();
  17. db.Config.Add(config);
  18. }
  19. var basic = new BasicConfig { };
  20. var images = new ImagesConfig { };
  21. var meta = new MetaConfig { };
  22. var company = new CompanyConfig { };
  23. var account = new AccountConfig { };
  24. var emailTemplate = new EmailTemplateConfig { };
  25. var external = new ExternalApiConfig { };
  26. var payment = new PaymentConfig { };
  27. if (request.Basic != null)
  28. {
  29. basic.SiteName = request.Basic.SiteName;
  30. basic.SiteURL = request.Basic.SiteURL;
  31. basic.RootID = request.Basic.RootID;
  32. basic.FromEmail = request.Basic.FromEmail;
  33. basic.FromName = request.Basic.FromName;
  34. basic.SmtpServer = request.Basic.SmtpServer;
  35. basic.SmtpPort = request.Basic.SmtpPort;
  36. basic.SmtpEnableSSL = request.Basic.SmtpEnableSSL;
  37. basic.SmtpUsername = request.Basic.SmtpUsername;
  38. basic.SmtpPassword = request.Basic.SmtpPassword;
  39. basic.AdminWhiteIPList = request.Basic.AdminWhiteIPList;
  40. basic.FrontWhiteIPList = request.Basic.FrontWhiteIPList;
  41. basic.BlockAlertTitle = request.Basic.BlockAlertTitle;
  42. basic.BlockAlertContent = await SaveBytesAsync(request.Basic.BlockAlertContent, UploadFolder.Basic, UploadAddition.BlockAlertContent, ct);
  43. basic.IsMaintenance = request.Basic.IsMaintenance;
  44. basic.MaintenanceContent = await SaveBytesAsync(request.Basic.MaintenanceContent, UploadFolder.Basic, UploadAddition.MaintenanceContent, ct);
  45. } else {
  46. basic = config.Basic;
  47. }
  48. if (request.Images != null)
  49. {
  50. var del = request.ImagesDelete ?? new UpdateConfigCommand.ImagesDeleteFlags();
  51. images.Favicon = await ApplyImageAsync(del.Favicon, config.Images.Favicon, request.Images.FaviconFile, [".ico"], ct);
  52. images.LogoSquare = await ApplyImageAsync(del.LogoSquare, config.Images.LogoSquare, request.Images.LogoSquareFile, [".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg"], ct);
  53. images.LogoHorizontal = await ApplyImageAsync(del.LogoHorizontal, config.Images.LogoHorizontal, request.Images.LogoHorizontalFile, [".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg"], ct);
  54. images.OgDefault = await ApplyImageAsync(del.OgDefault, config.Images.OgDefault, request.Images.OgDefaultFile, [".jpg", ".jpeg", ".png", ".gif", ".webp"], ct);
  55. images.TwitterImage = await ApplyImageAsync(del.TwitterImage, config.Images.TwitterImage, request.Images.TwitterImageFile, [".jpg", ".jpeg", ".png", ".gif", ".webp"], ct);
  56. images.AppleTouchIcon = await ApplyImageAsync(del.AppleTouchIcon, config.Images.AppleTouchIcon, request.Images.AppleTouchIconFile, [".jpg", ".jpeg", ".png", ".gif", ".webp"], ct);
  57. images.AppIcon_192 = await ApplyImageAsync(del.AppIcon192, config.Images.AppIcon_192, request.Images.AppIcon192File, [".jpg", ".jpeg", ".png", ".gif", ".webp"], ct);
  58. images.AppIcon_512 = await ApplyImageAsync(del.AppIcon512, config.Images.AppIcon_512, request.Images.AppIcon512File, [".jpg", ".jpeg", ".png", ".gif", ".webp"], ct);
  59. } else {
  60. images = config.Images;
  61. }
  62. if (request.Meta != null)
  63. {
  64. meta.Keywords = request.Meta.Keywords;
  65. meta.Description = request.Meta.Description;
  66. meta.Author = request.Meta.Author;
  67. meta.Viewport = request.Meta.Viewport;
  68. meta.ApplicationName = request.Meta.ApplicationName;
  69. meta.Generator = request.Meta.Generator;
  70. meta.Robots = request.Meta.Robots;
  71. meta.Adds = request.Meta.Adds;
  72. }
  73. else
  74. {
  75. meta = config.Meta;
  76. }
  77. if (request.Company != null)
  78. {
  79. company.Name = request.Company.Name;
  80. company.RegNo = request.Company.RegNo;
  81. company.Address = request.Company.Address;
  82. company.ZipCode = request.Company.ZipCode;
  83. company.Owner = request.Company.Owner;
  84. company.Tel = request.Company.Tel;
  85. company.Fax = request.Company.Fax;
  86. company.RetailSaleNo = request.Company.RetailSaleNo;
  87. company.AddedSaleNo = request.Company.AddedSaleNo;
  88. company.Hosting = request.Company.Hosting;
  89. company.AdminName = request.Company.AdminName;
  90. company.AdminEmail = request.Company.AdminEmail;
  91. company.SiteUrl = request.Company.SiteUrl;
  92. company.BankCode = request.Company.BankCode;
  93. company.BankOwner = request.Company.BankOwner;
  94. company.BankNumber = request.Company.BankNumber;
  95. } else {
  96. company = config.Company;
  97. }
  98. if (request.Account != null)
  99. {
  100. account.IsRegisterBlock = request.Account.IsRegisterBlock;
  101. account.IsRegisterEmailAuth = request.Account.IsRegisterEmailAuth;
  102. account.PasswordMinLength = request.Account.PasswordMinLength;
  103. account.PasswordUppercaseLength = request.Account.PasswordUppercaseLength;
  104. account.PasswordNumbersLength = request.Account.PasswordNumbersLength;
  105. account.PasswordSpecialcharsLength = request.Account.PasswordSpecialcharsLength;
  106. account.DeniedEmailList = request.Account.DeniedEmailList;
  107. account.DeniedNameList = request.Account.DeniedNameList;
  108. account.ChangeEmailDay = request.Account.ChangeEmailDay;
  109. account.ChangeNameDay = request.Account.ChangeNameDay;
  110. account.ChangeSummaryDay = request.Account.ChangeSummaryDay;
  111. account.ChangeIntroDay = request.Account.ChangeIntroDay;
  112. account.ChangePasswordDay = request.Account.ChangePasswordDay;
  113. account.MaxLoginTryCount = request.Account.MaxLoginTryCount;
  114. account.MaxLoginTryLimitSecond = request.Account.MaxLoginTryLimitSecond;
  115. } else {
  116. account = config.Account;
  117. }
  118. if (request.EmailTemplate != null)
  119. {
  120. emailTemplate.RegisterEmailFormTitle = request.EmailTemplate.RegisterEmailFormTitle;
  121. emailTemplate.RegisterEmailFormContent = await SaveBytesAsync(request.EmailTemplate.RegisterEmailFormContent, UploadFolder.EmailTemplate, UploadAddition.RegisterEmailFormContent, ct);
  122. emailTemplate.RegistrationEmailFormTitle = request.EmailTemplate.RegistrationEmailFormTitle;
  123. emailTemplate.RegistrationEmailFormContent = await SaveBytesAsync(request.EmailTemplate.RegistrationEmailFormContent, UploadFolder.EmailTemplate, UploadAddition.RegistrationEmailFormContent, ct);
  124. emailTemplate.ResetPasswordEmailFormTitle = request.EmailTemplate.ResetPasswordEmailFormTitle;
  125. emailTemplate.ResetPasswordEmailFormContent = await SaveBytesAsync(request.EmailTemplate.ResetPasswordEmailFormContent, UploadFolder.EmailTemplate, UploadAddition.ResetPasswordEmailFormContent, ct);
  126. emailTemplate.ChangedPasswordEmailFormTitle = request.EmailTemplate.ChangedPasswordEmailFormTitle;
  127. emailTemplate.ChangedPasswordEmailFormContent = await SaveBytesAsync(request.EmailTemplate.ChangedPasswordEmailFormContent, UploadFolder.EmailTemplate, UploadAddition.ChangedPasswordEmailFormContent, ct);
  128. emailTemplate.WithdrawEmailFormTitle = request.EmailTemplate.WithdrawEmailFormTitle;
  129. emailTemplate.WithdrawEmailFormContent = await SaveBytesAsync(request.EmailTemplate.WithdrawEmailFormContent, UploadFolder.EmailTemplate, UploadAddition.WithdrawEmailFormContent, ct);
  130. emailTemplate.EmailVerifyFormTitle = request.EmailTemplate.EmailVerifyFormTitle;
  131. emailTemplate.EmailVerifyFormContent = await SaveBytesAsync(request.EmailTemplate.EmailVerifyFormContent, UploadFolder.EmailTemplate, UploadAddition.EmailVerifyFormContent, ct);
  132. emailTemplate.ChangedEmailFormTitle = request.EmailTemplate.ChangedEmailFormTitle;
  133. emailTemplate.ChangedEmailFormContent = await SaveBytesAsync(request.EmailTemplate.ChangedEmailFormContent, UploadFolder.EmailTemplate, UploadAddition.ChangedEmailFormContent, ct);
  134. } else {
  135. emailTemplate = config.EmailTemplate;
  136. }
  137. if (request.External != null)
  138. {
  139. external.YouTubeApiKeyEnc = request.External.YouTubeApiKeyEnc;
  140. external.YouTubeApiName = request.External.YouTubeApiName;
  141. external.GoogleClientId = request.External.GoogleClientId;
  142. external.GoogleClientSecretEnc = request.External.GoogleClientSecretEnc;
  143. external.GoogleAppId = request.External.GoogleAppId;
  144. } else {
  145. external = config.External;
  146. }
  147. if (request.Payment != null)
  148. {
  149. }
  150. config.Update(
  151. basic,
  152. images,
  153. meta,
  154. company,
  155. account,
  156. emailTemplate,
  157. external,
  158. payment
  159. );
  160. await db.SaveChangesAsync(ct);
  161. }
  162. private async Task<string?> ApplyImageAsync(bool deleteRequested, string? currentUrl, IFormFile? newFile, string[] allowedExtensions, CancellationToken ct)
  163. {
  164. if (deleteRequested)
  165. {
  166. storage.DeleteByUrl(currentUrl);
  167. return null;
  168. }
  169. var uploaded = await SaveFileAsync(newFile, allowedExtensions, ct);
  170. return uploaded ?? currentUrl;
  171. }
  172. private async Task<string?> SaveFileAsync(IFormFile? file, string[] allowedExtensions, CancellationToken ct)
  173. {
  174. var path = new FileStoragePath(UploadTarget.Upload, UploadFolder.Basic, null, null);
  175. var result = await storage.SaveFileAsync(file, path, allowedExtensions, ct);
  176. return result?.Url;
  177. }
  178. private async Task<string?> SaveBytesAsync(string? html, UploadFolder folder, UploadAddition? addition = null, CancellationToken ct = default)
  179. {
  180. var path = new FileStoragePath(UploadTarget.Editor, folder, null, addition);
  181. return await editorImage.UploadAsync(html, path, ct);
  182. }
  183. }