-
Notifications
You must be signed in to change notification settings - Fork 80
/
Copy pathminio.server.ts
144 lines (127 loc) · 3.57 KB
/
minio.server.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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);
}
if (BUCKET?.IGNORE_POLICY) {
logger.info(`S3 Bucket ${bucketName} - ON`);
return true;
}
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);
}
}
};
const uploadTempFile = async (
folder: string,
fileName: string,
file: Buffer | Transform | Readable,
size: number,
metadata: Metadata,
) => {
if (minioClient) {
const objectName = join(folder, 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 deleteFile = async (folder: string, fileName: string) => {
if (minioClient) {
const objectName = join(folder, fileName);
try {
return await minioClient.removeObject(bucketName, objectName);
} catch (error) {
logger.error(error);
return error;
}
}
};
export { BUCKET, deleteFile, getObjectUrl, uploadFile, uploadTempFile };