"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.KyselyUserRepository = void 0; const User_1 = require("../../domain/entities/User"); const UniqueId_1 = require("../../../../shared/domain/UniqueId"); const Email_1 = require("../../domain/value-objects/Email"); const Role_1 = require("../../domain/value-objects/Role"); class KyselyUserRepository { constructor(db) { this.db = db; } async save(user) { const row = { id: user.id.toString(), email: user.email.value, name: user.name, password_hash: user.passwordHash, role: user.role.value, org_id: user.orgId ?? null, created_at: user.createdAt.getTime(), updated_at: user.updatedAt.getTime(), }; await this.db .insertInto('users') .values(row) .onConflict((oc) => oc.column('id').doUpdateSet({ name: row.name, role: row.role, org_id: row.org_id, updated_at: row.updated_at, })) .execute(); } async findById(id) { const row = await this.db .selectFrom('users') .selectAll() .where('id', '=', id) .executeTakeFirst(); return row ? this.toDomain(row) : undefined; } async findByEmail(email) { const row = await this.db .selectFrom('users') .selectAll() .where('email', '=', email.toLowerCase()) .executeTakeFirst(); return row ? this.toDomain(row) : undefined; } async findAll() { const rows = await this.db.selectFrom('users').selectAll().execute(); return rows.map((r) => this.toDomain(r)); } async count() { const result = await this.db .selectFrom('users') .select((eb) => eb.fn.count('id').as('count')) .executeTakeFirstOrThrow(); return Number(result.count); } toDomain(row) { return User_1.User.reconstitute({ email: Email_1.Email.create(row.email), name: row.name, passwordHash: row.password_hash, role: Role_1.Role.create(row.role), orgId: row.org_id ?? undefined, createdAt: new Date(row.created_at), updatedAt: new Date(row.updated_at), }, UniqueId_1.UniqueId.from(row.id)); } } exports.KyselyUserRepository = KyselyUserRepository;