yaml-admin-api 0.0.9 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -18,6 +18,8 @@ const generateCrud = async ({ app, db, entity_name, yml_entity, yml, options })
|
|
|
18
18
|
access_key_id: yml.upload.s3.access_key_id,
|
|
19
19
|
secret_access_key: yml.upload.s3.secret_access_key,
|
|
20
20
|
bucket: yml.upload.s3.bucket,
|
|
21
|
+
region: yml.upload.s3.region,
|
|
22
|
+
prefix: yml.upload.s3.prefix,
|
|
21
23
|
bucket_private: yml.upload.s3.bucket_private,
|
|
22
24
|
base_url: yml.upload.s3.base_url,
|
|
23
25
|
}) : withConfigLocal({
|
|
@@ -166,7 +168,7 @@ const generateCrud = async ({ app, db, entity_name, yml_entity, yml, options })
|
|
|
166
168
|
}
|
|
167
169
|
})
|
|
168
170
|
|
|
169
|
-
console.log('f', f
|
|
171
|
+
//console.log('f', f)
|
|
170
172
|
|
|
171
173
|
var name = req.query.name;
|
|
172
174
|
if (name == null && req.query.q)
|
|
@@ -364,7 +366,7 @@ const generateCrud = async ({ app, db, entity_name, yml_entity, yml, options })
|
|
|
364
366
|
const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' });
|
|
365
367
|
|
|
366
368
|
const currentTime = moment().format('YYYYMMDD_HHmmss');
|
|
367
|
-
const key =
|
|
369
|
+
const key = `/excel/${filename}${currentTime}.xlsx`;
|
|
368
370
|
await uploader.uploadSecure(key, excelBuffer);
|
|
369
371
|
let url = await uploader.getUrlSecure(key, auth);
|
|
370
372
|
return res.json({ r: true, url });
|
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
const moment = require('moment')
|
|
2
2
|
const fs = require('fs')
|
|
3
3
|
|
|
4
|
-
const getUrl = async (Key) => {
|
|
5
|
-
//console.log('getSignedUrl')
|
|
6
|
-
let r = await s3.getSignedUrl('getObject', {
|
|
7
|
-
Bucket:aws_bucket_private,
|
|
8
|
-
Key,
|
|
9
|
-
})
|
|
10
|
-
|
|
11
|
-
//console.log(r)
|
|
12
|
-
return r
|
|
13
|
-
}
|
|
14
|
-
|
|
15
4
|
const withConfigLocal = ({path, path_private, base_url, api_host}) => {
|
|
16
5
|
|
|
17
6
|
const upload = async (key, stream) => {
|
package/src/upload/s3Upload.js
CHANGED
|
@@ -2,46 +2,97 @@ const moment = require('moment')
|
|
|
2
2
|
const { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand } = require('@aws-sdk/client-s3')
|
|
3
3
|
const { getSignedUrl } = require('@aws-sdk/s3-request-presigner')
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
if(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
5
|
+
const whatIsContentType = (ext) => {
|
|
6
|
+
let contentType = 'image/jpeg'
|
|
7
|
+
if(ext == 'mp4')
|
|
8
|
+
contentType = 'video/mp4'
|
|
9
|
+
else if(ext == 'mov')
|
|
10
|
+
contentType = 'video/quicktime'
|
|
11
|
+
else if(ext == 'png')
|
|
12
|
+
contentType = 'image/png'
|
|
13
|
+
else if(ext == 'xlsx')
|
|
14
|
+
contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
15
|
+
else if(ext == 'zip')
|
|
16
|
+
contentType = 'application/zip'
|
|
17
|
+
else if(ext == 'pdf')
|
|
18
|
+
contentType = 'application/pdf'
|
|
19
|
+
else if(ext == 'docx')
|
|
20
|
+
contentType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
|
|
21
|
+
else if(ext == 'doc')
|
|
22
|
+
contentType = 'application/msword'
|
|
23
|
+
else if(ext == 'txt')
|
|
24
|
+
contentType = 'text/plain'
|
|
25
|
+
else if(ext == 'csv')
|
|
26
|
+
contentType = 'text/csv'
|
|
27
|
+
else if(ext == 'xls')
|
|
28
|
+
contentType = 'application/vnd.ms-excel'
|
|
29
|
+
else if(ext == 'pptx')
|
|
30
|
+
contentType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
|
|
31
|
+
else if(ext == 'ppt')
|
|
32
|
+
contentType = 'application/vnd.ms-powerpoint'
|
|
33
|
+
else if(ext == 'mp3')
|
|
34
|
+
contentType = 'audio/mpeg'
|
|
35
|
+
else if(ext == 'mov')
|
|
36
|
+
contentType = 'video/quicktime'
|
|
37
|
+
return contentType
|
|
19
38
|
}
|
|
20
39
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
40
|
+
|
|
41
|
+
const withConfigS3 = ({ access_key_id, secret_access_key, region, prefix, bucket, bucket_private, base_url }) => {
|
|
42
|
+
const s3 = new S3Client({
|
|
43
|
+
region: region,
|
|
44
|
+
credentials: {
|
|
45
|
+
accessKeyId: access_key_id,
|
|
46
|
+
secretAccessKey: secret_access_key
|
|
47
|
+
}
|
|
26
48
|
})
|
|
27
49
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
50
|
+
const upload = async (key, stream) => {
|
|
51
|
+
return await s3.send(new PutObjectCommand({
|
|
52
|
+
Bucket: bucket,
|
|
53
|
+
Key: key,
|
|
54
|
+
Body: stream,
|
|
55
|
+
ACL: 'public-read',
|
|
56
|
+
ContentType: whatIsContentType(key.split('.').pop()),
|
|
57
|
+
}))
|
|
58
|
+
}
|
|
31
59
|
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
60
|
+
const uploadSecure = async (Key, stream) => {
|
|
61
|
+
console.log('uploadSecure', prefix, Key)
|
|
62
|
+
return await s3.send(new PutObjectCommand({
|
|
63
|
+
Bucket: bucket_private,
|
|
64
|
+
Key: `${prefix}/${Key}`,
|
|
65
|
+
Body: stream,
|
|
66
|
+
ACL: 'private',
|
|
67
|
+
Expires: moment().add(10, 'minute').toDate(),
|
|
68
|
+
ContentType: whatIsContentType(Key.split('.').pop()),
|
|
69
|
+
}))
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const getUrl = async (Key) => {
|
|
73
|
+
return `${base_url}/${prefix}/${Key}`
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const getUrlSecure = async (Key) => {
|
|
77
|
+
const command = new GetObjectCommand({
|
|
78
|
+
Bucket: bucket_private,
|
|
79
|
+
Key: `${prefix}/${Key}`,
|
|
80
|
+
})
|
|
81
|
+
const r = await getSignedUrl(s3, command, { expiresIn: 600 })
|
|
82
|
+
return r
|
|
83
|
+
}
|
|
38
84
|
|
|
39
|
-
|
|
40
|
-
|
|
85
|
+
return {
|
|
86
|
+
upload,
|
|
87
|
+
uploadSecure,
|
|
88
|
+
getUrl,
|
|
89
|
+
getUrlSecure,
|
|
90
|
+
}
|
|
41
91
|
}
|
|
42
92
|
|
|
93
|
+
|
|
94
|
+
|
|
43
95
|
module.exports = {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
getSecureUrl,
|
|
96
|
+
withConfigS3,
|
|
97
|
+
whatIsContentType,
|
|
47
98
|
};
|
|
@@ -4,22 +4,11 @@ const { getSignedUrl } = require('@aws-sdk/s3-request-presigner')
|
|
|
4
4
|
const { genEntityIdWithKey } = require('../common/util.js');
|
|
5
5
|
const { S3Client } = require('@aws-sdk/client-s3')
|
|
6
6
|
const fs = require('fs')
|
|
7
|
-
|
|
8
|
-
const getContentType = (ext) => {
|
|
9
|
-
let contentType = 'image/jpeg'
|
|
10
|
-
if(ext == 'mp4')
|
|
11
|
-
contentType = 'video/mp4'
|
|
12
|
-
else if(ext == 'mov')
|
|
13
|
-
contentType = 'video/quicktime'
|
|
14
|
-
else if(ext == 'png')
|
|
15
|
-
contentType = 'image/png'
|
|
16
|
-
return contentType
|
|
17
|
-
}
|
|
18
|
-
|
|
7
|
+
const { whatIsContentType } = require('./s3Upload.js');
|
|
19
8
|
|
|
20
9
|
const generateS3UploadApi = async ({ app, db, yml, options }) => {
|
|
21
10
|
const auth = withConfig({ db, jwt_secret: yml.login["jwt-secret"] });
|
|
22
|
-
const { region, access_key_id, secret_access_key, bucket, bucket_private } = yml.upload.s3;
|
|
11
|
+
const { region, access_key_id, secret_access_key, prefix, bucket, bucket_private } = yml.upload.s3;
|
|
23
12
|
const getS3 = () => {
|
|
24
13
|
let s3 = new S3Client({
|
|
25
14
|
region: region,
|
|
@@ -33,15 +22,15 @@ const generateS3UploadApi = async ({ app, db, yml, options }) => {
|
|
|
33
22
|
|
|
34
23
|
app.get('/api/media/url/put/:ext', auth.isAuthenticated, async function(req, res){
|
|
35
24
|
let s3 = getS3()
|
|
36
|
-
let
|
|
25
|
+
let member_no = req.user.member_no || req.user.id;;
|
|
37
26
|
let fileName = await genEntityIdWithKey(db, 'file');
|
|
38
27
|
let ext = req.params.ext;
|
|
39
28
|
|
|
40
|
-
let contentType =
|
|
41
|
-
let key =
|
|
42
|
-
const uploadUrl = await getSignedUrl(s3, new PutObjectCommand({Bucket:
|
|
29
|
+
let contentType = whatIsContentType(ext)
|
|
30
|
+
let key = `${member_no}/${fileName}.${ext}`
|
|
31
|
+
const uploadUrl = await getSignedUrl(s3, new PutObjectCommand({Bucket: bucket,
|
|
43
32
|
ContentType: contentType,
|
|
44
|
-
Key: key}), { expiresIn: 300 });
|
|
33
|
+
Key: `${prefix}/${key}`}), { expiresIn: 300 });
|
|
45
34
|
|
|
46
35
|
let r = {upload_url:uploadUrl, key, fileName:`${fileName}.${ext}`, member_no, contentType}
|
|
47
36
|
console.log(r)
|
|
@@ -50,15 +39,15 @@ const generateS3UploadApi = async ({ app, db, yml, options }) => {
|
|
|
50
39
|
|
|
51
40
|
app.get('/api/media/url/secure/put/:ext', auth.isAuthenticated, async function(req, res){
|
|
52
41
|
let s3 = getS3()
|
|
53
|
-
let
|
|
42
|
+
let member_no = req.user.member_no || req.user.id;;
|
|
54
43
|
let fileName = await genEntityIdWithKey(db, 'file');
|
|
55
44
|
let ext = req.params.ext;
|
|
56
45
|
|
|
57
|
-
let contentType =
|
|
58
|
-
let key =
|
|
59
|
-
const uploadUrl = await getSignedUrl(s3, new PutObjectCommand({Bucket:
|
|
46
|
+
let contentType = whatIsContentType(ext)
|
|
47
|
+
let key = `${member_no}/${fileName}.${ext}`
|
|
48
|
+
const uploadUrl = await getSignedUrl(s3, new PutObjectCommand({Bucket: bucket_private,
|
|
60
49
|
ContentType: contentType,
|
|
61
|
-
Key: key}), { expiresIn: 300 });
|
|
50
|
+
Key: `${prefix}/${key}`}), { expiresIn: 300 });
|
|
62
51
|
|
|
63
52
|
let r = {upload_url:uploadUrl, key, fileName:`${fileName}.${ext}`, member_no, contentType}
|
|
64
53
|
|
|
@@ -72,12 +61,12 @@ const generateS3UploadApi = async ({ app, db, yml, options }) => {
|
|
|
72
61
|
let fileName = await genEntityIdWithKey(db, 'file');
|
|
73
62
|
let ext = req.params.ext;
|
|
74
63
|
|
|
75
|
-
let key =
|
|
76
|
-
let contentType =
|
|
64
|
+
let key = `/${member_no}/${fileName}.${ext}`;
|
|
65
|
+
let contentType = whatIsContentType(ext);
|
|
77
66
|
|
|
78
67
|
const createMultipartUpload = await s3.send(new CreateMultipartUploadCommand({
|
|
79
|
-
Bucket:
|
|
80
|
-
Key: key
|
|
68
|
+
Bucket: bucket_private,
|
|
69
|
+
Key: `${prefix}/${key}`,
|
|
81
70
|
ContentType: contentType
|
|
82
71
|
}));
|
|
83
72
|
|
|
@@ -90,8 +79,8 @@ const generateS3UploadApi = async ({ app, db, yml, options }) => {
|
|
|
90
79
|
let { key, uploadId, partNumber } = req.body;
|
|
91
80
|
|
|
92
81
|
const command = new UploadPartCommand({
|
|
93
|
-
Bucket:
|
|
94
|
-
Key: key
|
|
82
|
+
Bucket: bucket_private,
|
|
83
|
+
Key: `${prefix}/${key}`,
|
|
95
84
|
UploadId: uploadId,
|
|
96
85
|
PartNumber: partNumber
|
|
97
86
|
});
|
|
@@ -109,8 +98,8 @@ const generateS3UploadApi = async ({ app, db, yml, options }) => {
|
|
|
109
98
|
parts.sort((a, b) => a.PartNumber - b.PartNumber);
|
|
110
99
|
|
|
111
100
|
await s3.send(new CompleteMultipartUploadCommand({
|
|
112
|
-
Bucket:
|
|
113
|
-
Key: key
|
|
101
|
+
Bucket: bucket_private,
|
|
102
|
+
Key: `${prefix}/${key}`,
|
|
114
103
|
UploadId: uploadId,
|
|
115
104
|
MultipartUpload: { Parts: parts }
|
|
116
105
|
}));
|
|
@@ -125,8 +114,8 @@ const generateS3UploadApi = async ({ app, db, yml, options }) => {
|
|
|
125
114
|
const s3 = getS3();
|
|
126
115
|
|
|
127
116
|
await s3.send(new AbortMultipartUploadCommand({
|
|
128
|
-
Bucket:
|
|
129
|
-
Key: key
|
|
117
|
+
Bucket: bucket_private,
|
|
118
|
+
Key: `${prefix}/${key}`,
|
|
130
119
|
UploadId: uploadId
|
|
131
120
|
}));
|
|
132
121
|
|
|
@@ -139,17 +128,17 @@ const generateS3UploadApi = async ({ app, db, yml, options }) => {
|
|
|
139
128
|
|
|
140
129
|
app.post('/api/media/url/put', auth.isAuthenticated, async function(req, res) {
|
|
141
130
|
let s3 = getS3()
|
|
142
|
-
let
|
|
131
|
+
let member_no = req.user.member_no || req.user.id;
|
|
143
132
|
const {ext_list} = req.body
|
|
144
133
|
|
|
145
134
|
let r = {list:[], r:true}
|
|
146
135
|
for(let ext of ext_list) {
|
|
147
136
|
let fileName = await genEntityIdWithKey(db, 'file')
|
|
148
|
-
let key =
|
|
149
|
-
let contentType =
|
|
150
|
-
const upload_url = await getSignedUrl(s3, new PutObjectCommand({Bucket:
|
|
137
|
+
let key = `/${member_no}/${fileName}.${ext}`
|
|
138
|
+
let contentType = whatIsContentType(ext)
|
|
139
|
+
const upload_url = await getSignedUrl(s3, new PutObjectCommand({Bucket: bucket,
|
|
151
140
|
ContentType: contentType,
|
|
152
|
-
Key: key}), { expiresIn: 300 });
|
|
141
|
+
Key: `${prefix}/${key}`}), { expiresIn: 300 });
|
|
153
142
|
|
|
154
143
|
r.list.push({upload_url, key, fileName:`${fileName}.${ext}`, member_no, contentType})
|
|
155
144
|
}
|
|
@@ -159,17 +148,17 @@ const generateS3UploadApi = async ({ app, db, yml, options }) => {
|
|
|
159
148
|
|
|
160
149
|
app.post('/api/media/url/secure/put', auth.isAuthenticated, async function(req, res) {
|
|
161
150
|
let s3 = getS3()
|
|
162
|
-
let
|
|
151
|
+
let member_no = req.user.member_no || req.user.id;
|
|
163
152
|
const {ext_list} = req.body
|
|
164
153
|
|
|
165
154
|
let r = {list:[], r:true}
|
|
166
155
|
for(let ext of ext_list) {
|
|
167
156
|
let fileName = await genEntityIdWithKey(db, 'file')
|
|
168
|
-
let key =
|
|
169
|
-
let contentType =
|
|
170
|
-
const upload_url = await getSignedUrl(s3, new PutObjectCommand({Bucket:
|
|
157
|
+
let key = `${member_no}/${fileName}.${ext}`
|
|
158
|
+
let contentType = whatIsContentType(ext)
|
|
159
|
+
const upload_url = await getSignedUrl(s3, new PutObjectCommand({Bucket: bucket_private,
|
|
171
160
|
ContentType: contentType,
|
|
172
|
-
Key: key}), { expiresIn: 300 });
|
|
161
|
+
Key: `${prefix}/${key}`}), { expiresIn: 300 });
|
|
173
162
|
|
|
174
163
|
r.list.push({upload_url, key, fileName:`${fileName}.${ext}`, member_no, contentType})
|
|
175
164
|
}
|
|
@@ -187,7 +176,7 @@ const generateLocalUploadApi = async ({ app, db, yml, options }) => {
|
|
|
187
176
|
let member_no = req.user.member_no || req.user.id;
|
|
188
177
|
let {ext, name} = req.query
|
|
189
178
|
let fileName = await genEntityIdWithKey(db, 'file')
|
|
190
|
-
let key =
|
|
179
|
+
let key = `${member_no}/${fileName}.${ext}`
|
|
191
180
|
|
|
192
181
|
// Ensure directory exists
|
|
193
182
|
const fullPath = `${path}/${key}`;
|
|
@@ -209,7 +198,7 @@ const generateLocalUploadApi = async ({ app, db, yml, options }) => {
|
|
|
209
198
|
let {ext, name} = req.query
|
|
210
199
|
|
|
211
200
|
let fileName = await genEntityIdWithKey(db, 'file')
|
|
212
|
-
let key =
|
|
201
|
+
let key = `${member_no}/${fileName}.${ext}`
|
|
213
202
|
|
|
214
203
|
try {
|
|
215
204
|
// Ensure directory exists
|