using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Domain.Entities.Developers.ValueObject; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using SharedKernel.Results; namespace Application.Features.Admin.Developers.Accounts.ApproveDeveloper; internal sealed class Handler(IAppDbContext db, IConfiguration config) : ICommandHandler { public async Task Handle(Command request, CancellationToken ct) { var dev = await db.Developer .AsTracking() .FirstOrDefaultAsync(c => c.ID == request.DeveloperID, ct); if (dev is null) { return Result.Failure(Error.NotFound("Developer.NotFound", "개발자 정보를 찾을 수 없습니다.")); } // dev 환경: Developers:SkipKyc=true 이면 KYC 검증 우회 (NICE/다날 미연동 상태에서도 진행 가능). // production 에는 이 설정을 두지 말 것. var skipKyc = config.GetValue("Developers:SkipKyc", false); if (!skipKyc && dev.KycStatus != KycStatus.Verified) { return Result.Failure(Error.Problem("Developer.KycRequired", "본인인증이 완료되지 않은 계정은 승인할 수 없습니다.")); } dev.Approve(request.AdminID); await db.SaveChangesAsync(ct); return Result.Success(); } }