@things-factory/attachment-base 4.3.381 → 4.3.424
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/dist-server/attachment-const.js +2 -1
- package/dist-server/attachment-const.js.map +1 -1
- package/dist-server/awb-storage-s3.js +31 -7
- package/dist-server/awb-storage-s3.js.map +1 -1
- package/dist-server/storage-s3.js +63 -7
- package/dist-server/storage-s3.js.map +1 -1
- package/package.json +4 -3
- package/server/attachment-const.ts +1 -0
- package/server/awb-storage-s3.ts +32 -8
- package/server/storage-s3.ts +68 -8
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ATTACHMENT_PATH = exports.INVSTORAGE = exports.AWBSTORAGE = exports.STORAGE = void 0;
|
|
3
|
+
exports.ATTACHMENT_PATH = exports.INVSTORAGE = exports.AWSCREDENTIAL = exports.AWBSTORAGE = exports.STORAGE = void 0;
|
|
4
4
|
const env_1 = require("@things-factory/env");
|
|
5
5
|
exports.STORAGE = env_1.config.get('storage');
|
|
6
6
|
exports.AWBSTORAGE = env_1.config.get('awbFileStorage');
|
|
7
|
+
exports.AWSCREDENTIAL = env_1.config.get('awsCredential');
|
|
7
8
|
exports.INVSTORAGE = env_1.config.get('invoiceFileStorage');
|
|
8
9
|
exports.ATTACHMENT_PATH = env_1.config.get('attachmentPath', 'attachment');
|
|
9
10
|
//# sourceMappingURL=attachment-const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment-const.js","sourceRoot":"","sources":["../server/attachment-const.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAEjC,QAAA,OAAO,GAAQ,YAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AACpC,QAAA,UAAU,GAAQ,YAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;AAC9C,QAAA,UAAU,GAAQ,YAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;AAChD,QAAA,eAAe,GAAW,YAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"attachment-const.js","sourceRoot":"","sources":["../server/attachment-const.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAEjC,QAAA,OAAO,GAAQ,YAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AACpC,QAAA,UAAU,GAAQ,YAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;AAC9C,QAAA,aAAa,GAAQ,YAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;AAChD,QAAA,UAAU,GAAQ,YAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;AAChD,QAAA,eAAe,GAAW,YAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAA"}
|
|
@@ -1,19 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
4
|
+
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
|
|
4
5
|
const lib_storage_1 = require("@aws-sdk/lib-storage");
|
|
5
6
|
const env_1 = require("@things-factory/env");
|
|
6
7
|
const attachment_const_1 = require("./attachment-const");
|
|
7
8
|
if (attachment_const_1.AWBSTORAGE && attachment_const_1.AWBSTORAGE.type == 's3') {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
const getAWSSecret = async () => {
|
|
10
|
+
const secretManager = new client_secrets_manager_1.SecretsManagerClient({ region: attachment_const_1.AWSCREDENTIAL.region });
|
|
11
|
+
const secretManagerParams = {
|
|
12
|
+
SecretId: attachment_const_1.AWSCREDENTIAL.secretName,
|
|
13
|
+
VersionStage: 'AWSCURRENT'
|
|
14
|
+
};
|
|
15
|
+
const command = new client_secrets_manager_1.GetSecretValueCommand(secretManagerParams);
|
|
16
|
+
try {
|
|
17
|
+
const data = await secretManager.send(command);
|
|
18
|
+
const dataSecretString = data.SecretString;
|
|
19
|
+
if (dataSecretString) {
|
|
20
|
+
const secretString = JSON.parse(dataSecretString);
|
|
21
|
+
return { accessKeyId: secretString.accessKeyId, secretAccessKey: secretString.secretAccessKey };
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.log(`[SFTP Get Secret]: ${error}`);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
15
31
|
/* upload file */
|
|
16
32
|
attachment_const_1.AWBSTORAGE.uploadFile = async ({ stream, filename }) => {
|
|
33
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret();
|
|
34
|
+
const client = new client_s3_1.S3Client({
|
|
35
|
+
credentials: {
|
|
36
|
+
accessKeyId: accessKeyId,
|
|
37
|
+
secretAccessKey: secretAccessKey
|
|
38
|
+
},
|
|
39
|
+
region: attachment_const_1.AWSCREDENTIAL.region
|
|
40
|
+
});
|
|
17
41
|
const upload = new lib_storage_1.Upload({
|
|
18
42
|
client,
|
|
19
43
|
params: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awb-storage-s3.js","sourceRoot":"","sources":["../server/awb-storage-s3.ts"],"names":[],"mappings":";;AAAA,kDAA6C;AAC7C,sDAA6C;AAC7C,6CAA4C;AAE5C,
|
|
1
|
+
{"version":3,"file":"awb-storage-s3.js","sourceRoot":"","sources":["../server/awb-storage-s3.ts"],"names":[],"mappings":";;AAAA,kDAA6C;AAC7C,4EAA6F;AAC7F,sDAA6C;AAC7C,6CAA4C;AAE5C,yDAA8D;AAE9D,IAAI,6BAAU,IAAI,6BAAU,CAAC,IAAI,IAAI,IAAI,EAAE;IACzC,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;QAC9B,MAAM,aAAa,GAAG,IAAI,6CAAoB,CAAC,EAAE,MAAM,EAAE,gCAAa,CAAC,MAAM,EAAE,CAAC,CAAA;QAChF,MAAM,mBAAmB,GAAG;YAC1B,QAAQ,EAAE,gCAAa,CAAC,UAAU;YAClC,YAAY,EAAE,YAAY;SAC3B,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,8CAAqB,CAAC,mBAAmB,CAAC,CAAA;QAC9D,IAAI;YACF,MAAM,IAAI,GAAQ,MAAM,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACnD,MAAM,gBAAgB,GAAQ,IAAI,CAAC,YAAY,CAAA;YAC/C,IAAI,gBAAgB,EAAE;gBACpB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;gBAEjD,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE,eAAe,EAAE,YAAY,CAAC,eAAe,EAAE,CAAA;aAChG;iBAAM;gBACL,OAAO,IAAI,CAAA;aACZ;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAA;SAC3C;IACH,CAAC,CAAA;IAED,iBAAiB;IACjB,6BAAU,CAAC,UAAU,GAAG,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrD,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,MAAM,YAAY,EAAE,CAAA;QAC7D,MAAM,MAAM,GAAG,IAAI,oBAAQ,CAAC;YAC1B,WAAW,EAAE;gBACX,WAAW,EAAE,WAAW;gBACxB,eAAe,EAAE,eAAe;aACjC;YACD,MAAM,EAAE,gCAAa,CAAC,MAAM;SAC7B,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,IAAI,oBAAM,CAAC;YACxB,MAAM;YACN,MAAM,EAAE;gBACN,MAAM,EAAE,6BAAU,CAAC,UAAU;gBAC7B,GAAG,EAAE,GAAG,QAAQ,MAAM;gBACtB,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,iBAAiB;aAC/B;SACF,CAAC,CAAA;QAEF,IAAI,MAAM,CAAA;QACV,IAAI,GAAG,CAAA;QACP,IAAI;YACF,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAQ,CAAA;YACrC,GAAG,GAAG,WAAW,6BAAU,CAAC,UAAU,OAAO,6BAAU,CAAC,MAAM,kBAAkB,QAAQ,MAAM,CAAA;SAC/F;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;SACf;QAED,OAAO;YACL,MAAM;YACN,GAAG;SACJ,CAAA;IACH,CAAC,CAAA;IAED,YAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;CACxD"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const uuid_1 = require("uuid");
|
|
4
4
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
5
|
+
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
|
|
5
6
|
const lib_storage_1 = require("@aws-sdk/lib-storage");
|
|
6
7
|
const s3_presigned_post_1 = require("@aws-sdk/s3-presigned-post");
|
|
7
8
|
const env_1 = require("@things-factory/env");
|
|
@@ -9,13 +10,28 @@ const attachment_const_1 = require("./attachment-const");
|
|
|
9
10
|
const mime = require('mime');
|
|
10
11
|
const { fs } = require('memfs');
|
|
11
12
|
if (attachment_const_1.STORAGE && attachment_const_1.STORAGE.type == 's3') {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
const getAWSSecret = async () => {
|
|
14
|
+
const secretManager = new client_secrets_manager_1.SecretsManagerClient({ region: attachment_const_1.AWSCREDENTIAL.region });
|
|
15
|
+
const secretManagerParams = {
|
|
16
|
+
SecretId: attachment_const_1.AWSCREDENTIAL.secretName,
|
|
17
|
+
VersionStage: 'AWSCURRENT'
|
|
18
|
+
};
|
|
19
|
+
const command = new client_secrets_manager_1.GetSecretValueCommand(secretManagerParams);
|
|
20
|
+
try {
|
|
21
|
+
const data = await secretManager.send(command);
|
|
22
|
+
const dataSecretString = data.SecretString;
|
|
23
|
+
if (dataSecretString) {
|
|
24
|
+
const secretString = JSON.parse(dataSecretString);
|
|
25
|
+
return { accessKeyId: secretString.accessKeyId, secretAccessKey: secretString.secretAccessKey };
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.log(`[SFTP Get Secret]: ${error}`);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
19
35
|
const streamToBuffer = (stream) => new Promise((resolve, reject) => {
|
|
20
36
|
const chunks = [];
|
|
21
37
|
stream.on('data', chunk => chunks.push(chunk));
|
|
@@ -28,6 +44,14 @@ if (attachment_const_1.STORAGE && attachment_const_1.STORAGE.type == 's3') {
|
|
|
28
44
|
const ext = filename.split('.').pop();
|
|
29
45
|
const key = ext ? `${id}.${ext}` : id;
|
|
30
46
|
var size = 0;
|
|
47
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret();
|
|
48
|
+
const client = new client_s3_1.S3Client({
|
|
49
|
+
credentials: {
|
|
50
|
+
accessKeyId: accessKeyId,
|
|
51
|
+
secretAccessKey: secretAccessKey
|
|
52
|
+
},
|
|
53
|
+
region: attachment_const_1.AWSCREDENTIAL.region
|
|
54
|
+
});
|
|
31
55
|
const upload = new lib_storage_1.Upload({
|
|
32
56
|
client,
|
|
33
57
|
params: {
|
|
@@ -45,6 +69,14 @@ if (attachment_const_1.STORAGE && attachment_const_1.STORAGE.type == 's3') {
|
|
|
45
69
|
};
|
|
46
70
|
};
|
|
47
71
|
attachment_const_1.STORAGE.deleteFile = async (path) => {
|
|
72
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret();
|
|
73
|
+
const client = new client_s3_1.S3Client({
|
|
74
|
+
credentials: {
|
|
75
|
+
accessKeyId: accessKeyId,
|
|
76
|
+
secretAccessKey: secretAccessKey
|
|
77
|
+
},
|
|
78
|
+
region: attachment_const_1.AWSCREDENTIAL.region
|
|
79
|
+
});
|
|
48
80
|
const command = new client_s3_1.DeleteObjectCommand({
|
|
49
81
|
Bucket: attachment_const_1.STORAGE.bucketName,
|
|
50
82
|
Key: path
|
|
@@ -53,6 +85,14 @@ if (attachment_const_1.STORAGE && attachment_const_1.STORAGE.type == 's3') {
|
|
|
53
85
|
};
|
|
54
86
|
/* TODO Streaming to Streaming 으로 구현하라. */
|
|
55
87
|
attachment_const_1.STORAGE.sendFile = async (context, attachment, next) => {
|
|
88
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret();
|
|
89
|
+
const client = new client_s3_1.S3Client({
|
|
90
|
+
credentials: {
|
|
91
|
+
accessKeyId: accessKeyId,
|
|
92
|
+
secretAccessKey: secretAccessKey
|
|
93
|
+
},
|
|
94
|
+
region: attachment_const_1.AWSCREDENTIAL.region
|
|
95
|
+
});
|
|
56
96
|
const result = await client.send(new client_s3_1.GetObjectCommand({
|
|
57
97
|
Bucket: attachment_const_1.STORAGE.bucketName,
|
|
58
98
|
Key: attachment
|
|
@@ -67,6 +107,14 @@ if (attachment_const_1.STORAGE && attachment_const_1.STORAGE.type == 's3') {
|
|
|
67
107
|
context.body = result.Body;
|
|
68
108
|
};
|
|
69
109
|
attachment_const_1.STORAGE.readFile = async (attachment, encoding) => {
|
|
110
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret();
|
|
111
|
+
const client = new client_s3_1.S3Client({
|
|
112
|
+
credentials: {
|
|
113
|
+
accessKeyId: accessKeyId,
|
|
114
|
+
secretAccessKey: secretAccessKey
|
|
115
|
+
},
|
|
116
|
+
region: attachment_const_1.AWSCREDENTIAL.region
|
|
117
|
+
});
|
|
70
118
|
/*
|
|
71
119
|
* refered to
|
|
72
120
|
* https://transang.me/modern-fetch-and-how-to-get-buffer-output-from-aws-sdk-v3-getobjectcommand/#the-body-type
|
|
@@ -87,6 +135,14 @@ if (attachment_const_1.STORAGE && attachment_const_1.STORAGE.type == 's3') {
|
|
|
87
135
|
attachment_const_1.STORAGE.generateUploadURL = async (type) => {
|
|
88
136
|
const expiresInMinutes = 1;
|
|
89
137
|
const id = (0, uuid_1.v4)();
|
|
138
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret();
|
|
139
|
+
const client = new client_s3_1.S3Client({
|
|
140
|
+
credentials: {
|
|
141
|
+
accessKeyId: accessKeyId,
|
|
142
|
+
secretAccessKey: secretAccessKey
|
|
143
|
+
},
|
|
144
|
+
region: attachment_const_1.AWSCREDENTIAL.region
|
|
145
|
+
});
|
|
90
146
|
return await (0, s3_presigned_post_1.createPresignedPost)(client, {
|
|
91
147
|
Bucket: attachment_const_1.STORAGE.bucketName,
|
|
92
148
|
Key: id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-s3.js","sourceRoot":"","sources":["../server/storage-s3.ts"],"names":[],"mappings":";;AACA,+BAAmC;AAEnC,kDAA2G;AAC3G,sDAA6C;AAC7C,kEAAgE;AAChE,6CAA4C;AAE5C,
|
|
1
|
+
{"version":3,"file":"storage-s3.js","sourceRoot":"","sources":["../server/storage-s3.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/attachment-base",
|
|
3
|
-
"version": "4.3.
|
|
3
|
+
"version": "4.3.424",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -24,14 +24,15 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@aws-sdk/client-s3": "^3.46.0",
|
|
27
|
+
"@aws-sdk/client-secrets-manager": "^3.46.0",
|
|
27
28
|
"@aws-sdk/lib-storage": "^3.46.0",
|
|
28
29
|
"@aws-sdk/s3-presigned-post": "^3.46.0",
|
|
29
30
|
"@koa/multer": "^3.0.0",
|
|
30
|
-
"@things-factory/auth-base": "^4.3.
|
|
31
|
+
"@things-factory/auth-base": "^4.3.424",
|
|
31
32
|
"@things-factory/env": "^4.3.381",
|
|
32
33
|
"memfs": "^3.0.1",
|
|
33
34
|
"mime": "^2.4.4",
|
|
34
35
|
"multer": "^1.3.0"
|
|
35
36
|
},
|
|
36
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "0c04dd6934c7eb335fc5ad2dd55172b5e79cdca7"
|
|
37
38
|
}
|
|
@@ -2,5 +2,6 @@ import { config } from '@things-factory/env'
|
|
|
2
2
|
|
|
3
3
|
export var STORAGE: any = config.get('storage')
|
|
4
4
|
export var AWBSTORAGE: any = config.get('awbFileStorage')
|
|
5
|
+
export var AWSCREDENTIAL: any = config.get('awsCredential')
|
|
5
6
|
export var INVSTORAGE: any = config.get('invoiceFileStorage')
|
|
6
7
|
export const ATTACHMENT_PATH: string = config.get('attachmentPath', 'attachment')
|
package/server/awb-storage-s3.ts
CHANGED
|
@@ -1,20 +1,44 @@
|
|
|
1
1
|
import { S3Client } from '@aws-sdk/client-s3'
|
|
2
|
+
import { GetSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager'
|
|
2
3
|
import { Upload } from '@aws-sdk/lib-storage'
|
|
3
4
|
import { logger } from '@things-factory/env'
|
|
4
5
|
|
|
5
|
-
import { AWBSTORAGE } from './attachment-const'
|
|
6
|
+
import { AWBSTORAGE, AWSCREDENTIAL } from './attachment-const'
|
|
6
7
|
|
|
7
8
|
if (AWBSTORAGE && AWBSTORAGE.type == 's3') {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
const getAWSSecret = async () => {
|
|
10
|
+
const secretManager = new SecretsManagerClient({ region: AWSCREDENTIAL.region })
|
|
11
|
+
const secretManagerParams = {
|
|
12
|
+
SecretId: AWSCREDENTIAL.secretName,
|
|
13
|
+
VersionStage: 'AWSCURRENT'
|
|
14
|
+
}
|
|
15
|
+
const command = new GetSecretValueCommand(secretManagerParams)
|
|
16
|
+
try {
|
|
17
|
+
const data: any = await secretManager.send(command)
|
|
18
|
+
const dataSecretString: any = data.SecretString
|
|
19
|
+
if (dataSecretString) {
|
|
20
|
+
const secretString = JSON.parse(dataSecretString)
|
|
21
|
+
|
|
22
|
+
return { accessKeyId: secretString.accessKeyId, secretAccessKey: secretString.secretAccessKey }
|
|
23
|
+
} else {
|
|
24
|
+
return null
|
|
25
|
+
}
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.log(`[SFTP Get Secret]: ${error}`)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
15
30
|
|
|
16
31
|
/* upload file */
|
|
17
32
|
AWBSTORAGE.uploadFile = async ({ stream, filename }) => {
|
|
33
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret()
|
|
34
|
+
const client = new S3Client({
|
|
35
|
+
credentials: {
|
|
36
|
+
accessKeyId: accessKeyId,
|
|
37
|
+
secretAccessKey: secretAccessKey
|
|
38
|
+
},
|
|
39
|
+
region: AWSCREDENTIAL.region
|
|
40
|
+
})
|
|
41
|
+
|
|
18
42
|
const upload = new Upload({
|
|
19
43
|
client,
|
|
20
44
|
params: {
|
package/server/storage-s3.ts
CHANGED
|
@@ -2,23 +2,38 @@ import type { Readable } from 'stream'
|
|
|
2
2
|
import { v4 as uuidv4 } from 'uuid'
|
|
3
3
|
|
|
4
4
|
import { DeleteObjectCommand, GetObjectCommand, GetObjectCommandInput, S3Client } from '@aws-sdk/client-s3'
|
|
5
|
+
import { GetSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager'
|
|
5
6
|
import { Upload } from '@aws-sdk/lib-storage'
|
|
6
7
|
import { createPresignedPost } from '@aws-sdk/s3-presigned-post'
|
|
7
8
|
import { logger } from '@things-factory/env'
|
|
8
9
|
|
|
9
|
-
import { STORAGE } from './attachment-const'
|
|
10
|
+
import { AWSCREDENTIAL, STORAGE } from './attachment-const'
|
|
10
11
|
|
|
11
12
|
const mime = require('mime')
|
|
12
13
|
const { fs } = require('memfs')
|
|
13
14
|
|
|
14
15
|
if (STORAGE && STORAGE.type == 's3') {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
const getAWSSecret = async () => {
|
|
17
|
+
const secretManager = new SecretsManagerClient({ region: AWSCREDENTIAL.region })
|
|
18
|
+
const secretManagerParams = {
|
|
19
|
+
SecretId: AWSCREDENTIAL.secretName,
|
|
20
|
+
VersionStage: 'AWSCURRENT'
|
|
21
|
+
}
|
|
22
|
+
const command = new GetSecretValueCommand(secretManagerParams)
|
|
23
|
+
try {
|
|
24
|
+
const data: any = await secretManager.send(command)
|
|
25
|
+
const dataSecretString: any = data.SecretString
|
|
26
|
+
if (dataSecretString) {
|
|
27
|
+
const secretString = JSON.parse(dataSecretString)
|
|
28
|
+
|
|
29
|
+
return { accessKeyId: secretString.accessKeyId, secretAccessKey: secretString.secretAccessKey }
|
|
30
|
+
} else {
|
|
31
|
+
return null
|
|
32
|
+
}
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.log(`[SFTP Get Secret]: ${error}`)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
22
37
|
|
|
23
38
|
const streamToBuffer = (stream: Readable) =>
|
|
24
39
|
new Promise<Buffer>((resolve, reject) => {
|
|
@@ -35,6 +50,15 @@ if (STORAGE && STORAGE.type == 's3') {
|
|
|
35
50
|
const key = ext ? `${id}.${ext}` : id
|
|
36
51
|
var size: number = 0
|
|
37
52
|
|
|
53
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret()
|
|
54
|
+
const client = new S3Client({
|
|
55
|
+
credentials: {
|
|
56
|
+
accessKeyId: accessKeyId,
|
|
57
|
+
secretAccessKey: secretAccessKey
|
|
58
|
+
},
|
|
59
|
+
region: AWSCREDENTIAL.region
|
|
60
|
+
})
|
|
61
|
+
|
|
38
62
|
const upload = new Upload({
|
|
39
63
|
client,
|
|
40
64
|
params: {
|
|
@@ -54,6 +78,15 @@ if (STORAGE && STORAGE.type == 's3') {
|
|
|
54
78
|
}
|
|
55
79
|
|
|
56
80
|
STORAGE.deleteFile = async (path: string) => {
|
|
81
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret()
|
|
82
|
+
const client = new S3Client({
|
|
83
|
+
credentials: {
|
|
84
|
+
accessKeyId: accessKeyId,
|
|
85
|
+
secretAccessKey: secretAccessKey
|
|
86
|
+
},
|
|
87
|
+
region: AWSCREDENTIAL.region
|
|
88
|
+
})
|
|
89
|
+
|
|
57
90
|
const command = new DeleteObjectCommand({
|
|
58
91
|
Bucket: STORAGE.bucketName,
|
|
59
92
|
Key: path
|
|
@@ -64,6 +97,15 @@ if (STORAGE && STORAGE.type == 's3') {
|
|
|
64
97
|
|
|
65
98
|
/* TODO Streaming to Streaming 으로 구현하라. */
|
|
66
99
|
STORAGE.sendFile = async (context, attachment, next) => {
|
|
100
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret()
|
|
101
|
+
const client = new S3Client({
|
|
102
|
+
credentials: {
|
|
103
|
+
accessKeyId: accessKeyId,
|
|
104
|
+
secretAccessKey: secretAccessKey
|
|
105
|
+
},
|
|
106
|
+
region: AWSCREDENTIAL.region
|
|
107
|
+
})
|
|
108
|
+
|
|
67
109
|
const result = await client.send(
|
|
68
110
|
new GetObjectCommand({
|
|
69
111
|
Bucket: STORAGE.bucketName,
|
|
@@ -83,6 +125,15 @@ if (STORAGE && STORAGE.type == 's3') {
|
|
|
83
125
|
}
|
|
84
126
|
|
|
85
127
|
STORAGE.readFile = async (attachment: string, encoding: string) => {
|
|
128
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret()
|
|
129
|
+
const client = new S3Client({
|
|
130
|
+
credentials: {
|
|
131
|
+
accessKeyId: accessKeyId,
|
|
132
|
+
secretAccessKey: secretAccessKey
|
|
133
|
+
},
|
|
134
|
+
region: AWSCREDENTIAL.region
|
|
135
|
+
})
|
|
136
|
+
|
|
86
137
|
/*
|
|
87
138
|
* refered to
|
|
88
139
|
* https://transang.me/modern-fetch-and-how-to-get-buffer-output-from-aws-sdk-v3-getobjectcommand/#the-body-type
|
|
@@ -109,6 +160,15 @@ if (STORAGE && STORAGE.type == 's3') {
|
|
|
109
160
|
const expiresInMinutes = 1
|
|
110
161
|
const id = uuidv4()
|
|
111
162
|
|
|
163
|
+
const { accessKeyId, secretAccessKey } = await getAWSSecret()
|
|
164
|
+
const client = new S3Client({
|
|
165
|
+
credentials: {
|
|
166
|
+
accessKeyId: accessKeyId,
|
|
167
|
+
secretAccessKey: secretAccessKey
|
|
168
|
+
},
|
|
169
|
+
region: AWSCREDENTIAL.region
|
|
170
|
+
})
|
|
171
|
+
|
|
112
172
|
return await createPresignedPost(client, {
|
|
113
173
|
Bucket: STORAGE.bucketName,
|
|
114
174
|
Key: id,
|