Files
::: Configure the Files Module :::
Files are manged in minio a amazon s3 compatible object cloud storage. for more information and instruction on how to install or configure your own minio server refer to the official documentation.
Setup minio basics
In order to work with minio we have to first download and install the server on our local development environment or hosted on a remote server
Go ahead and download minio client you will use to configure your minio server and the actual minio server for your operating system here. Or if you want to use docker instead you can follow MinIO Docker quick start Guide.
Once you have configured minio server and client successfully following the installation guide you can now point unchained engine to store media files on it.
To connect your minio server with unchained you need to provide few environment variable listed below
MINIO_ENDPOINT
- server address in the format similar tohttp|s://domain-name:port
MINIO_ACCESS_KEY
- your minio access keyMINIO_SECRET_KEY
- your minio secret keyMINIO_BUCKET_NAME
- bucket nameMINIO_WEBHOOK_AUTH_TOKEN
- JWT token set initially when configuring the webhook
Note: don't forget to give the bucket public READ access.
How to use unchained api to store medias
Currently there are 2 ways you can upload media files mainly assortment, product and user avatar to minio using unchained api.
1. Directly uploading media BLOB
If you are using addProductMedia
, addAssortmentMedia
& updateUserAvatar
methods you are not required to do extra configuration and setup a webhook. a minio server with all the default configuration and a public read access enabled bucket and you are ready to go.
Flow of usage
Calling the corresponding media upload mutation listed above with the required parameters will be uploaded upon successful completion eg. below is for uploading product media.
mutation addProductMedia($media: Upload!, $productId: ID!) {
addProductMedia(media: $media, productId: $productId) {
_id
tags
}
}
2. pre-signed URL upload
The current file system supports pre-signed URL uploads for assortment, product and user avatar through the given API endpoints, this are prepareAssortmentMediaUpload
, prepareProductMediaUpload
and prepareUserAvatarUpload
.
In order to use pre-signed URL upload method successfully either of the two approach's are available.
Flow of usage
Manual upload confirmation
This is achieved by calling one of the above API which return a signed put URL to be used for uploading the media file along with the uploaded media ticket ID.
Once the upload successfully completes confirm the successful completion of the upload by calling confirmMediaUpload
.
eg. below uses product media upload.
mutation prepareProductMediaUpload($mediaName: String!, $productId: ID!) {
prepareProductMediaUpload(mediaName: $mediaName, productId: $productId) {
_id
putURL
expires
}
}
As you can see the above mutation will not upload the media instead it will take the media file name and return a signed put URL you will use to upload the media along with the expiration time of that URL and id. once you receive the put url upload the media file using any tool of your choice by making a put request to the given URL.
Finally tell unchained the file has been uploaded successfully by calling the confirmMediaUpload
API with the required parameters.
mutation confirmMediaUpload( $mediaUploadTicketId: ID!, $size: Int!, $type: String!) {
confirmMediaUpload(mediaUploadTicketId: $mediaUploadTicketId, size: $size, type: $type) {
_id
name
type
size
url
}
}
in this case mediaUploadTicketId
is the id provided to you when you first call prepareProductMediaUpload
while size
and type
are as there name suggests size and type of the file uploaded.
Webhook based confirmation
If you don't want to perform multiple request when uploading media files you can setup a webhook that listens for s3:ObjectCreated:Put
and link the uploaded file with the media. To make things easier we have already configured a minimal webhook the does just that and all you have to do is import at in boot file.
import '@unchainedshop/core-files/plugins/minio-webhook';
After this unchained will listen to s3:ObjectCreated:Put
event from minio and link media on successful uploads. Make sure to point your minio webhook to http|s://your-domain:port/minio
to use this webhook.
Flow of usage
the first and second steps are identical to manual upload in which you call one of the API's that will return a pre-signed URL for each media type followed by uploading the media BLOB to the provided URL. the only difference with this method is you don't have to confirm a successful media upload by calling confirmMediaUpload
because it will be handled by the webhook.
in order to successfully configure a webhook follow the this guide from the official minio documentation.
Note when configuring a webhook make sure you provide it with a secure JWT token and provide that token to unchained using the environment variable MINIO_WEBHOOK_AUTH_TOKEN
. if you are using the default provided webhook, make sure you point your webhook to http|s://your-domain/minio
.
http://localhost:4010/minio
https://unchained-remote-instance/minio