mirror of
https://github.com/sergeyyarkov/educt-server.git
synced 2026-10-11 10:19:20 +03:00
56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
import * as cloudinary from 'cloudinary';
|
|
import { UploadApiResponse, UploadApiOptions, ResponseCallback } from 'cloudinary';
|
|
import { MultipartFileContract } from '@ioc:Adonis/Core/BodyParser';
|
|
import { CloudinaryConfig, CloudinaryInterface } from '@ioc:Adonis/Addons/Cloudinary';
|
|
|
|
export default class CloudinaryService implements CloudinaryInterface {
|
|
private readonly config: CloudinaryConfig;
|
|
|
|
private cloudinary: typeof cloudinary;
|
|
|
|
constructor(config: CloudinaryConfig) {
|
|
/**
|
|
* Cloudinary config
|
|
*/
|
|
cloudinary.v2.config({
|
|
api_key: config.apiKey,
|
|
api_secret: config.apiSecret,
|
|
cloud_name: config.cloudName,
|
|
secure: config.secure,
|
|
});
|
|
|
|
this.cloudinary = cloudinary;
|
|
this.config = config;
|
|
}
|
|
|
|
public async upload(
|
|
file: MultipartFileContract,
|
|
publicId: string | undefined = undefined,
|
|
uploadOptions?: UploadApiOptions,
|
|
callback?: ResponseCallback
|
|
): Promise<UploadApiResponse> {
|
|
const path = CloudinaryService.getPathFromFile(file);
|
|
const response = await this.cloudinary.v2.uploader.upload(
|
|
path,
|
|
{ public_id: publicId, ...uploadOptions },
|
|
callback
|
|
);
|
|
|
|
return response;
|
|
}
|
|
|
|
public getConfig(): CloudinaryConfig {
|
|
return this.config;
|
|
}
|
|
|
|
public static getPathFromFile(file: MultipartFileContract): string {
|
|
const path = file.tmpPath ?? file.filePath;
|
|
|
|
if (!path) {
|
|
throw new Error('Cannot get file path from file');
|
|
}
|
|
|
|
return path;
|
|
}
|
|
}
|