Handler.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using SharedKernel.Results;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Admin.Forum.BoardManager.Save;
  6. internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result>
  7. {
  8. public async Task<Result> Handle(Command request, CancellationToken ct)
  9. {
  10. // 삭제
  11. if (request.DeleteIDs is { Length: > 0 })
  12. {
  13. var deleteTargets = await db.BoardManager
  14. .Where(c => c.BoardID == request.BoardID && request.DeleteIDs.Contains(c.ID))
  15. .ToListAsync(ct);
  16. if (deleteTargets.Count > 0)
  17. {
  18. db.BoardManager.RemoveRange(deleteTargets);
  19. }
  20. }
  21. // 수정
  22. if (request.Updates is { Count: > 0 })
  23. {
  24. var updateIDs = request.Updates.Select(c => c.ID).ToList();
  25. var updateTargets = await db.BoardManager
  26. .Where(c => c.BoardID == request.BoardID && updateIDs.Contains(c.ID))
  27. .ToListAsync(ct);
  28. var updateByID = updateTargets.ToDictionary(c => c.ID);
  29. foreach (var row in request.Updates)
  30. {
  31. if (!updateByID.TryGetValue(row.ID, out var existing))
  32. {
  33. return Result.Failure(Error.NotFound("BoardManager.NotFound", $"존재하지 않는 ID: {row.ID}"));
  34. }
  35. existing.CanEdit = row.CanEdit;
  36. existing.CanDelete = row.CanDelete;
  37. existing.UpdatedAt = DateTime.UtcNow;
  38. }
  39. }
  40. // 신규 추가
  41. if (request.NewItem is not null)
  42. {
  43. // 회원 존재 확인 — FK 위반 사전 방지
  44. var memberExists = await db.Member
  45. .AsNoTracking()
  46. .AnyAsync(c => c.ID == request.NewItem.MemberID, ct);
  47. if (!memberExists)
  48. {
  49. return Result.Failure(Error.NotFound("BoardManager.MemberNotFound", $"존재하지 않는 회원 ID 입니다: {request.NewItem.MemberID}"));
  50. }
  51. var isDuplicate = await db.BoardManager
  52. .AsNoTracking()
  53. .AnyAsync(c => c.BoardID == request.BoardID && c.MemberID == request.NewItem.MemberID, ct);
  54. if (isDuplicate)
  55. {
  56. return Result.Failure(Error.Conflict("BoardManager.Duplicate", "이미 등록된 매니저입니다."));
  57. }
  58. db.BoardManager.Add(new Domain.Entities.Forum.Boards.BoardManager
  59. {
  60. BoardID = request.BoardID,
  61. MemberID = request.NewItem.MemberID,
  62. CanEdit = request.NewItem.CanEdit,
  63. CanDelete = request.NewItem.CanDelete
  64. });
  65. }
  66. await db.SaveChangesAsync(ct);
  67. return Result.Success();
  68. }
  69. }