using Application.Abstractions.Messaging; using Application.Abstractions.Data; using SharedKernel.Results; using Microsoft.EntityFrameworkCore; namespace Application.Features.Admin.Forum.Board.Create; public sealed class Handler(IAppDbContext db) : ICommandHandler { public async Task Handle(Command request, CancellationToken ct) { if (!await db.BoardGroup.AnyAsync(x => x.ID == request.BoardGroupID, ct)) { return Result.Failure(Error.NotFound("BoardGroup.NotFound", "게시판 분류를 찾을 수 없습니다.")); } if (await db.Board.AnyAsync(x => x.Code == request.Code, ct)) { return Result.Failure(Error.Conflict("Board.DuplicateCode", $"`{request.Code}`는 이미 등록된 게시판 주소입니다.")); } var board = new Domain.Entities.Forum.Boards.Board { BoardGroupID = request.BoardGroupID, Code = request.Code, Name = request.Name, Order = request.Order, IsSearch = request.IsSearch, IsActive = request.IsActive }; await db.Board.AddAsync(board, ct); await db.SaveChangesAsync(ct); // BoardMeta 동시 생성 (속성 초기화로 기본값 채워짐) db.BoardMeta.Add(new Domain.Entities.Forum.Boards.BoardMeta { BoardID = board.ID }); await db.SaveChangesAsync(ct); // BoardGroup의 Boards 카운트 증가 var boardGroup = await db.BoardGroup.FirstOrDefaultAsync(x => x.ID == request.BoardGroupID, ct); if (boardGroup is not null) { boardGroup.Boards++; boardGroup.UpdatedAt = DateTime.UtcNow; await db.SaveChangesAsync(ct); } return Result.Success(); } }