From 0010a322482075fa615c9735c6d1a4d4305c69bf Mon Sep 17 00:00:00 2001 From: "Janus C. H. Knudsen" Date: Thu, 6 Mar 2025 00:05:58 +0100 Subject: [PATCH] Working on user+org create --- Core/Telemetry/TelemetryExtensions.cs | 12 +++++++ Database/Core/DDL/SetupIdentitySystem.cs | 1 - Database/Core/UserService.cs | 11 +++---- .../Create/CreateOrganizationCommand.cs | 3 +- .../Create/CreateOrganizationHandler.cs | 31 +++++++++++++------ .../Users/Create/CreateUserHandler.cs | 12 +++++-- 6 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 Core/Telemetry/TelemetryExtensions.cs diff --git a/Core/Telemetry/TelemetryExtensions.cs b/Core/Telemetry/TelemetryExtensions.cs new file mode 100644 index 0000000..be33227 --- /dev/null +++ b/Core/Telemetry/TelemetryExtensions.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace PlanTempus.Core.Telemetry; + +public static class TelemetryExtensions +{ + public static Dictionary Format(this object obj) + { + return new Dictionary { { "Object", JObject.FromObject(obj).ToString() } }; + } +} \ No newline at end of file diff --git a/Database/Core/DDL/SetupIdentitySystem.cs b/Database/Core/DDL/SetupIdentitySystem.cs index e3da563..18838d5 100644 --- a/Database/Core/DDL/SetupIdentitySystem.cs +++ b/Database/Core/DDL/SetupIdentitySystem.cs @@ -84,7 +84,6 @@ namespace PlanTempus.Database.Core.DDL id SERIAL PRIMARY KEY, connection_string VARCHAR(500) NOT NULL, 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 );"; diff --git a/Database/Core/UserService.cs b/Database/Core/UserService.cs index da8e721..e74d291 100644 --- a/Database/Core/UserService.cs +++ b/Database/Core/UserService.cs @@ -5,7 +5,7 @@ using System.Data; namespace PlanTempus.Database.Core { - public class UserService + public class UserService { public record UserCreateCommand(string CorrelationId, string Email, string Password); @@ -18,7 +18,6 @@ namespace PlanTempus.Database.Core public async Task CreateUser(UserCreateCommand command) { - var user = new User { Email = command.Email, @@ -32,8 +31,8 @@ namespace PlanTempus.Database.Core INSERT INTO users (email, password_hash, security_stamp, email_confirmed, created_at) VALUES (@Email, @PasswordHash, @SecurityStamp, @EmailConfirmed, @CreatedDate) RETURNING id", user); - } + public async Task CreateOrganization(int userId, string organizationConnectionString) { var schema = "dev"; @@ -52,8 +51,8 @@ namespace PlanTempus.Database.Core }; var organizationId = await _db.ExecuteScalarAsync(@$" - INSERT INTO {schema}.organizations (connection_string, created_date, created_by, is_active) - VALUES (@ConnectionString, @CreatedDate, @CreatedBy, @IsActive) + INSERT INTO {schema}.organizations (connection_string, created_date, is_active) + VALUES (@ConnectionString, @CreatedDate, @IsActive) RETURNING id", organization); // Link user to organization @@ -77,4 +76,4 @@ namespace PlanTempus.Database.Core } } } -} +} \ No newline at end of file diff --git a/PlanTempus.Components/Organizations/Create/CreateOrganizationCommand.cs b/PlanTempus.Components/Organizations/Create/CreateOrganizationCommand.cs index 2b53493..57234c1 100644 --- a/PlanTempus.Components/Organizations/Create/CreateOrganizationCommand.cs +++ b/PlanTempus.Components/Organizations/Create/CreateOrganizationCommand.cs @@ -2,8 +2,7 @@ { public class CreateOrganizationCommand { - public string Name { get; set; } public string ConnectionString { get; set; } - public Guid CreatedById { get; set; } + public Guid UserId { get; set; } } } diff --git a/PlanTempus.Components/Organizations/Create/CreateOrganizationHandler.cs b/PlanTempus.Components/Organizations/Create/CreateOrganizationHandler.cs index 13f72b4..9c3172a 100644 --- a/PlanTempus.Components/Organizations/Create/CreateOrganizationHandler.cs +++ b/PlanTempus.Components/Organizations/Create/CreateOrganizationHandler.cs @@ -1,30 +1,41 @@ using Insight.Database; +using Microsoft.ApplicationInsights; using PlanTempus.Core.Sql; +using PlanTempus.Core.Telemetry; namespace PlanTempus.Components.Organizations.Create { - public class CreateOrganizationHandler(IDatabaseOperations databaseOperations) + public class CreateOrganizationHandler(TelemetryClient telemetryClient, IDatabaseOperations databaseOperations) { public async Task Handle(CreateOrganizationCommand command) { using var db = databaseOperations.CreateScope(nameof(CreateOrganizationHandler)); - + using var transaction = db.Connection.BeginTransaction(); try { - var sql = @"INSERT INTO organizations (connection_string, created_by) - VALUES (@ConnectionString, @CreatedBy) - RETURNING id, created_at"; + var createOrg = @" + INSERT INTO organizations (connection_string) + VALUES (@ConnectionString) + RETURNING id, created_at"; - - var data = await db.Connection.QuerySqlAsync(sql, new + var data = await db.Connection.QuerySqlAsync(createOrg, new { - ConnectionString = command.ConnectionString, - CreatedBy = command.CreatedById + command.ConnectionString }); + 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(); - return data.First(); + telemetryClient.TrackTrace(GetType().Name, orgResult.Format()); + return orgResult; } catch (Exception ex) { diff --git a/PlanTempus.Components/Users/Create/CreateUserHandler.cs b/PlanTempus.Components/Users/Create/CreateUserHandler.cs index f7d8694..53240c7 100644 --- a/PlanTempus.Components/Users/Create/CreateUserHandler.cs +++ b/PlanTempus.Components/Users/Create/CreateUserHandler.cs @@ -1,10 +1,15 @@ using Insight.Database; +using Microsoft.ApplicationInsights; using PlanTempus.Core; using PlanTempus.Core.Sql; +using PlanTempus.Core.Telemetry; namespace PlanTempus.Components.Users.Create { - public class CreateUserHandler(IDatabaseOperations databaseOperations, ISecureTokenizer secureTokenizer) + public class CreateUserHandler( + TelemetryClient telemetryClient, + IDatabaseOperations databaseOperations, + ISecureTokenizer secureTokenizer) { public async Task Handle(CreateUserCommand command) { @@ -32,8 +37,11 @@ namespace PlanTempus.Components.Users.Create db.Success(); + var result = data.First(); - return data.First(); + telemetryClient.TrackTrace(GetType().Name, result.Format()); + + return result; } catch (Exception ex) {