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 { public async Task 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(); } }