Handler.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Domain.Entities.Donations;
  4. using Domain.Entities.Donations.ValueObject;
  5. using Microsoft.EntityFrameworkCore;
  6. namespace Application.Features.Api.DonationGoal.SaveConfig;
  7. internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
  8. {
  9. public async Task Handle(Command r, CancellationToken ct)
  10. {
  11. // 기간 중복 검증 (활성 + 기간 설정된 경우)
  12. if (r.IsActive && r.StartAt.HasValue && r.EndAt.HasValue)
  13. {
  14. var overlap = await db.DonationGoalConfig
  15. .AnyAsync(c => c.ChannelID == r.ChannelID
  16. && c.IsActive
  17. && c.ID != (r.ID ?? 0)
  18. && c.StartAt != null && c.EndAt != null
  19. && c.StartAt < r.EndAt && c.EndAt > r.StartAt, ct
  20. );
  21. if (overlap)
  22. {
  23. throw new InvalidOperationException("해당 기간에 이미 활성화된 목표가 존재합니다.");
  24. }
  25. }
  26. if (r.ID.HasValue)
  27. {
  28. var config = await db.DonationGoalConfig.FirstOrDefaultAsync(c => c.ID == r.ID.Value && c.ChannelID == r.ChannelID, ct);
  29. if (config is null)
  30. {
  31. throw new KeyNotFoundException("설정을 찾을 수 없습니다.");
  32. }
  33. config.Update(
  34. r.Title, (GoalWidgetStyle)r.Style, r.StartAmount, r.TargetAmount,
  35. r.StartAt, r.EndAt, r.IsShowPercent,
  36. r.BarColor, r.BarBackgroundColor, r.BarHeightPx,
  37. r.TitleFontSizePx, r.TitleFontColor,
  38. r.AmountFontSizePx, r.AmountFontColor,
  39. r.TitleFontFamily, r.AmountFontFamily,
  40. r.IsActive
  41. );
  42. }
  43. else
  44. {
  45. var config = DonationGoalConfig.Create(r.ChannelID, r.MemberID, r.Title, r.TargetAmount);
  46. config.Update(
  47. r.Title, (GoalWidgetStyle)r.Style, r.StartAmount, r.TargetAmount,
  48. r.StartAt, r.EndAt, r.IsShowPercent,
  49. r.BarColor, r.BarBackgroundColor, r.BarHeightPx,
  50. r.TitleFontSizePx, r.TitleFontColor,
  51. r.AmountFontSizePx, r.AmountFontColor,
  52. r.TitleFontFamily, r.AmountFontFamily,
  53. r.IsActive
  54. );
  55. db.DonationGoalConfig.Add(config);
  56. }
  57. await db.SaveChangesAsync(ct);
  58. }
  59. }