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.
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-4213XScp.js +1 -0
  5. package/assets/add-group--F1XxfJ1.js +1 -0
  6. package/assets/add-group-form-DKRXC2n-.js +1 -0
  7. package/assets/add-user-b9HfMq7z.js +1 -0
  8. package/assets/add-user-form-UXAToWQd.js +1 -0
  9. package/assets/app-Clx8f5hd.css +1 -0
  10. package/assets/app-layout-C02ja4OI.js +1 -0
  11. package/assets/app-shell-D8wtkECO.js +1 -0
  12. package/assets/app-sidebar-BR5_zwxj.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-6ZZjWdFs.js +6 -0
  17. package/assets/dashboard-CftAdKiH.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-DLHSU7Ak.js +1 -0
  24. package/assets/home-NcQ7nnU0.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-CFU0-TgN.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-CT7PC6pc.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-Bi-PX87D.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-YUfR4XMI.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-vLwTu1R6.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,8 +1,9 @@
1
1
  import { Adminizer } from '../../lib/Adminizer.js';
2
- import { redirectToLogin } from '../../helpers/inertiaAutHelper.js';
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.checkNotifPermission(req, res))
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
- const isUiRequest = req.method.toUpperCase() === 'GET';
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.checkNotifPermission(req, res))
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.checkNotifPermission(req, res))
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.checkNotifPermission(req, res))
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.checkNotifPermission(req, res))
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.checkNotifPermission(req, res))
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.checkNotifPermission(req, res))
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 checkNotifPermission(req, res, shouldRedirectToLogin = false) {
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
  }
@@ -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
- // TODO refactor CRUD functions for DataAccessor usage
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
- // TODO refactor CRUD functions for DataAccessor usage
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
- // TODO refactor CRUD functions for DataAccessor usage
53
- let defaultUserGroup = await req.adminizer.modelHandler.model.get("GroupAP")["_findOne"]({ name: req.adminizer.config.registration.defaultUserGroup });
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}`);
@@ -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 entity = ControllerHelper.findEntityObject(req);
14
- if (!entity.model) {
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 (!entity.config.remove) {
19
- return res.redirect(`${req.adminizer.config.routePrefix}/${entity.uri}`);
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, entity, "remove");
36
- record = await entity.model.findOne({ id: req.params.id }, dataAccessor);
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 = entity.config.identifierField ?? req.adminizer.config.identifierField;
51
+ const fieldId = modelResource.config.identifierField ?? req.adminizer.config.identifierField;
61
52
  const q = {};
62
53
  q[fieldId] = record[fieldId];
63
- destroyedRecord = await entity.model.destroy(q, dataAccessor);
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, entity.name, destroyedRecord);
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 ? `${entity.uri}${referTo}` : `${entity.uri}`;
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<void | ResType>;
1
+ export default function timezones(req: ReqType, res: ResType): Promise<ResType>;
@@ -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
+ }
@@ -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 entity = ControllerHelper.findEntityObject(req);
16
- if (!entity.config.view) {
17
- return res.redirect(`${req.adminizer.config.routePrefix}/${entity.uri}`);
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 (!entity.model) {
18
+ if (!modelResource.model) {
20
19
  return res.status(404).send({ error: 'Not Found' });
21
20
  }
22
- if (req.adminizer.config.auth.enable) {
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 entity.model.findOne({ id: req.params.id }, dataAccessor);
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 (entity.config.model) {
32
+ switch (modelResource.config.model) {
42
33
  case 'userap':
43
34
  let groups;
44
35
  try {
45
- // TODO refactor CRUD functions for DataAccessor usage
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(entity, req, groups, record, true);
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
- // TODO refactor CRUD functions for DataAccessor usage
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
- // TODO refactor CRUD functions for DataAccessor usage
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(entity, req, users, groupedTokens, group, true);
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: entity.model.modelname,
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, entity, fields, record, true);
86
+ const props = inertiaAddHelper(req, modelResource, fields, record, true);
99
87
  return req.Inertia.render({
100
88
  component: 'add',
101
89
  props: props
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Welcome text
3
3
  */
4
- export default function welcome(req: ReqType, res: ResType): void | Promise<import("express").Response<any, Record<string, any>>>;
4
+ export default function welcome(req: ReqType, res: ResType): Promise<import("express").Response<any, Record<string, any>>>;
@@ -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<void | ResType>;
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<void | ResType>;
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<void | ResType>;
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<void | ResType>;
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<void | ResType>;
1
+ export default function widgetsDB(req: ReqType, res: ResType): Promise<ResType>;
@@ -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 (auth) {
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 false;
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 no tokenId: ${tokenId}`);
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);