Handler.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using SharedKernel.Results;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Api.Forum.Post.Create;
  6. public sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result<int>>
  7. {
  8. public async Task<Result<int>> Handle(Command request, CancellationToken ct)
  9. {
  10. if (string.IsNullOrWhiteSpace(request.Subject))
  11. {
  12. return Result.Failure<int>(Error.Problem("Post.SubjectRequired", "제목을 입력해주세요."));
  13. }
  14. var board = await db.Board.AsNoTracking().FirstOrDefaultAsync(x => x.ID == request.BoardID, ct);
  15. if (board is null)
  16. {
  17. return Result.Failure<int>(Error.NotFound("Post.BoardNotFound", "게시판을 찾을 수 없습니다."));
  18. }
  19. var member = await db.Member.AsNoTracking().FirstOrDefaultAsync(x => x.ID == request.MemberID, ct);
  20. if (member is null)
  21. {
  22. return Result.Failure<int>(Error.NotFound("Post.MemberNotFound", "회원 정보를 찾을 수 없습니다."));
  23. }
  24. var post = new Domain.Entities.Forum.Posts.Post
  25. {
  26. BoardID = request.BoardID,
  27. BoardPrefixID = request.BoardPrefixID,
  28. MemberID = request.MemberID,
  29. Subject = request.Subject.Trim(),
  30. Content = request.Content ?? string.Empty,
  31. IsSecret = request.IsSecret,
  32. Name = member.Name,
  33. SID = member.SID,
  34. Email = member.Email
  35. };
  36. await db.Post.AddAsync(post, ct);
  37. await db.SaveChangesAsync(ct);
  38. // Board 게시글 카운트 증가
  39. var boardEntity = await db.Board.FirstOrDefaultAsync(x => x.ID == request.BoardID, ct);
  40. if (boardEntity is not null)
  41. {
  42. boardEntity.Posts++;
  43. boardEntity.UpdatedAt = DateTime.UtcNow;
  44. var boardGroup = await db.BoardGroup.FirstOrDefaultAsync(x => x.ID == boardEntity.BoardGroupID, ct);
  45. if (boardGroup is not null)
  46. {
  47. boardGroup.Posts++;
  48. boardGroup.UpdatedAt = DateTime.UtcNow;
  49. }
  50. // MemberStats 게시글 수 증가
  51. var memberStats = await db.MemberStats.FirstOrDefaultAsync(x => x.MemberID == request.MemberID, ct);
  52. if (memberStats is not null)
  53. {
  54. memberStats.PostCount++;
  55. }
  56. await db.SaveChangesAsync(ct);
  57. }
  58. return post.ID;
  59. }
  60. }