From edf9ed4e593063622aa39cdbebef4810bf2a5fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frane=20Poli=C4=87?= <16856471+fPolic@users.noreply.github.com> Date: Tue, 22 Aug 2023 13:05:30 +0200 Subject: [PATCH] fix(medusa-interfaces, medusa-file-*): flag for streaming to a private bucket (#4771) * wip: unify file service api * fix: flag type * fix: update Spaces service * fix: S3/Spaces - default to private * fix: MinIO `isPrivate` for `getPresignedDownloadUrl`, add `isPrivate` to `GetUploadedFileType` * chore: changeset --- .changeset/late-mugs-vanish.md | 8 +++++++ .../medusa-file-minio/src/services/minio.ts | 22 +++++++++---------- packages/medusa-file-s3/src/services/s3.ts | 4 +++- .../src/services/digital-ocean.js | 6 ++++- .../medusa/src/interfaces/file-service.ts | 3 ++- 5 files changed, 29 insertions(+), 14 deletions(-) create mode 100644 .changeset/late-mugs-vanish.md diff --git a/.changeset/late-mugs-vanish.md b/.changeset/late-mugs-vanish.md new file mode 100644 index 0000000000..3533372d10 --- /dev/null +++ b/.changeset/late-mugs-vanish.md @@ -0,0 +1,8 @@ +--- +"medusa-file-spaces": patch +"medusa-file-minio": patch +"medusa-file-s3": patch +"@medusajs/medusa": patch +--- + +fix(medusa-interfaces, medusa-file-\*): add `ìsPrivate` flag to the streaming methods, fix minio default bucket diff --git a/packages/medusa-file-minio/src/services/minio.ts b/packages/medusa-file-minio/src/services/minio.ts index f8205fd72c..0c656766b0 100644 --- a/packages/medusa-file-minio/src/services/minio.ts +++ b/packages/medusa-file-minio/src/services/minio.ts @@ -120,11 +120,10 @@ class MinioService extends AbstractFileService implements IFileService { async getUploadStreamDescriptor( fileData: UploadStreamDescriptorType & { - usePrivateBucket?: boolean contentType?: string } ) { - const usePrivateBucket = fileData.usePrivateBucket ?? true + const usePrivateBucket = fileData.isPrivate ?? true this.validatePrivateBucketConfiguration_(usePrivateBucket) @@ -149,10 +148,8 @@ class MinioService extends AbstractFileService implements IFileService { } } - async getDownloadStream( - fileData: GetUploadedFileType & { usePrivateBucket?: boolean } - ) { - const usePrivateBucket = !!fileData.usePrivateBucket + async getDownloadStream(fileData: GetUploadedFileType) { + const usePrivateBucket = fileData.isPrivate ?? true this.validatePrivateBucketConfiguration_(usePrivateBucket) const client = this.getClient(usePrivateBucket) @@ -164,14 +161,17 @@ class MinioService extends AbstractFileService implements IFileService { return client.getObject(params).createReadStream() } - async getPresignedDownloadUrl({ usePrivateBucket = true, ...fileData }) { - this.validatePrivateBucketConfiguration_(usePrivateBucket) - const client = this.getClient(usePrivateBucket, { + async getPresignedDownloadUrl({ + isPrivate = true, + ...fileData + }: GetUploadedFileType) { + this.validatePrivateBucketConfiguration_(isPrivate) + const client = this.getClient(isPrivate, { signatureVersion: "v4", }) const params = { - Bucket: usePrivateBucket ? this.private_bucket_ : this.bucket_, + Bucket: isPrivate ? this.private_bucket_ : this.bucket_, Key: `${fileData.fileKey}`, Expires: this.downloadUrlDuration, } @@ -179,7 +179,7 @@ class MinioService extends AbstractFileService implements IFileService { return await client.getSignedUrlPromise("getObject", params) } - validatePrivateBucketConfiguration_(usePrivateBucket) { + validatePrivateBucketConfiguration_(usePrivateBucket: boolean) { if ( usePrivateBucket && (!this.private_access_key_id_ || !this.private_bucket_) diff --git a/packages/medusa-file-s3/src/services/s3.ts b/packages/medusa-file-s3/src/services/s3.ts index 8767af9870..7ce87049f2 100644 --- a/packages/medusa-file-s3/src/services/s3.ts +++ b/packages/medusa-file-s3/src/services/s3.ts @@ -109,9 +109,11 @@ class S3Service extends AbstractFileService implements IFileService { const client = this.getClient() const pass = new stream.PassThrough() + const isPrivate = fileData.isPrivate ?? true // default to private + const fileKey = `${fileData.name}.${fileData.ext}` const params: PutObjectRequest = { - ACL: fileData.acl ?? "private", + ACL: isPrivate ? "private" : "public-read", Bucket: this.bucket_, Body: pass, Key: fileKey, diff --git a/packages/medusa-file-spaces/src/services/digital-ocean.js b/packages/medusa-file-spaces/src/services/digital-ocean.js index df67f45266..12838ab2d2 100644 --- a/packages/medusa-file-spaces/src/services/digital-ocean.js +++ b/packages/medusa-file-spaces/src/services/digital-ocean.js @@ -82,9 +82,13 @@ class DigitalOceanService extends AbstractFileService { const pass = new stream.PassThrough() + // default to private + const isPrivate = + typeof fileData.isPrivate === "undefined" ? true : fileData.isPrivate + const fileKey = `${fileData.name}.${fileData.ext}` const params = { - ACL: fileData.acl ?? "private", + ACL: isPrivate ? "private" : "public-read", Bucket: this.bucket_, Body: pass, Key: fileKey, diff --git a/packages/medusa/src/interfaces/file-service.ts b/packages/medusa/src/interfaces/file-service.ts index ab9c2c9c94..ca6280963d 100644 --- a/packages/medusa/src/interfaces/file-service.ts +++ b/packages/medusa/src/interfaces/file-service.ts @@ -15,6 +15,7 @@ export type FileServiceGetUploadStreamResult = { export type GetUploadedFileType = { fileKey: string + isPrivate?: boolean [x: string]: unknown } @@ -26,7 +27,7 @@ export type DeleteFileType = { export type UploadStreamDescriptorType = { name: string ext?: string - acl?: string + isPrivate?: boolean [x: string]: unknown }