using Femto.Common.Domain; using Femto.Modules.Auth.Application.Dto; using Femto.Modules.Auth.Data; using Femto.Modules.Auth.Models; using Microsoft.EntityFrameworkCore; namespace Femto.Modules.Auth.Application.Interface.Register; internal class RegisterCommandHandler(AuthContext context) : ICommandHandler { public async Task Handle( RegisterCommand request, CancellationToken cancellationToken ) { var now = DateTimeOffset.UtcNow; var code = await context .SignupCodes.Where(c => c.Code == request.SignupCode) .Where(c => c.ExpiresAt == null || c.ExpiresAt > now) .Where(c => c.RedeemingUserId == null) .SingleOrDefaultAsync(cancellationToken); if (code is null) throw new DomainError("invalid signup code"); var user = new UserIdentity(request.Username); await context.AddAsync(user, cancellationToken); user.SetPassword(request.Password); var session = Session.Strong(user.Id); await context.AddAsync(session, cancellationToken); code.Redeem(user.Id); return new(new SessionDto(session), new UserInfo(user)); } }