Handler.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Domain.Entities.Members;
  4. using Microsoft.EntityFrameworkCore;
  5. using SharedKernel.Results;
  6. namespace Application.Features.Api.MyPage.UpdateChatSettings;
  7. internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result>
  8. {
  9. public async Task<Result> Handle(Command request, CancellationToken ct)
  10. {
  11. var approve = await db.MemberApprove.FirstOrDefaultAsync(a => a.MemberID == request.MemberID, ct);
  12. if (approve is null)
  13. {
  14. var exists = await db.Member.AsNoTracking().AnyAsync(m => m.ID == request.MemberID, ct);
  15. if (!exists)
  16. {
  17. return Result.Failure(Error.NotFound("MyPage.MemberNotFound", "회원 정보를 찾을 수 없습니다."));
  18. }
  19. approve = MemberApprove.Create(request.MemberID);
  20. await db.MemberApprove.AddAsync(approve, ct);
  21. }
  22. approve.IsChatAllowInvite = request.AllowInvite;
  23. approve.IsChatAllowWhisper = request.AllowWhisper;
  24. approve.IsChatShowFollowingOnline = request.ShowFollowingOnline;
  25. try
  26. {
  27. await db.SaveChangesAsync(ct);
  28. }
  29. catch (DbUpdateException)
  30. {
  31. // 최초 저장 동시 요청 경합 — 다른 요청이 이미 MemberApprove 를 생성함(MemberID PK 충돌).
  32. // 재시도 시 갱신 경로로 성공한다.
  33. return Result.Failure(Error.Conflict("MyPage.ChatSettingsConflict", "설정 저장이 지연되었습니다. 다시 시도해 주세요."));
  34. }
  35. return Result.Success();
  36. }
  37. }