using AutoMapper; using LanguageExt.Common; using Microsoft.AspNetCore.Identity; using W542.GandalfReborn.Commands; using W542.GandalfReborn.Data.Database.Repositories; using W542.GandalfReborn.Data.Dto; using W542.GandalfReborn.Data.Entities.Security; using W542.GandalfReborn.Handlers.Commands; namespace W542.GandalfReborn.Handlers.Security; public class CreateAuthCodeCommandHandler(IPasswordHasher passwordHasher, TimeProvider timeProvider, IAuthCodeRepository authCodeRepository, IMapper mapper) : IGrCommandHandler> { private static readonly object MicrosoftIsAMeme = new(); public async Task> Handle(CreateAuthCodeCommand command, CancellationToken cancellationToken) { var code = passwordHasher.HashPassword(MicrosoftIsAMeme, command.SubjectId.ToString()); var expiresAt = timeProvider.GetUtcNow().AddMinutes(5); var authCodeEntity = new AuthCodeEntity { SubjectId = command.SubjectId, Expiration = expiresAt, IsRevoked = false, Code = code, Challenge = command.CodeChallenge, Algorithm = command.Algorithm, }; var insertedAuthCodeEntity = await authCodeRepository.Upsert(authCodeEntity); return insertedAuthCodeEntity.Match( success => mapper.Map(success), fail => new Result(fail) ); } }