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); user.SetPassword(request.Password); var session = user.StartNewSession(); await context.AddAsync(user, cancellationToken); code.Redeem(user.Id); return new(new Session(session.Id, session.Expires), new UserInfo(user)); } }