PlanTempusApp/PlanTempus.Components/Users/Create/CreateUserHandler.cs

69 lines
2.3 KiB
C#
Raw Normal View History

2025-03-04 17:13:02 +01:00
using Insight.Database;
2025-03-06 00:05:58 +01:00
using Microsoft.ApplicationInsights;
2025-03-10 15:56:22 +01:00
using Npgsql;
using PlanTempus.Components.Users.Exceptions;
2025-03-04 17:13:02 +01:00
using PlanTempus.Core;
2025-03-10 15:56:22 +01:00
using PlanTempus.Core.Database;
2025-03-06 00:05:58 +01:00
using PlanTempus.Core.Telemetry;
2025-03-04 17:13:02 +01:00
namespace PlanTempus.Components.Users.Create
{
2025-03-10 18:10:00 +01:00
public interface ICommandHandler
{
Task<TCommandResult> Handle<TCommand, TCommandResult>(TCommand command );
}
public interface ICommandHandler<in T, TResult>
2025-03-10 15:56:22 +01:00
{
Task<TResult> Handle(T input);
}
2025-03-06 00:05:58 +01:00
public class CreateUserHandler(
TelemetryClient telemetryClient,
IDatabaseOperations databaseOperations,
2025-03-10 15:56:22 +01:00
ISecureTokenizer secureTokenizer) : ICommandHandler<CreateUserCommand, CreateUserResult>
2025-03-04 23:54:55 +01:00
{
public async Task<CreateUserResult> Handle(CreateUserCommand command)
{
using var db = databaseOperations.CreateScope(nameof(CreateUserHandler));
try
{
var sql = @"
2025-03-07 16:17:30 +01:00
INSERT INTO system.users(email , password_hash, security_stamp, email_confirmed,
2025-03-04 23:54:55 +01:00
access_failed_count, lockout_enabled,
is_active)
2025-03-04 17:13:02 +01:00
VALUES(@Email, @PasswordHash, @SecurityStamp, @EmailConfirmed,
2025-03-04 23:54:55 +01:00
@AccessFailedCount, @LockoutEnabled, @IsActive)
RETURNING id, created_at, email, is_active";
2025-03-04 17:13:02 +01:00
2025-03-04 23:54:55 +01:00
var data = await db.Connection.QuerySqlAsync<CreateUserResult>(sql, new
{
Email = command.Email,
PasswordHash = secureTokenizer.TokenizeText(command.Password),
SecurityStamp = Guid.NewGuid().ToString("N"),
EmailConfirmed = false,
AccessFailedCount = 0,
LockoutEnabled = false,
IsActive = command.IsActive,
});
2025-03-04 17:13:02 +01:00
2025-03-06 00:05:58 +01:00
var result = data.First();
2025-03-04 17:13:02 +01:00
2025-03-06 00:05:58 +01:00
telemetryClient.TrackTrace(GetType().Name, result.Format());
return result;
2025-03-04 23:54:55 +01:00
}
2025-03-10 15:56:22 +01:00
catch (PostgresException ex) when (ex.SqlState == "23505")
{
db.Error(ex);
throw new EmailAlreadyRegistreredException();
}
2025-03-04 23:54:55 +01:00
catch (Exception ex)
{
db.Error(ex);
throw;
}
}
}
2025-03-04 17:13:02 +01:00
}