Handler.cs 2.9 KB

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