37 lines
1.3 KiB
C#
37 lines
1.3 KiB
C#
using Aegis.Application.Abstractions;
|
|
using Aegis.Domain;
|
|
using Aegis.Repository.SQLite.Queries;
|
|
|
|
namespace Aegis.Repository.SQLite.Repositories;
|
|
|
|
public class UserIdentityRepository(SqliteConnectionFactory factory) : IUserIdentityRepository
|
|
{
|
|
public async Task<UserId> GetOrCreateAsync(
|
|
string subject,
|
|
string issuer,
|
|
string? displayName,
|
|
string? email,
|
|
CancellationToken ct)
|
|
{
|
|
await using var conn = factory.Open();
|
|
await using var cmd = conn.CreateCommand();
|
|
|
|
cmd.CommandText = UserQueries.GetOrCreate;
|
|
|
|
cmd.Parameters.AddWithValue("$user_id", NewId());
|
|
cmd.Parameters.AddWithValue("$created_at", DateTimeOffset.UtcNow.ToUnixTimeSeconds());
|
|
cmd.Parameters.AddWithValue("$sub", subject);
|
|
cmd.Parameters.AddWithValue("$iss", issuer);
|
|
cmd.Parameters.AddWithValue("$display_name", (object?)displayName ?? DBNull.Value);
|
|
cmd.Parameters.AddWithValue("$email", (object?)email ?? DBNull.Value);
|
|
|
|
var result = await cmd.ExecuteScalarAsync(ct);
|
|
if (result is null)
|
|
throw new InvalidOperationException("Failed to resolve user_id.");
|
|
|
|
return new UserId((string)result);
|
|
}
|
|
|
|
private static string NewId()
|
|
=> Guid.NewGuid().ToString("N"); // pode trocar por ULID depois
|
|
} |