Working on user+org create
This commit is contained in:
parent
a15cc00595
commit
0010a32248
6 changed files with 49 additions and 21 deletions
12
Core/Telemetry/TelemetryExtensions.cs
Normal file
12
Core/Telemetry/TelemetryExtensions.cs
Normal 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() } };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
);";
|
);";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ using System.Data;
|
||||||
|
|
||||||
namespace PlanTempus.Database.Core
|
namespace PlanTempus.Database.Core
|
||||||
{
|
{
|
||||||
public class UserService
|
public class UserService
|
||||||
{
|
{
|
||||||
public record UserCreateCommand(string CorrelationId, string Email, string Password);
|
public record UserCreateCommand(string CorrelationId, string Email, string Password);
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
RETURNING id, created_at";
|
VALUES (@ConnectionString)
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue