diff options
Diffstat (limited to 'services/docker/mail-server/relay/db.ts')
-rw-r--r-- | services/docker/mail-server/relay/db.ts | 72 |
1 files changed, 36 insertions, 36 deletions
diff --git a/services/docker/mail-server/relay/db.ts b/services/docker/mail-server/relay/db.ts index 73c3abe..ee8bad1 100644 --- a/services/docker/mail-server/relay/db.ts +++ b/services/docker/mail-server/relay/db.ts @@ -6,19 +6,17 @@ import { Kysely, Migration, Migrator, - Selectable, SqliteDatabase, SqliteDialect, SqliteStatement, } from "kysely"; - import * as sqlite from "@db/sqlite"; class SqliteStatementAdapter implements SqliteStatement { constructor(public readonly stmt: sqlite.Statement) {} get reader(): boolean { - return this.stmt.columnNames.length >= 1; + return this.stmt.columnNames().length >= 1; } all(parameters: readonly unknown[]): unknown[] { @@ -57,7 +55,7 @@ class SqliteDatabaseAdapter implements SqliteDatabase { export class DbError extends Error { } -const tableNames = { +const NAMES = { mail: { table: "mail", columns: { @@ -71,46 +69,51 @@ const tableNames = { } as const; interface MailTable { - [tableNames.mail.columns.id]: Generated<number>; - [tableNames.mail.columns.messageId]: string; - [tableNames.mail.columns.awsMessageId]: string | null; - [tableNames.mail.columns.date]: number | null; - [tableNames.mail.columns.raw]: string; + [NAMES.mail.columns.id]: Generated<number>; + [NAMES.mail.columns.messageId]: string; + [NAMES.mail.columns.awsMessageId]: string | null; + [NAMES.mail.columns.date]: string | null; + [NAMES.mail.columns.raw]: string; } interface Database { - [tableNames.mail.table]: MailTable; + [NAMES.mail.table]: MailTable; } const migrations: Record<string, Migration> = { "0001-init": { // deno-lint-ignore no-explicit-any async up(db: Kysely<any>): Promise<void> { - const names = tableNames.mail; - await db.schema - .createTable(names.table) + .createTable(NAMES.mail.table) .addColumn( - names.columns.id, + NAMES.mail.columns.id, "integer", (col) => col.primaryKey().autoIncrement(), ) .addColumn( - names.columns.messageId, + NAMES.mail.columns.messageId, "text", (col) => col.notNull().unique(), ) - .addColumn(names.columns.awsMessageId, "text", (col) => col.unique()) - .addColumn(names.columns.date, "integer") - .addColumn(names.columns.raw, "text", (col) => col.notNull()) + .addColumn( + NAMES.mail.columns.awsMessageId, + "text", + (col) => col.unique(), + ) + .addColumn(NAMES.mail.columns.date, "text") + .addColumn(NAMES.mail.columns.raw, "text", (col) => col.notNull()) .execute(); for ( - const column of [names.columns.messageId, names.columns.awsMessageId] + const column of [ + NAMES.mail.columns.messageId, + NAMES.mail.columns.awsMessageId, + ] ) { await db.schema - .createIndex(`${names.table}_${column}`) - .on(names.table) + .createIndex(`${NAMES.mail.table}_${column}`) + .on(NAMES.mail.table) .column(column) .execute(); } @@ -118,7 +121,7 @@ const migrations: Record<string, Migration> = { // deno-lint-ignore no-explicit-any async down(db: Kysely<any>): Promise<void> { - await db.schema.dropTable(tableNames.mail.table).execute(); + await db.schema.dropTable(NAMES.mail.table).execute(); }, }, }; @@ -149,31 +152,28 @@ export class DbService { await this.#migrator.migrateToLatest(); } - async addMail(mail: Insertable<MailTable>): Promise<void> { - await this.#kysely.insertInto(tableNames.mail.table).values(mail) - .execute(); - } - - async listMails(): Promise<Selectable<MailTable>[]> { - return await this.#kysely.selectFrom(tableNames.mail.table).selectAll() - .execute(); + async addMail(mail: Insertable<MailTable>): Promise<number> { + const inserted = await this.#kysely.insertInto(NAMES.mail.table).values( + mail, + ).executeTakeFirstOrThrow(); + return Number(inserted.insertId!); } async messageIdToAws(messageId: string): Promise<string | null> { - const row = await this.#kysely.selectFrom(tableNames.mail.table).where( - tableNames.mail.columns.messageId, + const row = await this.#kysely.selectFrom(NAMES.mail.table).where( + NAMES.mail.columns.messageId, "=", messageId, - ).select(tableNames.mail.columns.awsMessageId).executeTakeFirst(); + ).select(NAMES.mail.columns.awsMessageId).executeTakeFirst(); return row?.aws_message_id ?? null; } async messageIdFromAws(awsMessageId: string): Promise<string | null> { - const row = await this.#kysely.selectFrom(tableNames.mail.table).where( - tableNames.mail.columns.awsMessageId, + const row = await this.#kysely.selectFrom(NAMES.mail.table).where( + NAMES.mail.columns.awsMessageId, "=", awsMessageId, - ).select(tableNames.mail.columns.messageId).executeTakeFirst(); + ).select(NAMES.mail.columns.messageId).executeTakeFirst(); return row?.message_id ?? null; } } |