using MediatR; using Microsoft.EntityFrameworkCore; using MinAttest.Application.Abstractions; using MinAttest.Contracts.Employers; using MinAttest.Domain.Entities; namespace MinAttest.Application.Features.Employers.Commands; public record UpsertEmployerUserCommand( Guid EmployerId, string ExternalObjectId, string Email, string? Name, string Role ) : IRequest; public class UpsertEmployerUserCommandHandler(IAppDbContext db) : IRequestHandler { public async Task Handle(UpsertEmployerUserCommand request, CancellationToken cancellationToken) { var employer = await db.Employers.FirstOrDefaultAsync(e => e.Id == request.EmployerId, cancellationToken); if (employer is null) return null; var roleParsed = Enum.TryParse(request.Role, ignoreCase: true, out var role) ? role : EmployerUserRole.Issuer; var user = await db.EmployerUsers.FirstOrDefaultAsync(u => u.ExternalObjectId == request.ExternalObjectId, cancellationToken); if (user is null) { user = new EmployerUser { Id = Guid.NewGuid(), EmployerId = employer.Id, ExternalObjectId = request.ExternalObjectId, Email = request.Email, Name = request.Name, Role = roleParsed }; db.EmployerUsers.Add(user); } else { user.EmployerId = employer.Id; user.Email = request.Email; user.Name = request.Name; user.Role = roleParsed; } await db.SaveChangesAsync(cancellationToken); return new EmployerUserResponse(user.Id, user.EmployerId, user.ExternalObjectId, user.Email, user.Name, user.Role.ToString()); } }