Handler.cs 2.3 KB

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