Handler.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using SharedKernel.Results;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Admin.Forum.Board.Create;
  6. public sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result>
  7. {
  8. public async Task<Result> Handle(Command request, CancellationToken ct)
  9. {
  10. if (!await db.BoardGroup.AnyAsync(x => x.ID == request.BoardGroupID, ct))
  11. {
  12. return Result.Failure(Error.NotFound("BoardGroup.NotFound", "게시판 분류를 찾을 수 없습니다."));
  13. }
  14. if (await db.Board.AnyAsync(x => x.Code == request.Code, ct))
  15. {
  16. return Result.Failure(Error.Conflict("Board.DuplicateCode", $"`{request.Code}`는 이미 등록된 게시판 주소입니다."));
  17. }
  18. var board = new Domain.Entities.Forum.Boards.Board
  19. {
  20. BoardGroupID = request.BoardGroupID,
  21. Code = request.Code,
  22. Name = request.Name,
  23. Order = request.Order,
  24. IsSearch = request.IsSearch,
  25. IsActive = request.IsActive
  26. };
  27. await db.Board.AddAsync(board, ct);
  28. await db.SaveChangesAsync(ct);
  29. // BoardMeta 동시 생성 (속성 초기화로 기본값 채워짐)
  30. db.BoardMeta.Add(new Domain.Entities.Forum.Boards.BoardMeta { BoardID = board.ID });
  31. await db.SaveChangesAsync(ct);
  32. // BoardGroup의 Boards 카운트 증가
  33. var boardGroup = await db.BoardGroup.FirstOrDefaultAsync(x => x.ID == request.BoardGroupID, ct);
  34. if (boardGroup is not null)
  35. {
  36. boardGroup.Boards++;
  37. boardGroup.UpdatedAt = DateTime.UtcNow;
  38. await db.SaveChangesAsync(ct);
  39. }
  40. return Result.Success();
  41. }
  42. }