Handler.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Domain.Entities.Forum.Constants;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Admin.Forum.BoardPrefix.Save;
  6. internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
  7. {
  8. public async Task Handle(Command request, CancellationToken ct)
  9. {
  10. // 삭제
  11. if (request.DeleteIDs is { Length: > 0 })
  12. {
  13. var deleteTargets = await db.BoardPrefix
  14. .Where(c => c.BoardID == request.BoardID && request.DeleteIDs.Contains(c.ID))
  15. .ToListAsync(ct);
  16. // 게시글이 등록된 말머리는 삭제 불가
  17. var hasPostsTargets = deleteTargets.Where(c => c.Posts > 0).ToList();
  18. if (hasPostsTargets.Count > 0)
  19. {
  20. throw new InvalidOperationException("게시글이 등록된 말머리는 삭제할 수 없습니다.");
  21. }
  22. if (deleteTargets.Count > 0)
  23. {
  24. db.BoardPrefix.RemoveRange(deleteTargets);
  25. }
  26. }
  27. // 수정
  28. if (request.Updates is { Count: > 0 })
  29. {
  30. var updateIDs = request.Updates.Select(c => c.ID).ToList();
  31. var updateTargets = await db.BoardPrefix
  32. .Where(c => c.BoardID == request.BoardID && updateIDs.Contains(c.ID))
  33. .ToListAsync(ct);
  34. var updateByID = updateTargets.ToDictionary(c => c.ID);
  35. foreach (var row in request.Updates)
  36. {
  37. if (!updateByID.TryGetValue(row.ID, out var existing))
  38. {
  39. throw new InvalidOperationException($"존재하지 않는 ID: {row.ID}");
  40. }
  41. existing.Name = row.Name;
  42. existing.Color = row.Color;
  43. existing.Order = row.Order;
  44. existing.IsActive = row.IsActive;
  45. existing.UpdatedAt = DateTime.UtcNow;
  46. }
  47. }
  48. // 신규 추가
  49. if (request.NewItem is not null)
  50. {
  51. var currentCount = await db.BoardPrefix
  52. .AsNoTracking()
  53. .CountAsync(c => c.BoardID == request.BoardID, ct);
  54. if (currentCount >= BoardConstant.MaxPrefixCount)
  55. {
  56. throw new InvalidOperationException($"말머리는 최대 {BoardConstant.MaxPrefixCount}개까지 등록할 수 있습니다.");
  57. }
  58. db.BoardPrefix.Add(new Domain.Entities.Forum.Boards.BoardPrefix
  59. {
  60. BoardID = request.BoardID,
  61. Name = request.NewItem.Name,
  62. Color = request.NewItem.Color,
  63. Order = request.NewItem.Order
  64. });
  65. }
  66. await db.SaveChangesAsync(ct);
  67. }
  68. }