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 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 }