From 7ff36e8c4f24cf47ec1d3d88fc553fe828f32a19 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Thu, 30 May 2024 17:58:58 +0200 Subject: [PATCH] feat: add s3 env variables to .env.example --- .env.example | 7 ++++++ packages/server/src/config/index.ts | 10 ++++----- .../services/Attachments/DeleteAttachment.ts | 22 ++++++++++++++----- .../src/services/Attachments/GetAttachment.ts | 5 +++-- .../Attachments/GetAttachmentPresignedUrl.ts | 12 ++++------ 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/.env.example b/.env.example index dc38bf3e3..a9470e912 100644 --- a/.env.example +++ b/.env.example @@ -103,3 +103,10 @@ PLAID_DEVELOPMENT_REDIRECT_URI= LEMONSQUEEZY_API_KEY= LEMONSQUEEZY_STORE_ID= LEMONSQUEEZY_WEBHOOK_SECRET= + +# S3 documents and attachments +S3_REGION= +S3_ACCESS_KEY_ID= +S3_SECRET_ACCESS_KEY= +S3_ENDPOINT= +S3_BUCKET= \ No newline at end of file diff --git a/packages/server/src/config/index.ts b/packages/server/src/config/index.ts index 4af66af10..d4d982c37 100644 --- a/packages/server/src/config/index.ts +++ b/packages/server/src/config/index.ts @@ -233,10 +233,10 @@ module.exports = { * S3 for documents. */ s3: { - region: process.env.AWS_REGION, - accessKeyId: process.env.AWS_ACCESS_KEY_ID, - secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, - endpoint: process.env.AWS_ENDPOINT, - bucket: process.env.AWS_BUCKET, + region: process.env.S3_REGION, + accessKeyId: process.env.S3_ACCESS_KEY_ID, + secretAccessKey: process.env.S3_SECRET_ACCESS_KEY, + endpoint: process.env.S3_ENDPOINT, + bucket: process.env.S3_BUCKET, }, }; diff --git a/packages/server/src/services/Attachments/DeleteAttachment.ts b/packages/server/src/services/Attachments/DeleteAttachment.ts index e77a6fc7a..78db4b3d0 100644 --- a/packages/server/src/services/Attachments/DeleteAttachment.ts +++ b/packages/server/src/services/Attachments/DeleteAttachment.ts @@ -1,13 +1,19 @@ import { DeleteObjectCommand } from '@aws-sdk/client-s3'; -import { s3 } from '@/lib/S3/S3'; import { Inject, Service } from 'typedi'; +import { s3 } from '@/lib/S3/S3'; import HasTenancyService from '../Tenancy/TenancyService'; +import config from '@/config'; +import UnitOfWork from '../UnitOfWork'; +import { Knex } from 'knex'; @Service() export class DeleteAttachment { @Inject() private tenancy: HasTenancyService; + @Inject() + private uow: UnitOfWork; + /** * Deletes the give file attachment file key. * @param {number} tenantId @@ -17,7 +23,7 @@ export class DeleteAttachment { const { Document, DocumentLink } = this.tenancy.models(tenantId); const params = { - Bucket: process.env.AWS_BUCKET, + Bucket: config.s3.bucket, Key: filekey, }; await s3.send(new DeleteObjectCommand(params)); @@ -26,10 +32,14 @@ export class DeleteAttachment { .findOne('key', filekey) .throwIfNotFound(); - // Delete all document links - await DocumentLink.query().where('documentId', foundDocument.id).delete(); + await this.uow.withTransaction(tenantId, async (trx: Knex.Transaction) => { + // Delete all document links + await DocumentLink.query(trx) + .where('documentId', foundDocument.id) + .delete(); - // Delete thedocument. - await Document.query().findById(foundDocument.id).delete(); + // Delete thedocument. + await Document.query(trx).findById(foundDocument.id).delete(); + }); } } diff --git a/packages/server/src/services/Attachments/GetAttachment.ts b/packages/server/src/services/Attachments/GetAttachment.ts index bee12126e..0f70cc9f9 100644 --- a/packages/server/src/services/Attachments/GetAttachment.ts +++ b/packages/server/src/services/Attachments/GetAttachment.ts @@ -1,6 +1,7 @@ import { Service } from 'typedi'; -import { s3 } from '@/lib/S3/S3'; import { GetObjectCommand } from '@aws-sdk/client-s3'; +import { s3 } from '@/lib/S3/S3'; +import config from '@/config'; @Service() export class GetAttachment { @@ -11,7 +12,7 @@ export class GetAttachment { */ async getAttachment(tenantId: number, filekey: string) { const params = { - Bucket: process.env.AWS_BUCKET, + Bucket: config.s3.bucket, Key: filekey, }; const data = await s3.send(new GetObjectCommand(params)); diff --git a/packages/server/src/services/Attachments/GetAttachmentPresignedUrl.ts b/packages/server/src/services/Attachments/GetAttachmentPresignedUrl.ts index 191d9aecc..62ca3f91c 100644 --- a/packages/server/src/services/Attachments/GetAttachmentPresignedUrl.ts +++ b/packages/server/src/services/Attachments/GetAttachmentPresignedUrl.ts @@ -1,23 +1,19 @@ +import { Service } from 'typedi'; import { GetObjectCommand } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; import { s3 } from '@/lib/S3/S3'; -import { Service } from 'typedi'; +import config from '@/config'; @Service() export class getAttachmentPresignedUrl { /** * Retrieves the presigned url of the given attachment key. - * @param {string} key + * @param {string} key * @returns {Promise} */ async getPresignedUrl(key: string) { - const params = { - Bucket: process.env.AWS_BUCKET, - Key: key, - Expires: 60 * 5, // 5 minutes - }; const command = new GetObjectCommand({ - Bucket: process.env.AWS_BUCKET, + Bucket: config.s3.bucket, Key: key, }); const signedUrl = await getSignedUrl(s3, command, { expiresIn: 300 });