Working on user+org create

This commit is contained in:
Janus C. H. Knudsen 2025-03-06 00:05:58 +01:00
parent a15cc00595
commit 0010a32248
6 changed files with 49 additions and 21 deletions

View file

@ -0,0 +1,12 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace PlanTempus.Core.Telemetry;
public static class TelemetryExtensions
{
public static Dictionary<string, string> Format(this object obj)
{
return new Dictionary<string, string> { { "Object", JObject.FromObject(obj).ToString() } };
}
}

View file

@ -84,7 +84,6 @@ namespace PlanTempus.Database.Core.DDL
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
connection_string VARCHAR(500) NOT NULL, connection_string VARCHAR(500) NOT NULL,
is_active BOOLEAN NOT NULL DEFAULT TRUE, is_active BOOLEAN NOT NULL DEFAULT TRUE,
created_by INTEGER NOT NULL REFERENCES {_command.Schema}.users(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
);"; );";

View file

@ -18,7 +18,6 @@ namespace PlanTempus.Database.Core
public async Task CreateUser(UserCreateCommand command) public async Task CreateUser(UserCreateCommand command)
{ {
var user = new User var user = new User
{ {
Email = command.Email, Email = command.Email,
@ -32,8 +31,8 @@ namespace PlanTempus.Database.Core
INSERT INTO users (email, password_hash, security_stamp, email_confirmed, created_at) INSERT INTO users (email, password_hash, security_stamp, email_confirmed, created_at)
VALUES (@Email, @PasswordHash, @SecurityStamp, @EmailConfirmed, @CreatedDate) VALUES (@Email, @PasswordHash, @SecurityStamp, @EmailConfirmed, @CreatedDate)
RETURNING id", user); RETURNING id", user);
} }
public async Task CreateOrganization(int userId, string organizationConnectionString) public async Task CreateOrganization(int userId, string organizationConnectionString)
{ {
var schema = "dev"; var schema = "dev";
@ -52,8 +51,8 @@ namespace PlanTempus.Database.Core
}; };
var organizationId = await _db.ExecuteScalarAsync<int>(@$" var organizationId = await _db.ExecuteScalarAsync<int>(@$"
INSERT INTO {schema}.organizations (connection_string, created_date, created_by, is_active) INSERT INTO {schema}.organizations (connection_string, created_date, is_active)
VALUES (@ConnectionString, @CreatedDate, @CreatedBy, @IsActive) VALUES (@ConnectionString, @CreatedDate, @IsActive)
RETURNING id", organization); RETURNING id", organization);
// Link user to organization // Link user to organization

View file

@ -2,8 +2,7 @@
{ {
public class CreateOrganizationCommand public class CreateOrganizationCommand
{ {
public string Name { get; set; }
public string ConnectionString { get; set; } public string ConnectionString { get; set; }
public Guid CreatedById { get; set; } public Guid UserId { get; set; }
} }
} }

View file

@ -1,30 +1,41 @@
using Insight.Database; using Insight.Database;
using Microsoft.ApplicationInsights;
using PlanTempus.Core.Sql; using PlanTempus.Core.Sql;
using PlanTempus.Core.Telemetry;
namespace PlanTempus.Components.Organizations.Create namespace PlanTempus.Components.Organizations.Create
{ {
public class CreateOrganizationHandler(IDatabaseOperations databaseOperations) public class CreateOrganizationHandler(TelemetryClient telemetryClient, IDatabaseOperations databaseOperations)
{ {
public async Task<CreateOrganizationResult> Handle(CreateOrganizationCommand command) public async Task<CreateOrganizationResult> Handle(CreateOrganizationCommand command)
{ {
using var db = databaseOperations.CreateScope(nameof(CreateOrganizationHandler)); using var db = databaseOperations.CreateScope(nameof(CreateOrganizationHandler));
using var transaction = db.Connection.BeginTransaction();
try try
{ {
var sql = @"INSERT INTO organizations (connection_string, created_by) var createOrg = @"
VALUES (@ConnectionString, @CreatedBy) INSERT INTO organizations (connection_string)
VALUES (@ConnectionString)
RETURNING id, created_at"; RETURNING id, created_at";
var data = await db.Connection.QuerySqlAsync<CreateOrganizationResult>(createOrg, new
var data = await db.Connection.QuerySqlAsync<CreateOrganizationResult>(sql, new
{ {
ConnectionString = command.ConnectionString, command.ConnectionString
CreatedBy = command.CreatedById
}); });
var orgResult = data.First();
await db.Connection.ExecuteAsync(@$"
INSERT INTO user_organizations (user_id, organization_id)
VALUES (@UserId, @OrganizationId)",
new { command.UserId, OrganizationId = orgResult.Id });
transaction.Commit();
db.Success(); db.Success();
return data.First(); telemetryClient.TrackTrace(GetType().Name, orgResult.Format());
return orgResult;
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -1,10 +1,15 @@
using Insight.Database; using Insight.Database;
using Microsoft.ApplicationInsights;
using PlanTempus.Core; using PlanTempus.Core;
using PlanTempus.Core.Sql; using PlanTempus.Core.Sql;
using PlanTempus.Core.Telemetry;
namespace PlanTempus.Components.Users.Create namespace PlanTempus.Components.Users.Create
{ {
public class CreateUserHandler(IDatabaseOperations databaseOperations, ISecureTokenizer secureTokenizer) public class CreateUserHandler(
TelemetryClient telemetryClient,
IDatabaseOperations databaseOperations,
ISecureTokenizer secureTokenizer)
{ {
public async Task<CreateUserResult> Handle(CreateUserCommand command) public async Task<CreateUserResult> Handle(CreateUserCommand command)
{ {
@ -32,8 +37,11 @@ namespace PlanTempus.Components.Users.Create
db.Success(); db.Success();
var result = data.First();
return data.First(); telemetryClient.TrackTrace(GetType().Name, result.Format());
return result;
} }
catch (Exception ex) catch (Exception ex)
{ {