adminizer 4.1.0-commit.ad1476a → 4.1.1
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/Readme.md +46 -0
- package/assets/{VanillaJSONEditor-FUe77pIA.js → VanillaJSONEditor-DfRefswH.js} +104 -104
- package/assets/add-CJ1-zeA1.js +1 -0
- package/assets/add-form-CbNl0wdS.js +1 -0
- package/assets/add-group-form-Bt_Dx9wm.js +1 -0
- package/assets/add-group-pIFJV5qL.js +1 -0
- package/assets/add-user-D2US8hL_.js +1 -0
- package/assets/add-user-form-Bt8Jy6S2.js +1 -0
- package/assets/{app-DMmad2-f.css → app-B6cCPfWk.css} +1 -1
- package/assets/app-layout-B86jl9bH.js +1 -0
- package/assets/app-shell-CiGyzQ0C.js +1 -0
- package/assets/app-sidebar-Bz-SRwBg.js +1 -0
- package/assets/app-sidebar-header-7CNCx7Rs.js +11 -0
- package/assets/app.js +45 -37
- package/assets/breadcrumbs-_jhtTcOi.js +1 -0
- package/assets/catalog-CON6moaA.js +16 -0
- package/assets/catalog-Cc6Mk9sX.css +1 -0
- package/assets/checkbox-CQdZw5mb.js +1 -0
- package/assets/dashboard-BOltB2Hq.css +1 -0
- package/assets/dashboard-es9ZT8qk.js +3 -0
- package/assets/{date-picker-B__dVVqj.js → date-picker-Dz-d-YWX.js} +2 -2
- package/assets/debounce-qdyXyOeG.js +1 -0
- package/assets/del-modal-D0mrZvki.js +11 -0
- package/assets/dialog-stack-BiMbfm58.js +1 -0
- package/assets/dropdown-menu-BSBcRiXx.js +1 -0
- package/assets/{field-renderer-CapylJU9.js → field-renderer-B6hFAeiU.js} +3 -3
- package/assets/form-Buslty7y.js +1 -0
- package/assets/form-aqiRmPix.js +1 -0
- package/assets/{geo-json-CwteYDGB.js → geo-json-BKmYmu3d.js} +2 -2
- package/assets/{handsontable-BCnjOpBr.js → handsontable-B8xVeMAQ.js} +5 -5
- package/assets/home-Dr72Jk-w.js +2 -0
- package/assets/icon-B-a7xg54.js +1 -0
- package/assets/index-B68_akQe.js +1 -0
- package/assets/index-B7-xTDyy.js +1 -0
- package/assets/index-BJFFlCSo.js +1 -0
- package/assets/{index-DTRTjOmh.js → index-BOuMo_nl.js} +3 -3
- package/assets/index-BzOcGsBq.js +1 -0
- package/assets/index-CFbQ2Rv0.js +1 -0
- package/assets/{index-D5ir9iUV.js → index-Cq31rrfZ.js} +1 -1
- package/assets/{index-BcE9FUM6.js → index-D5UDXTFs.js} +1 -1
- package/assets/index-oxIQWAdI.js +41 -0
- package/assets/init-user-5H689LP0.js +1 -0
- package/assets/input-CSJjrf2i.js +1 -0
- package/assets/input-error-CK92Shhm.js +1 -0
- package/assets/label-Muj0-Efy.js +1 -0
- package/assets/list-Cvh7zbyG.js +1 -0
- package/assets/list-table-Bs_vbQiV.js +52 -0
- package/assets/login-DliJrjMQ.js +6 -0
- package/assets/manifest.json +589 -666
- package/assets/material-icon-BRS58Qpk.js +1 -0
- package/assets/module-CjG21VCT.js +1 -0
- package/assets/{monaco-editor-DqAqwxw4.js → monaco-editor-9fDiyfuW.js} +2 -2
- package/assets/{multi-select-oabtVhUP.js → multi-select-CMQIJ0JT.js} +2 -2
- package/assets/nav-footer-IGMn9NiE.js +1 -0
- package/assets/nav-main-DBE4rMiZ.js +1 -0
- package/assets/nav-user-CjyLRyq-.js +1 -0
- package/assets/pagination-render-DUAq2klc.js +1 -0
- package/assets/popover-C_cww-4_.js +1 -0
- package/assets/register-UzQn3J0g.js +1 -0
- package/assets/{select-D1N8zRPY.js → select-DzBno-dc.js} +2 -2
- package/assets/{sidebar-4D-sX2l4.js → sidebar-Dc4iqfu-.js} +2 -2
- package/assets/skeleton-Dkmj2o2Z.js +1 -0
- package/assets/sonner-De1t71Gj.js +1 -0
- package/assets/{toast-editor-FbrFd1ft.js → toast-editor-1Pul3oMs.js} +2 -2
- package/assets/tooltip-CwPrC-HD.js +1 -0
- package/assets/use-appearance-J8J2w43p.js +1 -0
- package/assets/use-window-size-DLSEoR6e.js +1 -0
- package/assets/{user-info-DBYoAJYJ.js → user-info-8RyDk7qh.js} +2 -2
- package/assets/user-menu-content-CpxTLH56.js +6 -0
- package/assets/welcome-BYKI6yO-.js +1 -0
- package/controllers/add.js +10 -10
- package/controllers/addGroup.js +2 -4
- package/controllers/addUser.js +4 -6
- package/controllers/catalog/Catalog.d.ts +1 -1
- package/controllers/catalog/Catalog.js +42 -37
- package/controllers/catalog/FrontentCatalogAdapter.d.ts +36 -26
- package/controllers/catalog/FrontentCatalogAdapter.js +71 -73
- package/controllers/ckeditorUpload.js +2 -3
- package/controllers/dashboard.js +16 -2
- package/controllers/edit.js +10 -14
- package/controllers/editGroup.js +2 -4
- package/controllers/editUser.js +3 -5
- package/controllers/form.js +2 -3
- package/controllers/getAllWidgets.js +3 -3
- package/controllers/initUser.js +1 -2
- package/controllers/list.js +6 -6
- package/controllers/login.js +43 -18
- package/controllers/media-manager/mediaManagerAdapter.js +1 -2
- package/controllers/media-manager/mediaManagerApi.js +2 -2
- package/controllers/navigation/edit.js +2 -2
- package/controllers/register.js +1 -4
- package/controllers/remove.js +3 -3
- package/controllers/timezones.js +1 -1
- package/controllers/view.js +3 -3
- package/controllers/welcome.js +1 -1
- package/controllers/widgets/Action.js +2 -2
- package/controllers/widgets/Custom.js +2 -2
- package/controllers/widgets/Info.js +2 -2
- package/controllers/widgets/switch.js +2 -2
- package/controllers/widgetsDB.js +5 -5
- package/helpers/JsUtils.d.ts +1 -0
- package/helpers/JsUtils.js +3 -0
- package/helpers/accessRightsHelper.d.ts +6 -2
- package/helpers/accessRightsHelper.js +28 -5
- package/helpers/configHelper.js +2 -1
- package/helpers/controllerHelper.js +39 -18
- package/helpers/fieldsHelper.d.ts +4 -3
- package/helpers/fieldsHelper.js +5 -1
- package/helpers/inertiaActionsHelper.js +1 -1
- package/helpers/inertiaAddHelper.d.ts +3 -4
- package/helpers/inertiaAddHelper.js +27 -7
- package/helpers/inertiaFromHelper.js +2 -0
- package/helpers/inertiaGroupHelper.d.ts +4 -2
- package/helpers/inertiaGroupHelper.js +1 -1
- package/helpers/inertiaListHelper.js +5 -5
- package/helpers/inertiaMenuHelper.d.ts +1 -1
- package/helpers/inertiaMenuHelper.js +2 -2
- package/helpers/inertiaUserHelper.d.ts +7 -1
- package/helpers/inertiaUserHelper.js +5 -1
- package/helpers/menuHelper.d.ts +8 -3
- package/helpers/menuHelper.js +26 -17
- package/index.d.ts +6 -3
- package/index.js +9 -3
- package/interfaces/adminpanelConfig.d.ts +41 -32
- package/interfaces/global.d.ts +10 -28
- package/interfaces/types.d.ts +1 -1
- package/lib/Adminizer.d.ts +11 -3
- package/lib/Adminizer.js +49 -17
- package/lib/media-manager/AbstractMediaManager.d.ts +2 -2
- package/lib/media-manager/AbstractMediaManager.js +1 -1
- package/lib/media-manager/Items.js +0 -3
- package/lib/requestProcessor.js +10 -3
- package/lib/v4/DataAccessor.d.ts +5 -2
- package/lib/v4/DataAccessor.js +44 -19
- package/lib/v4/I18n.js +2 -0
- package/lib/v4/POWCaptcha.js +0 -1
- package/lib/v4/PolicyManager.js +0 -1
- package/lib/{catalog → v4/catalog}/AbstractCatalog.d.ts +89 -60
- package/lib/{catalog → v4/catalog}/AbstractCatalog.js +59 -55
- package/lib/v4/catalog/Navigation.d.ts +43 -0
- package/lib/v4/catalog/Navigation.js +457 -0
- package/lib/{controls → v4/controls}/AbstractControls.d.ts +1 -1
- package/lib/{controls → v4/controls}/codeEditor/MonacoEditor.d.ts +1 -1
- package/lib/{controls → v4/controls}/geojsoneditor/GeoEditor.d.ts +1 -1
- package/lib/{controls → v4/controls}/jsoneditor/JsonEditor.d.ts +1 -1
- package/lib/{controls → v4/controls}/markdown/ToastUiEditor.d.ts +1 -1
- package/lib/{controls → v4/controls}/table/Handsontable.d.ts +1 -1
- package/lib/{controls → v4/controls}/wysiwyg/CKeditor.d.ts +1 -1
- package/lib/{datatable → v4/datatable}/NodeTable.d.ts +3 -3
- package/lib/{datatable → v4/datatable}/NodeTable.js +8 -8
- package/lib/v4/helper/jwt.d.ts +10 -0
- package/lib/v4/helper/jwt.js +18 -0
- package/lib/{inertia → v4/inertia}/inertiaAdapter.js +0 -1
- package/lib/v4/model/AbstractModel.d.ts +5 -1
- package/lib/v4/model/AbstractModel.js +2 -3
- package/lib/v4/model/ModelHandler.js +1 -4
- package/lib/v4/model/adapter/sequelize.d.ts +11 -2
- package/lib/v4/model/adapter/sequelize.js +451 -118
- package/lib/v4/model/adapter/waterline.js +5 -3
- package/lib/{widgets → v4/widgets}/abstractAction.d.ts +1 -1
- package/lib/v4/widgets/abstractCustom.d.ts +28 -0
- package/lib/v4/widgets/abstractCustom.js +9 -0
- package/lib/{widgets → v4/widgets}/abstractInfo.d.ts +1 -1
- package/lib/{widgets → v4/widgets}/abstractInfo.js +1 -1
- package/lib/{widgets → v4/widgets}/abstractLink.d.ts +2 -1
- package/lib/{widgets → v4/widgets}/abstractSwitch.d.ts +1 -1
- package/lib/{widgets → v4/widgets}/abstractWidgetBase.d.ts +2 -2
- package/lib/{widgets → v4/widgets}/widgetHandler.d.ts +29 -5
- package/lib/{widgets → v4/widgets}/widgetHandler.js +25 -25
- package/models/GroupAP.d.ts +8 -0
- package/models/NavigationAP.d.ts +7 -3
- package/models/NavigationAP.js +5 -6
- package/models/UserAP.d.ts +24 -2
- package/models/UserAP.js +2 -2
- package/package.json +29 -11
- package/policies/checkAuth.js +4 -3
- package/policies/setLocale.js +2 -2
- package/system/Router.js +14 -17
- package/system/bindAccessRights.js +0 -4
- package/system/bindAuthorization.js +4 -5
- package/system/bindControls.js +6 -6
- package/system/bindDev.js +1 -0
- package/system/bindInertia.js +17 -12
- package/system/bindMediaManager.js +0 -1
- package/system/bindModels.js +9 -6
- package/system/bindNavigation.d.ts +2 -0
- package/system/bindNavigation.js +42 -42
- package/system/bindReqFunctions.js +15 -0
- package/system/defaults.js +13 -6
- package/translations/ar.json +70 -1
- package/translations/cn.json +70 -1
- package/translations/de.json +71 -3
- package/translations/en.json +70 -102
- package/translations/es.json +70 -1
- package/translations/fr.json +70 -1
- package/translations/hi.json +70 -1
- package/translations/jp.json +70 -1
- package/translations/ko.json +70 -1
- package/translations/pt.json +70 -1
- package/translations/ru.json +71 -94
- package/translations/ua.json +70 -1
- package/translations/uz.json +72 -0
- package/translations/vi.json +70 -1
- package/assets/add-ZITr43GJ.js +0 -1
- package/assets/add-form-CYOfr0Ef.js +0 -1
- package/assets/add-group-B332wN8K.js +0 -1
- package/assets/add-group-form-dzadPSfL.js +0 -1
- package/assets/add-user-TC-mYdsB.js +0 -1
- package/assets/add-user-form-y2f_1_lM.js +0 -1
- package/assets/app-layout-D1m9Kvxq.js +0 -1
- package/assets/app-shell-BWMRMkHM.js +0 -1
- package/assets/app-sidebar-BCtaEFGb.js +0 -1
- package/assets/app-sidebar-header-DLAFi13E.js +0 -11
- package/assets/breadcrumbs-CQNon4Vl.js +0 -1
- package/assets/button-CQ9t1kLz.js +0 -1
- package/assets/checkbox-W0nGAXIj.js +0 -1
- package/assets/compiler-runtime-tM4jBQ-T.js +0 -9
- package/assets/dashboard-BR602KhL.js +0 -1
- package/assets/dropdown-menu-SEBnEIiL.js +0 -1
- package/assets/form-DOUNk3o2.js +0 -1
- package/assets/form-lOKv4Qbw.js +0 -1
- package/assets/home-Ch6QfTIt.js +0 -2
- package/assets/icon-Bz9BMaD0.js +0 -1
- package/assets/index-BC0yfOHo.js +0 -1
- package/assets/index-BbXEMx9n.js +0 -1
- package/assets/index-C0SL3SHw.js +0 -41
- package/assets/index-Cdb9ACvz.js +0 -1
- package/assets/index-DEk3sC8d.js +0 -1
- package/assets/index-DrWfGwtf.js +0 -1
- package/assets/index-K81GbF6O.js +0 -1
- package/assets/init-user-D9mW-g14.js +0 -1
- package/assets/input-DF7Ue23C.js +0 -1
- package/assets/input-error-BBygona6.js +0 -1
- package/assets/label-Z506NKsW.js +0 -1
- package/assets/list-Qyd7ecQH.js +0 -1
- package/assets/list-table-DB1sEQLF.js +0 -62
- package/assets/login-DrGaTWhY.js +0 -6
- package/assets/material-icon-CItZiB53.js +0 -1
- package/assets/module-DBaykv8l.js +0 -1
- package/assets/nav-footer-CM-yHiRs.js +0 -1
- package/assets/nav-main-Q3xofGRT.js +0 -1
- package/assets/nav-user-Ds8i0Pa2.js +0 -1
- package/assets/pagination-render-B57pOpFy.js +0 -1
- package/assets/popover-I249Gg2O.js +0 -1
- package/assets/register-C9FQIDtS.js +0 -1
- package/assets/sonner-Dzckw3U3.js +0 -1
- package/assets/tooltip-D2ehgLlB.js +0 -1
- package/assets/use-appearance-Co6mO0dV.js +0 -1
- package/assets/use-window-size-B8l6Bpkf.js +0 -1
- package/assets/user-menu-content-qkvdkUVd.js +0 -6
- package/assets/utils-DjqsqOe8.js +0 -1
- package/assets/welcome-D2adQ8EU.js +0 -1
- package/controllers/processInstallFinalize.d.ts +0 -1
- package/controllers/processInstallFinalize.js +0 -16
- package/controllers/processInstallStep.d.ts +0 -1
- package/controllers/processInstallStep.js +0 -132
- package/lib/catalog/Navigation.d.ts +0 -0
- package/lib/catalog/Navigation.js +0 -532
- package/lib/installStepper/InstallStepAbstract.d.ts +0 -52
- package/lib/installStepper/InstallStepAbstract.js +0 -69
- package/lib/installStepper/finalizeStep.d.ts +0 -21
- package/lib/installStepper/finalizeStep.js +0 -48
- package/lib/installStepper/installStepper.d.ts +0 -40
- package/lib/installStepper/installStepper.js +0 -195
- package/lib/widgets/abstractCustom.d.ts +0 -13
- package/lib/widgets/abstractCustom.js +0 -3
- package/models/MediaManagerAP.d.ts +0 -46
- package/models/MediaManagerAP.js +0 -45
- package/models/MediaManagerAssociationsAP.d.ts +0 -28
- package/models/MediaManagerAssociationsAP.js +0 -27
- package/models/MediaManagerMetaAP.d.ts +0 -22
- package/models/MediaManagerMetaAP.js +0 -21
- package/system/bindInstallStepper.d.ts +0 -2
- package/system/bindInstallStepper.js +0 -23
- /package/lib/{catalog → v4/catalog}/CatalogHandler.d.ts +0 -0
- /package/lib/{catalog → v4/catalog}/CatalogHandler.js +0 -0
- /package/lib/{controls → v4/controls}/AbstractControls.js +0 -0
- /package/lib/{controls → v4/controls}/ControlsHandler.d.ts +0 -0
- /package/lib/{controls → v4/controls}/ControlsHandler.js +0 -0
- /package/lib/{controls → v4/controls}/codeEditor/MonacoEditor.js +0 -0
- /package/lib/{controls → v4/controls}/geojsoneditor/GeoEditor.js +0 -0
- /package/lib/{controls → v4/controls}/jsoneditor/JsonEditor.js +0 -0
- /package/lib/{controls → v4/controls}/markdown/ToastUiEditor.js +0 -0
- /package/lib/{controls → v4/controls}/table/Handsontable.js +0 -0
- /package/lib/{controls → v4/controls}/wysiwyg/CKeditor.js +0 -0
- /package/lib/{inertia → v4/inertia}/flash.d.ts +0 -0
- /package/lib/{inertia → v4/inertia}/flash.js +0 -0
- /package/lib/{inertia → v4/inertia}/inertiaAdapter.d.ts +0 -0
- /package/lib/{widgets → v4/widgets}/abstractAction.js +0 -0
- /package/lib/{widgets → v4/widgets}/abstractLink.js +0 -0
- /package/lib/{widgets → v4/widgets}/abstractSwitch.js +0 -0
- /package/lib/{widgets → v4/widgets}/abstractWidgetBase.js +0 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
export default async function getAllWidgets(req, res) {
|
|
2
2
|
if (req.adminizer.config.auth.enable) {
|
|
3
|
-
if (!req.
|
|
3
|
+
if (!req.user) {
|
|
4
4
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
5
5
|
}
|
|
6
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.
|
|
6
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.user)) {
|
|
7
7
|
return res.sendStatus(403);
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
if (req.method.toUpperCase() === 'GET') {
|
|
11
11
|
try {
|
|
12
|
-
return res.json({ widgets: await req.adminizer.widgetHandler.getAll(req.
|
|
12
|
+
return res.json({ widgets: await req.adminizer.widgetHandler.getAll(req.user, req.i18n) });
|
|
13
13
|
}
|
|
14
14
|
catch (e) {
|
|
15
15
|
return res.status(500).send({ error: e.message || 'Internal Server Error' });
|
package/controllers/initUser.js
CHANGED
|
@@ -29,12 +29,11 @@ export default async function initUser(req, res) {
|
|
|
29
29
|
}
|
|
30
30
|
try {
|
|
31
31
|
Adminizer.log.debug(`Created admin`);
|
|
32
|
-
let passwordHashed = generate(login + password);
|
|
32
|
+
let passwordHashed = generate(login + password + process.env.AP_PASSWORD_SALT);
|
|
33
33
|
password = 'masked';
|
|
34
34
|
// TODO refactor CRUD functions for DataAccessor usage
|
|
35
35
|
await req.adminizer.modelHandler.model.get("UserAP")["_create"]({
|
|
36
36
|
login: login,
|
|
37
|
-
password: password,
|
|
38
37
|
passwordHashed: passwordHashed,
|
|
39
38
|
fullName: "Administrator",
|
|
40
39
|
isActive: true,
|
package/controllers/list.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ControllerHelper } from "../helpers/controllerHelper";
|
|
2
2
|
import { DataAccessor } from "../lib/v4/DataAccessor";
|
|
3
|
-
import { NodeTable } from "../lib/datatable/NodeTable";
|
|
3
|
+
import { NodeTable } from "../lib/v4/datatable/NodeTable";
|
|
4
4
|
import { Adminizer } from "../lib/Adminizer";
|
|
5
5
|
import { inertiaListHelper } from "../helpers/inertiaListHelper";
|
|
6
6
|
export default async function list(req, res) {
|
|
@@ -9,14 +9,14 @@ export default async function list(req, res) {
|
|
|
9
9
|
return res.status(404).send({ error: 'Not Found' });
|
|
10
10
|
}
|
|
11
11
|
if (req.adminizer.config.auth.enable) {
|
|
12
|
-
if (!req.
|
|
12
|
+
if (!req.user) {
|
|
13
13
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
14
14
|
}
|
|
15
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.
|
|
15
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.user)) {
|
|
16
16
|
return res.sendStatus(403);
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
let dataAccessor = new DataAccessor(req, entity, "list");
|
|
19
|
+
let dataAccessor = new DataAccessor(req.adminizer, req.user, entity, "list");
|
|
20
20
|
let fields = dataAccessor.getFieldsConfig();
|
|
21
21
|
const header = inertiaListHelper(entity, req, fields);
|
|
22
22
|
let start = "0";
|
|
@@ -46,8 +46,8 @@ export default async function list(req, res) {
|
|
|
46
46
|
const searchMap = new Map();
|
|
47
47
|
for (let i = 0; i < searchColumns.length; i++) {
|
|
48
48
|
const column = searchColumns[i];
|
|
49
|
-
const value = searchColumnValues[i] || "";
|
|
50
|
-
searchMap.set(column, value);
|
|
49
|
+
const value = searchColumnValues[i] || "";
|
|
50
|
+
searchMap.set(column, value);
|
|
51
51
|
}
|
|
52
52
|
const searchPairs = Array.from(searchMap.entries()).map(([column, value]) => ({
|
|
53
53
|
column,
|
package/controllers/login.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { POWCaptcha } from "../lib/v4/POWCaptcha";
|
|
2
2
|
import passwordHash from "password-hash";
|
|
3
3
|
import { inertiaLoginHelper } from "../helpers/inertiaAutHelper";
|
|
4
|
+
import { Adminizer } from "../lib/Adminizer";
|
|
5
|
+
import { signUser } from "../lib/v4/helper/jwt";
|
|
6
|
+
import { serialize } from "cookie";
|
|
4
7
|
export default async function login(req, res) {
|
|
5
8
|
const powCaptcha = new POWCaptcha();
|
|
6
9
|
if (req.originalUrl.indexOf("login") >= 0) {
|
|
@@ -11,11 +14,6 @@ export default async function login(req, res) {
|
|
|
11
14
|
let login = req.body.login;
|
|
12
15
|
let password = req.body.password;
|
|
13
16
|
let captchaSolution = req.body.captchaSolution;
|
|
14
|
-
// Verify CAPTCHA solution
|
|
15
|
-
const isCaptchaValid = powCaptcha.check(captchaSolution, `login:${req.ip}`);
|
|
16
|
-
if (!isCaptchaValid) {
|
|
17
|
-
return inertiaAdminMessage(req, "Invalid CAPTCHA solution", 'captchaSolution');
|
|
18
|
-
}
|
|
19
17
|
let user;
|
|
20
18
|
try {
|
|
21
19
|
// TODO refactor CRUD functions for DataAccessor usage
|
|
@@ -28,10 +26,18 @@ export default async function login(req, res) {
|
|
|
28
26
|
if (!user) {
|
|
29
27
|
return res.sendStatus(404);
|
|
30
28
|
}
|
|
31
|
-
if (req.
|
|
32
|
-
req.session.
|
|
33
|
-
|
|
34
|
-
return
|
|
29
|
+
if (req.user.isAdministrator) {
|
|
30
|
+
req.session.userPretended = user;
|
|
31
|
+
// return res.sendStatus(200);
|
|
32
|
+
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}`);
|
|
33
|
+
}
|
|
34
|
+
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
35
|
+
}
|
|
36
|
+
// Verify CAPTCHA solution if enabled
|
|
37
|
+
if (req.adminizer.config.auth.captcha !== false) {
|
|
38
|
+
const isCaptchaValid = powCaptcha.check(captchaSolution, `login:${req.ip}`);
|
|
39
|
+
if (!isCaptchaValid) {
|
|
40
|
+
return inertiaAdminMessage(req, "Invalid CAPTCHA solution", 'captchaSolution');
|
|
35
41
|
}
|
|
36
42
|
}
|
|
37
43
|
if (!user) {
|
|
@@ -42,12 +48,18 @@ export default async function login(req, res) {
|
|
|
42
48
|
//Here we use the captchaSolution key to output messages unrelated to the form fields.
|
|
43
49
|
return inertiaAdminMessage(req, "Profile is not confirmed, please contact to administrator", 'captchaSolution');
|
|
44
50
|
}
|
|
45
|
-
if (passwordHash.verify(login + password, user.passwordHashed)) {
|
|
51
|
+
if (passwordHash.verify(login + password + process.env.AP_PASSWORD_SALT, user.passwordHashed)) {
|
|
46
52
|
if (user.expires && Date.now() > Date.parse(user.expires)) {
|
|
47
53
|
//Here we use the captchaSolution key to output messages unrelated to the form fields.
|
|
48
54
|
return inertiaAdminMessage(req, "Profile expired, contact the administrator", 'captchaSolution');
|
|
49
55
|
}
|
|
50
|
-
|
|
56
|
+
const token = signUser(user, req.adminizer.jwtSecret);
|
|
57
|
+
res.setHeader('Set-Cookie', serialize('adminizer_jwt', token, {
|
|
58
|
+
httpOnly: true,
|
|
59
|
+
sameSite: 'lax',
|
|
60
|
+
path: '/',
|
|
61
|
+
maxAge: 60 * 60 * 24 * 7 * 2,
|
|
62
|
+
}));
|
|
51
63
|
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}`);
|
|
52
64
|
}
|
|
53
65
|
else {
|
|
@@ -56,8 +68,11 @@ export default async function login(req, res) {
|
|
|
56
68
|
}
|
|
57
69
|
}
|
|
58
70
|
if (req.method.toUpperCase() === "GET") {
|
|
59
|
-
// Generate new CAPTCHA
|
|
60
|
-
|
|
71
|
+
// Generate new CAPTCHA task if enabled
|
|
72
|
+
let captchaTask = [];
|
|
73
|
+
if (req.adminizer.config.auth.captcha !== false) {
|
|
74
|
+
captchaTask = await powCaptcha.getJob(`login:${req.ip}`);
|
|
75
|
+
}
|
|
61
76
|
return req.Inertia.render({
|
|
62
77
|
component: 'login',
|
|
63
78
|
props: {
|
|
@@ -69,19 +84,29 @@ export default async function login(req, res) {
|
|
|
69
84
|
}
|
|
70
85
|
}
|
|
71
86
|
else if (req.originalUrl.indexOf("logout") >= 0) {
|
|
72
|
-
if (req.session.
|
|
73
|
-
|
|
74
|
-
req.session.adminPretender = {};
|
|
87
|
+
if (req.session.userPretended && req.session.userPretended.id && req.user && req.user.id) {
|
|
88
|
+
delete (req.session.userPretended);
|
|
75
89
|
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
76
90
|
}
|
|
77
|
-
req.
|
|
91
|
+
req.user = undefined;
|
|
92
|
+
res.setHeader('Set-Cookie', serialize('adminizer_jwt', '', {
|
|
93
|
+
httpOnly: true,
|
|
94
|
+
sameSite: 'lax',
|
|
95
|
+
path: '/',
|
|
96
|
+
expires: new Date(0),
|
|
97
|
+
}));
|
|
78
98
|
req.Inertia.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
79
99
|
}
|
|
80
100
|
return res.status(404);
|
|
81
101
|
}
|
|
82
102
|
async function inertiaAdminMessage(req, message, messageType) {
|
|
103
|
+
Adminizer.log.warn(message);
|
|
83
104
|
const powCaptcha = new POWCaptcha();
|
|
84
|
-
|
|
105
|
+
// Generate new CAPTCHA task if enabled
|
|
106
|
+
let captchaTask = [];
|
|
107
|
+
if (req.adminizer.config.auth.captcha !== false) {
|
|
108
|
+
captchaTask = await powCaptcha.getJob(`login:${req.ip}`);
|
|
109
|
+
}
|
|
85
110
|
let errors = {};
|
|
86
111
|
errors[messageType] = message;
|
|
87
112
|
return req.Inertia.render({
|
|
@@ -123,7 +123,6 @@ export class MediaManagerAdapter {
|
|
|
123
123
|
}
|
|
124
124
|
try {
|
|
125
125
|
const item = await this.manager.upload(req.file, filename, origFileName, group);
|
|
126
|
-
console.log(item);
|
|
127
126
|
if (item) {
|
|
128
127
|
return res.send({
|
|
129
128
|
msg: "success",
|
|
@@ -150,7 +149,7 @@ export class MediaManagerAdapter {
|
|
|
150
149
|
return;
|
|
151
150
|
}
|
|
152
151
|
catch (e) {
|
|
153
|
-
console.
|
|
152
|
+
console.error(e);
|
|
154
153
|
}
|
|
155
154
|
}
|
|
156
155
|
}
|
|
@@ -4,10 +4,10 @@ export async function mediaManagerController(req, res) {
|
|
|
4
4
|
const method = req.method.toUpperCase();
|
|
5
5
|
let id = req.params.id ? req.params.id : '';
|
|
6
6
|
if (req.adminizer.config.auth.enable) {
|
|
7
|
-
if (!req.
|
|
7
|
+
if (!req.user) {
|
|
8
8
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
9
|
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`catalog-${id}`, req.
|
|
10
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`catalog-${id}`, req.user)) {
|
|
11
11
|
return res.sendStatus(403);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -2,12 +2,12 @@ import { ControllerHelper } from "../../helpers/controllerHelper";
|
|
|
2
2
|
import { DataAccessor } from "../../lib/v4/DataAccessor";
|
|
3
3
|
export default async function edit(req, res) {
|
|
4
4
|
if (req.adminizer.config.auth.enable) {
|
|
5
|
-
if (!req.
|
|
5
|
+
if (!req.user) {
|
|
6
6
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
9
|
let entity = ControllerHelper.findEntityObject(req);
|
|
10
|
-
let dataAccessor = new DataAccessor(req, entity, "edit");
|
|
10
|
+
let dataAccessor = new DataAccessor(req.adminizer, req.user, entity, "edit");
|
|
11
11
|
let record = await entity.model.findOne({ id: req.params.id }, dataAccessor);
|
|
12
12
|
return res.redirect(`${req.adminizer.config.routePrefix}/catalog/navigation/${record.label}`);
|
|
13
13
|
}
|
package/controllers/register.js
CHANGED
|
@@ -5,7 +5,6 @@ export default async function register(req, res) {
|
|
|
5
5
|
return res.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
6
6
|
}
|
|
7
7
|
if (req.method.toUpperCase() === "POST") {
|
|
8
|
-
// console.log("req.body", req.body);
|
|
9
8
|
for (const key of ["login", "fullName", "password"]) {
|
|
10
9
|
if (!req.body[key]) {
|
|
11
10
|
let errors = {};
|
|
@@ -40,12 +39,11 @@ export default async function register(req, res) {
|
|
|
40
39
|
}
|
|
41
40
|
else {
|
|
42
41
|
try {
|
|
43
|
-
let passwordHashed = generate(req.body.login + req.body.password);
|
|
42
|
+
let passwordHashed = generate(req.body.login + req.body.password + process.env.AP_PASSWORD_SALT);
|
|
44
43
|
let password = 'masked';
|
|
45
44
|
// TODO refactor CRUD functions for DataAccessor usage
|
|
46
45
|
let userap = await req.adminizer.modelHandler.model.get("UserAP")["_create"]({
|
|
47
46
|
login: req.body.login,
|
|
48
|
-
password: password,
|
|
49
47
|
passwordHashed: passwordHashed,
|
|
50
48
|
fullName: req.body.fullName,
|
|
51
49
|
email: req.body.email,
|
|
@@ -53,7 +51,6 @@ export default async function register(req, res) {
|
|
|
53
51
|
});
|
|
54
52
|
// TODO refactor CRUD functions for DataAccessor usage
|
|
55
53
|
let defaultUserGroup = await req.adminizer.modelHandler.model.get("GroupAP")["_findOne"]({ name: req.adminizer.config.registration.defaultUserGroup });
|
|
56
|
-
console.log(userap);
|
|
57
54
|
// TODO refactor CRUD functions for DataAccessor usage
|
|
58
55
|
await req.adminizer.modelHandler.model.get("UserAP")["_updateOne"]({ id: userap.id }, {
|
|
59
56
|
groups: [defaultUserGroup.id]
|
package/controllers/remove.js
CHANGED
|
@@ -18,10 +18,10 @@ export default async function remove(req, res) {
|
|
|
18
18
|
return res.redirect(`${req.adminizer.config.routePrefix}/${entity.uri}`);
|
|
19
19
|
}
|
|
20
20
|
if (req.adminizer.config.auth.enable) {
|
|
21
|
-
if (!req.
|
|
21
|
+
if (!req.user) {
|
|
22
22
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
23
23
|
}
|
|
24
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`delete-${entity.name}-model`, req.
|
|
24
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`delete-${entity.name}-model`, req.user)) {
|
|
25
25
|
return res.sendStatus(403);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
@@ -31,7 +31,7 @@ export default async function remove(req, res) {
|
|
|
31
31
|
let record;
|
|
32
32
|
let dataAccessor;
|
|
33
33
|
try {
|
|
34
|
-
dataAccessor = new DataAccessor(req, entity, "remove");
|
|
34
|
+
dataAccessor = new DataAccessor(req.adminizer, req.user, entity, "remove");
|
|
35
35
|
record = await entity.model.findOne({ id: req.params.id }, dataAccessor);
|
|
36
36
|
}
|
|
37
37
|
catch (e) {
|
package/controllers/timezones.js
CHANGED
package/controllers/view.js
CHANGED
|
@@ -18,14 +18,14 @@ export default async function view(req, res) {
|
|
|
18
18
|
return res.status(404).send({ error: 'Not Found' });
|
|
19
19
|
}
|
|
20
20
|
if (req.adminizer.config.auth.enable) {
|
|
21
|
-
if (!req.
|
|
21
|
+
if (!req.user) {
|
|
22
22
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
23
23
|
}
|
|
24
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.
|
|
24
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.user)) {
|
|
25
25
|
return res.sendStatus(403);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
let dataAccessor = new DataAccessor(req, entity, "view");
|
|
28
|
+
let dataAccessor = new DataAccessor(req.adminizer, req.user, entity, "view");
|
|
29
29
|
let fields = dataAccessor.getFieldsConfig();
|
|
30
30
|
let record;
|
|
31
31
|
try {
|
package/controllers/welcome.js
CHANGED
|
@@ -4,10 +4,10 @@ export async function widgetActionController(req, res) {
|
|
|
4
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
5
5
|
}
|
|
6
6
|
if (req.adminizer.config.auth.enable) {
|
|
7
|
-
if (!req.
|
|
7
|
+
if (!req.user) {
|
|
8
8
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
9
|
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.
|
|
10
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
11
11
|
return res.sendStatus(403);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -4,10 +4,10 @@ export async function widgetCustomController(req, res) {
|
|
|
4
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
5
5
|
}
|
|
6
6
|
if (req.adminizer.config.auth.enable) {
|
|
7
|
-
if (!req.
|
|
7
|
+
if (!req.user) {
|
|
8
8
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
9
|
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.
|
|
10
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
11
11
|
return res.sendStatus(403);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -4,10 +4,10 @@ export async function widgetInfoController(req, res) {
|
|
|
4
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
5
5
|
}
|
|
6
6
|
if (req.adminizer.config.auth.enable) {
|
|
7
|
-
if (!req.
|
|
7
|
+
if (!req.user) {
|
|
8
8
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
9
|
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.
|
|
10
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
11
11
|
return res.sendStatus(403);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -4,10 +4,10 @@ export async function widgetSwitchController(req, res) {
|
|
|
4
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
5
5
|
}
|
|
6
6
|
if (req.adminizer.config.auth.enable) {
|
|
7
|
-
if (!req.
|
|
7
|
+
if (!req.user) {
|
|
8
8
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
9
|
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.
|
|
10
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
11
11
|
return res.sendStatus(403);
|
|
12
12
|
}
|
|
13
13
|
}
|
package/controllers/widgetsDB.js
CHANGED
|
@@ -2,17 +2,17 @@ export default async function widgetsDB(req, res) {
|
|
|
2
2
|
let id = 0;
|
|
3
3
|
let auth = req.adminizer.config.auth.enable;
|
|
4
4
|
if (auth) {
|
|
5
|
-
if (!req.
|
|
5
|
+
if (!req.user) {
|
|
6
6
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
7
7
|
}
|
|
8
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.
|
|
8
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.user)) {
|
|
9
9
|
return res.sendStatus(403);
|
|
10
10
|
}
|
|
11
|
-
id = req.
|
|
11
|
+
id = req.user.id;
|
|
12
12
|
}
|
|
13
13
|
if (req.method.toUpperCase() === 'GET') {
|
|
14
14
|
try {
|
|
15
|
-
let widgets = await req.adminizer.widgetHandler.getWidgetsDB(id, auth);
|
|
15
|
+
let widgets = await req.adminizer.widgetHandler.getWidgetsDB(id, auth, req.i18n);
|
|
16
16
|
return res.json({ widgetsDB: widgets });
|
|
17
17
|
}
|
|
18
18
|
catch (e) {
|
|
@@ -25,7 +25,7 @@ export default async function widgetsDB(req, res) {
|
|
|
25
25
|
}
|
|
26
26
|
try {
|
|
27
27
|
return res.json({
|
|
28
|
-
userID: await req.adminizer.widgetHandler.setWidgetsDB(id, req.body
|
|
28
|
+
userID: await req.adminizer.widgetHandler.setWidgetsDB(id, req.body, auth),
|
|
29
29
|
status: 'ok'
|
|
30
30
|
});
|
|
31
31
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isObject(obj: unknown): obj is object;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UserAP } from "models/UserAP";
|
|
1
2
|
import { AccessRightsToken } from "../interfaces/types";
|
|
2
3
|
import { Adminizer } from "../lib/Adminizer";
|
|
3
4
|
export declare class AccessRightsHelper {
|
|
@@ -9,6 +10,9 @@ export declare class AccessRightsHelper {
|
|
|
9
10
|
getTokens(): AccessRightsToken[];
|
|
10
11
|
getTokensByDepartment(department: string): AccessRightsToken[];
|
|
11
12
|
getAllDepartments(): string[];
|
|
12
|
-
enoughPermissions(tokens: string[], user:
|
|
13
|
-
hasPermission(tokenId: string, user:
|
|
13
|
+
enoughPermissions(tokens: string[], user: UserAP): boolean;
|
|
14
|
+
hasPermission(tokenId: string, user: UserAP): boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class GroupsAccessRightsHelper {
|
|
17
|
+
static hasAccess(user: UserAP, groupsAccessRights?: string[]): boolean;
|
|
14
18
|
}
|
|
@@ -6,12 +6,14 @@ export class AccessRightsHelper {
|
|
|
6
6
|
this.adminizer = adminizer;
|
|
7
7
|
}
|
|
8
8
|
registerToken(accessRightsToken) {
|
|
9
|
+
accessRightsToken.id = accessRightsToken.id.toLowerCase();
|
|
9
10
|
if (!accessRightsToken.id || !accessRightsToken.name || !accessRightsToken.description || !accessRightsToken.department) {
|
|
10
11
|
throw new Error("Adminpanel > Can not register token: Missed one or more required parameters");
|
|
11
12
|
}
|
|
12
|
-
for (let
|
|
13
|
-
if (
|
|
14
|
-
|
|
13
|
+
for (let i = 0; i < this._tokens.length; i++) {
|
|
14
|
+
if (this._tokens[i].id === accessRightsToken.id) {
|
|
15
|
+
this._tokens.splice(i, 1);
|
|
16
|
+
break;
|
|
15
17
|
}
|
|
16
18
|
}
|
|
17
19
|
this._tokens.push(accessRightsToken);
|
|
@@ -42,6 +44,11 @@ export class AccessRightsHelper {
|
|
|
42
44
|
return tokens.some((token) => this.hasPermission(token, user));
|
|
43
45
|
}
|
|
44
46
|
hasPermission(tokenId, user) {
|
|
47
|
+
if (!tokenId) {
|
|
48
|
+
Adminizer.log.error(`AccessRightsHelper > hasPermission no tokenId: ${tokenId}`);
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
tokenId = tokenId.toLowerCase();
|
|
45
52
|
if (!this.adminizer.config.auth.enable) {
|
|
46
53
|
return true;
|
|
47
54
|
}
|
|
@@ -50,9 +57,25 @@ export class AccessRightsHelper {
|
|
|
50
57
|
}
|
|
51
58
|
const tokenIsValid = this._tokens.some((token) => token.id === tokenId);
|
|
52
59
|
if (!tokenIsValid) {
|
|
53
|
-
Adminizer.log.error("Adminpanel > Token is not valid");
|
|
60
|
+
Adminizer.log.error("Adminpanel > Token is not valid", tokenId, user.login);
|
|
54
61
|
return false;
|
|
55
62
|
}
|
|
56
|
-
|
|
63
|
+
if (!user.groups) {
|
|
64
|
+
Adminizer.log.error('User has no groups');
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return user.groups.some((group) => group.tokens?.includes(tokenId));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export class GroupsAccessRightsHelper {
|
|
71
|
+
static hasAccess(user, groupsAccessRights) {
|
|
72
|
+
const userGroups = user.groups?.map(group => group.name.toLowerCase());
|
|
73
|
+
if (groupsAccessRights) {
|
|
74
|
+
const allowedGroups = groupsAccessRights.map(item => item.toLowerCase());
|
|
75
|
+
return userGroups?.some(group => allowedGroups.includes(group)) ?? false;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
57
80
|
}
|
|
58
81
|
}
|
package/helpers/configHelper.js
CHANGED
|
@@ -77,7 +77,7 @@ export class ConfigHelper {
|
|
|
77
77
|
}
|
|
78
78
|
// Boolean notation: `true` means field is visible; `false` means field is hidden.
|
|
79
79
|
if (typeof config === "boolean") {
|
|
80
|
-
return config ? { title: key } : false;
|
|
80
|
+
return config ? { title: key } : { visible: false };
|
|
81
81
|
}
|
|
82
82
|
// String notation: Interpreted as the field title.
|
|
83
83
|
if (typeof config === "string") {
|
|
@@ -86,6 +86,7 @@ export class ConfigHelper {
|
|
|
86
86
|
// Object notation: Allows full customization of the field.
|
|
87
87
|
if (typeof config === "object" && config !== null) {
|
|
88
88
|
config.title = config.title || key;
|
|
89
|
+
config.visible = config.visible === undefined ? true : Boolean(config.visible);
|
|
89
90
|
// For association types, determine display field by checking model attributes.
|
|
90
91
|
if (["association", "association-many"].includes(config.type)) {
|
|
91
92
|
let associatedModelAttributes = {};
|
|
@@ -28,7 +28,15 @@ export class ControllerHelper {
|
|
|
28
28
|
* @private
|
|
29
29
|
*/
|
|
30
30
|
static _isValidModelConfig(config) {
|
|
31
|
-
|
|
31
|
+
try {
|
|
32
|
+
if (!config)
|
|
33
|
+
throw `Config is not defined ${config}`;
|
|
34
|
+
return (typeof config === "object" && typeof config.model === "string");
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
Adminizer.log.error(error);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
32
40
|
}
|
|
33
41
|
;
|
|
34
42
|
/**
|
|
@@ -84,7 +92,7 @@ export class ControllerHelper {
|
|
|
84
92
|
const entityType = req.params.entityType;
|
|
85
93
|
if (!entityType) {
|
|
86
94
|
const extractedEntityType = req.originalUrl.split('/')[2];
|
|
87
|
-
if (["form", "model"
|
|
95
|
+
if (["form", "model"].includes(extractedEntityType)) {
|
|
88
96
|
return extractedEntityType;
|
|
89
97
|
}
|
|
90
98
|
else {
|
|
@@ -101,22 +109,28 @@ export class ControllerHelper {
|
|
|
101
109
|
* @returns {?string}
|
|
102
110
|
*/
|
|
103
111
|
static findEntityName(req) {
|
|
104
|
-
if (
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
+
if (req.params.entityName) {
|
|
113
|
+
return req.params.entityName;
|
|
114
|
+
}
|
|
115
|
+
const urlParts = req.originalUrl.split('/');
|
|
116
|
+
const entityType = urlParts[2];
|
|
117
|
+
const entityName = urlParts[3];
|
|
118
|
+
if (entityType === 'form') {
|
|
119
|
+
const forms = req.adminizer.config.forms?.data;
|
|
120
|
+
if (!forms || !Object.keys(forms).some(key => key.toLowerCase() === entityName.toLowerCase())) {
|
|
121
|
+
throw new Error(`Form "${entityName}" not found`);
|
|
112
122
|
}
|
|
113
|
-
|
|
114
|
-
|
|
123
|
+
return Object.keys(forms).find(key => key.toLowerCase() === entityName.toLowerCase());
|
|
124
|
+
}
|
|
125
|
+
if (entityType === 'model') {
|
|
126
|
+
const models = req.adminizer.config.models;
|
|
127
|
+
if (!models || !Object.keys(models).some(key => key.toLowerCase() === entityName.toLowerCase())) {
|
|
128
|
+
throw new Error(`Model "${entityName}" not found`);
|
|
115
129
|
}
|
|
130
|
+
return Object.keys(models).find(key => key.toLowerCase() === entityName.toLowerCase());
|
|
116
131
|
}
|
|
117
|
-
|
|
132
|
+
throw new Error(`Unsupported entity type "${entityType}" in URL`);
|
|
118
133
|
}
|
|
119
|
-
;
|
|
120
134
|
/**
|
|
121
135
|
* Searches for config from admin panel
|
|
122
136
|
*
|
|
@@ -125,11 +139,17 @@ export class ControllerHelper {
|
|
|
125
139
|
* @returns {?Object}
|
|
126
140
|
*/
|
|
127
141
|
static findModelConfig(req, entityName) {
|
|
128
|
-
|
|
129
|
-
|
|
142
|
+
const models = req.adminizer.config.models;
|
|
143
|
+
if (!models) {
|
|
144
|
+
Adminizer.log.error('No models configuration found');
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const foundKey = Object.keys(models).find(key => key.toLowerCase() === entityName.toLowerCase());
|
|
148
|
+
if (!foundKey) {
|
|
149
|
+
Adminizer.log.error(`No such route exists: ${entityName}`);
|
|
130
150
|
return null;
|
|
131
151
|
}
|
|
132
|
-
return this._normalizeModelConfig(
|
|
152
|
+
return this._normalizeModelConfig(foundKey, models[foundKey]);
|
|
133
153
|
}
|
|
134
154
|
/**
|
|
135
155
|
* Will get action config from configuration file depending to given action
|
|
@@ -200,7 +220,8 @@ export class ControllerHelper {
|
|
|
200
220
|
name: entityName,
|
|
201
221
|
uri: entityUri,
|
|
202
222
|
type: entityType,
|
|
203
|
-
model: null
|
|
223
|
+
model: null,
|
|
224
|
+
config: null
|
|
204
225
|
};
|
|
205
226
|
// If the entity type is "model", add additional properties
|
|
206
227
|
if (entityType === "model") {
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
import { ActionType, BaseFieldConfig, FieldsTypes } from "../interfaces/adminpanelConfig";
|
|
1
|
+
import { ActionType, BaseFieldConfig, FieldsTypes, ModelConfig } from "../interfaces/adminpanelConfig";
|
|
2
2
|
import { Attribute } from "../lib/v4/model/AbstractModel";
|
|
3
3
|
export type Field = {
|
|
4
4
|
config: BaseFieldConfig & {
|
|
5
5
|
/** @deprecated record should not be in config anymore */
|
|
6
|
-
records?:
|
|
6
|
+
records?: Record<string, any>[];
|
|
7
7
|
file?: string;
|
|
8
8
|
key?: string;
|
|
9
9
|
required?: boolean;
|
|
10
10
|
type?: FieldsTypes;
|
|
11
11
|
groupsAccessRights?: string[];
|
|
12
12
|
} | string | boolean;
|
|
13
|
-
/**
|
|
13
|
+
/** For render associalitons fields */
|
|
14
14
|
populated: {
|
|
15
15
|
[key: string]: Field;
|
|
16
16
|
} | undefined;
|
|
17
17
|
model: Attribute;
|
|
18
|
+
modelConfig: ModelConfig;
|
|
18
19
|
};
|
|
19
20
|
export type Fields = {
|
|
20
21
|
[key: string]: Field;
|