@tsc_tech/medusa-plugin-cloudinary
Version:
A Medusa plugin to use Cloudinary as a file storage provider. Seamlessly upload, retrieve, and manage media files in your Medusa store using Cloudinary.
78 lines • 6.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("@medusajs/framework/utils");
const cloudinary_1 = require("cloudinary");
const stream_1 = require("stream");
const uuid_1 = require("uuid");
class CloudinaryFileProviderService extends utils_1.AbstractFileProviderService {
constructor({ logger }, options) {
super();
this.logger_ = logger;
this.options_ = options;
cloudinary_1.v2.config({
cloud_name: options.cloudName,
api_key: options.apiKey,
api_secret: options.apiSecret,
secure: options.secure ?? true,
});
}
static validateOptions(options) {
if (!options.apiKey || !options.apiSecret || !options.cloudName) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "API key, API secret or Cloud Name is required in the cloudinary provider's options.");
}
}
async upload(file) {
const publicId = this.generatePublicId(file.filename);
// Convert binary-encoded string to Buffer
const buffer = Buffer.from(file.content, "binary");
return new Promise((resolve, reject) => {
const uploadStream = cloudinary_1.v2.uploader.upload_stream({
resource_type: "auto",
public_id: publicId,
folder: this.options_?.folderName || undefined,
}, (error, result) => {
if (error)
return reject(error);
if (!result)
return reject(new Error("No result returned from Cloudinary upload."));
resolve({
url: result.secure_url,
key: result.public_id,
});
});
stream_1.Readable.from(buffer).pipe(uploadStream);
});
}
async delete(file) {
await cloudinary_1.v2.uploader.destroy(file.fileKey, { resource_type: "auto" });
}
async getAsBuffer(file) {
const url = cloudinary_1.v2.url(file.fileKey, { secure: true });
const response = await fetch(url);
return Buffer.from(await response.arrayBuffer());
}
async getDownloadStream(file) {
const url = cloudinary_1.v2.url(file.fileKey, { secure: true });
const response = await fetch(url);
return stream_1.Readable.fromWeb(response.body);
}
async getPresignedDownloadUrl(file) {
return cloudinary_1.v2.url(file.fileKey, { secure: true });
}
// helper function
cleanFilename(filename) {
return filename
.replace(/[^a-zA-Z0-9.\-_]/g, "_")
.replace(/_+/g, "_")
.replace(/^_+|_+$/g, "")
.toLowerCase();
}
generatePublicId(filename) {
const cleaned = this.cleanFilename(filename);
const unique = (0, uuid_1.v4)();
return `${unique}_${cleaned}`;
}
}
CloudinaryFileProviderService.identifier = "cloudinary";
exports.default = CloudinaryFileProviderService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvZmlsZS1jbG91ZGluYXJ5L3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFHbUM7QUFPbkMsMkNBQThDO0FBQzlDLG1DQUFrQztBQUNsQywrQkFBb0M7QUFjcEMsTUFBTSw2QkFBOEIsU0FBUSxtQ0FBMkI7SUFLdEUsWUFBWSxFQUFFLE1BQU0sRUFBd0IsRUFBRSxPQUFnQjtRQUM3RCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBRXhCLGVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDakIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzdCLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN2QixVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDN0IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSTtTQUM5QixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFnQjtRQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakUsTUFBTSxJQUFJLG1CQUFXLENBQ3BCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIscUZBQXFGLENBQ3JGLENBQUM7UUFDSCxDQUFDO0lBQ0YsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBMkI7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV0RCwwQ0FBMEM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxD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