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,5 +1,6 @@
|
|
|
1
1
|
import { formatChanges, sanitizeForDiff } from "../../helpers/diffHelpers.js";
|
|
2
2
|
import { diff } from "deep-object-diff";
|
|
3
|
+
import { INTERNAL_MODEL_ACCESS_TOKEN } from "./internalModelAccessToken.js";
|
|
3
4
|
export class AbstractModel {
|
|
4
5
|
modelname;
|
|
5
6
|
attributes;
|
|
@@ -11,6 +12,41 @@ export class AbstractModel {
|
|
|
11
12
|
this.primaryKey = primaryKey;
|
|
12
13
|
this.identity = identity;
|
|
13
14
|
}
|
|
15
|
+
createInternalRepository(accessToken, modelName = this.modelname) {
|
|
16
|
+
if (accessToken !== INTERNAL_MODEL_ACCESS_TOKEN) {
|
|
17
|
+
throw new Error("Internal model repository access denied");
|
|
18
|
+
}
|
|
19
|
+
const model = this;
|
|
20
|
+
return {
|
|
21
|
+
async find(criteria = {}) {
|
|
22
|
+
return model._find(criteria);
|
|
23
|
+
},
|
|
24
|
+
async findOne(criteria = {}) {
|
|
25
|
+
return model._findOne(criteria);
|
|
26
|
+
},
|
|
27
|
+
async count(criteria = {}) {
|
|
28
|
+
return model._count(criteria);
|
|
29
|
+
},
|
|
30
|
+
async create(data) {
|
|
31
|
+
return model._create(data);
|
|
32
|
+
},
|
|
33
|
+
async update(criteria, data) {
|
|
34
|
+
return model._update(criteria, data);
|
|
35
|
+
},
|
|
36
|
+
async updateOne(criteria, data) {
|
|
37
|
+
return model._updateOne(criteria, data);
|
|
38
|
+
},
|
|
39
|
+
async destroy(criteria) {
|
|
40
|
+
return model._destroy(criteria);
|
|
41
|
+
},
|
|
42
|
+
async destroyOne(criteria) {
|
|
43
|
+
return model._destroyOne(criteria);
|
|
44
|
+
},
|
|
45
|
+
get name() {
|
|
46
|
+
return modelName;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
14
50
|
/**
|
|
15
51
|
* Generate diff between old and new records
|
|
16
52
|
*/
|
|
@@ -74,7 +110,7 @@ export class AbstractModel {
|
|
|
74
110
|
const record = eventType === 'Deleted' ? oldRecord : newRecord;
|
|
75
111
|
this.setHistory(dataAccessor, {
|
|
76
112
|
modelId: record[this.primaryKey],
|
|
77
|
-
modelName: dataAccessor.
|
|
113
|
+
modelName: dataAccessor.modelResource.name.toLocaleLowerCase(),
|
|
78
114
|
action: eventType.toLocaleLowerCase(),
|
|
79
115
|
data: record,
|
|
80
116
|
diff: formattedChanges,
|
|
@@ -99,6 +135,22 @@ export class AbstractModel {
|
|
|
99
135
|
let records = await this._find(criteria);
|
|
100
136
|
return records.map(record => dataAccessor.process(record));
|
|
101
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Find with raw SQL where clause (Sequelize.literal support)
|
|
140
|
+
* Only available in Sequelize adapter
|
|
141
|
+
*/
|
|
142
|
+
async findWithRawWhere(where, options) {
|
|
143
|
+
// Default implementation - will be overridden by Sequelize adapter
|
|
144
|
+
throw new Error('findWithRawWhere is only supported in Sequelize adapter');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Count with raw SQL where clause (Sequelize.literal support)
|
|
148
|
+
* Only available in Sequelize adapter
|
|
149
|
+
*/
|
|
150
|
+
async countWithRawWhere(where) {
|
|
151
|
+
// Default implementation - will be overridden by Sequelize adapter
|
|
152
|
+
throw new Error('countWithRawWhere is only supported in Sequelize adapter');
|
|
153
|
+
}
|
|
102
154
|
async updateOne(criteria, data, dataAccessor) {
|
|
103
155
|
let _data = dataAccessor.process(data);
|
|
104
156
|
// Get the old record first for diff
|
|
@@ -161,7 +213,7 @@ export class AbstractModel {
|
|
|
161
213
|
}
|
|
162
214
|
return records.map(record => dataAccessor.process(record));
|
|
163
215
|
}
|
|
164
|
-
async count(criteria, dataAccessor) {
|
|
216
|
+
async count(criteria = {}, dataAccessor) {
|
|
165
217
|
criteria = await dataAccessor.sanitizeUserRelationAccess(criteria);
|
|
166
218
|
return this._count(criteria);
|
|
167
219
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { InternalModelAccessMap, InternalModelRepository } from "../../interfaces/internalModelAccess";
|
|
2
|
+
import { AbstractModel } from "./AbstractModel";
|
|
3
|
+
export declare const DEFAULT_INTERNAL_MODEL_ACCESS: InternalModelAccessMap;
|
|
4
|
+
export declare class InternalModelScope {
|
|
5
|
+
private readonly getModel;
|
|
6
|
+
private readonly scopeName;
|
|
7
|
+
private readonly allowedModels;
|
|
8
|
+
constructor(getModel: (modelName: string) => AbstractModel<any> | undefined, scopeName: string, allowedModels: Set<string>);
|
|
9
|
+
get<T = any>(modelName: string): InternalModelRepository<T>;
|
|
10
|
+
has(modelName: string): boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class InternalModelAccessFactory {
|
|
13
|
+
private readonly getModel;
|
|
14
|
+
private readonly accessMap;
|
|
15
|
+
constructor(getModel: (modelName: string) => AbstractModel<any> | undefined, accessMap?: InternalModelAccessMap);
|
|
16
|
+
scope(scopeName: string): InternalModelScope;
|
|
17
|
+
canUse(scopeName: string, modelName: string): boolean;
|
|
18
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createInternalModelRepository } from "./internalModelRepository.js";
|
|
2
|
+
export const DEFAULT_INTERNAL_MODEL_ACCESS = {
|
|
3
|
+
auth: ["UserAP", "GroupAP"],
|
|
4
|
+
"access-rights": ["UserAP", "GroupAP"],
|
|
5
|
+
users: ["UserAP", "GroupAP"],
|
|
6
|
+
filters: ["FilterAP", "FilterColumnAP", "UserAP", "GroupAP"],
|
|
7
|
+
"media-manager": [
|
|
8
|
+
"MediaManagerAP",
|
|
9
|
+
"MediaManagerMetaAP",
|
|
10
|
+
"MediaManagerAssociationsAP",
|
|
11
|
+
"HistoryActionsAP"
|
|
12
|
+
],
|
|
13
|
+
history: ["HistoryActionsAP", "UserAP"],
|
|
14
|
+
"data-accessor": [],
|
|
15
|
+
notifications: ["NotificationAP", "UserNotificationAP", "UserAP"],
|
|
16
|
+
navigation: ["NavigationAP"],
|
|
17
|
+
feed: ["FilterAP", "UserAP"],
|
|
18
|
+
widgets: ["UserAP", "FilterAP"]
|
|
19
|
+
};
|
|
20
|
+
function normalizeName(name) {
|
|
21
|
+
return name.toLowerCase();
|
|
22
|
+
}
|
|
23
|
+
function normalizeAccessMap(accessMap) {
|
|
24
|
+
const result = new Map();
|
|
25
|
+
for (const [scope, models] of Object.entries(accessMap)) {
|
|
26
|
+
result.set(normalizeName(scope), new Set(models.map(normalizeName)));
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
function mergeAccessMaps(base, extra) {
|
|
31
|
+
const merged = { ...base };
|
|
32
|
+
if (!extra) {
|
|
33
|
+
return merged;
|
|
34
|
+
}
|
|
35
|
+
for (const [scope, models] of Object.entries(extra)) {
|
|
36
|
+
merged[scope] = [...(merged[scope] ?? []), ...models];
|
|
37
|
+
}
|
|
38
|
+
return merged;
|
|
39
|
+
}
|
|
40
|
+
export class InternalModelScope {
|
|
41
|
+
getModel;
|
|
42
|
+
scopeName;
|
|
43
|
+
allowedModels;
|
|
44
|
+
constructor(getModel, scopeName, allowedModels) {
|
|
45
|
+
this.getModel = getModel;
|
|
46
|
+
this.scopeName = scopeName;
|
|
47
|
+
this.allowedModels = allowedModels;
|
|
48
|
+
}
|
|
49
|
+
get(modelName) {
|
|
50
|
+
const normalizedModelName = normalizeName(modelName);
|
|
51
|
+
if (!this.allowedModels.has(normalizedModelName)) {
|
|
52
|
+
throw new Error(`Internal model access denied: scope "${this.scopeName}" cannot use model "${modelName}"`);
|
|
53
|
+
}
|
|
54
|
+
const model = this.getModel(modelName);
|
|
55
|
+
if (!model) {
|
|
56
|
+
throw new Error(`Internal model access failed: model "${modelName}" was not found`);
|
|
57
|
+
}
|
|
58
|
+
return createInternalModelRepository(modelName, model);
|
|
59
|
+
}
|
|
60
|
+
has(modelName) {
|
|
61
|
+
return this.allowedModels.has(normalizeName(modelName));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export class InternalModelAccessFactory {
|
|
65
|
+
getModel;
|
|
66
|
+
accessMap;
|
|
67
|
+
constructor(getModel, accessMap) {
|
|
68
|
+
this.getModel = getModel;
|
|
69
|
+
this.accessMap = normalizeAccessMap(mergeAccessMaps(DEFAULT_INTERNAL_MODEL_ACCESS, accessMap));
|
|
70
|
+
}
|
|
71
|
+
scope(scopeName) {
|
|
72
|
+
const normalizedScopeName = normalizeName(scopeName);
|
|
73
|
+
const allowedModels = this.accessMap.get(normalizedScopeName);
|
|
74
|
+
if (!allowedModels) {
|
|
75
|
+
throw new Error(`Internal model access scope "${scopeName}" is not registered`);
|
|
76
|
+
}
|
|
77
|
+
return new InternalModelScope(this.getModel, scopeName, allowedModels);
|
|
78
|
+
}
|
|
79
|
+
canUse(scopeName, modelName) {
|
|
80
|
+
return this.accessMap.get(normalizeName(scopeName))?.has(normalizeName(modelName)) ?? false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { AbstractModel } from "./AbstractModel";
|
|
2
|
+
import { InternalModelAccessMap } from "../../interfaces/internalModelAccess";
|
|
3
|
+
import { InternalModelScope } from "./InternalModelAccessFactory";
|
|
2
4
|
/**
|
|
3
5
|
* Central registry (service locator) for all AbstractModel instances in the application.
|
|
4
6
|
* A single instance is created in Adminizer and shared across the entire app via `req.adminizer.modelHandler`.
|
|
@@ -10,6 +12,7 @@ import { AbstractModel } from "./AbstractModel";
|
|
|
10
12
|
*/
|
|
11
13
|
export declare class ModelHandler {
|
|
12
14
|
private models;
|
|
15
|
+
private internalAccess?;
|
|
13
16
|
add<T>(modelName: string, modelInstance: AbstractModel<T>): void;
|
|
14
17
|
/** Improved model getter, so you can write both model.get("UserAP") and model.get("userap") */
|
|
15
18
|
get model(): {
|
|
@@ -19,6 +22,9 @@ export declare class ModelHandler {
|
|
|
19
22
|
keys: () => MapIterator<string>;
|
|
20
23
|
values: () => MapIterator<AbstractModel<any>>;
|
|
21
24
|
};
|
|
25
|
+
configureInternalAccess(accessMap?: InternalModelAccessMap): void;
|
|
26
|
+
internal(scopeName: string): InternalModelScope;
|
|
27
|
+
private getInternalAccess;
|
|
22
28
|
/**
|
|
23
29
|
* Get all models
|
|
24
30
|
*/
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Adminizer } from "../Adminizer.js";
|
|
2
|
+
import { InternalModelAccessFactory } from "./InternalModelAccessFactory.js";
|
|
2
3
|
/**
|
|
3
4
|
* Central registry (service locator) for all AbstractModel instances in the application.
|
|
4
5
|
* A single instance is created in Adminizer and shared across the entire app via `req.adminizer.modelHandler`.
|
|
@@ -10,6 +11,7 @@ import { Adminizer } from "../Adminizer.js";
|
|
|
10
11
|
*/
|
|
11
12
|
export class ModelHandler {
|
|
12
13
|
models = new Map();
|
|
14
|
+
internalAccess;
|
|
13
15
|
add(modelName, modelInstance) {
|
|
14
16
|
const modelname = modelName.toLowerCase();
|
|
15
17
|
this.models.set(modelname, modelInstance);
|
|
@@ -26,6 +28,18 @@ export class ModelHandler {
|
|
|
26
28
|
values: () => this.models.values(),
|
|
27
29
|
};
|
|
28
30
|
}
|
|
31
|
+
configureInternalAccess(accessMap) {
|
|
32
|
+
this.internalAccess = new InternalModelAccessFactory((modelName) => this.model.get(modelName), accessMap);
|
|
33
|
+
}
|
|
34
|
+
internal(scopeName) {
|
|
35
|
+
return this.getInternalAccess().scope(scopeName);
|
|
36
|
+
}
|
|
37
|
+
getInternalAccess() {
|
|
38
|
+
if (!this.internalAccess) {
|
|
39
|
+
throw new Error("Internal model access is not configured");
|
|
40
|
+
}
|
|
41
|
+
return this.internalAccess;
|
|
42
|
+
}
|
|
29
43
|
/**
|
|
30
44
|
* Get all models
|
|
31
45
|
*/
|
|
@@ -1,26 +1,48 @@
|
|
|
1
1
|
import { Sequelize, ModelStatic } from "sequelize";
|
|
2
|
-
import { AbstractAdapter, AbstractModel, Attribute
|
|
3
|
-
|
|
2
|
+
import { AbstractAdapter, AbstractModel, Attribute } from "../AbstractModel";
|
|
3
|
+
import { QueryCriteria } from "../../../interfaces/queryCriteria";
|
|
4
|
+
export declare function mapSequelizeToAdminizerAttributes(model: ModelStatic<any>): Record<string, Attribute>;
|
|
4
5
|
export declare class SequelizeModel<T> extends AbstractModel<T> {
|
|
5
6
|
private model;
|
|
6
7
|
constructor(modelName: string, model: ModelStatic<any>);
|
|
8
|
+
private _buildJsonContainsCondition;
|
|
7
9
|
_convertCriteriaToSequelize(criteria: any): any;
|
|
8
|
-
|
|
10
|
+
_convertAdminizerCriteriaToSequelizeOptions(criteria: any): {
|
|
9
11
|
where?: any;
|
|
10
12
|
limit?: number;
|
|
11
13
|
offset?: number;
|
|
12
14
|
order?: any[];
|
|
15
|
+
attributes?: string[];
|
|
13
16
|
};
|
|
14
17
|
_assignAssociations(instance: any, assocData: Record<string, any>): Promise<void>;
|
|
15
18
|
protected _create(data: Record<string, any>): Promise<T>;
|
|
16
|
-
protected _findOne(criteria:
|
|
17
|
-
protected _find(criteria?:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
protected _findOne(criteria: QueryCriteria): Promise<T | null>;
|
|
20
|
+
protected _find(criteria?: QueryCriteria): Promise<T[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Public method for raw SQL where clauses (Sequelize.literal support)
|
|
23
|
+
* Bypasses Adminizer criteria conversion for direct Sequelize usage
|
|
24
|
+
*/
|
|
25
|
+
findWithRawWhere(where: any, options?: {
|
|
26
|
+
limit?: number;
|
|
27
|
+
offset?: number;
|
|
28
|
+
order?: any;
|
|
29
|
+
populate?: boolean;
|
|
30
|
+
}): Promise<T[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Public method for count with raw SQL where clauses
|
|
33
|
+
*/
|
|
34
|
+
countWithRawWhere(where: any): Promise<number>;
|
|
35
|
+
protected _updateOne(criteria: QueryCriteria, data: Partial<T>): Promise<T | null>;
|
|
36
|
+
protected _update(criteria: QueryCriteria, data: Partial<T>): Promise<T[]>;
|
|
37
|
+
protected _destroyOne(criteria: QueryCriteria): Promise<T | null>;
|
|
38
|
+
protected _destroy(criteria: QueryCriteria): Promise<T[]>;
|
|
39
|
+
protected _count(criteria?: QueryCriteria): Promise<number>;
|
|
40
|
+
private _hasRelationPathCondition;
|
|
41
|
+
private _extractRelationAliasesFromWhere;
|
|
42
|
+
private _buildListInclude;
|
|
23
43
|
private _buildIncludes;
|
|
44
|
+
private _buildAttributes;
|
|
45
|
+
private _buildCriteriaIncludes;
|
|
24
46
|
}
|
|
25
47
|
export declare class SequelizeAdapter extends AbstractAdapter {
|
|
26
48
|
sequelize: Sequelize;
|