adminizer 4.6.0 → 4.7.0-build.221
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 +12 -0
- package/assets/RelationDialogStack-CnHFOYyR.css +1 -0
- package/assets/RelationDialogStack-DI2bZxQX.js +20 -0
- package/assets/add-4213XScp.js +1 -0
- package/assets/add-group--F1XxfJ1.js +1 -0
- package/assets/add-group-form-DKRXC2n-.js +1 -0
- package/assets/add-user-b9HfMq7z.js +1 -0
- package/assets/add-user-form-UXAToWQd.js +1 -0
- package/assets/app-Clx8f5hd.css +1 -0
- package/assets/app-layout-C02ja4OI.js +1 -0
- package/assets/app-shell-D8wtkECO.js +1 -0
- package/assets/app-sidebar-BR5_zwxj.js +1 -0
- package/assets/app-sidebar-header-BZbIBQjq.js +1 -0
- package/assets/app.js +59 -7990
- package/assets/breadcrumbs-CODaqVkB.js +1 -0
- package/assets/catalog-6ZZjWdFs.js +6 -0
- package/assets/dashboard-CftAdKiH.js +3 -0
- package/assets/date-picker-DSOkNiNo.js +1 -0
- package/assets/del-modal-Cd4M7af8.js +1 -0
- package/assets/dynamic-controls-BsrJhPDY.js +1 -0
- package/assets/geo-json-CzR5JBXL.js +1 -0
- package/assets/handsontable-BI98OF5R.js +336 -0
- package/assets/history-DLHSU7Ak.js +1 -0
- package/assets/home-NcQ7nnU0.js +2 -0
- package/assets/icon-C2JNaLxH.js +1 -0
- package/assets/init-user-D2HSyXup.js +1 -0
- package/assets/input-error-CH2caTtO.js +1 -0
- package/assets/jsoneditor-DVNQmA6G.js +3869 -0
- package/assets/list-CFU0-TgN.js +4 -0
- package/assets/login-DFSLEO17.js +1 -0
- package/assets/manifest.json +246 -273
- package/assets/material-icon-Bx9pGQiQ.js +1 -0
- package/assets/media-manager-WcKe1EvD.js +6 -0
- package/assets/module-CT7PC6pc.js +1 -0
- package/assets/monaco-Bl4zdWCn.js +11 -0
- package/assets/nav-footer-BiSQkPt4.js +1 -0
- package/assets/nav-main-rTH0PfDw.js +1 -0
- package/assets/nav-user-Bj6cWs0a.js +1 -0
- package/assets/notification-Bi-PX87D.js +20 -0
- package/assets/pagination-render-AKJvTIRA.js +1 -0
- package/assets/register-BTP4uxsK.js +1 -0
- package/assets/ru-eW0WKkga.js +1 -0
- package/assets/theme-switcher-Dm8EOGzx.js +1 -0
- package/assets/toast-editor-DOg_gvSp.js +668 -0
- package/assets/user-filters-list-YUfR4XMI.js +1 -0
- package/assets/user-info-BgSbT02v.js +1 -0
- package/assets/user-menu-content-TQTXHIv6.js +1 -0
- package/assets/{vanilla-picker-l5rcX3cq.js → vanilla-picker-B3LgXoKV.js} +1 -7
- package/assets/welcome-vLwTu1R6.js +1 -0
- package/controllers/add.d.ts +1 -1
- package/controllers/add.js +20 -26
- package/controllers/addGroup.d.ts +1 -1
- package/controllers/addGroup.js +7 -15
- package/controllers/addUser.d.ts +1 -1
- package/controllers/addUser.js +10 -16
- package/controllers/catalog/Catalog.d.ts +1 -1
- package/controllers/catalog/Catalog.js +1 -10
- package/controllers/catalog/FrontendCatalogAdapter.d.ts +3 -3
- package/controllers/catalog/FrontendCatalogAdapter.js +0 -6
- package/controllers/catalog/FrontentCatalogAdapter.d.ts +3 -3
- package/controllers/catalog/FrontentCatalogAdapter.js +0 -4
- package/controllers/ckeditorUpload.js +2 -18
- package/controllers/dashboard.d.ts +1 -1
- package/controllers/dashboard.js +2 -5
- package/controllers/edit.js +24 -37
- package/controllers/editGroup.d.ts +1 -1
- package/controllers/editGroup.js +10 -21
- package/controllers/editUser.d.ts +1 -1
- package/controllers/editUser.js +11 -23
- package/controllers/exportData.d.ts +6 -0
- package/controllers/exportData.js +315 -0
- package/controllers/feed.d.ts +6 -0
- package/controllers/feed.js +73 -0
- package/controllers/feedback/feedbackController.d.ts +1 -1
- package/controllers/feedback/feedbackController.js +5 -7
- package/controllers/filter-fields/columns.d.ts +11 -0
- package/controllers/filter-fields/columns.js +106 -0
- package/controllers/filter-fields/filterFields.d.ts +10 -0
- package/controllers/filter-fields/filterFields.js +141 -0
- package/controllers/filter-fields/getAllUserFilters.d.ts +6 -0
- package/controllers/filter-fields/getAllUserFilters.js +115 -0
- package/controllers/filter-fields/groups.d.ts +5 -0
- package/controllers/filter-fields/groups.js +26 -0
- package/controllers/filter-fields/savedFilters.d.ts +25 -0
- package/controllers/filter-fields/savedFilters.js +317 -0
- package/controllers/getAllWidgets.d.ts +1 -1
- package/controllers/getAllWidgets.js +1 -9
- package/controllers/history-actions/HistoryController.js +6 -31
- package/controllers/initUser.js +6 -5
- package/controllers/inlineUpdate.d.ts +7 -0
- package/controllers/inlineUpdate.js +148 -0
- package/controllers/list.d.ts +1 -1
- package/controllers/list.js +383 -70
- package/controllers/listUserFilters.d.ts +5 -0
- package/controllers/listUserFilters.js +26 -0
- package/controllers/login.js +2 -2
- package/controllers/media-manager/mediaManagerApi.js +0 -9
- package/controllers/navigation/edit.js +3 -9
- package/controllers/notifications/NotificationController.d.ts +1 -1
- package/controllers/notifications/NotificationController.js +12 -36
- package/controllers/register.js +10 -9
- package/controllers/remove.js +10 -19
- package/controllers/timezones.d.ts +1 -1
- package/controllers/timezones.js +0 -6
- package/controllers/userApiKey.d.ts +7 -0
- package/controllers/userApiKey.js +36 -0
- package/controllers/view.js +14 -26
- package/controllers/welcome.d.ts +1 -1
- package/controllers/welcome.js +0 -4
- package/controllers/widgets/Action.d.ts +1 -1
- package/controllers/widgets/Action.js +1 -9
- package/controllers/widgets/Custom.d.ts +1 -1
- package/controllers/widgets/Custom.js +1 -9
- package/controllers/widgets/Info.d.ts +1 -1
- package/controllers/widgets/Info.js +1 -9
- package/controllers/widgets/filterInfo.d.ts +1 -0
- package/controllers/widgets/filterInfo.js +44 -0
- package/controllers/widgets/switch.d.ts +1 -1
- package/controllers/widgets/switch.js +1 -9
- package/controllers/widgetsDB.d.ts +1 -1
- package/controllers/widgetsDB.js +2 -8
- package/helpers/accessRightsHelper.d.ts +1 -1
- package/helpers/accessRightsHelper.js +5 -4
- package/helpers/apiKeyHelper.d.ts +5 -0
- package/helpers/apiKeyHelper.js +8 -0
- package/helpers/configHelper.js +12 -15
- package/helpers/controllerHelper.d.ts +14 -21
- package/helpers/controllerHelper.js +50 -83
- package/helpers/fieldsHelper.js +3 -3
- package/helpers/filterDatetimeHelper.d.ts +5 -0
- package/helpers/filterDatetimeHelper.js +84 -0
- package/helpers/inertiaActionsHelper.d.ts +2 -2
- package/helpers/inertiaActionsHelper.js +5 -4
- package/helpers/inertiaAddHelper.d.ts +3 -414
- package/helpers/inertiaAddHelper.js +39 -15
- package/helpers/inertiaGroupHelper.d.ts +2 -2
- package/helpers/inertiaGroupHelper.js +3 -3
- package/helpers/inertiaListHelper.d.ts +7 -3
- package/helpers/inertiaListHelper.js +26 -12
- package/helpers/inertiaMenuHelper.d.ts +1 -0
- package/helpers/inertiaMenuHelper.js +15 -3
- package/helpers/inertiaUserHelper.d.ts +3 -2
- package/helpers/inertiaUserHelper.js +7 -3
- package/helpers/menuHelper.d.ts +5 -2
- package/helpers/menuHelper.js +64 -12
- package/helpers/viteHelper.js +1 -2
- package/index.d.ts +6 -2
- package/index.js +6 -2
- package/interfaces/adminpanelConfig.d.ts +126 -39
- package/interfaces/internalModelAccess.d.ts +37 -0
- package/interfaces/internalModelAccess.js +1 -0
- package/interfaces/listQueryBuilder.d.ts +22 -0
- package/interfaces/listQueryBuilder.js +1 -0
- package/interfaces/queryCriteria.d.ts +54 -0
- package/interfaces/queryCriteria.js +1 -0
- package/interfaces/types.d.ts +1 -13
- package/lib/Adminizer.d.ts +4 -2
- package/lib/Adminizer.js +29 -10
- package/lib/DataAccessor.d.ts +8 -5
- package/lib/DataAccessor.js +89 -42
- package/lib/I18n.d.ts +5 -1
- package/lib/I18n.js +45 -19
- package/lib/MiddlewareManager.d.ts +8 -0
- package/lib/MiddlewareManager.js +53 -0
- package/lib/ai-assistant/OpenAiModelService.d.ts +3 -3
- package/lib/ai-assistant/OpenAiModelService.js +23 -24
- package/lib/catalog/Navigation.d.ts +1 -0
- package/lib/catalog/Navigation.js +12 -11
- package/lib/controls/jsoneditor/JsonEditor.d.ts +1 -2
- package/lib/controls/markdown/ToastUiEditor.d.ts +1 -2
- package/lib/feedback/FeedbackHandler.js +2 -2
- package/lib/filters/ConditionValidator.d.ts +107 -0
- package/lib/filters/ConditionValidator.js +483 -0
- package/lib/filters/CustomFilterHandler.d.ts +122 -0
- package/lib/filters/CustomFilterHandler.js +131 -0
- package/lib/filters/FilterCustomFieldHandler.d.ts +2 -0
- package/lib/filters/FilterCustomFieldHandler.js +2 -0
- package/lib/filters/FilterService.d.ts +82 -0
- package/lib/filters/FilterService.js +323 -0
- package/lib/filters/index.d.ts +6 -0
- package/lib/filters/index.js +4 -0
- package/lib/history-actions/AbstractHistoryAdapter.d.ts +5 -4
- package/lib/history-actions/AbstractHistoryAdapter.js +45 -30
- package/lib/history-actions/DefaultHistoryAdapter.d.ts +2 -0
- package/lib/history-actions/DefaultHistoryAdapter.js +12 -6
- package/lib/history-actions/HistoryHandler.js +1 -1
- package/lib/list-query-builder/ListQueryBuilder.d.ts +117 -0
- package/lib/list-query-builder/ListQueryBuilder.js +707 -0
- package/lib/media-manager/AbstractMediaManager.d.ts +9 -8
- package/lib/media-manager/DefaultMediaManager.d.ts +2 -0
- package/lib/media-manager/DefaultMediaManager.js +27 -15
- package/lib/media-manager/Items.d.ts +4 -1
- package/lib/media-manager/Items.js +62 -59
- package/lib/media-manager/MediaManagerHandler.js +1 -1
- package/lib/media-manager/helpers/MediaManagerHelper.d.ts +5 -1
- package/lib/media-manager/helpers/MediaManagerHelper.js +38 -4
- package/lib/model/AbstractModel.d.ts +33 -25
- package/lib/model/AbstractModel.js +54 -2
- package/lib/model/InternalModelAccessFactory.d.ts +18 -0
- package/lib/model/InternalModelAccessFactory.js +82 -0
- package/lib/model/ModelHandler.d.ts +6 -0
- package/lib/model/ModelHandler.js +14 -0
- package/lib/model/adapter/sequelize.d.ts +32 -10
- package/lib/model/adapter/sequelize.js +409 -62
- package/lib/model/adapter/typeorm.d.ts +62 -0
- package/lib/model/adapter/typeorm.js +777 -0
- package/lib/model/internalModelAccessToken.d.ts +1 -0
- package/lib/model/internalModelAccessToken.js +1 -0
- package/lib/model/internalModelRepository.d.ts +3 -0
- package/lib/model/internalModelRepository.js +4 -0
- package/lib/notifications/AbstractNotificationService.d.ts +3 -0
- package/lib/notifications/AbstractNotificationService.js +42 -36
- package/lib/notifications/GeneralNotificationService.js +37 -40
- package/lib/notifications/SystemNotificationService.js +33 -36
- package/lib/requestProcessor.js +0 -3
- package/lib/ui-i18n/getUiTranslations.d.ts +1 -0
- package/lib/ui-i18n/getUiTranslations.js +3 -0
- package/lib/ui-i18n/uiTranslationKeys.d.ts +6 -0
- package/lib/ui-i18n/uiTranslationKeys.js +268 -0
- package/lib/widgets/widgetHandler.d.ts +7 -2
- package/lib/widgets/widgetHandler.js +98 -18
- package/models/FilterAP.d.ts +116 -0
- package/models/FilterAP.js +68 -0
- package/models/FilterColumnAP.d.ts +32 -0
- package/models/FilterColumnAP.js +21 -0
- package/models/GroupAP.d.ts +1 -1
- package/models/HistoryActionsAP.d.ts +3 -3
- package/models/MediaManagerMetaAP.d.ts +1 -1
- package/models/NavigationAP.d.ts +1 -1
- package/models/UserAP.d.ts +6 -1
- package/models/UserAP.js +4 -0
- package/package.json +39 -32
- package/policies/authPolicies.d.ts +12 -0
- package/policies/authPolicies.js +104 -0
- package/policies/permissionResolvers.d.ts +12 -0
- package/policies/permissionResolvers.js +52 -0
- package/services/FeedService.d.ts +70 -0
- package/services/FeedService.js +334 -0
- package/system/Router.d.ts +1 -0
- package/system/Router.js +136 -59
- package/system/bindAccessRights.js +11 -30
- package/system/bindAuthorization.js +18 -18
- package/system/bindCors.js +16 -1
- package/system/bindCustomFilterHandlers.d.ts +2 -0
- package/system/bindCustomFilterHandlers.js +4 -0
- package/system/bindInertia.js +18 -61
- package/system/bindReqFunctions.js +10 -2
- package/system/bindTranslations.js +7 -3
- package/system/buildInternalModelAccess.d.ts +4 -0
- package/system/buildInternalModelAccess.js +59 -0
- package/system/defaults.js +18 -14
- package/system/routePolicies.d.ts +2 -0
- package/system/routePolicies.js +29 -0
- package/translations/en.json +151 -39
- package/translations/ru.json +211 -64
- package/ui/components/handsontable.js +13 -27
- package/ui/components/ui/dialog-stack.js +1 -3
- package/ui/components/ui/popover.js +1 -1
- package/ui/components/ui/sidebar.js +1 -1
- package/assets/RelationDialogStack-D9UVEF9s.js +0 -407
- package/assets/RelationDialogStack-DV8OITPR.css +0 -4
- package/assets/add-BlvzWQKF.js +0 -1
- package/assets/add-group-1Uoq9NWe.js +0 -1
- package/assets/add-group-form-B01gwDGu.js +0 -1
- package/assets/add-user-BQCAsaRy.js +0 -1
- package/assets/add-user-form-Cgwc9JkI.js +0 -1
- package/assets/app-DaOMy1nl.css +0 -72
- package/assets/app-layout-CAm60qoE.js +0 -1
- package/assets/app-shell-QWCtn9ye.js +0 -1
- package/assets/app-sidebar-CfaYbnSy.js +0 -1
- package/assets/app-sidebar-header-BsPFDhZ8.js +0 -1
- package/assets/breadcrumbs-CZZirDj8.js +0 -1
- package/assets/catalog-k5myk7fk.js +0 -6
- package/assets/dashboard-BkL9ybBw.js +0 -3
- package/assets/date-picker-B5AZ_7Q9.js +0 -1
- package/assets/del-modal-BoyXZloG.js +0 -1
- package/assets/dynamic-controls-k61T9W2P.js +0 -1
- package/assets/form-1WGY0YgG.js +0 -1
- package/assets/form-DJapG3qF.js +0 -1
- package/assets/geo-json-DsMUHo0l.js +0 -4
- package/assets/handsontable-PxYdjN8c.js +0 -298
- package/assets/history-CluyR-yJ.js +0 -1
- package/assets/home-Dug9zBzM.js +0 -2
- package/assets/icon-DfDLMG5f.js +0 -1
- package/assets/init-user-CF80MEnT.js +0 -1
- package/assets/input-error-DuuqFgZa.js +0 -1
- package/assets/jsoneditor-De1FvcYu.js +0 -3882
- package/assets/list-CuexshNt.js +0 -1
- package/assets/list-table-BsEWjTKY.js +0 -22
- package/assets/login-eDemYzN-.js +0 -1
- package/assets/material-icon-DMT8KdmE.js +0 -1
- package/assets/media-manager-DfYa_mT_.js +0 -14
- package/assets/module-Cd4Tm6uq.js +0 -1
- package/assets/monaco-BhBYtg3d.js +0 -11
- package/assets/nav-footer-D3olYxtz.js +0 -1
- package/assets/nav-main-BctqyzeV.js +0 -1
- package/assets/nav-user-Bn1Lt-BZ.js +0 -1
- package/assets/notification-D64qvni-.js +0 -27
- package/assets/pagination-render-DxD78ahJ.js +0 -1
- package/assets/register-349PwYbe.js +0 -1
- package/assets/theme-switcher-DfExsHW2.js +0 -1
- package/assets/toast-editor-ESK5iWPx.js +0 -845
- package/assets/user-info-DtBK5Kh8.js +0 -1
- package/assets/user-menu-content-0XYOCMaA.js +0 -1
- package/assets/welcome-PDp-gUei.js +0 -1
- package/controllers/form.d.ts +0 -1
- package/controllers/form.js +0 -86
- package/helpers/formHelper.d.ts +0 -6
- package/helpers/formHelper.js +0 -38
- package/helpers/inertiaFromHelper.d.ts +0 -11
- package/helpers/inertiaFromHelper.js +0 -98
- package/helpers/runtimeMode.d.ts +0 -1
- package/helpers/runtimeMode.js +0 -3
- package/lib/PolicyManager.d.ts +0 -8
- package/lib/PolicyManager.js +0 -53
- package/lib/datatable/NodeTable.d.ts +0 -49
- package/lib/datatable/NodeTable.js +0 -207
- package/lib/model/adapter/waterline.d.ts +0 -32
- package/lib/model/adapter/waterline.js +0 -180
- package/migrations/index.d.ts +0 -3
- package/migrations/index.js +0 -4
- package/migrations/knex/20250106000001_adminizer_init.d.ts +0 -8
- package/migrations/knex/20250106000001_adminizer_init.js +0 -164
- package/migrations/umzug/0001.d.ts +0 -7
- package/migrations/umzug/0001.js +0 -121
- package/migrations/umzugExports.d.ts +0 -2
- package/migrations/umzugExports.js +0 -9
- package/system/bindForms.d.ts +0 -2
- package/system/bindForms.js +0 -20
- /package/{policies → middlewares}/addMessages.d.ts +0 -0
- /package/{policies → middlewares}/addMessages.js +0 -0
- /package/{policies → middlewares}/checkAuth.d.ts +0 -0
- /package/{policies → middlewares}/checkAuth.js +0 -0
- /package/{policies → middlewares}/setLocale.d.ts +0 -0
- /package/{policies → middlewares}/setLocale.js +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Adminizer } from '../../lib/Adminizer.js';
|
|
2
|
-
import {
|
|
2
|
+
import { getUiTranslations } from "../../lib/ui-i18n/getUiTranslations.js";
|
|
3
|
+
import { NOTIFICATION_UI_TRANSLATION_KEYS } from "../../lib/ui-i18n/uiTranslationKeys.js";
|
|
3
4
|
export class NotificationController {
|
|
4
5
|
static async search(req, res) {
|
|
5
|
-
if (!NotificationController.
|
|
6
|
+
if (!NotificationController.checkNotifStatus(req, res))
|
|
6
7
|
return;
|
|
7
8
|
if (req.method.toUpperCase() === 'POST') {
|
|
8
9
|
const { s, notificationClass } = req.body;
|
|
@@ -16,29 +17,14 @@ export class NotificationController {
|
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
19
|
static async viewAll(req, res) {
|
|
19
|
-
|
|
20
|
-
if (!NotificationController.checkNotifPermission(req, res, isUiRequest))
|
|
20
|
+
if (!NotificationController.checkNotifStatus(req, res))
|
|
21
21
|
return;
|
|
22
|
-
if (req.method.toUpperCase() === 'POST') {
|
|
23
|
-
const messages = {
|
|
24
|
-
"Make read": "",
|
|
25
|
-
"View All": "",
|
|
26
|
-
"Search": "",
|
|
27
|
-
"Make all read": "",
|
|
28
|
-
"Title": "",
|
|
29
|
-
"Message": "",
|
|
30
|
-
"Date": "",
|
|
31
|
-
"Diff": "",
|
|
32
|
-
"The end of the list has been reached": "",
|
|
33
|
-
};
|
|
34
|
-
res.json(Object.fromEntries(Object.keys(messages).map(key => [key, req.i18n.__(key)])));
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
22
|
if (req.method.toUpperCase() === 'GET') {
|
|
38
23
|
req.Inertia.render({
|
|
39
24
|
component: 'notification',
|
|
40
25
|
props: {
|
|
41
26
|
title: req.i18n.__('Notifications'),
|
|
27
|
+
i18nPage: getUiTranslations(req, NOTIFICATION_UI_TRANSLATION_KEYS),
|
|
42
28
|
}
|
|
43
29
|
});
|
|
44
30
|
return;
|
|
@@ -46,7 +32,7 @@ export class NotificationController {
|
|
|
46
32
|
res.status(405).end();
|
|
47
33
|
}
|
|
48
34
|
static async getNotificationClasses(req, res) {
|
|
49
|
-
if (!NotificationController.
|
|
35
|
+
if (!NotificationController.checkNotifStatus(req, res))
|
|
50
36
|
return;
|
|
51
37
|
if (req.adminizer.config.notifications.enabled === false) {
|
|
52
38
|
Adminizer.log.warn('[Notifications] Notifications disabled in config');
|
|
@@ -70,7 +56,7 @@ export class NotificationController {
|
|
|
70
56
|
});
|
|
71
57
|
}
|
|
72
58
|
static async getNotificationsStream(req, res) {
|
|
73
|
-
if (!NotificationController.
|
|
59
|
+
if (!NotificationController.checkNotifStatus(req, res))
|
|
74
60
|
return;
|
|
75
61
|
res.setHeader('Content-Type', 'text/event-stream');
|
|
76
62
|
res.setHeader('Cache-Control', 'no-cache, no-transform');
|
|
@@ -152,7 +138,7 @@ export class NotificationController {
|
|
|
152
138
|
}
|
|
153
139
|
// API for receiving class notifications
|
|
154
140
|
static async getNotificationsByClass(req, res) {
|
|
155
|
-
if (!NotificationController.
|
|
141
|
+
if (!NotificationController.checkNotifStatus(req, res))
|
|
156
142
|
return;
|
|
157
143
|
try {
|
|
158
144
|
const { notificationClass } = req.params;
|
|
@@ -178,7 +164,7 @@ export class NotificationController {
|
|
|
178
164
|
}
|
|
179
165
|
// API for receiving all user notifications
|
|
180
166
|
static async getUserNotifications(req, res) {
|
|
181
|
-
if (!NotificationController.
|
|
167
|
+
if (!NotificationController.checkNotifStatus(req, res))
|
|
182
168
|
return;
|
|
183
169
|
const { limit = 4, skip = 0, unreadOnly = false } = req.query;
|
|
184
170
|
try {
|
|
@@ -201,7 +187,7 @@ export class NotificationController {
|
|
|
201
187
|
}
|
|
202
188
|
// API for marking as read
|
|
203
189
|
static async markAsRead(req, res) {
|
|
204
|
-
if (!NotificationController.
|
|
190
|
+
if (!NotificationController.checkNotifStatus(req, res))
|
|
205
191
|
return;
|
|
206
192
|
try {
|
|
207
193
|
const { notificationClass, id } = req.params;
|
|
@@ -215,7 +201,7 @@ export class NotificationController {
|
|
|
215
201
|
}
|
|
216
202
|
}
|
|
217
203
|
static async markAllAsRead(req, res) {
|
|
218
|
-
if (!NotificationController.
|
|
204
|
+
if (!NotificationController.checkNotifStatus(req, res))
|
|
219
205
|
return;
|
|
220
206
|
try {
|
|
221
207
|
const services = req.adminizer.notificationHandler.getAllServices();
|
|
@@ -229,21 +215,11 @@ export class NotificationController {
|
|
|
229
215
|
res.status(500).json({ error: 'Internal server error' });
|
|
230
216
|
}
|
|
231
217
|
}
|
|
232
|
-
static
|
|
218
|
+
static checkNotifStatus(req, res) {
|
|
233
219
|
if (!req.adminizer?.notificationHandler) {
|
|
234
220
|
res.status(500).json({ error: 'Notification system not initialized' });
|
|
235
221
|
return false;
|
|
236
222
|
}
|
|
237
|
-
// We use the redirect only for UI pages; API requests receive 401.
|
|
238
|
-
if (req.adminizer.config.auth.enable && !req.user) {
|
|
239
|
-
if (shouldRedirectToLogin) {
|
|
240
|
-
redirectToLogin(req, res);
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
res.status(401).json({ error: 'Unauthorized' });
|
|
244
|
-
}
|
|
245
|
-
return false;
|
|
246
|
-
}
|
|
247
223
|
return true;
|
|
248
224
|
}
|
|
249
225
|
}
|
package/controllers/register.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { generate } from "password-hash";
|
|
2
2
|
import { inertiaRegisterHelper } from "../helpers/inertiaAutHelper.js";
|
|
3
|
+
import { generateUserApiKey } from "../helpers/apiKeyHelper.js";
|
|
3
4
|
export default async function register(req, res) {
|
|
4
5
|
if (!req.adminizer.config.auth.enable || req.adminizer.config.registration?.enable !== true) {
|
|
5
6
|
return res.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
6
7
|
}
|
|
8
|
+
const authModels = req.adminizer.modelHandler.internal("auth");
|
|
9
|
+
const userModel = authModels.get("UserAP");
|
|
10
|
+
const groupModel = authModels.get("GroupAP");
|
|
7
11
|
if (req.method.toUpperCase() === "POST") {
|
|
8
12
|
for (const key of ["login", "fullName", "password"]) {
|
|
9
13
|
if (!req.body[key]) {
|
|
@@ -20,8 +24,7 @@ export default async function register(req, res) {
|
|
|
20
24
|
}
|
|
21
25
|
let user;
|
|
22
26
|
try {
|
|
23
|
-
|
|
24
|
-
user = await req.adminizer.modelHandler.model.get("UserAP")["_findOne"]({ login: req.body.login });
|
|
27
|
+
user = await userModel.findOne({ where: { login: req.body.login } });
|
|
25
28
|
}
|
|
26
29
|
catch (e) {
|
|
27
30
|
return res.status(500).send({ error: e.message || 'Internal Server Error' });
|
|
@@ -41,18 +44,16 @@ export default async function register(req, res) {
|
|
|
41
44
|
try {
|
|
42
45
|
let passwordHashed = generate(req.body.login + req.body.password + process.env.AP_PASSWORD_SALT);
|
|
43
46
|
let password = 'masked';
|
|
44
|
-
|
|
45
|
-
let userap = await req.adminizer.modelHandler.model.get("UserAP")["_create"]({
|
|
47
|
+
let userap = await userModel.create({
|
|
46
48
|
login: req.body.login,
|
|
47
49
|
passwordHashed: passwordHashed,
|
|
48
50
|
fullName: req.body.fullName,
|
|
49
51
|
email: req.body.email,
|
|
50
|
-
locale: req.body.locale
|
|
52
|
+
locale: req.body.locale,
|
|
53
|
+
apiKey: generateUserApiKey()
|
|
51
54
|
});
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// TODO refactor CRUD functions for DataAccessor usage
|
|
55
|
-
await req.adminizer.modelHandler.model.get("UserAP")["_updateOne"]({ id: userap.id }, {
|
|
55
|
+
let defaultUserGroup = await groupModel.findOne({ where: { name: req.adminizer.config.registration.defaultUserGroup } });
|
|
56
|
+
await userModel.updateOne({ where: { id: userap.id } }, {
|
|
56
57
|
groups: [defaultUserGroup.id]
|
|
57
58
|
}); // instead of UserAP.addToCollection;
|
|
58
59
|
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}`);
|
package/controllers/remove.js
CHANGED
|
@@ -2,7 +2,6 @@ import { ControllerHelper } from "../helpers/controllerHelper.js";
|
|
|
2
2
|
import { deleteRelationsMediaManager } from "../lib/media-manager/helpers/MediaManagerHelper.js";
|
|
3
3
|
import { DataAccessor } from "../lib/DataAccessor.js";
|
|
4
4
|
import { Adminizer } from "../lib/Adminizer.js";
|
|
5
|
-
import { redirectToLogin } from '../helpers/inertiaAutHelper.js';
|
|
6
5
|
export default async function remove(req, res) {
|
|
7
6
|
// Checking id of the record
|
|
8
7
|
if (!req.params.id) {
|
|
@@ -10,21 +9,13 @@ export default async function remove(req, res) {
|
|
|
10
9
|
return res.status(404).send({ error: 'Not Found' });
|
|
11
10
|
}
|
|
12
11
|
let referTo = decodeURIComponent(req.query.referTo);
|
|
13
|
-
let
|
|
14
|
-
if (!
|
|
12
|
+
let modelResource = ControllerHelper.findModelResource(req);
|
|
13
|
+
if (!modelResource.model) {
|
|
15
14
|
Adminizer.log.error(new Error('Admin panel: no model found'));
|
|
16
15
|
return res.status(404).send({ error: 'Not Found' });
|
|
17
16
|
}
|
|
18
|
-
if (!
|
|
19
|
-
return res.redirect(`${req.adminizer.config.routePrefix}/${
|
|
20
|
-
}
|
|
21
|
-
if (req.adminizer.config.auth.enable) {
|
|
22
|
-
if (!req.user) {
|
|
23
|
-
return redirectToLogin(req, res);
|
|
24
|
-
}
|
|
25
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`delete-${entity.name}-model`, req.user)) {
|
|
26
|
-
return res.sendStatus(403);
|
|
27
|
-
}
|
|
17
|
+
if (!modelResource.config.remove) {
|
|
18
|
+
return res.redirect(`${req.adminizer.config.routePrefix}/${modelResource.uri}`);
|
|
28
19
|
}
|
|
29
20
|
/**
|
|
30
21
|
* Searching for record by model
|
|
@@ -32,8 +23,8 @@ export default async function remove(req, res) {
|
|
|
32
23
|
let record;
|
|
33
24
|
let dataAccessor;
|
|
34
25
|
try {
|
|
35
|
-
dataAccessor = new DataAccessor(req.adminizer, req.user,
|
|
36
|
-
record = await
|
|
26
|
+
dataAccessor = new DataAccessor(req.adminizer, req.user, modelResource, "remove");
|
|
27
|
+
record = await modelResource.model.findOne({ where: { id: req.params.id } }, dataAccessor);
|
|
37
28
|
}
|
|
38
29
|
catch (e) {
|
|
39
30
|
if (req.accepts('json')) {
|
|
@@ -57,13 +48,13 @@ export default async function remove(req, res) {
|
|
|
57
48
|
// adminizer.log.debug('admin > remove > record > ', record);
|
|
58
49
|
let destroyedRecord;
|
|
59
50
|
try {
|
|
60
|
-
const fieldId =
|
|
51
|
+
const fieldId = modelResource.config.identifierField ?? req.adminizer.config.identifierField;
|
|
61
52
|
const q = {};
|
|
62
53
|
q[fieldId] = record[fieldId];
|
|
63
|
-
destroyedRecord = await
|
|
54
|
+
destroyedRecord = await modelResource.model.destroy(q, dataAccessor);
|
|
64
55
|
console.log(destroyedRecord[0]);
|
|
65
56
|
// delete relations media manager
|
|
66
|
-
await deleteRelationsMediaManager(req.adminizer,
|
|
57
|
+
await deleteRelationsMediaManager(req.adminizer, modelResource.name, destroyedRecord);
|
|
67
58
|
}
|
|
68
59
|
catch (e) {
|
|
69
60
|
Adminizer.log.error('adminpanel > error', e);
|
|
@@ -74,7 +65,7 @@ export default async function remove(req, res) {
|
|
|
74
65
|
else {
|
|
75
66
|
req.flash.setFlashMessage('error', req.i18n.__('Record was not removed'));
|
|
76
67
|
}
|
|
77
|
-
let referToUrl = referTo ? `${
|
|
68
|
+
let referToUrl = referTo ? `${modelResource.uri}${referTo}` : `${modelResource.uri}`;
|
|
78
69
|
return req.Inertia.redirect(`${referToUrl}`);
|
|
79
70
|
}
|
|
80
71
|
;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default function timezones(req: ReqType, res: ResType): Promise<
|
|
1
|
+
export default function timezones(req: ReqType, res: ResType): Promise<ResType>;
|
package/controllers/timezones.js
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
import { redirectToLogin } from '../helpers/inertiaAutHelper.js';
|
|
2
1
|
export default async function timezones(req, res) {
|
|
3
|
-
if (req.adminizer.config.auth.enable) {
|
|
4
|
-
if (!req.user) {
|
|
5
|
-
return redirectToLogin(req, res);
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
2
|
let timezones = [];
|
|
9
3
|
for (let timezone of req.adminizer.config.timezones) {
|
|
10
4
|
timezones.push({
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controller for managing user API key.
|
|
3
|
+
* GET /adminizer/api/user-key — returns current user's API key
|
|
4
|
+
* POST /adminizer/api/user-key/regenerate — regenerates the API key
|
|
5
|
+
*/
|
|
6
|
+
export declare function getUserApiKey(req: ReqType, res: ResType): Promise<ResType>;
|
|
7
|
+
export declare function regenerateUserApiKey(req: ReqType, res: ResType): Promise<ResType>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { generateUserApiKey } from "../helpers/apiKeyHelper.js";
|
|
2
|
+
import { Adminizer } from "../lib/Adminizer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Controller for managing user API key.
|
|
5
|
+
* GET /adminizer/api/user-key — returns current user's API key
|
|
6
|
+
* POST /adminizer/api/user-key/regenerate — regenerates the API key
|
|
7
|
+
*/
|
|
8
|
+
export async function getUserApiKey(req, res) {
|
|
9
|
+
// If user doesn't have an API key yet, generate one
|
|
10
|
+
if (!req.user.apiKey) {
|
|
11
|
+
const newKey = generateUserApiKey();
|
|
12
|
+
try {
|
|
13
|
+
const userModel = req.adminizer.modelHandler.internal("auth").get("UserAP");
|
|
14
|
+
await userModel.updateOne({ where: { id: req.user.id } }, { apiKey: newKey });
|
|
15
|
+
req.user.apiKey = newKey;
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
Adminizer.log.error('Error generating user API key:', e);
|
|
19
|
+
return res.status(500).json({ error: 'Failed to generate API key' });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return res.json({ apiKey: req.user.apiKey });
|
|
23
|
+
}
|
|
24
|
+
export async function regenerateUserApiKey(req, res) {
|
|
25
|
+
const newKey = generateUserApiKey();
|
|
26
|
+
try {
|
|
27
|
+
const userModel = req.adminizer.modelHandler.internal("auth").get("UserAP");
|
|
28
|
+
await userModel.updateOne({ where: { id: req.user.id } }, { apiKey: newKey });
|
|
29
|
+
Adminizer.log.debug(`User ${req.user.id} regenerated their API key`);
|
|
30
|
+
return res.json({ apiKey: newKey });
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
Adminizer.log.error('Error regenerating user API key:', e);
|
|
34
|
+
return res.status(500).json({ error: 'Failed to regenerate API key' });
|
|
35
|
+
}
|
|
36
|
+
}
|
package/controllers/view.js
CHANGED
|
@@ -6,49 +6,39 @@ import { inertiaGroupHelper } from "../helpers/inertiaGroupHelper.js";
|
|
|
6
6
|
import inertiaAddHelper from "../helpers/inertiaAddHelper.js";
|
|
7
7
|
import { FieldsHelper } from "../helpers/fieldsHelper.js";
|
|
8
8
|
import { getRelationsMediaManager } from "../lib/media-manager/helpers/MediaManagerHelper.js";
|
|
9
|
-
import { redirectToLogin } from '../helpers/inertiaAutHelper.js';
|
|
10
9
|
export default async function view(req, res) {
|
|
11
10
|
// Check id
|
|
12
11
|
if (!req.params.id) {
|
|
13
12
|
return res.status(404).send({ error: 'Not Found' });
|
|
14
13
|
}
|
|
15
|
-
let
|
|
16
|
-
if (!
|
|
17
|
-
return res.redirect(`${req.adminizer.config.routePrefix}/${
|
|
14
|
+
let modelResource = ControllerHelper.findModelResource(req);
|
|
15
|
+
if (!modelResource.config.view) {
|
|
16
|
+
return res.redirect(`${req.adminizer.config.routePrefix}/${modelResource.uri}`);
|
|
18
17
|
}
|
|
19
|
-
if (!
|
|
18
|
+
if (!modelResource.model) {
|
|
20
19
|
return res.status(404).send({ error: 'Not Found' });
|
|
21
20
|
}
|
|
22
|
-
|
|
23
|
-
if (!req.user) {
|
|
24
|
-
return redirectToLogin(req, res);
|
|
25
|
-
}
|
|
26
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.user)) {
|
|
27
|
-
return res.sendStatus(403);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
let dataAccessor = new DataAccessor(req.adminizer, req.user, entity, "view");
|
|
21
|
+
let dataAccessor = new DataAccessor(req.adminizer, req.user, modelResource, "view");
|
|
31
22
|
let fields = dataAccessor.getFieldsConfig();
|
|
32
23
|
let record;
|
|
33
24
|
try {
|
|
34
|
-
record = await
|
|
25
|
+
record = await modelResource.model.findOne({ where: { id: req.params.id } }, dataAccessor);
|
|
35
26
|
}
|
|
36
27
|
catch (e) {
|
|
37
28
|
Adminizer.log.error('Admin edit error: ');
|
|
38
29
|
Adminizer.log.error(e);
|
|
39
30
|
return res.status(500).send({ error: 'Internal Server Error' });
|
|
40
31
|
}
|
|
41
|
-
switch (
|
|
32
|
+
switch (modelResource.config.model) {
|
|
42
33
|
case 'userap':
|
|
43
34
|
let groups;
|
|
44
35
|
try {
|
|
45
|
-
|
|
46
|
-
groups = await req.adminizer.modelHandler.model.get("GroupAP")["_find"]({});
|
|
36
|
+
groups = await req.adminizer.modelHandler.internal("users").get("GroupAP").find({});
|
|
47
37
|
}
|
|
48
38
|
catch (e) {
|
|
49
39
|
Adminizer.log.error(e);
|
|
50
40
|
}
|
|
51
|
-
const userProps = inertiaUserHelper(
|
|
41
|
+
const userProps = inertiaUserHelper(modelResource, req, groups, record, true);
|
|
52
42
|
return req.Inertia.render({
|
|
53
43
|
component: 'add-user',
|
|
54
44
|
props: userProps
|
|
@@ -56,16 +46,14 @@ export default async function view(req, res) {
|
|
|
56
46
|
case 'groupap':
|
|
57
47
|
let users;
|
|
58
48
|
try {
|
|
59
|
-
|
|
60
|
-
users = await req.adminizer.modelHandler.model.get("UserAP")["_find"](({ isAdministrator: false }));
|
|
49
|
+
users = await req.adminizer.modelHandler.internal("users").get("UserAP").find({ where: { isAdministrator: false } });
|
|
61
50
|
}
|
|
62
51
|
catch (e) {
|
|
63
52
|
Adminizer.log.error(e);
|
|
64
53
|
}
|
|
65
54
|
let group;
|
|
66
55
|
try {
|
|
67
|
-
|
|
68
|
-
group = await req.adminizer.modelHandler.model.get("GroupAP")["_findOne"]({ id: req.params.id });
|
|
56
|
+
group = await req.adminizer.modelHandler.internal("users").get("GroupAP").findOne({ where: { id: Number(req.params.id) } });
|
|
69
57
|
}
|
|
70
58
|
catch (e) {
|
|
71
59
|
Adminizer.log.error('Admin edit error: ');
|
|
@@ -77,7 +65,7 @@ export default async function view(req, res) {
|
|
|
77
65
|
for (let department of departments) {
|
|
78
66
|
groupedTokens[department] = req.adminizer.accessRightsHelper.getTokensByDepartment(department);
|
|
79
67
|
}
|
|
80
|
-
const groupProps = inertiaGroupHelper(
|
|
68
|
+
const groupProps = inertiaGroupHelper(modelResource, req, users, groupedTokens, group, true);
|
|
81
69
|
return req.Inertia.render({
|
|
82
70
|
component: 'add-group',
|
|
83
71
|
props: groupProps
|
|
@@ -89,13 +77,13 @@ export default async function view(req, res) {
|
|
|
89
77
|
if (fieldConfigConfig.type === 'mediamanager') {
|
|
90
78
|
record[field] = await getRelationsMediaManager(req.adminizer, {
|
|
91
79
|
mediaManagerId: fieldConfigConfig.options?.id ?? "default",
|
|
92
|
-
model:
|
|
80
|
+
model: modelResource.model.modelname,
|
|
93
81
|
widgetName: field,
|
|
94
82
|
modelId: req.params.id
|
|
95
83
|
});
|
|
96
84
|
}
|
|
97
85
|
}
|
|
98
|
-
const props = inertiaAddHelper(req,
|
|
86
|
+
const props = inertiaAddHelper(req, modelResource, fields, record, true);
|
|
99
87
|
return req.Inertia.render({
|
|
100
88
|
component: 'add',
|
|
101
89
|
props: props
|
package/controllers/welcome.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Welcome text
|
|
3
3
|
*/
|
|
4
|
-
export default function welcome(req: ReqType, res: ResType):
|
|
4
|
+
export default function welcome(req: ReqType, res: ResType): Promise<import("express").Response<any, Record<string, any>>>;
|
package/controllers/welcome.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { redirectToLogin } from '../helpers/inertiaAutHelper.js';
|
|
2
1
|
/**
|
|
3
2
|
* Welcome text
|
|
4
3
|
*/
|
|
5
4
|
export default function welcome(req, res) {
|
|
6
|
-
if (!req.user) {
|
|
7
|
-
return redirectToLogin(req, res);
|
|
8
|
-
}
|
|
9
5
|
let text = '';
|
|
10
6
|
let title = '';
|
|
11
7
|
if (Boolean((req.adminizer.configHelper.getConfig()).welcome) && Boolean((req.adminizer.configHelper.getConfig()).welcome.title) && Boolean((req.adminizer.configHelper.getConfig()).welcome.text)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function widgetActionController(req: ReqType, res: ResType): Promise<
|
|
1
|
+
export declare function widgetActionController(req: ReqType, res: ResType): Promise<ResType>;
|
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
import { redirectToLogin } from '../../helpers/inertiaAutHelper.js';
|
|
2
1
|
export async function widgetActionController(req, res) {
|
|
3
2
|
let widgetId = req.params.widgetId;
|
|
4
3
|
if (!widgetId) {
|
|
5
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
6
5
|
}
|
|
7
|
-
if (req.adminizer.config.auth.enable) {
|
|
8
|
-
if (!req.user) {
|
|
9
|
-
return redirectToLogin(req, res);
|
|
10
|
-
}
|
|
11
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
12
|
-
return res.sendStatus(403);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
6
|
let widget = req.adminizer.widgetHandler.getById(widgetId);
|
|
16
7
|
if (widget === undefined) {
|
|
17
8
|
return res.status(404).send({ error: 'Not Found' });
|
|
@@ -25,4 +16,5 @@ export async function widgetActionController(req, res) {
|
|
|
25
16
|
return res.json(error);
|
|
26
17
|
}
|
|
27
18
|
}
|
|
19
|
+
return res.status(405).end();
|
|
28
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function widgetCustomController(req: ReqType, res: ResType): Promise<
|
|
1
|
+
export declare function widgetCustomController(req: ReqType, res: ResType): Promise<ResType>;
|
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
import { redirectToLogin } from '../../helpers/inertiaAutHelper.js';
|
|
2
1
|
export async function widgetCustomController(req, res) {
|
|
3
2
|
let widgetId = req.params.widgetId;
|
|
4
3
|
if (!widgetId) {
|
|
5
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
6
5
|
}
|
|
7
|
-
if (req.adminizer.config.auth.enable) {
|
|
8
|
-
if (!req.user) {
|
|
9
|
-
return redirectToLogin(req, res);
|
|
10
|
-
}
|
|
11
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
12
|
-
return res.sendStatus(403);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
6
|
let widget = req.adminizer.widgetHandler.getById(widgetId);
|
|
16
7
|
if (widget === undefined) {
|
|
17
8
|
return res.status(404).send({ error: 'Not Found' });
|
|
@@ -34,4 +25,5 @@ export async function widgetCustomController(req, res) {
|
|
|
34
25
|
// return res.serverError(e)
|
|
35
26
|
// }
|
|
36
27
|
// }
|
|
28
|
+
return res.status(405).end();
|
|
37
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function widgetInfoController(req: ReqType, res: ResType): Promise<
|
|
1
|
+
export declare function widgetInfoController(req: ReqType, res: ResType): Promise<ResType>;
|
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
import { redirectToLogin } from '../../helpers/inertiaAutHelper.js';
|
|
2
1
|
export async function widgetInfoController(req, res) {
|
|
3
2
|
let widgetId = req.params.widgetId;
|
|
4
3
|
if (!widgetId) {
|
|
5
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
6
5
|
}
|
|
7
|
-
if (req.adminizer.config.auth.enable) {
|
|
8
|
-
if (!req.user) {
|
|
9
|
-
return redirectToLogin(req, res);
|
|
10
|
-
}
|
|
11
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
12
|
-
return res.sendStatus(403);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
6
|
let widget = req.adminizer.widgetHandler.getById(widgetId);
|
|
16
7
|
if (widget === undefined) {
|
|
17
8
|
return res.status(404).send({ error: 'Not Found' });
|
|
@@ -26,4 +17,5 @@ export async function widgetInfoController(req, res) {
|
|
|
26
17
|
return res.status(500).send({ error: e.message || 'Internal Server Error' });
|
|
27
18
|
}
|
|
28
19
|
}
|
|
20
|
+
return res.status(405).end();
|
|
29
21
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function widgetFilterInfoController(req: ReqType, res: ResType): Promise<ResType>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { FilterService } from "../../lib/filters/FilterService.js";
|
|
2
|
+
async function resolveDashboardUser(req) {
|
|
3
|
+
if (req.user) {
|
|
4
|
+
return req.user;
|
|
5
|
+
}
|
|
6
|
+
const adminLogin = req.adminizer.config.administrator?.login ?? "admin";
|
|
7
|
+
const userModel = req.adminizer.modelHandler.internal("widgets").get("UserAP");
|
|
8
|
+
const user = await userModel.findOne({ where: { login: adminLogin } });
|
|
9
|
+
return user ?? null;
|
|
10
|
+
}
|
|
11
|
+
export async function widgetFilterInfoController(req, res) {
|
|
12
|
+
const filterId = req.params.filterId;
|
|
13
|
+
if (!filterId) {
|
|
14
|
+
return res.status(404).send({ error: req.i18n.__("Not found") });
|
|
15
|
+
}
|
|
16
|
+
const user = await resolveDashboardUser(req);
|
|
17
|
+
if (!user) {
|
|
18
|
+
return res.status(401).send({ error: req.i18n.__("Unauthorized") });
|
|
19
|
+
}
|
|
20
|
+
const filterService = new FilterService(req.adminizer);
|
|
21
|
+
let filter = null;
|
|
22
|
+
try {
|
|
23
|
+
filter = await filterService.getFilterById(filterId, user);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
filter = null;
|
|
27
|
+
}
|
|
28
|
+
if (!filter || !filterService.canViewFilter(filter, user)) {
|
|
29
|
+
return res.status(404).send({ error: req.i18n.__("Not found") });
|
|
30
|
+
}
|
|
31
|
+
if (!req.adminizer.accessRightsHelper.hasPermission(`read-${filter.modelName}-model`, user)) {
|
|
32
|
+
return res.sendStatus(403);
|
|
33
|
+
}
|
|
34
|
+
if (req.method.toUpperCase() === "GET") {
|
|
35
|
+
try {
|
|
36
|
+
const count = await filterService.countFilterResults(filter, user);
|
|
37
|
+
return res.send(count >= 0 ? String(count) : "-");
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
return res.status(500).send({ error: e.message || req.i18n.__("Internal server error") });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return res.status(405).end();
|
|
44
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function widgetSwitchController(req: ReqType, res: ResType): Promise<
|
|
1
|
+
export declare function widgetSwitchController(req: ReqType, res: ResType): Promise<ResType>;
|
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
import { redirectToLogin } from '../../helpers/inertiaAutHelper.js';
|
|
2
1
|
export async function widgetSwitchController(req, res) {
|
|
3
2
|
let widgetId = req.params.widgetId;
|
|
4
3
|
if (!widgetId) {
|
|
5
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
6
5
|
}
|
|
7
|
-
if (req.adminizer.config.auth.enable) {
|
|
8
|
-
if (!req.user) {
|
|
9
|
-
return redirectToLogin(req, res);
|
|
10
|
-
}
|
|
11
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
12
|
-
return res.sendStatus(403);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
6
|
let widget = req.adminizer.widgetHandler.getById(widgetId);
|
|
16
7
|
if (widget === undefined) {
|
|
17
8
|
return res.status(404).send({ error: 'Not Found' });
|
|
@@ -36,4 +27,5 @@ export async function widgetSwitchController(req, res) {
|
|
|
36
27
|
return res.status(500).send({ error: e.message || 'Internal Server Error' });
|
|
37
28
|
}
|
|
38
29
|
}
|
|
30
|
+
return res.status(405).end();
|
|
39
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default function widgetsDB(req: ReqType, res: ResType): Promise<
|
|
1
|
+
export default function widgetsDB(req: ReqType, res: ResType): Promise<ResType>;
|
package/controllers/widgetsDB.js
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
import { redirectToLogin } from '../helpers/inertiaAutHelper.js';
|
|
2
1
|
export default async function widgetsDB(req, res) {
|
|
3
2
|
let id = 0;
|
|
4
3
|
let auth = req.adminizer.config.auth.enable;
|
|
5
|
-
if (
|
|
6
|
-
if (!req.user) {
|
|
7
|
-
return redirectToLogin(req, res);
|
|
8
|
-
}
|
|
9
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.user)) {
|
|
10
|
-
return res.sendStatus(403);
|
|
11
|
-
}
|
|
4
|
+
if (req.user) {
|
|
12
5
|
id = req.user.id;
|
|
13
6
|
}
|
|
14
7
|
if (req.method.toUpperCase() === 'GET') {
|
|
@@ -34,4 +27,5 @@ export default async function widgetsDB(req, res) {
|
|
|
34
27
|
return res.status(500).send({ error: e.message || 'Internal Server Error' });
|
|
35
28
|
}
|
|
36
29
|
}
|
|
30
|
+
return res.status(405).end();
|
|
37
31
|
}
|
|
@@ -12,7 +12,7 @@ export declare class AccessRightsHelper {
|
|
|
12
12
|
getTokensByDepartment(department: string): AccessRightsToken[];
|
|
13
13
|
getAllDepartments(): string[];
|
|
14
14
|
enoughPermissions(tokens: string[], user: UserAP): boolean;
|
|
15
|
-
hasPermission(tokenId: string, user: UserAP): boolean;
|
|
15
|
+
hasPermission(tokenId: string | undefined, user: UserAP, context?: string): boolean;
|
|
16
16
|
}
|
|
17
17
|
export declare class GroupsAccessRightsHelper {
|
|
18
18
|
static hasAccess(user: UserAP, groupsAccessRights?: string[]): boolean;
|
|
@@ -45,23 +45,24 @@ export class AccessRightsHelper {
|
|
|
45
45
|
if (user.isAdministrator) {
|
|
46
46
|
return true;
|
|
47
47
|
}
|
|
48
|
+
// No tokens required — access granted for all authenticated users
|
|
48
49
|
if (!tokens.length) {
|
|
49
|
-
return
|
|
50
|
+
return true;
|
|
50
51
|
}
|
|
51
52
|
return tokens.some((token) => this.hasPermission(token, user));
|
|
52
53
|
}
|
|
53
|
-
hasPermission(tokenId, user) {
|
|
54
|
+
hasPermission(tokenId, user, context) {
|
|
54
55
|
if (!this.adminizer.config.auth.enable) {
|
|
55
56
|
return true;
|
|
56
57
|
}
|
|
57
58
|
if (user.isAdministrator) {
|
|
58
59
|
return true;
|
|
59
60
|
}
|
|
60
|
-
tokenId = tokenId.toLowerCase();
|
|
61
61
|
if (!tokenId) {
|
|
62
|
-
Adminizer.log.warn(`AccessRightsHelper > hasPermission
|
|
62
|
+
Adminizer.log.warn(`AccessRightsHelper > hasPermission: missing accessRightsToken${context ? ` [${context}]` : ''}`);
|
|
63
63
|
return false;
|
|
64
64
|
}
|
|
65
|
+
tokenId = tokenId.toLowerCase();
|
|
65
66
|
const tokenIsValid = this._tokens.some((token) => token.id === tokenId);
|
|
66
67
|
if (!tokenIsValid) {
|
|
67
68
|
Adminizer.log.error("Adminpanel > Token is not valid", tokenId, user.login);
|