How to Create a File Provider Module
In this document, you’ll learn how to create a file provider module and the methods you must implement in its main service.
1. Create Module Directory#
Start by creating a new directory for your module. For example, src/modules/my-file
.
2. Create the File Provider Service#
Create the file src/modules/my-file/service.ts
that holds the implementation of the module's main service. It must extend the AbstractFileProviderService
class imported from @medusajs/utils
:
constructor#
The constructor allows you to access resources from the module's container using the first parameter, and the module's options using the second parameter.
If you're creating a client or establishing a connection with a third-party service, do it in the constructor.
Example
1import { Logger } from "@medusajs/types"2import { AbstractFileProviderService } from "@medusajs/utils"3 4type InjectedDependencies = {5 logger: Logger6}7 8type Options = {9 apiKey: string10}11 12class MyFileProviderService extends AbstractFileProviderService {13 protected logger_: Logger14 protected options_: Options15 // assuming you're initializing a client16 protected client17 18 constructor (19 { logger }: InjectedDependencies,20 options: Options21 ) {22 super()23 24 this.logger_ = logger25 this.options_ = options26 27 // assuming you're initializing a client28 this.client = new Client(options)29 }30}31 32export default MyFileProviderService
constructor#
validateOptions#
Override this static method in order for the loader to validate the options provided to the module provider.
Parameters
options
Record<any, any>Returns
void
voidupload#
This method uploads a file using your provider's custom logic.
Example
Parameters
The file to upload
Returns
Promise
Promise<ProviderFileResultDTO>The uploaded file's details.
Promise
Promise<ProviderFileResultDTO>delete#
This method deletes the file from storage.
Example
Parameters
The details of the file to delete.
Returns
Promise
Promise<void>getPresignedDownloadUrl#
This method is used to retrieve a download URL of the file. For some providers, such as S3, a presigned URL indicates a temporary URL to get access to a file.
If your provider doesn’t perform or offer a similar functionality, you can return the URL to download the file.
Example
1class MyFileProviderService extends AbstractFileProviderService {2 // ...3 async getPresignedDownloadUrl(4 fileData: ProviderGetFileDTO5 ): Promise<string> {6 // TODO logic to get the presigned URL7 // Use the `file.fileKey` to delete the file8 // for example:9 return this.client.getPresignedUrl(fileData.fileKey)10 }11}
Parameters
fileData
ProviderGetFileDTOThe details of the file to get its
presigned URL.
fileData
ProviderGetFileDTOReturns
Promise
Promise<string>The file's presigned URL.
Promise
Promise<string>3. Create Module Definition File#
Create the file src/modules/my-file/index.ts
with the following content:
This exports the module's definition, indicating that the MyFileProviderService
is the module's service.
4. Use Module#
To use your File Module Provider, add it to the providers
array of the File Module:
1const { Modules } = require("@medusajs/utils")2 3// ...4 5module.exports = defineConfig({6 // ...7 modules: {8 [Modules.FILE]: {9 resolve: "@medusajs/file",10 options: {11 providers: [12 {13 resolve: "./modules/my-file",14 id: "my-file",15 options: {16 // provider options...17 },18 },19 ],20 },21 },22 }23})