Handler.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Admin.Forum.BoardGroup.Save
  5. {
  6. public sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Response>
  7. {
  8. public async Task<Response> Handle(Command request, CancellationToken ct)
  9. {
  10. var items = request.Items;
  11. var dbRows = await db.BoardGroup.ToListAsync(ct);
  12. var dbByID = dbRows.ToDictionary(c => c.ID);
  13. var requestIDs = items.Where(c => c.ID.HasValue && c.ID.Value > 0).Select(c => c.ID!.Value).ToHashSet();
  14. // 삭제 대상 조회
  15. var deleteTargets = dbRows.Where(x => !requestIDs.Contains(x.ID)).ToList();
  16. if (deleteTargets.Count > 0)
  17. {
  18. var deleteIDs = deleteTargets.Select(c => c.ID).ToList();
  19. var hasBoards = await db.Board.AsNoTracking().AnyAsync(c => deleteIDs.Contains(c.BoardGroupID), ct);
  20. if (hasBoards)
  21. {
  22. throw new InvalidOperationException("게시판이 등록된 분류는 삭제할 수 없습니다. 먼저 해당 게시판을 삭제하세요.");
  23. }
  24. db.BoardGroup.RemoveRange(deleteTargets);
  25. }
  26. ushort inserted = 0;
  27. ushort updated = 0;
  28. ushort deleted = 0;
  29. foreach (var row in items)
  30. {
  31. // 신규 추가
  32. if (!row.ID.HasValue || row.ID.Value <= 0)
  33. {
  34. if (await db.BoardGroup.AnyAsync(c => c.Code == row.Code, ct))
  35. {
  36. throw new InvalidOperationException($"`{row.Code}`는 이미 등록되었습니다.");
  37. }
  38. db.BoardGroup.Add(new Domain.Entities.Forum.Boards.BoardGroup
  39. {
  40. Code = row.Code,
  41. Name = row.Name,
  42. Order = row.Order
  43. });
  44. inserted++;
  45. continue;
  46. }
  47. // 수정
  48. if (!dbByID.TryGetValue(row.ID.Value, out var existing))
  49. {
  50. throw new InvalidOperationException($"존재하지 않는 ID: {row.ID.Value}");
  51. }
  52. if (existing.Code != row.Code && await db.BoardGroup.AnyAsync(c => c.Code == row.Code, ct))
  53. {
  54. throw new InvalidOperationException($"`{row.Code}`는 이미 등록되었습니다.");
  55. }
  56. existing.Code = row.Code;
  57. existing.Name = row.Name;
  58. existing.Order = row.Order;
  59. existing.UpdatedAt = DateTime.UtcNow;
  60. updated++;
  61. }
  62. deleted = (ushort)deleteTargets.Count;
  63. await db.SaveChangesAsync(ct);
  64. return new Response(inserted, updated, deleted);
  65. }
  66. }
  67. }