diff --git a/packages/medusa-file-minio/README.md b/packages/medusa-file-minio/README.md index e2fb95f7fc..005f1ab57e 100644 --- a/packages/medusa-file-minio/README.md +++ b/packages/medusa-file-minio/README.md @@ -13,4 +13,4 @@ Learn more about how you can use this plugin in the [documentation](https://docs access_key_id: "YOUR-ACCESS-KEY", secret_access_key: "YOUR-SECRET-KEY", } -``` \ No newline at end of file +``` diff --git a/packages/medusa/src/api/routes/admin/uploads/delete-upload.ts b/packages/medusa/src/api/routes/admin/uploads/delete-upload.ts index 52e65c2ded..5a4d2e5440 100644 --- a/packages/medusa/src/api/routes/admin/uploads/delete-upload.ts +++ b/packages/medusa/src/api/routes/admin/uploads/delete-upload.ts @@ -1,3 +1,6 @@ +import { IsString } from "class-validator" +import { validator } from "../../../../utils/validator" + /** * [delete] /uploads * operationId: "AdminDeleteUpload" @@ -11,14 +14,20 @@ * description: OK */ export default async (req, res) => { - try { - const fileService = req.scope.resolve("fileService") + const validated = await validator(AdminDeleteUploadReq, req.body, { + forbidUnknownValues: false, + }) - await fileService.delete(req.body.file) + const fileService = req.scope.resolve("fileService") - res.status(200).send({ id: "", object: "file", deleted: true }) - } catch (err) { - console.log(err) - throw err - } + await fileService.delete(validated) + + res + .status(200) + .send({ id: validated.file_key, object: "file", deleted: true }) +} + +class AdminDeleteUploadReq { + @IsString() + file_key: string } diff --git a/packages/medusa/src/api/routes/admin/uploads/get-download-url.ts b/packages/medusa/src/api/routes/admin/uploads/get-download-url.ts new file mode 100644 index 0000000000..6dfe7ccb93 --- /dev/null +++ b/packages/medusa/src/api/routes/admin/uploads/get-download-url.ts @@ -0,0 +1,43 @@ +import { IsString } from "class-validator" +import { AbstractFileService } from "../../../../interfaces" +import { validator } from "../../../../utils/validator" + +/** + * [get] /uploads + * operationId: "GetUploadsFileDownloadUrl" + * summary: "Gets a presigned download url for a file" + * description: "Gets a presigned download url for a file" + * x-authenticated: true + * requestBody: + * content: + * application/json: + * schema: + * required: + * - file_key + * properties: + * file_key: + * description: "key of the file to obtain the download link for" + * type: string + * - (path) fileKey=* {string} key of the file to obtain the download link for. + * tags: + * - Uploads + * responses: + * 200: + * description: OK + */ +export default async (req, res) => { + const validated = await validator(AdminGetUploadsFileDownloadUrlReq, req.body) + + const fileService: AbstractFileService = req.scope.resolve("fileService") + + const url = await fileService.getPresignedDownloadUrl({ + fileKey: validated.file_key, + }) + + res.status(200).send({ download_url: url }) +} + +class AdminGetUploadsFileDownloadUrlReq { + @IsString() + file_key: string +} diff --git a/packages/medusa/src/api/routes/admin/uploads/index.ts b/packages/medusa/src/api/routes/admin/uploads/index.ts index ceeceb50fa..60ee1b4ef8 100644 --- a/packages/medusa/src/api/routes/admin/uploads/index.ts +++ b/packages/medusa/src/api/routes/admin/uploads/index.ts @@ -16,8 +16,12 @@ export default (app) => { middlewares.wrap(require("./create-upload").default) ) - // removed on purpose - // route.post("/delete", middlewares.wrap(require("./delete-upload").default)) + route.delete("/", middlewares.wrap(require("./delete-upload").default)) + + route.get( + "/download-url", + middlewares.wrap(require("./get-download-url").default) + ) return app } @@ -29,4 +33,5 @@ export type AdminUploadRes = { export type AdminDeleteUploadRes = DeleteResponse export * from "./create-upload" -// export * from "./delete-upload" +export * from "./delete-upload" +export * from "./get-download-url" diff --git a/packages/medusa/src/interfaces/file-service.ts b/packages/medusa/src/interfaces/file-service.ts index db9b599bf6..e64a765fcb 100644 --- a/packages/medusa/src/interfaces/file-service.ts +++ b/packages/medusa/src/interfaces/file-service.ts @@ -18,6 +18,11 @@ export type GetUploadedFileType = { [x: string]: unknown } +export type DeleteFileType = { + fileKey: string + [x: string]: unknown +} + export type UploadStreamDescriptorType = { name: string ext?: string @@ -37,7 +42,7 @@ export interface IFileService> * remove file from fileservice * @param fileData Remove file described by record * */ - delete(fileData: Record): void + delete(fileData: DeleteFileType): Promise /** * upload file to fileservice from stream @@ -72,7 +77,7 @@ export abstract class AbstractFileService> fileData: Express.Multer.File ): Promise - abstract delete(fileData: Record): void + abstract delete(fileData: DeleteFileType): Promise abstract getUploadStreamDescriptor( fileData: UploadStreamDescriptorType diff --git a/packages/medusa/src/services/file.ts b/packages/medusa/src/services/file.ts index cc4121b218..c8618d4cae 100644 --- a/packages/medusa/src/services/file.ts +++ b/packages/medusa/src/services/file.ts @@ -15,7 +15,7 @@ class DefaultFileService extends AbstractFileService { "Please add a file service plugin in order to manipulate files in Medusa" ) } - delete(fileData: Record): void { + delete(fileData: Record): Promise { throw new MedusaError( MedusaError.Types.UNEXPECTED_STATE, "Please add a file service plugin in order to manipulate files in Medusa" diff --git a/packages/medusa/src/strategies/batch-jobs/product/export.ts b/packages/medusa/src/strategies/batch-jobs/product/export.ts index ff41cc2733..1ff315cf1a 100644 --- a/packages/medusa/src/strategies/batch-jobs/product/export.ts +++ b/packages/medusa/src/strategies/batch-jobs/product/export.ts @@ -290,7 +290,7 @@ export default class ProductExportStrategy extends AbstractBatchJobStrategy< await this.fileService_ .withTransaction(transactionManager) - .delete({ key: fileKey }) + .delete({ fileKey }) return } }