using Application.Abstractions.Messaging; using Application.Abstractions.Data; using SharedKernel.Results; using Microsoft.EntityFrameworkCore; namespace Application.Features.Api.Forum.Post.Create; public sealed class Handler(IAppDbContext db) : ICommandHandler> { public async Task> Handle(Command request, CancellationToken ct) { if (string.IsNullOrWhiteSpace(request.Subject)) { return Result.Failure(Error.Problem("Post.SubjectRequired", "제목을 입력해주세요.")); } var board = await db.Board.AsNoTracking().FirstOrDefaultAsync(x => x.ID == request.BoardID, ct); if (board is null) { return Result.Failure(Error.NotFound("Post.BoardNotFound", "게시판을 찾을 수 없습니다.")); } var member = await db.Member.AsNoTracking().FirstOrDefaultAsync(x => x.ID == request.MemberID, ct); if (member is null) { return Result.Failure(Error.NotFound("Post.MemberNotFound", "회원 정보를 찾을 수 없습니다.")); } var post = new Domain.Entities.Forum.Posts.Post { BoardID = request.BoardID, BoardPrefixID = request.BoardPrefixID, MemberID = request.MemberID, Subject = request.Subject.Trim(), Content = request.Content ?? string.Empty, IsSecret = request.IsSecret, Name = member.Name, SID = member.SID, Email = member.Email }; await db.Post.AddAsync(post, ct); await db.SaveChangesAsync(ct); // Board 게시글 카운트 증가 var boardEntity = await db.Board.FirstOrDefaultAsync(x => x.ID == request.BoardID, ct); if (boardEntity is not null) { boardEntity.Posts++; boardEntity.UpdatedAt = DateTime.UtcNow; var boardGroup = await db.BoardGroup.FirstOrDefaultAsync(x => x.ID == boardEntity.BoardGroupID, ct); if (boardGroup is not null) { boardGroup.Posts++; boardGroup.UpdatedAt = DateTime.UtcNow; } // MemberStats 게시글 수 증가 var memberStats = await db.MemberStats.FirstOrDefaultAsync(x => x.MemberID == request.MemberID, ct); if (memberStats is not null) { memberStats.PostCount++; } await db.SaveChangesAsync(ct); } return post.ID; } }