mirror of
https://github.com/EvolutionAPI/evolution-api.git
synced 2025-12-19 11:52:20 -06:00
refactor: integrations folder structure
This commit is contained in:
108
src/api/integrations/storage/s3/libs/minio.server.ts
Normal file
108
src/api/integrations/storage/s3/libs/minio.server.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
import { ConfigService, S3 } from '@config/env.config';
|
||||
import { Logger } from '@config/logger.config';
|
||||
import { BadRequestException } from '@exceptions';
|
||||
import * as MinIo from 'minio';
|
||||
import { join } from 'path';
|
||||
import { Readable, Transform } from 'stream';
|
||||
|
||||
const logger = new Logger('S3 Service');
|
||||
|
||||
const BUCKET = new ConfigService().get<S3>('S3');
|
||||
|
||||
interface Metadata extends MinIo.ItemBucketMetadata {
|
||||
'Content-Type': string;
|
||||
}
|
||||
|
||||
const minioClient = (() => {
|
||||
if (BUCKET?.ENABLE) {
|
||||
return new MinIo.Client({
|
||||
endPoint: BUCKET.ENDPOINT,
|
||||
port: BUCKET.PORT,
|
||||
useSSL: BUCKET.USE_SSL,
|
||||
accessKey: BUCKET.ACCESS_KEY,
|
||||
secretKey: BUCKET.SECRET_KEY,
|
||||
region: BUCKET.REGION,
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
||||
const bucketName = process.env.S3_BUCKET;
|
||||
|
||||
const bucketExists = async () => {
|
||||
if (minioClient) {
|
||||
try {
|
||||
const list = await minioClient.listBuckets();
|
||||
return list.find((bucket) => bucket.name === bucketName);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const setBucketPolicy = async () => {
|
||||
if (minioClient) {
|
||||
const policy = {
|
||||
Version: '2012-10-17',
|
||||
Statement: [
|
||||
{
|
||||
Effect: 'Allow',
|
||||
Principal: '*',
|
||||
Action: ['s3:GetObject'],
|
||||
Resource: [`arn:aws:s3:::${bucketName}/*`],
|
||||
},
|
||||
],
|
||||
};
|
||||
await minioClient.setBucketPolicy(bucketName, JSON.stringify(policy));
|
||||
}
|
||||
};
|
||||
|
||||
const createBucket = async () => {
|
||||
if (minioClient) {
|
||||
try {
|
||||
const exists = await bucketExists();
|
||||
if (!exists) {
|
||||
await minioClient.makeBucket(bucketName);
|
||||
}
|
||||
|
||||
await setBucketPolicy();
|
||||
|
||||
logger.info(`S3 Bucket ${bucketName} - ON`);
|
||||
return true;
|
||||
} catch (error) {
|
||||
logger.error('S3 ERROR:');
|
||||
logger.error(error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
createBucket();
|
||||
|
||||
const uploadFile = async (fileName: string, file: Buffer | Transform | Readable, size: number, metadata: Metadata) => {
|
||||
if (minioClient) {
|
||||
const objectName = join('evolution-api', fileName);
|
||||
try {
|
||||
metadata['custom-header-application'] = 'evolution-api';
|
||||
return await minioClient.putObject(bucketName, objectName, file, size, metadata);
|
||||
} catch (error) {
|
||||
logger.error(error);
|
||||
return error;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const getObjectUrl = async (fileName: string, expiry?: number) => {
|
||||
if (minioClient) {
|
||||
try {
|
||||
const objectName = join('evolution-api', fileName);
|
||||
if (expiry) {
|
||||
return await minioClient.presignedGetObject(bucketName, objectName, expiry);
|
||||
}
|
||||
return await minioClient.presignedGetObject(bucketName, objectName);
|
||||
} catch (error) {
|
||||
throw new BadRequestException(error?.message);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export { BUCKET, getObjectUrl, uploadFile };
|
||||
Reference in New Issue
Block a user