@silexlabs/silex 3.0.0-alpha.100
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/.env.default +19 -0
- package/.silex.js +37 -0
- package/LICENSE +661 -0
- package/README.md +96 -0
- package/dist/client/client/api.d.ts +85 -0
- package/dist/client/client/assetUrl.d.ts +51 -0
- package/dist/client/client/config.d.ts +58 -0
- package/dist/client/client/events.d.ts +14 -0
- package/dist/client/client/expose.d.ts +8 -0
- package/dist/client/client/grapesjs/LoginDialog.d.ts +15 -0
- package/dist/client/client/grapesjs/PublicationManager.d.ts +72 -0
- package/dist/client/client/grapesjs/PublicationUi.d.ts +62 -0
- package/dist/client/client/grapesjs/blocks.d.ts +1 -0
- package/dist/client/client/grapesjs/breadcrumbs.d.ts +1 -0
- package/dist/client/client/grapesjs/footer.d.ts +2 -0
- package/dist/client/client/grapesjs/index.d.ts +5 -0
- package/dist/client/client/grapesjs/internal-links.d.ts +1 -0
- package/dist/client/client/grapesjs/new-page-dialog.d.ts +2 -0
- package/dist/client/client/grapesjs/openImport.d.ts +9 -0
- package/dist/client/client/grapesjs/page-panel.d.ts +3 -0
- package/dist/client/client/grapesjs/project-bar.d.ts +1 -0
- package/dist/client/client/grapesjs/rich-text.d.ts +1 -0
- package/dist/client/client/grapesjs/semantic.d.ts +1 -0
- package/dist/client/client/grapesjs/settings.d.ts +2 -0
- package/dist/client/client/grapesjs/storage.d.ts +1 -0
- package/dist/client/client/grapesjs/symbolDialogs.d.ts +3 -0
- package/dist/client/client/index.d.ts +5 -0
- package/dist/client/client/publication-transformers.d.ts +41 -0
- package/dist/client/client/utils.d.ts +2 -0
- package/dist/client/constants.d.ts +29 -0
- package/dist/client/css/admin.css +4491 -0
- package/dist/client/index.html +9 -0
- package/dist/client/js/main.js +321 -0
- package/dist/client/js/main.js.LICENSE.txt +24 -0
- package/dist/client/page.d.ts +2 -0
- package/dist/client/types.d.ts +334 -0
- package/dist/plugins/client/client/api.d.ts +85 -0
- package/dist/plugins/client/client/api.js +114 -0
- package/dist/plugins/client/client/api.js.map +1 -0
- package/dist/plugins/client/client/assetUrl.d.ts +51 -0
- package/dist/plugins/client/client/assetUrl.js +224 -0
- package/dist/plugins/client/client/assetUrl.js.map +1 -0
- package/dist/plugins/client/client/config.d.ts +58 -0
- package/dist/plugins/client/client/config.js +90 -0
- package/dist/plugins/client/client/config.js.map +1 -0
- package/dist/plugins/client/client/events.d.ts +14 -0
- package/dist/plugins/client/client/events.js +34 -0
- package/dist/plugins/client/client/events.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/LoginDialog.d.ts +15 -0
- package/dist/plugins/client/client/grapesjs/LoginDialog.js +195 -0
- package/dist/plugins/client/client/grapesjs/LoginDialog.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/PublicationManager.d.ts +72 -0
- package/dist/plugins/client/client/grapesjs/PublicationManager.js +356 -0
- package/dist/plugins/client/client/grapesjs/PublicationManager.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/PublicationUi.d.ts +62 -0
- package/dist/plugins/client/client/grapesjs/PublicationUi.js +336 -0
- package/dist/plugins/client/client/grapesjs/PublicationUi.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/blocks.d.ts +1 -0
- package/dist/plugins/client/client/grapesjs/blocks.js +37 -0
- package/dist/plugins/client/client/grapesjs/blocks.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/breadcrumbs.d.ts +1 -0
- package/dist/plugins/client/client/grapesjs/breadcrumbs.js +75 -0
- package/dist/plugins/client/client/grapesjs/breadcrumbs.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/footer.d.ts +2 -0
- package/dist/plugins/client/client/grapesjs/footer.js +28 -0
- package/dist/plugins/client/client/grapesjs/footer.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/index.d.ts +5 -0
- package/dist/plugins/client/client/grapesjs/index.js +313 -0
- package/dist/plugins/client/client/grapesjs/index.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/internal-links.d.ts +1 -0
- package/dist/plugins/client/client/grapesjs/internal-links.js +219 -0
- package/dist/plugins/client/client/grapesjs/internal-links.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/new-page-dialog.d.ts +2 -0
- package/dist/plugins/client/client/grapesjs/new-page-dialog.js +83 -0
- package/dist/plugins/client/client/grapesjs/new-page-dialog.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/openImport.d.ts +9 -0
- package/dist/plugins/client/client/grapesjs/openImport.js +74 -0
- package/dist/plugins/client/client/grapesjs/openImport.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/page-panel.d.ts +3 -0
- package/dist/plugins/client/client/grapesjs/page-panel.js +113 -0
- package/dist/plugins/client/client/grapesjs/page-panel.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/project-bar.d.ts +1 -0
- package/dist/plugins/client/client/grapesjs/project-bar.js +104 -0
- package/dist/plugins/client/client/grapesjs/project-bar.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/rich-text.d.ts +1 -0
- package/dist/plugins/client/client/grapesjs/rich-text.js +31 -0
- package/dist/plugins/client/client/grapesjs/rich-text.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/semantic.d.ts +1 -0
- package/dist/plugins/client/client/grapesjs/semantic.js +110 -0
- package/dist/plugins/client/client/grapesjs/semantic.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/settings.d.ts +2 -0
- package/dist/plugins/client/client/grapesjs/settings.js +198 -0
- package/dist/plugins/client/client/grapesjs/settings.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/storage.d.ts +1 -0
- package/dist/plugins/client/client/grapesjs/storage.js +126 -0
- package/dist/plugins/client/client/grapesjs/storage.js.map +1 -0
- package/dist/plugins/client/client/grapesjs/symbolDialogs.d.ts +3 -0
- package/dist/plugins/client/client/grapesjs/symbolDialogs.js +36 -0
- package/dist/plugins/client/client/grapesjs/symbolDialogs.js.map +1 -0
- package/dist/plugins/client/client/publication-transformers.d.ts +41 -0
- package/dist/plugins/client/client/publication-transformers.js +238 -0
- package/dist/plugins/client/client/publication-transformers.js.map +1 -0
- package/dist/plugins/client/client/utils.d.ts +2 -0
- package/dist/plugins/client/client/utils.js +25 -0
- package/dist/plugins/client/client/utils.js.map +1 -0
- package/dist/plugins/client/constants.d.ts +29 -0
- package/dist/plugins/client/constants.js +46 -0
- package/dist/plugins/client/constants.js.map +1 -0
- package/dist/plugins/client/page.d.ts +2 -0
- package/dist/plugins/client/page.js +31 -0
- package/dist/plugins/client/page.js.map +1 -0
- package/dist/plugins/client/plugins/client/11ty.d.ts +17 -0
- package/dist/plugins/client/plugins/client/11ty.js +86 -0
- package/dist/plugins/client/plugins/client/11ty.js.map +1 -0
- package/dist/plugins/client/plugins/client/publicationRenderer.d.ts +2 -0
- package/dist/plugins/client/plugins/client/publicationRenderer.js +170 -0
- package/dist/plugins/client/plugins/client/publicationRenderer.js.map +1 -0
- package/dist/plugins/client/plugins/client/template.d.ts +2 -0
- package/dist/plugins/client/plugins/client/template.js +183 -0
- package/dist/plugins/client/plugins/client/template.js.map +1 -0
- package/dist/plugins/client/plugins/client/website-info.d.ts +1 -0
- package/dist/plugins/client/plugins/client/website-info.js +72 -0
- package/dist/plugins/client/plugins/client/website-info.js.map +1 -0
- package/dist/plugins/client/types.d.ts +334 -0
- package/dist/plugins/client/types.js +74 -0
- package/dist/plugins/client/types.js.map +1 -0
- package/dist/plugins/server/constants.d.ts +29 -0
- package/dist/plugins/server/constants.js +49 -0
- package/dist/plugins/server/constants.js.map +1 -0
- package/dist/plugins/server/plugins/server/AuthPlugin.d.ts +1 -0
- package/dist/plugins/server/plugins/server/AuthPlugin.js +40 -0
- package/dist/plugins/server/plugins/server/AuthPlugin.js.map +1 -0
- package/dist/plugins/server/plugins/server/Cache.d.ts +2 -0
- package/dist/plugins/server/plugins/server/Cache.js +32 -0
- package/dist/plugins/server/plugins/server/Cache.js.map +1 -0
- package/dist/plugins/server/plugins/server/DownloadConnector.d.ts +29 -0
- package/dist/plugins/server/plugins/server/DownloadConnector.js +129 -0
- package/dist/plugins/server/plugins/server/DownloadConnector.js.map +1 -0
- package/dist/plugins/server/plugins/server/FtpConnector.d.ts +86 -0
- package/dist/plugins/server/plugins/server/FtpConnector.js +526 -0
- package/dist/plugins/server/plugins/server/FtpConnector.js.map +1 -0
- package/dist/plugins/server/plugins/server/GitlabConnector.d.ts +87 -0
- package/dist/plugins/server/plugins/server/GitlabConnector.js +564 -0
- package/dist/plugins/server/plugins/server/GitlabConnector.js.map +1 -0
- package/dist/plugins/server/plugins/server/PublicationOptimizer.d.ts +0 -0
- package/dist/plugins/server/plugins/server/PublicationOptimizer.js +14 -0
- package/dist/plugins/server/plugins/server/PublicationOptimizer.js.map +1 -0
- package/dist/plugins/server/plugins/server/SslPlugin.d.ts +1 -0
- package/dist/plugins/server/plugins/server/SslPlugin.js +86 -0
- package/dist/plugins/server/plugins/server/SslPlugin.js.map +1 -0
- package/dist/plugins/server/plugins/server/StaticPlugin.d.ts +1 -0
- package/dist/plugins/server/plugins/server/StaticPlugin.js +78 -0
- package/dist/plugins/server/plugins/server/StaticPlugin.js.map +1 -0
- package/dist/plugins/server/server/config.d.ts +59 -0
- package/dist/plugins/server/server/config.js +181 -0
- package/dist/plugins/server/server/config.js.map +1 -0
- package/dist/plugins/server/server/connectors/FsHosting.d.ts +13 -0
- package/dist/plugins/server/server/connectors/FsHosting.js +54 -0
- package/dist/plugins/server/server/connectors/FsHosting.js.map +1 -0
- package/dist/plugins/server/server/connectors/FsStorage.d.ts +43 -0
- package/dist/plugins/server/server/connectors/FsStorage.js +257 -0
- package/dist/plugins/server/server/connectors/FsStorage.js.map +1 -0
- package/dist/plugins/server/server/connectors/connectors.d.ts +87 -0
- package/dist/plugins/server/server/connectors/connectors.js +127 -0
- package/dist/plugins/server/server/connectors/connectors.js.map +1 -0
- package/dist/plugins/server/server/events.d.ts +26 -0
- package/dist/plugins/server/server/events.js +31 -0
- package/dist/plugins/server/server/events.js.map +1 -0
- package/dist/plugins/server/server/jobs.d.ts +12 -0
- package/dist/plugins/server/server/jobs.js +77 -0
- package/dist/plugins/server/server/jobs.js.map +1 -0
- package/dist/plugins/server/server/utils/validation.d.ts +7 -0
- package/dist/plugins/server/server/utils/validation.js +38 -0
- package/dist/plugins/server/server/utils/validation.js.map +1 -0
- package/dist/plugins/server/types.d.ts +334 -0
- package/dist/plugins/server/types.js +78 -0
- package/dist/plugins/server/types.js.map +1 -0
- package/dist/server/constants.js +29 -0
- package/dist/server/plugins/server/Cache.js +15 -0
- package/dist/server/server/api/api.js +20 -0
- package/dist/server/server/api/connectorApi.js +216 -0
- package/dist/server/server/api/publicationApi.js +108 -0
- package/dist/server/server/api/websiteApi.js +296 -0
- package/dist/server/server/cli.js +68 -0
- package/dist/server/server/config.js +120 -0
- package/dist/server/server/connectors/FsHosting.js +35 -0
- package/dist/server/server/connectors/FsStorage.js +225 -0
- package/dist/server/server/connectors/connectors.js +89 -0
- package/dist/server/server/events.js +14 -0
- package/dist/server/server/expose.js +27 -0
- package/dist/server/server/express.js +47 -0
- package/dist/server/server/index.js +90 -0
- package/dist/server/server/jobs.js +48 -0
- package/dist/server/server/utils/validation.js +15 -0
- package/dist/server/types.js +34 -0
- package/package.json +209 -0
- package/public/assets/container.png +0 -0
- package/public/assets/favicon.png +0 -0
- package/public/assets/logo-silex-small.png +0 -0
- package/public/robots.txt +2 -0
- package/public/silex.js +24 -0
- package/src/css/_mixins.scss +8 -0
- package/src/css/_variables.scss +33 -0
- package/src/css/dialog.scss +41 -0
- package/src/css/footer.scss +12 -0
- package/src/css/grapesjs-light.scss +180 -0
- package/src/css/grapesjs.scss +152 -0
- package/src/css/index.scss +32 -0
- package/src/css/light.scss +7 -0
- package/src/css/loader.scss +12 -0
- package/src/css/page-panel.scss +65 -0
- package/src/css/project-bar.scss +102 -0
- package/src/css/silex.scss +189 -0
- package/src/css/website-info.scss +14 -0
- package/src/html/debug.pug +8 -0
- package/src/html/index.pug +39 -0
- package/src/html/templates/includes.pug +1 -0
- package/src/html/templates/workspace.pug +2 -0
- package/src/ts/client/api.ts +144 -0
- package/src/ts/client/assetUrl.test.ts +125 -0
- package/src/ts/client/assetUrl.ts +235 -0
- package/src/ts/client/config.ts +105 -0
- package/src/ts/client/events.ts +34 -0
- package/src/ts/client/expose.ts +30 -0
- package/src/ts/client/grapesjs/LoginDialog.ts +204 -0
- package/src/ts/client/grapesjs/PublicationManager.ts +370 -0
- package/src/ts/client/grapesjs/PublicationUi.ts +342 -0
- package/src/ts/client/grapesjs/blocks.ts +37 -0
- package/src/ts/client/grapesjs/breadcrumbs.ts +79 -0
- package/src/ts/client/grapesjs/eleventy.ts +47 -0
- package/src/ts/client/grapesjs/footer.ts +27 -0
- package/src/ts/client/grapesjs/index.ts +335 -0
- package/src/ts/client/grapesjs/internal-links.test.ts +105 -0
- package/src/ts/client/grapesjs/internal-links.ts +225 -0
- package/src/ts/client/grapesjs/new-page-dialog.ts +90 -0
- package/src/ts/client/grapesjs/openImport.ts +81 -0
- package/src/ts/client/grapesjs/page-panel.ts +118 -0
- package/src/ts/client/grapesjs/project-bar.ts +107 -0
- package/src/ts/client/grapesjs/rich-text.ts +33 -0
- package/src/ts/client/grapesjs/semantic.ts +114 -0
- package/src/ts/client/grapesjs/settings.ts +208 -0
- package/src/ts/client/grapesjs/storage.ts +121 -0
- package/src/ts/client/grapesjs/symbolDialogs.ts +38 -0
- package/src/ts/client/index.ts +98 -0
- package/src/ts/client/publication-transformers.test.ts +199 -0
- package/src/ts/client/publication-transformers.ts +263 -0
- package/src/ts/client/utils.ts +28 -0
- package/src/ts/constants.ts +52 -0
- package/src/ts/externs.ts +18 -0
- package/src/ts/page.ts +31 -0
- package/src/ts/plugins/client/11ty.ts +104 -0
- package/src/ts/plugins/client/publicationRenderer.ts +174 -0
- package/src/ts/plugins/client/template.ts +192 -0
- package/src/ts/plugins/client/website-info.ts +84 -0
- package/src/ts/plugins/server/AuthPlugin.ts +38 -0
- package/src/ts/plugins/server/Cache.ts +28 -0
- package/src/ts/plugins/server/DownloadConnector.ts +148 -0
- package/src/ts/plugins/server/FtpConnector.test.ts +82 -0
- package/src/ts/plugins/server/FtpConnector.ts +609 -0
- package/src/ts/plugins/server/GitlabConnector.ts +644 -0
- package/src/ts/plugins/server/PublicationOptimizer.ts +14 -0
- package/src/ts/plugins/server/SslPlugin.ts +84 -0
- package/src/ts/plugins/server/StaticPlugin.ts +79 -0
- package/src/ts/server/api/api.ts +19 -0
- package/src/ts/server/api/connectorApi.ts +345 -0
- package/src/ts/server/api/publicationApi.ts +159 -0
- package/src/ts/server/api/websiteApi.ts +432 -0
- package/src/ts/server/cli.ts +65 -0
- package/src/ts/server/config.ts +189 -0
- package/src/ts/server/connectors/FsHosting.ts +60 -0
- package/src/ts/server/connectors/FsStorage.test.ts +51 -0
- package/src/ts/server/connectors/FsStorage.ts +261 -0
- package/src/ts/server/connectors/connectors.ts +203 -0
- package/src/ts/server/events.ts +37 -0
- package/src/ts/server/expose.ts +19 -0
- package/src/ts/server/express.ts +70 -0
- package/src/ts/server/index.ts +100 -0
- package/src/ts/server/jobs.test.ts +75 -0
- package/src/ts/server/jobs.ts +87 -0
- package/src/ts/server/utils/BackwardCompat.ts +552 -0
- package/src/ts/server/utils/validation.ts +34 -0
- package/src/ts/types.ts +339 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const constants_1 = require("../../constants");
|
|
5
|
+
const validation_1 = require("../utils/validation");
|
|
6
|
+
const connectors_1 = require("../connectors/connectors");
|
|
7
|
+
function default_1(config) {
|
|
8
|
+
const router = (0, express_1.Router)();
|
|
9
|
+
router.get(constants_1.API_CONNECTOR_USER, routeUser);
|
|
10
|
+
router.get(constants_1.API_CONNECTOR_LIST, routeListConnectors);
|
|
11
|
+
router.get(constants_1.API_CONNECTOR_LOGIN, routeLogin);
|
|
12
|
+
router.post(constants_1.API_CONNECTOR_LOGIN_CALLBACK, routeLoginSuccess);
|
|
13
|
+
router.get(constants_1.API_CONNECTOR_LOGIN_CALLBACK, routeLoginSuccess);
|
|
14
|
+
router.post(constants_1.API_CONNECTOR_LOGOUT, routeLogout);
|
|
15
|
+
return router;
|
|
16
|
+
}
|
|
17
|
+
exports.default = default_1;
|
|
18
|
+
function validateStatus(status, _default = 500) {
|
|
19
|
+
if (!status) {
|
|
20
|
+
console.warn(`Status code is undefined, returning default ${_default}`);
|
|
21
|
+
return _default;
|
|
22
|
+
}
|
|
23
|
+
status = parseInt(status.toString());
|
|
24
|
+
if (status >= 100 && status < 600)
|
|
25
|
+
return status;
|
|
26
|
+
console.warn(`Invalid status code ${status}, returning default ${_default}}`);
|
|
27
|
+
return _default;
|
|
28
|
+
}
|
|
29
|
+
async function routeUser(req, res) {
|
|
30
|
+
try {
|
|
31
|
+
const config = (0, validation_1.requiredParam)(req.app.get('config'), 'Config object on express js APP');
|
|
32
|
+
const session = (0, validation_1.requiredParam)(req['session'], 'Session object');
|
|
33
|
+
const query = req.query;
|
|
34
|
+
const type = (0, connectors_1.toConnectorEnum)((0, validation_1.requiredParam)(query.type, 'Connector type'));
|
|
35
|
+
const connector = await (0, connectors_1.getConnector)(config, session, type, query.connectorId);
|
|
36
|
+
if (!connector) {
|
|
37
|
+
res
|
|
38
|
+
.status(500)
|
|
39
|
+
.json({
|
|
40
|
+
error: true,
|
|
41
|
+
message: `Connector not found: ${type} ${query.connectorId}`,
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (!await connector.isLoggedIn(session)) {
|
|
46
|
+
res
|
|
47
|
+
.status(401)
|
|
48
|
+
.json({
|
|
49
|
+
error: true,
|
|
50
|
+
message: 'Not logged in',
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const user = await connector.getUser(session);
|
|
55
|
+
res.json(user);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error('Error in the user request', error, error.code);
|
|
59
|
+
res.status(validateStatus(error?.code ?? error?.httpStatusCode, 500)).json({
|
|
60
|
+
error: true,
|
|
61
|
+
message: error.message,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function routeListConnectors(req, res) {
|
|
66
|
+
try {
|
|
67
|
+
const config = (0, validation_1.requiredParam)(req.app.get('config'), 'Config object on express js APP');
|
|
68
|
+
const session = (0, validation_1.requiredParam)(req['session'], 'Session object');
|
|
69
|
+
const query = req.query;
|
|
70
|
+
const type = (0, connectors_1.toConnectorEnum)((0, validation_1.requiredParam)(query.type, 'Connector type'));
|
|
71
|
+
const connectors = config.getConnectors(type);
|
|
72
|
+
try {
|
|
73
|
+
const list = await Promise.all(connectors.map(async (connector) => (0, connectors_1.toConnectorData)(session, connector)));
|
|
74
|
+
res.json(list);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
console.error('Error while listing connectors', error);
|
|
78
|
+
res.status(validateStatus(error?.code ?? error?.httpStatusCode, 500)).json({
|
|
79
|
+
error: true,
|
|
80
|
+
message: 'Error while listing connectors: ' + error.message,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error('Error in the list connectors request', error);
|
|
86
|
+
res.status(validateStatus(error?.code ?? error?.httpStatusCode, 400)).json({
|
|
87
|
+
error: true,
|
|
88
|
+
message: 'Error in the list connectors request: ' + error.message,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function routeLogin(req, res) {
|
|
93
|
+
try {
|
|
94
|
+
const query = req.query;
|
|
95
|
+
const connectorId = (0, validation_1.requiredParam)(query.connectorId, 'Connector id');
|
|
96
|
+
const config = (0, validation_1.requiredParam)(req.app.get('config'), 'Config object on express js APP');
|
|
97
|
+
const type = (0, connectors_1.toConnectorEnum)((0, validation_1.requiredParam)(query.type, 'Connector type'));
|
|
98
|
+
const connector = await (0, connectors_1.getConnector)(config, req['session'], type, connectorId);
|
|
99
|
+
const session = (0, validation_1.requiredParam)(req['session'], 'Session object');
|
|
100
|
+
if (!connector)
|
|
101
|
+
throw new Error(`Connector not found ${connectorId} ${type}`);
|
|
102
|
+
if (await connector.isLoggedIn(session)) {
|
|
103
|
+
res.redirect(`${config.url}${constants_1.API_PATH}${constants_1.API_CONNECTOR_PATH}${constants_1.API_CONNECTOR_LOGIN_CALLBACK}?connectorId=${connectorId}&type=${type}`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const oauthUrl = await connector.getOAuthUrl(session);
|
|
107
|
+
if (oauthUrl) {
|
|
108
|
+
res.redirect(oauthUrl);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const redirectTo = await connector.getSettingsForm(session, '') ?
|
|
112
|
+
`${config.url}${constants_1.API_PATH}${constants_1.API_CONNECTOR_PATH}${constants_1.API_CONNECTOR_SETTINGS}?connectorId=${connectorId}&type=${type}` :
|
|
113
|
+
`${config.url}${constants_1.API_PATH}${constants_1.API_CONNECTOR_PATH}${constants_1.API_CONNECTOR_LOGIN_CALLBACK}?connectorId=${connectorId}&type=${type}`;
|
|
114
|
+
res.send(await connector.getLoginForm(session, redirectTo));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.error('Error in the login request', error);
|
|
119
|
+
res.status(validateStatus(error?.code ?? error?.httpStatusCode, 400)).json({
|
|
120
|
+
error: true,
|
|
121
|
+
message: 'Error in the login request: ' + error.message,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function routeLoginSuccess(req, res) {
|
|
126
|
+
try {
|
|
127
|
+
const query = req.query;
|
|
128
|
+
if (query.error)
|
|
129
|
+
throw new Error(query.error);
|
|
130
|
+
const body = req.body;
|
|
131
|
+
const session = (0, validation_1.requiredParam)(req['session'], 'Session object');
|
|
132
|
+
const connectorId = (0, validation_1.requiredParam)(query.connectorId, 'Connector id');
|
|
133
|
+
const config = (0, validation_1.requiredParam)(req.app.get('config'), 'Config object on express js APP');
|
|
134
|
+
const type = (0, connectors_1.toConnectorEnum)((0, validation_1.requiredParam)(query.type, 'Connector type'));
|
|
135
|
+
const connector = await (0, connectors_1.getConnector)(config, req['session'], type, connectorId);
|
|
136
|
+
if (!connector)
|
|
137
|
+
throw new Error('Connector not found ' + connectorId);
|
|
138
|
+
if (await connector.isLoggedIn(session)) {
|
|
139
|
+
console.info('User already logged in for connector ' + connectorId);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
await connector.setToken(session, {
|
|
143
|
+
...query,
|
|
144
|
+
...body,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
res.send(getEndAuthHtml('Logged in', false, connectorId, connector.getOptions(body)));
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
res
|
|
151
|
+
.status(validateStatus(error?.code ?? error?.httpStatusCode, 500))
|
|
152
|
+
.send(getEndAuthHtml(error.message, true));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async function routeLogout(req, res) {
|
|
156
|
+
try {
|
|
157
|
+
const query = req.query;
|
|
158
|
+
const session = (0, validation_1.requiredParam)(req['session'], 'Session object');
|
|
159
|
+
const config = (0, validation_1.requiredParam)(req.app.get('config'), 'Config object on express js APP');
|
|
160
|
+
const type = (0, connectors_1.toConnectorEnum)((0, validation_1.requiredParam)(query.type, 'Connector type'));
|
|
161
|
+
const connectorId = query.connectorId;
|
|
162
|
+
const connector = await (0, connectors_1.getConnector)(config, session, type, connectorId);
|
|
163
|
+
if (!connector)
|
|
164
|
+
throw new Error(`Connector not found ${connectorId} ${type}`);
|
|
165
|
+
try {
|
|
166
|
+
await connector.logout(session);
|
|
167
|
+
res.json({
|
|
168
|
+
error: false,
|
|
169
|
+
message: 'OK',
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
console.error('Error while logging out', error);
|
|
174
|
+
res.status(validateStatus(error?.code ?? error?.httpStatusCode, 500)).json({
|
|
175
|
+
error: true,
|
|
176
|
+
message: 'Error while logging out: ' + error.message,
|
|
177
|
+
});
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.error('Error in the logout request', error);
|
|
183
|
+
res.status(validateStatus(error?.code ?? error?.httpStatusCode, 400)).json({
|
|
184
|
+
error: true,
|
|
185
|
+
message: 'Error in the logout request: ' + error.message,
|
|
186
|
+
});
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function getEndAuthHtml(message, error, connectorId, options) {
|
|
191
|
+
const data = {
|
|
192
|
+
type: 'login',
|
|
193
|
+
error,
|
|
194
|
+
message,
|
|
195
|
+
connectorId,
|
|
196
|
+
options,
|
|
197
|
+
};
|
|
198
|
+
return `
|
|
199
|
+
<html>
|
|
200
|
+
<head>
|
|
201
|
+
<script>
|
|
202
|
+
if(window.opener) {
|
|
203
|
+
window.opener.postMessage(${JSON.stringify(data)}, '*')
|
|
204
|
+
window.close()
|
|
205
|
+
} else {
|
|
206
|
+
window.location.href = '/'
|
|
207
|
+
}
|
|
208
|
+
</script>
|
|
209
|
+
</head>
|
|
210
|
+
<body>
|
|
211
|
+
<p>${message}</p>
|
|
212
|
+
<p>Close this window or <a href="/">go back to /</a></p>
|
|
213
|
+
</body>
|
|
214
|
+
</html>
|
|
215
|
+
`;
|
|
216
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getStorageConnector = exports.getHostingConnector = exports.PublicationError = void 0;
|
|
4
|
+
const express_1 = require("express");
|
|
5
|
+
const constants_1 = require("../../constants");
|
|
6
|
+
const types_1 = require("../../types");
|
|
7
|
+
const connectors_1 = require("../connectors/connectors");
|
|
8
|
+
const validation_1 = require("../utils/validation");
|
|
9
|
+
const events_1 = require("../events");
|
|
10
|
+
const jobs_1 = require("../jobs");
|
|
11
|
+
class PublicationError extends Error {
|
|
12
|
+
code;
|
|
13
|
+
constructor(message, code) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.code = code;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.PublicationError = PublicationError;
|
|
19
|
+
const PROJECT_ROOT = require.main ? require.main.path : process.cwd();
|
|
20
|
+
async function getHostingConnector(session, config, connectorId) {
|
|
21
|
+
const hostingConnector = await (0, connectors_1.getConnector)(config, session, types_1.ConnectorType.HOSTING, connectorId);
|
|
22
|
+
if (!hostingConnector) {
|
|
23
|
+
throw new PublicationError('No hosting connector found', 500);
|
|
24
|
+
}
|
|
25
|
+
if (!await hostingConnector.isLoggedIn(session)) {
|
|
26
|
+
throw new PublicationError('Not logged in', 401);
|
|
27
|
+
}
|
|
28
|
+
return hostingConnector;
|
|
29
|
+
}
|
|
30
|
+
exports.getHostingConnector = getHostingConnector;
|
|
31
|
+
async function getStorageConnector(session, config, connectorId) {
|
|
32
|
+
const storageConnector = await (0, connectors_1.getConnector)(config, session, types_1.ConnectorType.STORAGE, connectorId);
|
|
33
|
+
if (!storageConnector) {
|
|
34
|
+
throw new PublicationError('No storage connector found', 500);
|
|
35
|
+
}
|
|
36
|
+
if (!await storageConnector.isLoggedIn(session)) {
|
|
37
|
+
throw new PublicationError('Not logged in to the storage connector', 401);
|
|
38
|
+
}
|
|
39
|
+
return storageConnector;
|
|
40
|
+
}
|
|
41
|
+
exports.getStorageConnector = getStorageConnector;
|
|
42
|
+
function default_1(config) {
|
|
43
|
+
const router = (0, express_1.Router)();
|
|
44
|
+
router.get(constants_1.API_PUBLICATION_STATUS, async function (req, res) {
|
|
45
|
+
const query = req.query;
|
|
46
|
+
const jobId = query.jobId;
|
|
47
|
+
const job = jobId && (0, jobs_1.getJob)(jobId);
|
|
48
|
+
if (!job) {
|
|
49
|
+
console.error(`Error: job not found with id ${jobId}`);
|
|
50
|
+
res.status(404).json({
|
|
51
|
+
message: 'Error: job not found.',
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
res.json({
|
|
56
|
+
...job,
|
|
57
|
+
_timeout: undefined,
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
router.post(constants_1.API_PUBLICATION_PUBLISH, async function (req, res) {
|
|
61
|
+
try {
|
|
62
|
+
const query = req.query;
|
|
63
|
+
const body = req.body;
|
|
64
|
+
const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'id in query');
|
|
65
|
+
const storageId = (0, validation_1.requiredParam)(query.storageId, 'storageId in query');
|
|
66
|
+
const hostingId = (0, validation_1.requiredParam)(query.hostingId, 'hostingId in query');
|
|
67
|
+
const session = (0, validation_1.requiredParam)(req['session'], 'session on express request');
|
|
68
|
+
const data = body;
|
|
69
|
+
const { files } = data;
|
|
70
|
+
if (!files) {
|
|
71
|
+
throw new PublicationError('Missing files in body', 400);
|
|
72
|
+
}
|
|
73
|
+
config.emit(events_1.ServerEvent.PUBLISH_START, data);
|
|
74
|
+
const hostingConnector = await getHostingConnector(session, config, hostingId);
|
|
75
|
+
const storage = await getStorageConnector(session, config, storageId);
|
|
76
|
+
const filesList = await Promise.all(files.map(async (file) => {
|
|
77
|
+
const prefix = constants_1.API_WEBSITE_ASSET_READ;
|
|
78
|
+
const fileWithContent = file;
|
|
79
|
+
const fileWithSrc = file;
|
|
80
|
+
if (!fileWithContent.content && !fileWithSrc.src)
|
|
81
|
+
throw new PublicationError('Missing content or src in file', 400);
|
|
82
|
+
const src = fileWithSrc.src?.startsWith(prefix) ? fileWithSrc.src.substring(prefix.length) : fileWithSrc.src;
|
|
83
|
+
return {
|
|
84
|
+
path: file.path,
|
|
85
|
+
content: fileWithContent.content ??
|
|
86
|
+
await storage.readAsset(session, websiteId, src),
|
|
87
|
+
};
|
|
88
|
+
}));
|
|
89
|
+
res.json({
|
|
90
|
+
url: await hostingConnector.getUrl(session, websiteId),
|
|
91
|
+
job: await hostingConnector.publish(session, websiteId, filesList, jobs_1.jobManager),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
console.error('Error publishing the website', err);
|
|
96
|
+
res
|
|
97
|
+
.status(typeof err.code === 'number' ? err.code : 500)
|
|
98
|
+
.json({
|
|
99
|
+
message: `Error publishing the website. ${err.message}`
|
|
100
|
+
});
|
|
101
|
+
config.emit(events_1.ServerEvent.PUBLISH_END, err);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
config.emit(events_1.ServerEvent.PUBLISH_END);
|
|
105
|
+
});
|
|
106
|
+
return router;
|
|
107
|
+
}
|
|
108
|
+
exports.default = default_1;
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_1 = require("express");
|
|
7
|
+
const formidable_1 = __importDefault(require("formidable"));
|
|
8
|
+
const constants_1 = require("../../constants");
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const types_1 = require("../../types");
|
|
11
|
+
const connectors_1 = require("../connectors/connectors");
|
|
12
|
+
const stream_1 = require("stream");
|
|
13
|
+
const validation_1 = require("../utils/validation");
|
|
14
|
+
const path_1 = require("path");
|
|
15
|
+
const events_1 = require("../events");
|
|
16
|
+
function default_1(config, opts = {}) {
|
|
17
|
+
const options = {
|
|
18
|
+
assetsPath: '/assets',
|
|
19
|
+
...opts
|
|
20
|
+
};
|
|
21
|
+
const router = (0, express_1.Router)();
|
|
22
|
+
router.get(constants_1.API_WEBSITE_READ, async (req, res, next) => {
|
|
23
|
+
const query = req.query;
|
|
24
|
+
const { websiteId, connectorId } = query;
|
|
25
|
+
const session = req['session'];
|
|
26
|
+
if (!websiteId) {
|
|
27
|
+
next();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const websiteData = await readWebsite(session, websiteId, connectorId);
|
|
32
|
+
if (websiteData instanceof stream_1.Readable) {
|
|
33
|
+
websiteData.pipe(res.type('application/json'));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
res.json(websiteData);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
if (e.httpStatusCode) {
|
|
41
|
+
res.status(e.httpStatusCode).json({ message: e.message });
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
res.status(500).json({ message: e.message });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
router.get(constants_1.API_WEBSITE_LIST, async (req, res) => {
|
|
49
|
+
const query = req.query;
|
|
50
|
+
const { connectorId } = query;
|
|
51
|
+
const session = req['session'];
|
|
52
|
+
try {
|
|
53
|
+
const websites = await listWebsites(req['session'], query.connectorId);
|
|
54
|
+
res.json(websites);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
console.error('Error getting website data', e);
|
|
58
|
+
if (e.httpStatusCode) {
|
|
59
|
+
res.status(e.httpStatusCode).json({ message: e.message });
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
res.status(500).json({ message: e.message });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
router.post(constants_1.API_WEBSITE_WRITE, async (req, res) => {
|
|
67
|
+
try {
|
|
68
|
+
const query = req.query;
|
|
69
|
+
const body = req.body;
|
|
70
|
+
const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
|
|
71
|
+
const websiteData = (0, validation_1.requiredParam)(body, 'Website data');
|
|
72
|
+
const connectorId = query.connectorId;
|
|
73
|
+
config.emit(events_1.ServerEvent.WEBSITE_STORE_START, { websiteId, websiteData, connectorId });
|
|
74
|
+
await writeWebsite(req['session'], websiteId, websiteData, connectorId);
|
|
75
|
+
config.emit(events_1.ServerEvent.WEBSITE_STORE_END, null);
|
|
76
|
+
res.status(200).json({ message: 'Website saved' });
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
console.error('Error saving website data', e);
|
|
80
|
+
config.emit(events_1.ServerEvent.WEBSITE_STORE_END, e);
|
|
81
|
+
if (e.httpStatusCode) {
|
|
82
|
+
res.status(e.httpStatusCode).json({ message: e.message });
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
res.status(500).json({ message: e.message });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
router.put(constants_1.API_WEBSITE_CREATE, async (req, res) => {
|
|
90
|
+
try {
|
|
91
|
+
const session = req['session'];
|
|
92
|
+
const query = req.query;
|
|
93
|
+
const body = req.body;
|
|
94
|
+
const websiteMeta = (0, validation_1.requiredParam)(body, 'Website meta');
|
|
95
|
+
const connectorId = query.connectorId;
|
|
96
|
+
const connector = await (0, connectors_1.getConnector)(config, session, types_1.ConnectorType.STORAGE, connectorId);
|
|
97
|
+
if (!connector) {
|
|
98
|
+
throw new types_1.ApiError(`Connector ${connectorId} not found`, 500);
|
|
99
|
+
}
|
|
100
|
+
await connector.createWebsite(session, websiteMeta);
|
|
101
|
+
res.json({ message: 'Website meta saved' });
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
console.error('Error saving website meta', e);
|
|
105
|
+
if (e.httpStatusCode) {
|
|
106
|
+
res.status(e.httpStatusCode).json({ message: e.message });
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
res.status(500).json({ message: e.message });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
router.post(constants_1.API_WEBSITE_META_WRITE, async (req, res) => {
|
|
114
|
+
try {
|
|
115
|
+
const session = req['session'];
|
|
116
|
+
const query = req.query;
|
|
117
|
+
const body = req.body;
|
|
118
|
+
const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
|
|
119
|
+
const websiteMeta = (0, validation_1.requiredParam)(body, 'Website meta');
|
|
120
|
+
const connectorId = query.connectorId;
|
|
121
|
+
const connector = await (0, connectors_1.getConnector)(config, session, types_1.ConnectorType.STORAGE, connectorId);
|
|
122
|
+
if (!connector) {
|
|
123
|
+
throw new types_1.ApiError(`Connector ${connectorId} not found`, 500);
|
|
124
|
+
}
|
|
125
|
+
await connector.setWebsiteMeta(session, websiteId, websiteMeta);
|
|
126
|
+
res.json({ message: 'Website meta saved' });
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
console.error('Error saving website meta', e);
|
|
130
|
+
if (e.httpStatusCode) {
|
|
131
|
+
res.status(e.httpStatusCode).json({ message: e.message });
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
res.status(500).json({ message: e.message });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
router.get(constants_1.API_WEBSITE_META_READ, async (req, res) => {
|
|
139
|
+
try {
|
|
140
|
+
const session = req['session'];
|
|
141
|
+
const query = req.query;
|
|
142
|
+
const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
|
|
143
|
+
const connectorId = query.connectorId;
|
|
144
|
+
const connector = await (0, connectors_1.getConnector)(config, session, types_1.ConnectorType.STORAGE, connectorId);
|
|
145
|
+
if (!connector) {
|
|
146
|
+
throw new types_1.ApiError(`Connector ${connectorId} not found`, 500);
|
|
147
|
+
}
|
|
148
|
+
const websiteMeta = await connector.getWebsiteMeta(session, websiteId);
|
|
149
|
+
res.json(websiteMeta);
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
console.error('Error getting website meta', e);
|
|
153
|
+
if (e.httpStatusCode) {
|
|
154
|
+
res.status(e.httpStatusCode).json({ message: e.message });
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
res.status(500).json({ message: e.message });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
router.delete(constants_1.API_WEBSITE_DELETE, async (req, res) => {
|
|
162
|
+
try {
|
|
163
|
+
const query = req.query;
|
|
164
|
+
const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
|
|
165
|
+
await deleteWebsite(req['session'], websiteId, query.connectorId);
|
|
166
|
+
res.status(200).json({ message: 'Website deleted' });
|
|
167
|
+
}
|
|
168
|
+
catch (e) {
|
|
169
|
+
console.error('Error deleting website data', e);
|
|
170
|
+
if (e.httpStatusCode) {
|
|
171
|
+
res.status(e.httpStatusCode).json({ message: e.message });
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
res.status(500).json({ message: e.message });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
router.get(constants_1.API_WEBSITE_ASSET_READ + '/:path', async (req, res) => {
|
|
179
|
+
{
|
|
180
|
+
try {
|
|
181
|
+
const query = req.query;
|
|
182
|
+
const params = req.params;
|
|
183
|
+
const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
|
|
184
|
+
const path = (0, validation_1.requiredParam)(params.path, 'path');
|
|
185
|
+
const asset = await readAsset(req['session'], websiteId, path, query.connectorId);
|
|
186
|
+
res.contentType((0, path_1.basename)(path));
|
|
187
|
+
if (asset instanceof stream_1.Readable) {
|
|
188
|
+
asset.pipe(res);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
res.send(asset);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch (e) {
|
|
195
|
+
console.error('Error getting asset', e);
|
|
196
|
+
if (e.httpStatusCode) {
|
|
197
|
+
res.status(e.httpStatusCode).json({ message: e.message });
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
res.status(500).json({ message: e.message });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
router.post(constants_1.API_WEBSITE_ASSETS_WRITE, async (req, res) => {
|
|
206
|
+
try {
|
|
207
|
+
const query = req.query;
|
|
208
|
+
const websiteId = (0, validation_1.requiredParam)(query.websiteId, 'Website id');
|
|
209
|
+
const form = (0, formidable_1.default)({
|
|
210
|
+
filename: (name, ext, part, _form) => `${name}${ext}`,
|
|
211
|
+
multiples: true,
|
|
212
|
+
keepExtensions: true,
|
|
213
|
+
});
|
|
214
|
+
const connectorId = query.connectorId;
|
|
215
|
+
const files = await new Promise((resolve, reject) => {
|
|
216
|
+
form.parse(req, async (err, fields, _files) => {
|
|
217
|
+
if (err) {
|
|
218
|
+
console.error('Error parsing upload data', err);
|
|
219
|
+
reject(new types_1.ApiError('Error parsing upload data: ' + err.message, 400));
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
const files = [].concat(_files['files[]'])
|
|
223
|
+
.map(file => file.toJSON())
|
|
224
|
+
.map(file => ({
|
|
225
|
+
path: `/${file.originalFilename}`,
|
|
226
|
+
content: (0, fs_1.createReadStream)(file.filepath),
|
|
227
|
+
}));
|
|
228
|
+
resolve(files);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
config.emit(events_1.ServerEvent.WEBSITE_ASSET_STORE_START, { files, websiteId, connectorId });
|
|
233
|
+
const result = await writeAssets(req['session'], websiteId, files, connectorId);
|
|
234
|
+
const baseUrl = new URL(config.url).pathname.replace(/\/$/, '');
|
|
235
|
+
const data = result.map(path => baseUrl + constants_1.API_PATH + constants_1.API_WEBSITE_PATH + constants_1.API_WEBSITE_ASSET_READ
|
|
236
|
+
+ path
|
|
237
|
+
+ `?websiteId=${websiteId}&connectorId=${connectorId ? connectorId : ''}`);
|
|
238
|
+
res.json({
|
|
239
|
+
data,
|
|
240
|
+
});
|
|
241
|
+
config.emit(events_1.ServerEvent.WEBSITE_ASSET_STORE_END, null);
|
|
242
|
+
}
|
|
243
|
+
catch (e) {
|
|
244
|
+
console.error('Error uploading assets', e);
|
|
245
|
+
if (e.httpStatusCode) {
|
|
246
|
+
res.status(e.httpStatusCode).json({ message: e.message });
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
res.status(500).json({ message: e.message });
|
|
250
|
+
}
|
|
251
|
+
config.emit(events_1.ServerEvent.WEBSITE_ASSET_STORE_END, e);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
async function getStorageConnector(session, connectorId) {
|
|
255
|
+
const storageConnector = await (0, connectors_1.getConnector)(config, session, types_1.ConnectorType.STORAGE, connectorId);
|
|
256
|
+
if (!storageConnector) {
|
|
257
|
+
throw new types_1.ApiError('No storage connector found', 404);
|
|
258
|
+
}
|
|
259
|
+
if (!await storageConnector.isLoggedIn(session)) {
|
|
260
|
+
throw new types_1.ApiError('Not logged in', 401);
|
|
261
|
+
}
|
|
262
|
+
return storageConnector;
|
|
263
|
+
}
|
|
264
|
+
async function readWebsite(session, websiteId, connectorId) {
|
|
265
|
+
const storageConnector = await getStorageConnector(session, connectorId);
|
|
266
|
+
return storageConnector.readWebsite(session, websiteId);
|
|
267
|
+
}
|
|
268
|
+
async function listWebsites(session, connectorId) {
|
|
269
|
+
const storageConnector = await getStorageConnector(session, connectorId);
|
|
270
|
+
return storageConnector.listWebsites(session);
|
|
271
|
+
}
|
|
272
|
+
async function writeWebsite(session, websiteId, websiteData, connectorId) {
|
|
273
|
+
const storageConnector = await getStorageConnector(session, connectorId);
|
|
274
|
+
await storageConnector.updateWebsite(session, websiteId, websiteData);
|
|
275
|
+
}
|
|
276
|
+
async function deleteWebsite(session, websiteId, connectorId) {
|
|
277
|
+
const storageConnector = await getStorageConnector(session, connectorId);
|
|
278
|
+
return storageConnector.deleteWebsite(session, websiteId);
|
|
279
|
+
}
|
|
280
|
+
async function readAsset(session, websiteId, fileName, connectorId) {
|
|
281
|
+
const storageConnector = await getStorageConnector(session, connectorId);
|
|
282
|
+
return storageConnector.readAsset(session, websiteId, `/${fileName}`);
|
|
283
|
+
}
|
|
284
|
+
async function writeAssets(session, websiteId, files, connectorId) {
|
|
285
|
+
const storageConnector = await getStorageConnector(session, connectorId);
|
|
286
|
+
const cleanPathFiles = files.map(file => ({
|
|
287
|
+
...file,
|
|
288
|
+
path: file.path.replace('/assets/', '/'),
|
|
289
|
+
}));
|
|
290
|
+
const result = await storageConnector.writeAssets(session, websiteId, cleanPathFiles);
|
|
291
|
+
return files
|
|
292
|
+
.map(({ path }, idx) => result && result[idx] ? result[idx] : path);
|
|
293
|
+
}
|
|
294
|
+
return router;
|
|
295
|
+
}
|
|
296
|
+
exports.default = default_1;
|