using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Domain.Entities.Developers; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Api.Developers.Profile.UpsertProfile; internal sealed class Handler(IAppDbContext db) : ICommandHandler> { public async Task> Handle(Command request, CancellationToken ct) { if (string.IsNullOrWhiteSpace(request.CompanyName)) { return Result.Failure(Error.Problem("Developer.CompanyNameRequired", "회사명은 필수입니다.")); } if (string.IsNullOrWhiteSpace(request.BusinessNumber)) { return Result.Failure(Error.Problem("Developer.BusinessNumberRequired", "사업자번호는 필수입니다.")); } if (string.IsNullOrWhiteSpace(request.CeoName)) { return Result.Failure(Error.Problem("Developer.CeoNameRequired", "대표자명은 필수입니다.")); } if (string.IsNullOrWhiteSpace(request.ContactName)) { return Result.Failure(Error.Problem("Developer.ContactNameRequired", "담당자명은 필수입니다.")); } if (string.IsNullOrWhiteSpace(request.ContactPhone)) { return Result.Failure(Error.Problem("Developer.ContactPhoneRequired", "담당자 휴대폰은 필수입니다.")); } var existing = await db.Developer .AsTracking() .FirstOrDefaultAsync(c => c.MemberID == request.MemberID, ct); if (existing is null) { var newDev = Developer.Create( request.MemberID, request.CompanyName.Trim(), request.BusinessNumber.Trim(), request.CeoName.Trim(), request.ContactName.Trim(), request.ContactPhone.Trim() ); await db.Developer.AddAsync(newDev, ct); await db.SaveChangesAsync(ct); return Result.Success(new Response(newDev.ID, true)); } existing.UpdateCompanyInfo( request.CompanyName.Trim(), request.BusinessNumber.Trim(), request.CeoName.Trim(), request.ContactName.Trim(), request.ContactPhone.Trim() ); await db.SaveChangesAsync(ct); return Result.Success(new Response(existing.ID, false)); } }