aegis-api/Aegis.Infrastructure/SQLite/Repositories/UserIdentityRepository.cs

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
}