diff options
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/aws')
4 files changed, 59 insertions, 31 deletions
diff --git a/services/docker/mail-server/aws-sendmail/aws/base.ts b/services/docker/mail-server/aws-sendmail/aws/base.ts deleted file mode 100644 index 1e23009..0000000 --- a/services/docker/mail-server/aws-sendmail/aws/base.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { getEnvRequired } from "../base.ts"; - -export class AwsContext { - readonly region = "ap-southeast-1"; - - accessKeyId = getEnvRequired("AWS_USER", "aws access key id"); - secretAccessKey = getEnvRequired("AWS_PASSWORD", "aws secret access key"); - - getCredentials() { - const { accessKeyId, secretAccessKey } = this; - return Promise.resolve({ accessKeyId, secretAccessKey }); - } - - readonly credentials = this.getCredentials.bind(this); -} diff --git a/services/docker/mail-server/aws-sendmail/aws/context.ts b/services/docker/mail-server/aws-sendmail/aws/context.ts new file mode 100644 index 0000000..65c8371 --- /dev/null +++ b/services/docker/mail-server/aws-sendmail/aws/context.ts @@ -0,0 +1,41 @@ +import { + CopyObjectCommand, + DeleteObjectCommand, + S3Client, +} from "@aws-sdk/client-s3"; + +import { getConfig } from "../config.ts"; + +export class AwsContext { + readonly region = "ap-southeast-1"; + + accessKeyId = getConfig().getValue("awsAccessKeyId"); + secretAccessKey = getConfig().getValue("awsSecretAccessKey"); + + getCredentials() { + const { accessKeyId, secretAccessKey } = this; + return Promise.resolve({ accessKeyId, secretAccessKey }); + } + + readonly credentials = this.getCredentials.bind(this); +} + +export async function s3MoveObject( + client: S3Client, + bucket: string, + path: string, + newPath: string, +): Promise<void> { + const copyCommand = new CopyObjectCommand({ + Bucket: bucket, + Key: newPath, + CopySource: path, + }); + await client.send(copyCommand); + + const deleteCommand = new DeleteObjectCommand({ + Bucket: bucket, + Key: path, + }); + await client.send(deleteCommand); +} diff --git a/services/docker/mail-server/aws-sendmail/aws/deliver.ts b/services/docker/mail-server/aws-sendmail/aws/deliver.ts index da100f5..5982d56 100644 --- a/services/docker/mail-server/aws-sendmail/aws/deliver.ts +++ b/services/docker/mail-server/aws-sendmail/aws/deliver.ts @@ -1,6 +1,6 @@ import { SendEmailCommand, SESv2Client } from "@aws-sdk/client-sesv2"; -import { AwsContext } from "./base.ts"; +import { AwsContext } from "./context.ts"; import { Mail, MailDeliverer } from "../mail.ts"; export class AwsMailDeliverer extends MailDeliverer { diff --git a/services/docker/mail-server/aws-sendmail/aws/retriver.ts b/services/docker/mail-server/aws-sendmail/aws/retriver.ts index cdfe6f1..1544c04 100644 --- a/services/docker/mail-server/aws-sendmail/aws/retriver.ts +++ b/services/docker/mail-server/aws-sendmail/aws/retriver.ts @@ -6,23 +6,23 @@ import { S3Client, } from "@aws-sdk/client-s3"; -import { generateTimeStringForFileName, getEnvRequired } from "../base.ts"; +import { generateTimeStringForFileName } from "../util.ts"; import { getLogger } from "../logger.ts"; -import { AwsContext } from "./base.ts"; -import { MailDeliverer } from "../mail.ts"; +import { AwsContext, s3MoveObject } from "./context.ts"; +import { getConfig } from "../config.ts"; export class AwsMailRetriever { - mailBucket = getEnvRequired( - "AWS_MAIL_BUCKET", - "aws s3 bucket saving raw mails", - ); - liveMailPrefix = "mail/live/"; - archiveMailPrefix = "mail/archive/"; + readonly liveMailPrefix = "mail/live/"; + readonly archiveMailPrefix = "mail/archive/"; + readonly mailBucket = getConfig().getValue("awsMailBucket"); - private s3Client; - private liveMailRecyclerAborter = new AbortController(); + private readonly s3Client; + private readonly liveMailRecyclerAborter = new AbortController(); - constructor(private aws: AwsContext, private localDeliverer: MailDeliverer) { + constructor( + aws: AwsContext, + private readonly callback: (rawMail: string) => Promise<void>, + ) { const { region, credentials } = aws; this.s3Client = new S3Client({ region, credentials }); } @@ -66,9 +66,10 @@ export class AwsMailRetriever { } async deliverS3MailObject(messageId: string) { + const mailPath = `${this.liveMailPrefix}${messageId}`; const command = new GetObjectCommand({ Bucket: this.mailBucket, - Key: `${this.liveMailPrefix}${messageId}`, + Key: mailPath, }); const res = await this.s3Client.send(command); @@ -78,9 +79,10 @@ export class AwsMailRetriever { } const rawMail = await res.Body.transformToString(); - await this.localDeliverer.deliverRaw(rawMail); + await this.callback(rawMail); - const archiveCommand = new + // TODO: Continue here. + await s3MoveObject(this.s3Client, this.mailBucket, mailPath, ); } async recycleLiveMails() { |