adminizer 4.6.0 → 4.7.0-build.222

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.
Files changed (335) hide show
  1. package/Readme.md +12 -0
  2. package/assets/RelationDialogStack-CnHFOYyR.css +1 -0
  3. package/assets/RelationDialogStack-DI2bZxQX.js +20 -0
  4. package/assets/add-DCQ7ZW4B.js +1 -0
  5. package/assets/add-group-DCVPryBo.js +1 -0
  6. package/assets/add-group-form-DKRXC2n-.js +1 -0
  7. package/assets/add-user-B7OOiYxv.js +1 -0
  8. package/assets/add-user-form-UXAToWQd.js +1 -0
  9. package/assets/app-AKbNCggP.css +1 -0
  10. package/assets/app-layout-6EwNBvnR.js +1 -0
  11. package/assets/app-shell-D8wtkECO.js +1 -0
  12. package/assets/app-sidebar-DfGjL-2K.js +1 -0
  13. package/assets/app-sidebar-header-BZbIBQjq.js +1 -0
  14. package/assets/app.js +59 -7990
  15. package/assets/breadcrumbs-CODaqVkB.js +1 -0
  16. package/assets/catalog-DVvFGa2X.js +6 -0
  17. package/assets/dashboard-BadoiH_a.js +3 -0
  18. package/assets/date-picker-DSOkNiNo.js +1 -0
  19. package/assets/del-modal-Cd4M7af8.js +1 -0
  20. package/assets/dynamic-controls-BsrJhPDY.js +1 -0
  21. package/assets/geo-json-CzR5JBXL.js +1 -0
  22. package/assets/handsontable-BI98OF5R.js +336 -0
  23. package/assets/history-D1iLA6rs.js +1 -0
  24. package/assets/home-DbWj-W_k.js +2 -0
  25. package/assets/icon-C2JNaLxH.js +1 -0
  26. package/assets/init-user-D2HSyXup.js +1 -0
  27. package/assets/input-error-CH2caTtO.js +1 -0
  28. package/assets/jsoneditor-DVNQmA6G.js +3869 -0
  29. package/assets/list-CVoljVUw.js +4 -0
  30. package/assets/login-DFSLEO17.js +1 -0
  31. package/assets/manifest.json +246 -273
  32. package/assets/material-icon-Bx9pGQiQ.js +1 -0
  33. package/assets/media-manager-WcKe1EvD.js +6 -0
  34. package/assets/module-DJsC37CM.js +1 -0
  35. package/assets/monaco-Bl4zdWCn.js +11 -0
  36. package/assets/nav-footer-BiSQkPt4.js +1 -0
  37. package/assets/nav-main-rTH0PfDw.js +1 -0
  38. package/assets/nav-user-Bj6cWs0a.js +1 -0
  39. package/assets/notification-DKrNfaAB.js +20 -0
  40. package/assets/pagination-render-AKJvTIRA.js +1 -0
  41. package/assets/register-BTP4uxsK.js +1 -0
  42. package/assets/ru-eW0WKkga.js +1 -0
  43. package/assets/theme-switcher-Dm8EOGzx.js +1 -0
  44. package/assets/toast-editor-DOg_gvSp.js +668 -0
  45. package/assets/user-filters-list-C9R9J6Om.js +1 -0
  46. package/assets/user-info-BgSbT02v.js +1 -0
  47. package/assets/user-menu-content-TQTXHIv6.js +1 -0
  48. package/assets/{vanilla-picker-l5rcX3cq.js → vanilla-picker-B3LgXoKV.js} +1 -7
  49. package/assets/welcome-BwDlAOGh.js +1 -0
  50. package/controllers/add.d.ts +1 -1
  51. package/controllers/add.js +20 -26
  52. package/controllers/addGroup.d.ts +1 -1
  53. package/controllers/addGroup.js +7 -15
  54. package/controllers/addUser.d.ts +1 -1
  55. package/controllers/addUser.js +10 -16
  56. package/controllers/catalog/Catalog.d.ts +1 -1
  57. package/controllers/catalog/Catalog.js +1 -10
  58. package/controllers/catalog/FrontendCatalogAdapter.d.ts +3 -3
  59. package/controllers/catalog/FrontendCatalogAdapter.js +0 -6
  60. package/controllers/catalog/FrontentCatalogAdapter.d.ts +3 -3
  61. package/controllers/catalog/FrontentCatalogAdapter.js +0 -4
  62. package/controllers/ckeditorUpload.js +2 -18
  63. package/controllers/dashboard.d.ts +1 -1
  64. package/controllers/dashboard.js +2 -5
  65. package/controllers/edit.js +24 -37
  66. package/controllers/editGroup.d.ts +1 -1
  67. package/controllers/editGroup.js +10 -21
  68. package/controllers/editUser.d.ts +1 -1
  69. package/controllers/editUser.js +11 -23
  70. package/controllers/exportData.d.ts +6 -0
  71. package/controllers/exportData.js +315 -0
  72. package/controllers/feed.d.ts +6 -0
  73. package/controllers/feed.js +73 -0
  74. package/controllers/feedback/feedbackController.d.ts +1 -1
  75. package/controllers/feedback/feedbackController.js +5 -7
  76. package/controllers/filter-fields/columns.d.ts +11 -0
  77. package/controllers/filter-fields/columns.js +106 -0
  78. package/controllers/filter-fields/filterFields.d.ts +10 -0
  79. package/controllers/filter-fields/filterFields.js +141 -0
  80. package/controllers/filter-fields/getAllUserFilters.d.ts +6 -0
  81. package/controllers/filter-fields/getAllUserFilters.js +115 -0
  82. package/controllers/filter-fields/groups.d.ts +5 -0
  83. package/controllers/filter-fields/groups.js +26 -0
  84. package/controllers/filter-fields/savedFilters.d.ts +25 -0
  85. package/controllers/filter-fields/savedFilters.js +317 -0
  86. package/controllers/getAllWidgets.d.ts +1 -1
  87. package/controllers/getAllWidgets.js +1 -9
  88. package/controllers/history-actions/HistoryController.js +6 -31
  89. package/controllers/initUser.js +6 -5
  90. package/controllers/inlineUpdate.d.ts +7 -0
  91. package/controllers/inlineUpdate.js +148 -0
  92. package/controllers/list.d.ts +1 -1
  93. package/controllers/list.js +383 -70
  94. package/controllers/listUserFilters.d.ts +5 -0
  95. package/controllers/listUserFilters.js +26 -0
  96. package/controllers/login.js +2 -2
  97. package/controllers/media-manager/mediaManagerApi.js +0 -9
  98. package/controllers/navigation/edit.js +3 -9
  99. package/controllers/notifications/NotificationController.d.ts +1 -1
  100. package/controllers/notifications/NotificationController.js +12 -36
  101. package/controllers/register.js +10 -9
  102. package/controllers/remove.js +10 -19
  103. package/controllers/timezones.d.ts +1 -1
  104. package/controllers/timezones.js +0 -6
  105. package/controllers/userApiKey.d.ts +7 -0
  106. package/controllers/userApiKey.js +36 -0
  107. package/controllers/view.js +14 -26
  108. package/controllers/welcome.d.ts +1 -1
  109. package/controllers/welcome.js +0 -4
  110. package/controllers/widgets/Action.d.ts +1 -1
  111. package/controllers/widgets/Action.js +1 -9
  112. package/controllers/widgets/Custom.d.ts +1 -1
  113. package/controllers/widgets/Custom.js +1 -9
  114. package/controllers/widgets/Info.d.ts +1 -1
  115. package/controllers/widgets/Info.js +1 -9
  116. package/controllers/widgets/filterInfo.d.ts +1 -0
  117. package/controllers/widgets/filterInfo.js +44 -0
  118. package/controllers/widgets/switch.d.ts +1 -1
  119. package/controllers/widgets/switch.js +1 -9
  120. package/controllers/widgetsDB.d.ts +1 -1
  121. package/controllers/widgetsDB.js +2 -8
  122. package/helpers/accessRightsHelper.d.ts +1 -1
  123. package/helpers/accessRightsHelper.js +5 -4
  124. package/helpers/apiKeyHelper.d.ts +5 -0
  125. package/helpers/apiKeyHelper.js +8 -0
  126. package/helpers/configHelper.js +12 -15
  127. package/helpers/controllerHelper.d.ts +14 -21
  128. package/helpers/controllerHelper.js +50 -83
  129. package/helpers/fieldsHelper.js +3 -3
  130. package/helpers/filterDatetimeHelper.d.ts +5 -0
  131. package/helpers/filterDatetimeHelper.js +84 -0
  132. package/helpers/inertiaActionsHelper.d.ts +2 -2
  133. package/helpers/inertiaActionsHelper.js +5 -4
  134. package/helpers/inertiaAddHelper.d.ts +3 -414
  135. package/helpers/inertiaAddHelper.js +39 -15
  136. package/helpers/inertiaGroupHelper.d.ts +2 -2
  137. package/helpers/inertiaGroupHelper.js +3 -3
  138. package/helpers/inertiaListHelper.d.ts +7 -3
  139. package/helpers/inertiaListHelper.js +26 -12
  140. package/helpers/inertiaMenuHelper.d.ts +1 -0
  141. package/helpers/inertiaMenuHelper.js +15 -3
  142. package/helpers/inertiaUserHelper.d.ts +3 -2
  143. package/helpers/inertiaUserHelper.js +7 -3
  144. package/helpers/menuHelper.d.ts +5 -2
  145. package/helpers/menuHelper.js +64 -12
  146. package/helpers/viteHelper.js +1 -2
  147. package/index.d.ts +6 -2
  148. package/index.js +6 -2
  149. package/interfaces/adminpanelConfig.d.ts +126 -39
  150. package/interfaces/internalModelAccess.d.ts +37 -0
  151. package/interfaces/internalModelAccess.js +1 -0
  152. package/interfaces/listQueryBuilder.d.ts +22 -0
  153. package/interfaces/listQueryBuilder.js +1 -0
  154. package/interfaces/queryCriteria.d.ts +54 -0
  155. package/interfaces/queryCriteria.js +1 -0
  156. package/interfaces/types.d.ts +1 -13
  157. package/lib/Adminizer.d.ts +4 -2
  158. package/lib/Adminizer.js +29 -10
  159. package/lib/DataAccessor.d.ts +8 -5
  160. package/lib/DataAccessor.js +89 -42
  161. package/lib/I18n.d.ts +5 -1
  162. package/lib/I18n.js +45 -19
  163. package/lib/MiddlewareManager.d.ts +8 -0
  164. package/lib/MiddlewareManager.js +53 -0
  165. package/lib/ai-assistant/OpenAiModelService.d.ts +3 -3
  166. package/lib/ai-assistant/OpenAiModelService.js +23 -24
  167. package/lib/catalog/Navigation.d.ts +1 -0
  168. package/lib/catalog/Navigation.js +12 -11
  169. package/lib/controls/jsoneditor/JsonEditor.d.ts +1 -2
  170. package/lib/controls/markdown/ToastUiEditor.d.ts +1 -2
  171. package/lib/feedback/FeedbackHandler.js +2 -2
  172. package/lib/filters/ConditionValidator.d.ts +107 -0
  173. package/lib/filters/ConditionValidator.js +483 -0
  174. package/lib/filters/CustomFilterHandler.d.ts +122 -0
  175. package/lib/filters/CustomFilterHandler.js +131 -0
  176. package/lib/filters/FilterCustomFieldHandler.d.ts +2 -0
  177. package/lib/filters/FilterCustomFieldHandler.js +2 -0
  178. package/lib/filters/FilterService.d.ts +82 -0
  179. package/lib/filters/FilterService.js +323 -0
  180. package/lib/filters/index.d.ts +6 -0
  181. package/lib/filters/index.js +4 -0
  182. package/lib/history-actions/AbstractHistoryAdapter.d.ts +5 -4
  183. package/lib/history-actions/AbstractHistoryAdapter.js +45 -30
  184. package/lib/history-actions/DefaultHistoryAdapter.d.ts +2 -0
  185. package/lib/history-actions/DefaultHistoryAdapter.js +12 -6
  186. package/lib/history-actions/HistoryHandler.js +1 -1
  187. package/lib/list-query-builder/ListQueryBuilder.d.ts +117 -0
  188. package/lib/list-query-builder/ListQueryBuilder.js +707 -0
  189. package/lib/media-manager/AbstractMediaManager.d.ts +9 -8
  190. package/lib/media-manager/DefaultMediaManager.d.ts +2 -0
  191. package/lib/media-manager/DefaultMediaManager.js +27 -15
  192. package/lib/media-manager/Items.d.ts +4 -1
  193. package/lib/media-manager/Items.js +62 -59
  194. package/lib/media-manager/MediaManagerHandler.js +1 -1
  195. package/lib/media-manager/helpers/MediaManagerHelper.d.ts +5 -1
  196. package/lib/media-manager/helpers/MediaManagerHelper.js +38 -4
  197. package/lib/model/AbstractModel.d.ts +33 -25
  198. package/lib/model/AbstractModel.js +54 -2
  199. package/lib/model/InternalModelAccessFactory.d.ts +18 -0
  200. package/lib/model/InternalModelAccessFactory.js +82 -0
  201. package/lib/model/ModelHandler.d.ts +6 -0
  202. package/lib/model/ModelHandler.js +14 -0
  203. package/lib/model/adapter/sequelize.d.ts +32 -10
  204. package/lib/model/adapter/sequelize.js +409 -62
  205. package/lib/model/adapter/typeorm.d.ts +62 -0
  206. package/lib/model/adapter/typeorm.js +777 -0
  207. package/lib/model/internalModelAccessToken.d.ts +1 -0
  208. package/lib/model/internalModelAccessToken.js +1 -0
  209. package/lib/model/internalModelRepository.d.ts +3 -0
  210. package/lib/model/internalModelRepository.js +4 -0
  211. package/lib/notifications/AbstractNotificationService.d.ts +3 -0
  212. package/lib/notifications/AbstractNotificationService.js +42 -36
  213. package/lib/notifications/GeneralNotificationService.js +37 -40
  214. package/lib/notifications/SystemNotificationService.js +33 -36
  215. package/lib/requestProcessor.js +0 -3
  216. package/lib/ui-i18n/getUiTranslations.d.ts +1 -0
  217. package/lib/ui-i18n/getUiTranslations.js +3 -0
  218. package/lib/ui-i18n/uiTranslationKeys.d.ts +6 -0
  219. package/lib/ui-i18n/uiTranslationKeys.js +268 -0
  220. package/lib/widgets/widgetHandler.d.ts +7 -2
  221. package/lib/widgets/widgetHandler.js +98 -18
  222. package/models/FilterAP.d.ts +116 -0
  223. package/models/FilterAP.js +68 -0
  224. package/models/FilterColumnAP.d.ts +32 -0
  225. package/models/FilterColumnAP.js +21 -0
  226. package/models/GroupAP.d.ts +1 -1
  227. package/models/HistoryActionsAP.d.ts +3 -3
  228. package/models/MediaManagerMetaAP.d.ts +1 -1
  229. package/models/NavigationAP.d.ts +1 -1
  230. package/models/UserAP.d.ts +6 -1
  231. package/models/UserAP.js +4 -0
  232. package/package.json +39 -32
  233. package/policies/authPolicies.d.ts +12 -0
  234. package/policies/authPolicies.js +104 -0
  235. package/policies/permissionResolvers.d.ts +12 -0
  236. package/policies/permissionResolvers.js +52 -0
  237. package/services/FeedService.d.ts +70 -0
  238. package/services/FeedService.js +334 -0
  239. package/system/Router.d.ts +1 -0
  240. package/system/Router.js +136 -59
  241. package/system/bindAccessRights.js +11 -30
  242. package/system/bindAuthorization.js +18 -18
  243. package/system/bindCors.js +16 -1
  244. package/system/bindCustomFilterHandlers.d.ts +2 -0
  245. package/system/bindCustomFilterHandlers.js +4 -0
  246. package/system/bindInertia.js +18 -61
  247. package/system/bindReqFunctions.js +10 -2
  248. package/system/bindTranslations.js +7 -3
  249. package/system/buildInternalModelAccess.d.ts +4 -0
  250. package/system/buildInternalModelAccess.js +59 -0
  251. package/system/defaults.js +18 -14
  252. package/system/routePolicies.d.ts +2 -0
  253. package/system/routePolicies.js +29 -0
  254. package/translations/en.json +151 -39
  255. package/translations/ru.json +211 -64
  256. package/ui/components/handsontable.js +13 -27
  257. package/ui/components/ui/dialog-stack.js +1 -3
  258. package/ui/components/ui/popover.js +1 -1
  259. package/ui/components/ui/sidebar.js +1 -1
  260. package/assets/RelationDialogStack-D9UVEF9s.js +0 -407
  261. package/assets/RelationDialogStack-DV8OITPR.css +0 -4
  262. package/assets/add-BlvzWQKF.js +0 -1
  263. package/assets/add-group-1Uoq9NWe.js +0 -1
  264. package/assets/add-group-form-B01gwDGu.js +0 -1
  265. package/assets/add-user-BQCAsaRy.js +0 -1
  266. package/assets/add-user-form-Cgwc9JkI.js +0 -1
  267. package/assets/app-DaOMy1nl.css +0 -72
  268. package/assets/app-layout-CAm60qoE.js +0 -1
  269. package/assets/app-shell-QWCtn9ye.js +0 -1
  270. package/assets/app-sidebar-CfaYbnSy.js +0 -1
  271. package/assets/app-sidebar-header-BsPFDhZ8.js +0 -1
  272. package/assets/breadcrumbs-CZZirDj8.js +0 -1
  273. package/assets/catalog-k5myk7fk.js +0 -6
  274. package/assets/dashboard-BkL9ybBw.js +0 -3
  275. package/assets/date-picker-B5AZ_7Q9.js +0 -1
  276. package/assets/del-modal-BoyXZloG.js +0 -1
  277. package/assets/dynamic-controls-k61T9W2P.js +0 -1
  278. package/assets/form-1WGY0YgG.js +0 -1
  279. package/assets/form-DJapG3qF.js +0 -1
  280. package/assets/geo-json-DsMUHo0l.js +0 -4
  281. package/assets/handsontable-PxYdjN8c.js +0 -298
  282. package/assets/history-CluyR-yJ.js +0 -1
  283. package/assets/home-Dug9zBzM.js +0 -2
  284. package/assets/icon-DfDLMG5f.js +0 -1
  285. package/assets/init-user-CF80MEnT.js +0 -1
  286. package/assets/input-error-DuuqFgZa.js +0 -1
  287. package/assets/jsoneditor-De1FvcYu.js +0 -3882
  288. package/assets/list-CuexshNt.js +0 -1
  289. package/assets/list-table-BsEWjTKY.js +0 -22
  290. package/assets/login-eDemYzN-.js +0 -1
  291. package/assets/material-icon-DMT8KdmE.js +0 -1
  292. package/assets/media-manager-DfYa_mT_.js +0 -14
  293. package/assets/module-Cd4Tm6uq.js +0 -1
  294. package/assets/monaco-BhBYtg3d.js +0 -11
  295. package/assets/nav-footer-D3olYxtz.js +0 -1
  296. package/assets/nav-main-BctqyzeV.js +0 -1
  297. package/assets/nav-user-Bn1Lt-BZ.js +0 -1
  298. package/assets/notification-D64qvni-.js +0 -27
  299. package/assets/pagination-render-DxD78ahJ.js +0 -1
  300. package/assets/register-349PwYbe.js +0 -1
  301. package/assets/theme-switcher-DfExsHW2.js +0 -1
  302. package/assets/toast-editor-ESK5iWPx.js +0 -845
  303. package/assets/user-info-DtBK5Kh8.js +0 -1
  304. package/assets/user-menu-content-0XYOCMaA.js +0 -1
  305. package/assets/welcome-PDp-gUei.js +0 -1
  306. package/controllers/form.d.ts +0 -1
  307. package/controllers/form.js +0 -86
  308. package/helpers/formHelper.d.ts +0 -6
  309. package/helpers/formHelper.js +0 -38
  310. package/helpers/inertiaFromHelper.d.ts +0 -11
  311. package/helpers/inertiaFromHelper.js +0 -98
  312. package/helpers/runtimeMode.d.ts +0 -1
  313. package/helpers/runtimeMode.js +0 -3
  314. package/lib/PolicyManager.d.ts +0 -8
  315. package/lib/PolicyManager.js +0 -53
  316. package/lib/datatable/NodeTable.d.ts +0 -49
  317. package/lib/datatable/NodeTable.js +0 -207
  318. package/lib/model/adapter/waterline.d.ts +0 -32
  319. package/lib/model/adapter/waterline.js +0 -180
  320. package/migrations/index.d.ts +0 -3
  321. package/migrations/index.js +0 -4
  322. package/migrations/knex/20250106000001_adminizer_init.d.ts +0 -8
  323. package/migrations/knex/20250106000001_adminizer_init.js +0 -164
  324. package/migrations/umzug/0001.d.ts +0 -7
  325. package/migrations/umzug/0001.js +0 -121
  326. package/migrations/umzugExports.d.ts +0 -2
  327. package/migrations/umzugExports.js +0 -9
  328. package/system/bindForms.d.ts +0 -2
  329. package/system/bindForms.js +0 -20
  330. /package/{policies → middlewares}/addMessages.d.ts +0 -0
  331. /package/{policies → middlewares}/addMessages.js +0 -0
  332. /package/{policies → middlewares}/checkAuth.d.ts +0 -0
  333. /package/{policies → middlewares}/checkAuth.js +0 -0
  334. /package/{policies → middlewares}/setLocale.d.ts +0 -0
  335. /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.entity.name.toLocaleLowerCase(),
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, FindOptions } from "../AbstractModel";
3
- export declare function mapSequelizeToWaterline(model: ModelStatic<any>): Record<string, Attribute>;
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
- _convertWaterlineCriteriaToSequelizeOptions(criteria: any): {
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: Partial<T>): Promise<T | null>;
17
- protected _find(criteria?: Partial<T>, options?: FindOptions): Promise<T[]>;
18
- protected _updateOne(criteria: Partial<T>, data: Partial<T>): Promise<T | null>;
19
- protected _update(criteria: Partial<T>, data: Partial<T>): Promise<T[]>;
20
- protected _destroyOne(criteria: Partial<T>): Promise<T | null>;
21
- protected _destroy(criteria: Partial<T>): Promise<T[]>;
22
- protected _count(criteria?: Partial<T>): Promise<number>;
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;