| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- 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<Command, Result<int>>
- {
- public async Task<Result<int>> Handle(Command request, CancellationToken ct)
- {
- if (string.IsNullOrWhiteSpace(request.Subject))
- {
- return Result.Failure<int>(Error.Problem("Post.SubjectRequired", "제목을 입력해주세요."));
- }
- var board = await db.Board.AsNoTracking().FirstOrDefaultAsync(x => x.ID == request.BoardID, ct);
- if (board is null)
- {
- return Result.Failure<int>(Error.NotFound("Post.BoardNotFound", "게시판을 찾을 수 없습니다."));
- }
- var member = await db.Member.AsNoTracking().FirstOrDefaultAsync(x => x.ID == request.MemberID, ct);
- if (member is null)
- {
- return Result.Failure<int>(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;
- }
- }
|