using Insight.Database; using Microsoft.ApplicationInsights; using Npgsql; using PlanTempus.Components.Users.Exceptions; using PlanTempus.Core; using PlanTempus.Core.Database; using PlanTempus.Core.Telemetry; namespace PlanTempus.Components.Users.Create { public interface ICommandHandler { Task Handle(TCommand command ); } public interface ICommandHandler { Task Handle(T input); } public class CreateUserHandler( TelemetryClient telemetryClient, IDatabaseOperations databaseOperations, ISecureTokenizer secureTokenizer) : ICommandHandler { public async Task Handle(CreateUserCommand command) { using var db = databaseOperations.CreateScope(nameof(CreateUserHandler)); try { var sql = @" INSERT INTO system.users(email , password_hash, security_stamp, email_confirmed, access_failed_count, lockout_enabled, is_active) VALUES(@Email, @PasswordHash, @SecurityStamp, @EmailConfirmed, @AccessFailedCount, @LockoutEnabled, @IsActive) RETURNING id, created_at, email, is_active"; var data = await db.Connection.QuerySqlAsync(sql, new { Email = command.Email, PasswordHash = secureTokenizer.TokenizeText(command.Password), SecurityStamp = Guid.NewGuid().ToString("N"), EmailConfirmed = false, AccessFailedCount = 0, LockoutEnabled = false, IsActive = command.IsActive, }); var result = data.First(); telemetryClient.TrackTrace(GetType().Name, result.Format()); return result; } catch (PostgresException ex) when (ex.SqlState == "23505") { db.Error(ex); throw new EmailAlreadyRegistreredException(); } catch (Exception ex) { db.Error(ex); throw; } } } }