aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/aws-sendmail/db.ts
diff options
context:
space:
mode:
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/db.ts')
-rw-r--r--services/docker/mail-server/aws-sendmail/db.ts30
1 files changed, 29 insertions, 1 deletions
diff --git a/services/docker/mail-server/aws-sendmail/db.ts b/services/docker/mail-server/aws-sendmail/db.ts
index e239e72..e5307be 100644
--- a/services/docker/mail-server/aws-sendmail/db.ts
+++ b/services/docker/mail-server/aws-sendmail/db.ts
@@ -3,6 +3,11 @@
import { SQLocalKysely } from "sqlocal/kysely";
import { Generated, Insertable, Kysely, Migration, Migrator } from "kysely";
+import { Mail } from "./mail.ts";
+
+export class DbError extends Error {
+}
+
const tableNames = {
mail: {
table: "mail",
@@ -10,6 +15,7 @@ const tableNames = {
id: "id",
messageId: "message_id",
awsMessageId: "aws_message_id",
+ date: "date",
raw: "raw",
},
},
@@ -19,6 +25,7 @@ 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;
}
@@ -45,6 +52,7 @@ const migrations: Record<string, Migration> = {
(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())
.execute();
@@ -96,7 +104,27 @@ export class DbService {
await this._migrator.migrateToLatest();
}
- async addMail(mail: Insertable<MailTable>): Promise<void> {
+ async addMail(mail: Insertable<MailTable> | Mail, options?: {
+ allowNullAwsMessageId?: boolean;
+ }): Promise<void> {
+ if (mail instanceof Mail) {
+ if (mail.messageId == null) {
+ throw new DbError("Mail object has no message id.");
+ }
+ mail = {
+ message_id: mail.messageId,
+ aws_message_id: mail.awsMessageId,
+ date: mail.simpleGetDate()?.getTime(),
+ raw: mail.raw,
+ };
+ }
+ if (
+ mail.aws_message_id == null &&
+ !(options?.allowNullAwsMessageId === true)
+ ) {
+ throw new DbError("Aws message id is missing but it is required.");
+ }
+
await this._db.insertInto(tableNames.mail.table).values(mail)
.executeTakeFirstOrThrow();
}