| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Domain.Entities.Members;
- using Microsoft.EntityFrameworkCore;
- using SharedKernel.Results;
- namespace Application.Features.Api.MyPage.UpdateChatSettings;
- internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result>
- {
- public async Task<Result> Handle(Command request, CancellationToken ct)
- {
- var approve = await db.MemberApprove.FirstOrDefaultAsync(a => a.MemberID == request.MemberID, ct);
- if (approve is null)
- {
- var exists = await db.Member.AsNoTracking().AnyAsync(m => m.ID == request.MemberID, ct);
- if (!exists)
- {
- return Result.Failure(Error.NotFound("MyPage.MemberNotFound", "회원 정보를 찾을 수 없습니다."));
- }
- approve = MemberApprove.Create(request.MemberID);
- await db.MemberApprove.AddAsync(approve, ct);
- }
- approve.IsChatAllowInvite = request.AllowInvite;
- approve.IsChatAllowWhisper = request.AllowWhisper;
- approve.IsChatShowFollowingOnline = request.ShowFollowingOnline;
- try
- {
- await db.SaveChangesAsync(ct);
- }
- catch (DbUpdateException)
- {
- // 최초 저장 동시 요청 경합 — 다른 요청이 이미 MemberApprove 를 생성함(MemberID PK 충돌).
- // 재시도 시 갱신 경로로 성공한다.
- return Result.Failure(Error.Conflict("MyPage.ChatSettingsConflict", "설정 저장이 지연되었습니다. 다시 시도해 주세요."));
- }
- return Result.Success();
- }
- }
|