import { Kysely } from 'kysely'; import { Database } from '../../../../shared/infrastructure/DatabaseConnection'; import { ISessionRepository, AuthSession } from '../../domain/ports/ISessionRepository'; export class KyselySessionRepository implements ISessionRepository { constructor(private readonly db: Kysely) {} async save(session: AuthSession): Promise { await this.db .insertInto('auth_sessions') .values({ id: session.id, user_id: session.userId, token: session.token, expires_at: session.expiresAt.getTime(), created_at: session.createdAt.getTime(), }) .execute(); } async findByToken(token: string): Promise { const row = await this.db .selectFrom('auth_sessions') .selectAll() .where('token', '=', token) .executeTakeFirst(); if (!row) return undefined; return { id: row.id, userId: row.user_id, token: row.token, expiresAt: new Date(row.expires_at), createdAt: new Date(row.created_at), }; } async findByUserId(userId: string): Promise { const rows = await this.db .selectFrom('auth_sessions') .selectAll() .where('user_id', '=', userId) .where('expires_at', '>', Date.now()) .orderBy('created_at', 'desc') .execute(); return rows.map((row) => ({ id: row.id, userId: row.user_id, token: row.token, expiresAt: new Date(row.expires_at), createdAt: new Date(row.created_at), })); } async deleteByToken(token: string): Promise { await this.db.deleteFrom('auth_sessions').where('token', '=', token).execute(); } async deleteById(id: string): Promise { await this.db.deleteFrom('auth_sessions').where('id', '=', id).execute(); } async deleteExpired(): Promise { await this.db .deleteFrom('auth_sessions') .where('expires_at', '<', Date.now()) .execute(); } }