PlanTempusApp/Database/Core/UserService.cs

80 lines
2.6 KiB
C#
Raw Normal View History

2025-01-21 23:26:05 +01:00
using Core.Entities.Users;
using Insight.Database;
using System.Data;
2025-02-06 23:46:55 +01:00
namespace Database.Core
2025-01-21 23:26:05 +01:00
{
public class UserService
{
2025-02-14 20:14:01 +01:00
public record UserCreateCommand(string CorrelationId, string Email, string Password);
2025-01-21 23:26:05 +01:00
private readonly IDbConnection _db;
public UserService(IDbConnection db)
{
_db = db;
}
2025-02-14 20:14:01 +01:00
public async Task CreateUser(UserCreateCommand command)
2025-01-21 23:26:05 +01:00
{
2025-02-14 20:14:01 +01:00
var user = new User
2025-01-21 23:26:05 +01:00
{
2025-02-14 20:14:01 +01:00
Email = command.Email,
PasswordHash = PasswordHasher.HashPassword(command.Password),
SecurityStamp = Guid.NewGuid().ToString(),
EmailConfirmed = false,
CreatedDate = DateTime.UtcNow
};
2025-01-21 23:26:05 +01:00
2025-02-14 20:14:01 +01:00
var userId = await _db.ExecuteScalarAsync<int>(@$"
INSERT INTO users (email, password_hash, security_stamp, email_confirmed, created_at)
2025-01-21 23:26:05 +01:00
VALUES (@Email, @PasswordHash, @SecurityStamp, @EmailConfirmed, @CreatedDate)
RETURNING id", user);
2025-02-14 20:14:01 +01:00
}
public async Task CreateOrganization(int userId, string organizationConnectionString)
{
var schema = "dev";
using var transaction = _db.OpenWithTransaction();
try
{
// Create organization
var organization = new Organization
2025-01-21 23:26:05 +01:00
{
2025-02-14 20:14:01 +01:00
ConnectionString = organizationConnectionString,
2025-01-21 23:26:05 +01:00
CreatedDate = DateTime.UtcNow,
CreatedBy = userId,
IsActive = true
};
2025-02-14 20:14:01 +01:00
var organizationId = await _db.ExecuteScalarAsync<int>(@$"
INSERT INTO {schema}.organizations (connection_string, created_date, created_by, is_active)
2025-01-21 23:26:05 +01:00
VALUES (@ConnectionString, @CreatedDate, @CreatedBy, @IsActive)
2025-02-14 20:14:01 +01:00
RETURNING id", organization);
2025-01-21 23:26:05 +01:00
2025-02-14 20:14:01 +01:00
// Link user to organization
var userOrganization = new UserOrganization
2025-01-21 23:26:05 +01:00
{
UserId = userId,
2025-02-14 20:14:01 +01:00
OrganizationId = organizationId,
2025-01-21 23:26:05 +01:00
CreatedDate = DateTime.UtcNow
};
await _db.ExecuteAsync(@$"
2025-02-14 20:14:01 +01:00
INSERT INTO {schema}.user_organizations (user_id, organization_id, created_date)
VALUES (@UserId, @OrganizationId, @CreatedDate)", userOrganization);
2025-01-21 23:26:05 +01:00
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
}
}