39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
import type pg from 'pg';
|
|
import type { NotificationsRepository } from '../domain/ports.js';
|
|
import type { EmailMessage } from '../domain/notification.js';
|
|
|
|
interface MessageRow {
|
|
event_id: string;
|
|
template: string;
|
|
recipient: string;
|
|
status: string;
|
|
}
|
|
|
|
export class PgNotificationsRepository implements NotificationsRepository {
|
|
constructor(private readonly pool: pg.Pool) {}
|
|
|
|
async findByEventId(
|
|
eventId: string,
|
|
): Promise<{ template: string; recipient: string; status: string } | undefined> {
|
|
const result = await this.pool.query<MessageRow>(
|
|
'SELECT event_id, template, recipient, status FROM notifications_messages WHERE event_id = $1',
|
|
[eventId],
|
|
);
|
|
const row = result.rows[0];
|
|
return row
|
|
? { template: row.template, recipient: row.recipient, status: row.status }
|
|
: undefined;
|
|
}
|
|
|
|
async record(message: EmailMessage): Promise<{ created: boolean }> {
|
|
const result = await this.pool.query(
|
|
`INSERT INTO notifications_messages (event_id, template, recipient, subject, body)
|
|
VALUES ($1, $2, $3, $4, $5)
|
|
ON CONFLICT (event_id) DO NOTHING
|
|
RETURNING id`,
|
|
[message.eventId, message.template, message.recipient, message.subject, message.body],
|
|
);
|
|
return { created: (result.rowCount ?? 0) > 0 };
|
|
}
|
|
}
|