zyket 1.2.11 → 1.2.13
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/.github/workflows/publish.yml +37 -37
- package/README.md +279 -279
- package/bin/cli.js +201 -201
- package/index.js +32 -32
- package/package.json +54 -50
- package/src/Middleware.js +3 -3
- package/src/extensions/Extension.js +10 -10
- package/src/extensions/bullboard/index.js +38 -38
- package/src/extensions/interactive-storage/index.js +162 -162
- package/src/extensions/interactive-storage/middlewares/MulterMiddleware.js +31 -31
- package/src/extensions/interactive-storage/routes/browse.js +31 -31
- package/src/extensions/interactive-storage/routes/create-folder.js +37 -37
- package/src/extensions/interactive-storage/routes/delete-folder.js +57 -57
- package/src/extensions/interactive-storage/routes/delete.js +41 -41
- package/src/extensions/interactive-storage/routes/download.js +47 -47
- package/src/extensions/interactive-storage/routes/info.js +37 -37
- package/src/extensions/interactive-storage/routes/upload.js +46 -46
- package/src/kernel/HTTPServer.js +31 -31
- package/src/kernel/index.js +78 -78
- package/src/services/Service.js +10 -10
- package/src/services/auth/auth.js +7 -7
- package/src/services/auth/index.js +199 -199
- package/src/services/bullmq/Worker.js +7 -7
- package/src/services/bullmq/index.js +92 -92
- package/src/services/cache/index.js +96 -96
- package/src/services/database/index.js +127 -127
- package/src/services/events/Event.js +6 -6
- package/src/services/events/index.js +59 -59
- package/src/services/express/Express.js +280 -248
- package/src/services/express/Middleware.js +7 -7
- package/src/services/express/RedirectResponse.js +8 -8
- package/src/services/express/Route.js +6 -6
- package/src/services/express/index.js +4 -4
- package/src/services/index.js +30 -29
- package/src/services/logger/index.js +84 -80
- package/src/services/s3/index.js +82 -82
- package/src/services/scheduler/Schedule.js +6 -6
- package/src/services/scheduler/index.js +47 -47
- package/src/services/socketio/Guard.js +10 -10
- package/src/services/socketio/Handler.js +10 -10
- package/src/services/socketio/SocketIO.js +159 -132
- package/src/services/socketio/index.js +4 -4
- package/src/services/template-manager/index.js +73 -73
- package/src/services/vite/builder.js +29 -0
- package/src/services/vite/index.js +23 -1
- package/src/templates/default/config/cors.js +4 -4
- package/src/templates/default/config/swagger.js +15 -15
- package/src/templates/default/frontend/main.jsx +15 -15
- package/src/templates/default/frontend/src/hooks/useAuth.jsx +51 -51
- package/src/templates/default/frontend/src/hooks/useLayout.jsx +18 -18
- package/src/templates/default/frontend/src/layouts/auth/index.jsx +45 -45
- package/src/templates/default/frontend/src/layouts/auth/routes.js +17 -17
- package/src/templates/default/frontend/src/layouts/landing/index.jsx +61 -61
- package/src/templates/default/frontend/src/layouts/landing/routes.js +10 -10
- package/src/templates/default/frontend/src/layouts/panel/index.jsx +115 -115
- package/src/templates/default/frontend/src/layouts/panel/routes.js +10 -10
- package/src/templates/default/frontend/src/middlewares/LoggedMiddleware.jsx +21 -21
- package/src/templates/default/frontend/src/middlewares/NotLoggedMiddleware.jsx +14 -14
- package/src/templates/default/frontend/src/store/index.jsx +5 -5
- package/src/templates/default/frontend/src/store/storeAuth.jsx +14 -14
- package/src/templates/default/frontend/src/views/auth/index.jsx +4 -4
- package/src/templates/default/frontend/src/views/auth/register/index.jsx +4 -4
- package/src/templates/default/frontend/src/views/landing/index.jsx +4 -4
- package/src/templates/default/frontend/src/views/panel/dashboard/index.jsx +4 -4
- package/src/templates/default/frontend/styles.css +1 -1
- package/src/templates/default/src/guards/default.js +6 -6
- package/src/templates/default/src/handlers/connection.js +6 -6
- package/src/templates/default/src/handlers/message.js +8 -8
- package/src/templates/default/src/middlewares/default.js +7 -7
- package/src/templates/default/src/routes/[test]/message.js +26 -26
- package/src/templates/default/src/routes/index.js +22 -22
- package/src/templates/default/src/services/auth/auth.js +7 -7
- package/src/templates/default/src/services/auth/index.js +32 -32
- package/src/utils/EnvManager.js +66 -65
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
const { Route } = require('../../../services/express');
|
|
2
|
-
|
|
3
|
-
module.exports = class DeleteFolderRoute extends Route {
|
|
4
|
-
s3;
|
|
5
|
-
bucketName;
|
|
6
|
-
normalizePath;
|
|
7
|
-
listFiles;
|
|
8
|
-
|
|
9
|
-
constructor(path, s3, bucketName, normalizePath, listFiles) {
|
|
10
|
-
super(path);
|
|
11
|
-
this.s3 = s3;
|
|
12
|
-
this.bucketName = bucketName;
|
|
13
|
-
this.normalizePath = normalizePath;
|
|
14
|
-
this.listFiles = listFiles;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
async delete({ container, request }) {
|
|
18
|
-
const logger = container.get('logger');
|
|
19
|
-
const { folderPath } = request.body;
|
|
20
|
-
|
|
21
|
-
if (!folderPath) {
|
|
22
|
-
return { success: false, message: 'Folder path is required', status: 400 };
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const normalizedPath = this.normalizePath(folderPath);
|
|
26
|
-
const prefix = `${normalizedPath}/`;
|
|
27
|
-
|
|
28
|
-
// List all files in the folder
|
|
29
|
-
const files = await this.listFiles(this.s3, prefix);
|
|
30
|
-
|
|
31
|
-
if (files.length === 0) {
|
|
32
|
-
return {
|
|
33
|
-
success: true,
|
|
34
|
-
message: 'Folder is empty or does not exist',
|
|
35
|
-
deletedCount: 0
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Delete all files
|
|
40
|
-
const deletePromises = files.map(file =>
|
|
41
|
-
this.s3.removeFile(this.bucketName, file.name).catch(err => ({ error: err.message, fileName: file.name }))
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
const results = await Promise.all(deletePromises);
|
|
45
|
-
const errors = results.filter(r => r && r.error);
|
|
46
|
-
const successCount = results.length - errors.length;
|
|
47
|
-
|
|
48
|
-
logger.info(`Deleted folder ${normalizedPath} with ${successCount} files`);
|
|
49
|
-
|
|
50
|
-
return {
|
|
51
|
-
success: errors.length === 0,
|
|
52
|
-
message: `Deleted folder and ${successCount} files`,
|
|
53
|
-
deletedCount: successCount,
|
|
54
|
-
errors: errors.length > 0 ? errors : undefined
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
};
|
|
1
|
+
const { Route } = require('../../../services/express');
|
|
2
|
+
|
|
3
|
+
module.exports = class DeleteFolderRoute extends Route {
|
|
4
|
+
s3;
|
|
5
|
+
bucketName;
|
|
6
|
+
normalizePath;
|
|
7
|
+
listFiles;
|
|
8
|
+
|
|
9
|
+
constructor(path, s3, bucketName, normalizePath, listFiles) {
|
|
10
|
+
super(path);
|
|
11
|
+
this.s3 = s3;
|
|
12
|
+
this.bucketName = bucketName;
|
|
13
|
+
this.normalizePath = normalizePath;
|
|
14
|
+
this.listFiles = listFiles;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async delete({ container, request }) {
|
|
18
|
+
const logger = container.get('logger');
|
|
19
|
+
const { folderPath } = request.body;
|
|
20
|
+
|
|
21
|
+
if (!folderPath) {
|
|
22
|
+
return { success: false, message: 'Folder path is required', status: 400 };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const normalizedPath = this.normalizePath(folderPath);
|
|
26
|
+
const prefix = `${normalizedPath}/`;
|
|
27
|
+
|
|
28
|
+
// List all files in the folder
|
|
29
|
+
const files = await this.listFiles(this.s3, prefix);
|
|
30
|
+
|
|
31
|
+
if (files.length === 0) {
|
|
32
|
+
return {
|
|
33
|
+
success: true,
|
|
34
|
+
message: 'Folder is empty or does not exist',
|
|
35
|
+
deletedCount: 0
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Delete all files
|
|
40
|
+
const deletePromises = files.map(file =>
|
|
41
|
+
this.s3.removeFile(this.bucketName, file.name).catch(err => ({ error: err.message, fileName: file.name }))
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const results = await Promise.all(deletePromises);
|
|
45
|
+
const errors = results.filter(r => r && r.error);
|
|
46
|
+
const successCount = results.length - errors.length;
|
|
47
|
+
|
|
48
|
+
logger.info(`Deleted folder ${normalizedPath} with ${successCount} files`);
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
success: errors.length === 0,
|
|
52
|
+
message: `Deleted folder and ${successCount} files`,
|
|
53
|
+
deletedCount: successCount,
|
|
54
|
+
errors: errors.length > 0 ? errors : undefined
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
};
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
const { Route } = require('../../../services/express');
|
|
2
|
-
|
|
3
|
-
module.exports = class DeleteRoute extends Route {
|
|
4
|
-
s3;
|
|
5
|
-
bucketName;
|
|
6
|
-
|
|
7
|
-
constructor(path, s3, bucketName) {
|
|
8
|
-
super(path);
|
|
9
|
-
this.s3 = s3;
|
|
10
|
-
this.bucketName = bucketName;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
async delete({ container, request }) {
|
|
14
|
-
const logger = container.get('logger');
|
|
15
|
-
const { fileName, fileNames } = request.body;
|
|
16
|
-
|
|
17
|
-
// Support both single file and multiple files
|
|
18
|
-
const filesToDelete = fileNames || (fileName ? [fileName] : []);
|
|
19
|
-
|
|
20
|
-
if (!Array.isArray(filesToDelete) || filesToDelete.length === 0) {
|
|
21
|
-
return { success: false, message: 'fileName or fileNames array is required', status: 400 };
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const deletePromises = filesToDelete.map(file =>
|
|
25
|
-
this.s3.removeFile(this.bucketName, file).catch(err => ({ error: err.message, fileName: file }))
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
const results = await Promise.all(deletePromises);
|
|
29
|
-
const errors = results.filter(r => r && r.error);
|
|
30
|
-
const successCount = results.length - errors.length;
|
|
31
|
-
|
|
32
|
-
logger.info(`Deleted ${successCount} file(s) from S3 dropbox`);
|
|
33
|
-
|
|
34
|
-
return {
|
|
35
|
-
success: errors.length === 0,
|
|
36
|
-
message: `Deleted ${successCount} of ${filesToDelete.length} file(s)`,
|
|
37
|
-
deletedCount: successCount,
|
|
38
|
-
errors: errors.length > 0 ? errors : undefined
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
};
|
|
1
|
+
const { Route } = require('../../../services/express');
|
|
2
|
+
|
|
3
|
+
module.exports = class DeleteRoute extends Route {
|
|
4
|
+
s3;
|
|
5
|
+
bucketName;
|
|
6
|
+
|
|
7
|
+
constructor(path, s3, bucketName) {
|
|
8
|
+
super(path);
|
|
9
|
+
this.s3 = s3;
|
|
10
|
+
this.bucketName = bucketName;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async delete({ container, request }) {
|
|
14
|
+
const logger = container.get('logger');
|
|
15
|
+
const { fileName, fileNames } = request.body;
|
|
16
|
+
|
|
17
|
+
// Support both single file and multiple files
|
|
18
|
+
const filesToDelete = fileNames || (fileName ? [fileName] : []);
|
|
19
|
+
|
|
20
|
+
if (!Array.isArray(filesToDelete) || filesToDelete.length === 0) {
|
|
21
|
+
return { success: false, message: 'fileName or fileNames array is required', status: 400 };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const deletePromises = filesToDelete.map(file =>
|
|
25
|
+
this.s3.removeFile(this.bucketName, file).catch(err => ({ error: err.message, fileName: file }))
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const results = await Promise.all(deletePromises);
|
|
29
|
+
const errors = results.filter(r => r && r.error);
|
|
30
|
+
const successCount = results.length - errors.length;
|
|
31
|
+
|
|
32
|
+
logger.info(`Deleted ${successCount} file(s) from S3 dropbox`);
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
success: errors.length === 0,
|
|
36
|
+
message: `Deleted ${successCount} of ${filesToDelete.length} file(s)`,
|
|
37
|
+
deletedCount: successCount,
|
|
38
|
+
errors: errors.length > 0 ? errors : undefined
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
};
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
const { Route } = require('../../../services/express');
|
|
2
|
-
|
|
3
|
-
module.exports = class DownloadRoute extends Route {
|
|
4
|
-
s3;
|
|
5
|
-
bucketName;
|
|
6
|
-
getFileStat;
|
|
7
|
-
|
|
8
|
-
constructor(path, s3, bucketName, getFileStat) {
|
|
9
|
-
super(path);
|
|
10
|
-
this.s3 = s3;
|
|
11
|
-
this.bucketName = bucketName;
|
|
12
|
-
this.getFileStat = getFileStat;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
async get({ container, request, response }) {
|
|
16
|
-
const logger = container.get('logger');
|
|
17
|
-
const { fileName } = request.params;
|
|
18
|
-
|
|
19
|
-
try {
|
|
20
|
-
// Get file info first
|
|
21
|
-
const stat = await this.getFileStat(this.s3, fileName);
|
|
22
|
-
|
|
23
|
-
// Set response headers
|
|
24
|
-
response.setHeader('Content-Type', stat.metaData?.['content-type'] || 'application/octet-stream');
|
|
25
|
-
response.setHeader('Content-Disposition', `attachment; filename="${fileName}"`);
|
|
26
|
-
response.setHeader('Content-Length', stat.size);
|
|
27
|
-
|
|
28
|
-
// Stream the file
|
|
29
|
-
await new Promise((resolve, reject) => {
|
|
30
|
-
this.s3.client.getObject(this.bucketName, fileName, (err, stream) => {
|
|
31
|
-
if (err) return reject(err);
|
|
32
|
-
stream.pipe(response);
|
|
33
|
-
stream.on('end', resolve);
|
|
34
|
-
stream.on('error', reject);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
logger.info(`Downloaded file: ${fileName}`);
|
|
39
|
-
|
|
40
|
-
// Return null to indicate response was handled manually
|
|
41
|
-
return null;
|
|
42
|
-
} catch (error) {
|
|
43
|
-
logger.error(`Error downloading file: ${error.message}`);
|
|
44
|
-
return { success: false, message: 'File not found', status: 404 };
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
};
|
|
1
|
+
const { Route } = require('../../../services/express');
|
|
2
|
+
|
|
3
|
+
module.exports = class DownloadRoute extends Route {
|
|
4
|
+
s3;
|
|
5
|
+
bucketName;
|
|
6
|
+
getFileStat;
|
|
7
|
+
|
|
8
|
+
constructor(path, s3, bucketName, getFileStat) {
|
|
9
|
+
super(path);
|
|
10
|
+
this.s3 = s3;
|
|
11
|
+
this.bucketName = bucketName;
|
|
12
|
+
this.getFileStat = getFileStat;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async get({ container, request, response }) {
|
|
16
|
+
const logger = container.get('logger');
|
|
17
|
+
const { fileName } = request.params;
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
// Get file info first
|
|
21
|
+
const stat = await this.getFileStat(this.s3, fileName);
|
|
22
|
+
|
|
23
|
+
// Set response headers
|
|
24
|
+
response.setHeader('Content-Type', stat.metaData?.['content-type'] || 'application/octet-stream');
|
|
25
|
+
response.setHeader('Content-Disposition', `attachment; filename="${fileName}"`);
|
|
26
|
+
response.setHeader('Content-Length', stat.size);
|
|
27
|
+
|
|
28
|
+
// Stream the file
|
|
29
|
+
await new Promise((resolve, reject) => {
|
|
30
|
+
this.s3.client.getObject(this.bucketName, fileName, (err, stream) => {
|
|
31
|
+
if (err) return reject(err);
|
|
32
|
+
stream.pipe(response);
|
|
33
|
+
stream.on('end', resolve);
|
|
34
|
+
stream.on('error', reject);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
logger.info(`Downloaded file: ${fileName}`);
|
|
39
|
+
|
|
40
|
+
// Return null to indicate response was handled manually
|
|
41
|
+
return null;
|
|
42
|
+
} catch (error) {
|
|
43
|
+
logger.error(`Error downloading file: ${error.message}`);
|
|
44
|
+
return { success: false, message: 'File not found', status: 404 };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
const { Route } = require('../../../services/express');
|
|
2
|
-
|
|
3
|
-
module.exports = class InfoRoute extends Route {
|
|
4
|
-
s3;
|
|
5
|
-
bucketName;
|
|
6
|
-
getFileStat;
|
|
7
|
-
|
|
8
|
-
constructor(path, s3, bucketName, getFileStat) {
|
|
9
|
-
super(path);
|
|
10
|
-
this.s3 = s3;
|
|
11
|
-
this.bucketName = bucketName;
|
|
12
|
-
this.getFileStat = getFileStat;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
async get({ container, request }) {
|
|
16
|
-
const logger = container.get('logger');
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
const { fileName } = request.params;
|
|
20
|
-
const stat = await this.getFileStat(this.s3, fileName);
|
|
21
|
-
|
|
22
|
-
return {
|
|
23
|
-
success: true,
|
|
24
|
-
file: {
|
|
25
|
-
name: fileName,
|
|
26
|
-
size: stat.size,
|
|
27
|
-
lastModified: stat.lastModified,
|
|
28
|
-
etag: stat.etag,
|
|
29
|
-
contentType: stat.metaData?.['content-type']
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
} catch (error) {
|
|
33
|
-
logger.error(`Error getting file info: ${error.message}`);
|
|
34
|
-
return { success: false, message: 'File not found', status: 404 };
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
};
|
|
1
|
+
const { Route } = require('../../../services/express');
|
|
2
|
+
|
|
3
|
+
module.exports = class InfoRoute extends Route {
|
|
4
|
+
s3;
|
|
5
|
+
bucketName;
|
|
6
|
+
getFileStat;
|
|
7
|
+
|
|
8
|
+
constructor(path, s3, bucketName, getFileStat) {
|
|
9
|
+
super(path);
|
|
10
|
+
this.s3 = s3;
|
|
11
|
+
this.bucketName = bucketName;
|
|
12
|
+
this.getFileStat = getFileStat;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async get({ container, request }) {
|
|
16
|
+
const logger = container.get('logger');
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
const { fileName } = request.params;
|
|
20
|
+
const stat = await this.getFileStat(this.s3, fileName);
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
success: true,
|
|
24
|
+
file: {
|
|
25
|
+
name: fileName,
|
|
26
|
+
size: stat.size,
|
|
27
|
+
lastModified: stat.lastModified,
|
|
28
|
+
etag: stat.etag,
|
|
29
|
+
contentType: stat.metaData?.['content-type']
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
} catch (error) {
|
|
33
|
+
logger.error(`Error getting file info: ${error.message}`);
|
|
34
|
+
return { success: false, message: 'File not found', status: 404 };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
const { Route } = require('../../../services/express');
|
|
2
|
-
|
|
3
|
-
module.exports = class UploadRoute extends Route {
|
|
4
|
-
s3;
|
|
5
|
-
bucketName;
|
|
6
|
-
normalizePath;
|
|
7
|
-
|
|
8
|
-
constructor(path, s3, bucketName, normalizePath) {
|
|
9
|
-
super(path);
|
|
10
|
-
this.s3 = s3;
|
|
11
|
-
this.bucketName = bucketName;
|
|
12
|
-
this.normalizePath = normalizePath;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
async post({ container, request }) {
|
|
16
|
-
const logger = container.get('logger');
|
|
17
|
-
|
|
18
|
-
if (!request.files || request.files.length === 0) {
|
|
19
|
-
return { success: false, message: 'No files uploaded', status: 400 };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const folder = request.body.folder || '';
|
|
23
|
-
const folderPath = folder ? this.normalizePath(folder) + '/' : '';
|
|
24
|
-
|
|
25
|
-
const uploadPromises = request.files.map(async (file) => {
|
|
26
|
-
const fileName = `${folderPath}${Date.now()}-${file.originalname}`;
|
|
27
|
-
await this.s3.saveFile(this.bucketName, fileName, file.buffer, file.mimetype);
|
|
28
|
-
return {
|
|
29
|
-
originalName: file.originalname,
|
|
30
|
-
fileName: fileName,
|
|
31
|
-
folder: folder,
|
|
32
|
-
size: file.size,
|
|
33
|
-
mimeType: file.mimetype
|
|
34
|
-
};
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
const uploadedFiles = await Promise.all(uploadPromises);
|
|
38
|
-
logger.info(`Uploaded ${uploadedFiles.length} file(s) to S3 dropbox`);
|
|
39
|
-
|
|
40
|
-
return {
|
|
41
|
-
success: true,
|
|
42
|
-
message: 'Files uploaded successfully',
|
|
43
|
-
files: uploadedFiles
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
};
|
|
1
|
+
const { Route } = require('../../../services/express');
|
|
2
|
+
|
|
3
|
+
module.exports = class UploadRoute extends Route {
|
|
4
|
+
s3;
|
|
5
|
+
bucketName;
|
|
6
|
+
normalizePath;
|
|
7
|
+
|
|
8
|
+
constructor(path, s3, bucketName, normalizePath) {
|
|
9
|
+
super(path);
|
|
10
|
+
this.s3 = s3;
|
|
11
|
+
this.bucketName = bucketName;
|
|
12
|
+
this.normalizePath = normalizePath;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async post({ container, request }) {
|
|
16
|
+
const logger = container.get('logger');
|
|
17
|
+
|
|
18
|
+
if (!request.files || request.files.length === 0) {
|
|
19
|
+
return { success: false, message: 'No files uploaded', status: 400 };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const folder = request.body.folder || '';
|
|
23
|
+
const folderPath = folder ? this.normalizePath(folder) + '/' : '';
|
|
24
|
+
|
|
25
|
+
const uploadPromises = request.files.map(async (file) => {
|
|
26
|
+
const fileName = `${folderPath}${Date.now()}-${file.originalname}`;
|
|
27
|
+
await this.s3.saveFile(this.bucketName, fileName, file.buffer, file.mimetype);
|
|
28
|
+
return {
|
|
29
|
+
originalName: file.originalname,
|
|
30
|
+
fileName: fileName,
|
|
31
|
+
folder: folder,
|
|
32
|
+
size: file.size,
|
|
33
|
+
mimeType: file.mimetype
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const uploadedFiles = await Promise.all(uploadPromises);
|
|
38
|
+
logger.info(`Uploaded ${uploadedFiles.length} file(s) to S3 dropbox`);
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
success: true,
|
|
42
|
+
message: 'Files uploaded successfully',
|
|
43
|
+
files: uploadedFiles
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
package/src/kernel/HTTPServer.js
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
const http = require('http')
|
|
2
|
-
|
|
3
|
-
module.exports = class HTTPServer {
|
|
4
|
-
#server
|
|
5
|
-
#port
|
|
6
|
-
|
|
7
|
-
constructor ({ port }) {
|
|
8
|
-
if (!port || typeof port !== 'number' || port < 1) {
|
|
9
|
-
throw new Error('port must be a positive number')
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
this.#port = port
|
|
13
|
-
this.#server = http.createServer()
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
start () {
|
|
17
|
-
if (this.isStarted) {
|
|
18
|
-
throw new Error('Server is already started. Review your code')
|
|
19
|
-
}
|
|
20
|
-
console.log(`HTTP Server listening on port ${this.#port}`)
|
|
21
|
-
|
|
22
|
-
this.#server.listen(this.#port, () => {})
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
get server () {
|
|
26
|
-
return this.#server
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
get isStarted () {
|
|
30
|
-
return this.#server?.listening === true
|
|
31
|
-
}
|
|
1
|
+
const http = require('http')
|
|
2
|
+
|
|
3
|
+
module.exports = class HTTPServer {
|
|
4
|
+
#server
|
|
5
|
+
#port
|
|
6
|
+
|
|
7
|
+
constructor ({ port }) {
|
|
8
|
+
if (!port || typeof port !== 'number' || port < 1) {
|
|
9
|
+
throw new Error('port must be a positive number')
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
this.#port = port
|
|
13
|
+
this.#server = http.createServer()
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
start () {
|
|
17
|
+
if (this.isStarted) {
|
|
18
|
+
throw new Error('Server is already started. Review your code')
|
|
19
|
+
}
|
|
20
|
+
console.log(`HTTP Server listening on port ${this.#port}`)
|
|
21
|
+
|
|
22
|
+
this.#server.listen(this.#port, () => {})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get server () {
|
|
26
|
+
return this.#server
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get isStarted () {
|
|
30
|
+
return this.#server?.listening === true
|
|
31
|
+
}
|
|
32
32
|
}
|