@open-mercato/core 0.4.2-canary-3b5064ce72 → 0.4.2-canary-15e78de280

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 (512) hide show
  1. package/dist/generated/entities/api_key/index.js +2 -0
  2. package/dist/generated/entities/api_key/index.js.map +2 -2
  3. package/dist/generated/entities.ids.generated.js +1 -5
  4. package/dist/generated/entities.ids.generated.js.map +2 -2
  5. package/dist/generated/entity-fields-registry.js +0 -2
  6. package/dist/generated/entity-fields-registry.js.map +2 -2
  7. package/dist/modules/api_docs/frontend/docs/api/page.js +2 -3
  8. package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
  9. package/dist/modules/api_keys/backend/api-keys/page.js +1 -1
  10. package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
  11. package/dist/modules/api_keys/data/entities.js +3 -0
  12. package/dist/modules/api_keys/data/entities.js.map +2 -2
  13. package/dist/modules/api_keys/migrations/Migration20260125204102.js +13 -0
  14. package/dist/modules/api_keys/migrations/Migration20260125204102.js.map +7 -0
  15. package/dist/modules/api_keys/services/apiKeyService.js +41 -0
  16. package/dist/modules/api_keys/services/apiKeyService.js.map +3 -3
  17. package/dist/modules/attachments/components/AttachmentLibrary.js +0 -4
  18. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  19. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +0 -2
  20. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
  21. package/dist/modules/auth/api/admin/nav.js +3 -4
  22. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  23. package/dist/modules/auth/api/login.js +6 -25
  24. package/dist/modules/auth/api/login.js.map +2 -2
  25. package/dist/modules/auth/api/reset/confirm.js +2 -25
  26. package/dist/modules/auth/api/reset/confirm.js.map +2 -2
  27. package/dist/modules/auth/api/reset.js +0 -23
  28. package/dist/modules/auth/api/reset.js.map +2 -2
  29. package/dist/modules/auth/api/sidebar/preferences/route.js +9 -14
  30. package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
  31. package/dist/modules/auth/api/users/route.js +2 -4
  32. package/dist/modules/auth/api/users/route.js.map +2 -2
  33. package/dist/modules/auth/backend/roles/[id]/edit/page.js +1 -4
  34. package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
  35. package/dist/modules/auth/backend/roles/page.js +3 -3
  36. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  37. package/dist/modules/auth/backend/users/[id]/edit/page.js +3 -18
  38. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  39. package/dist/modules/auth/backend/users/create/page.js +2 -15
  40. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  41. package/dist/modules/auth/backend/users/page.js +3 -3
  42. package/dist/modules/auth/backend/users/page.js.map +2 -2
  43. package/dist/modules/auth/cli.js +11 -25
  44. package/dist/modules/auth/cli.js.map +2 -2
  45. package/dist/modules/auth/commands/users.js +2 -59
  46. package/dist/modules/auth/commands/users.js.map +2 -2
  47. package/dist/modules/auth/data/validators.js +3 -6
  48. package/dist/modules/auth/data/validators.js.map +2 -2
  49. package/dist/modules/auth/frontend/login.js +3 -112
  50. package/dist/modules/auth/frontend/login.js.map +2 -2
  51. package/dist/modules/auth/frontend/reset/[token]/page.js +10 -20
  52. package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
  53. package/dist/modules/auth/lib/setup-app.js +8 -42
  54. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  55. package/dist/modules/auth/services/authService.js +3 -24
  56. package/dist/modules/auth/services/authService.js.map +2 -2
  57. package/dist/modules/auth/services/rbacService.js.map +2 -2
  58. package/dist/modules/business_rules/api/execute/route.js +1 -7
  59. package/dist/modules/business_rules/api/execute/route.js.map +2 -2
  60. package/dist/modules/business_rules/backend/rules/page.js +0 -4
  61. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  62. package/dist/modules/business_rules/backend/sets/page.js +0 -3
  63. package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
  64. package/dist/modules/business_rules/cli.js +1 -2
  65. package/dist/modules/business_rules/cli.js.map +2 -2
  66. package/dist/modules/business_rules/lib/rule-engine.js +3 -33
  67. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  68. package/dist/modules/catalog/components/PriceKindSettings.js +0 -2
  69. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  70. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
  71. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  72. package/dist/modules/catalog/components/products/ProductsDataTable.js +0 -2
  73. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  74. package/dist/modules/configs/cli.js +0 -6
  75. package/dist/modules/configs/cli.js.map +2 -2
  76. package/dist/modules/configs/components/CachePanel.js +4 -4
  77. package/dist/modules/configs/components/CachePanel.js.map +2 -2
  78. package/dist/modules/configs/lib/system-status.js +1 -48
  79. package/dist/modules/configs/lib/system-status.js.map +2 -2
  80. package/dist/modules/configs/lib/upgrade-actions.js +0 -18
  81. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  82. package/dist/modules/currencies/backend/currencies/page.js +0 -3
  83. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  84. package/dist/modules/currencies/backend/exchange-rates/page.js +0 -2
  85. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  86. package/dist/modules/customers/backend/customers/companies/page.js +0 -3
  87. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  88. package/dist/modules/customers/backend/customers/deals/page.js +0 -3
  89. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  90. package/dist/modules/customers/backend/customers/people/page.js +0 -3
  91. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  92. package/dist/modules/customers/commands/deals.js +0 -31
  93. package/dist/modules/customers/commands/deals.js.map +2 -2
  94. package/dist/modules/customers/components/CustomerTodosTable.js +0 -1
  95. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  96. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js +1 -2
  97. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js.map +2 -2
  98. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js +1 -2
  99. package/dist/modules/customers/widgets/dashboard/new-customers/widget.js.map +2 -2
  100. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js +1 -2
  101. package/dist/modules/customers/widgets/dashboard/new-deals/widget.js.map +2 -2
  102. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js +1 -2
  103. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js.map +2 -2
  104. package/dist/modules/dashboards/cli.js +5 -44
  105. package/dist/modules/dashboards/cli.js.map +2 -2
  106. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +11 -16
  107. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +3 -3
  108. package/dist/modules/dashboards/services/widgetDataService.js +3 -139
  109. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  110. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js +1 -2
  111. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js.map +2 -2
  112. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js +1 -2
  113. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js.map +2 -2
  114. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js +1 -2
  115. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js.map +2 -2
  116. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js +1 -2
  117. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js.map +2 -2
  118. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +1 -2
  119. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +2 -2
  120. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js +1 -2
  121. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js.map +2 -2
  122. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js +1 -2
  123. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js.map +2 -2
  124. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js +1 -2
  125. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js.map +2 -2
  126. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js +1 -2
  127. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js.map +2 -2
  128. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js +1 -2
  129. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js.map +2 -2
  130. package/dist/modules/dictionaries/components/DictionaryTable.js +0 -2
  131. package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
  132. package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
  133. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  134. package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
  135. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  136. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
  137. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  138. package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
  139. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  140. package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
  141. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  142. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
  143. package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
  144. package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
  145. package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
  146. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
  147. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  148. package/dist/modules/query_index/cli.js +7 -63
  149. package/dist/modules/query_index/cli.js.map +2 -2
  150. package/dist/modules/query_index/components/QueryIndexesTable.js +1 -7
  151. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  152. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
  153. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  154. package/dist/modules/resources/backend/resources/resources/page.js +2 -2
  155. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  156. package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -2
  157. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  158. package/dist/modules/sales/backend/sales/channels/page.js +0 -2
  159. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  160. package/dist/modules/sales/commands/documents.js +0 -53
  161. package/dist/modules/sales/commands/documents.js.map +2 -2
  162. package/dist/modules/sales/commands/payments.js +0 -26
  163. package/dist/modules/sales/commands/payments.js.map +2 -2
  164. package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
  165. package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
  166. package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
  167. package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
  168. package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
  169. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
  170. package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
  171. package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
  172. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -2
  173. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  174. package/dist/modules/sales/components/documents/AdjustmentsSection.js +0 -2
  175. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  176. package/dist/modules/sales/components/documents/PaymentsSection.js +1 -2
  177. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  178. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +0 -2
  179. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  180. package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
  181. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  182. package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
  183. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  184. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
  185. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  186. package/dist/modules/staff/backend/staff/teams/page.js +2 -2
  187. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  188. package/dist/modules/staff/commands/leave-requests.js +0 -79
  189. package/dist/modules/staff/commands/leave-requests.js.map +2 -2
  190. package/dist/modules/workflows/backend/definitions/page.js +0 -5
  191. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  192. package/dist/modules/workflows/backend/instances/page.js +0 -3
  193. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  194. package/dist/modules/workflows/backend/tasks/page.js +0 -3
  195. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  196. package/dist/modules/workflows/cli.js +12 -12
  197. package/dist/modules/workflows/cli.js.map +2 -2
  198. package/dist/modules/workflows/lib/transition-handler.js +6 -14
  199. package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
  200. package/generated/entities/api_key/index.ts +1 -0
  201. package/generated/entities.ids.generated.ts +1 -5
  202. package/generated/entity-fields-registry.ts +0 -2
  203. package/package.json +2 -2
  204. package/src/modules/api_docs/frontend/docs/api/page.tsx +2 -3
  205. package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
  206. package/src/modules/api_keys/data/entities.ts +4 -0
  207. package/src/modules/api_keys/migrations/.snapshot-open-mercato.json +9 -0
  208. package/src/modules/api_keys/migrations/Migration20260125204102.ts +13 -0
  209. package/src/modules/api_keys/services/apiKeyService.ts +85 -0
  210. package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -4
  211. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +0 -2
  212. package/src/modules/auth/README.md +1 -1
  213. package/src/modules/auth/__tests__/cli-setup-acl.test.ts +1 -1
  214. package/src/modules/auth/api/__tests__/login.test.ts +0 -2
  215. package/src/modules/auth/api/admin/nav.ts +6 -10
  216. package/src/modules/auth/api/login.ts +7 -26
  217. package/src/modules/auth/api/reset/confirm.ts +2 -25
  218. package/src/modules/auth/api/reset.ts +0 -23
  219. package/src/modules/auth/api/sidebar/preferences/route.ts +12 -21
  220. package/src/modules/auth/api/users/route.ts +2 -5
  221. package/src/modules/auth/backend/roles/[id]/edit/page.tsx +1 -4
  222. package/src/modules/auth/backend/roles/page.tsx +3 -3
  223. package/src/modules/auth/backend/users/[id]/edit/page.tsx +3 -22
  224. package/src/modules/auth/backend/users/create/page.tsx +2 -19
  225. package/src/modules/auth/backend/users/page.tsx +3 -3
  226. package/src/modules/auth/cli.ts +11 -38
  227. package/src/modules/auth/commands/users.ts +2 -73
  228. package/src/modules/auth/data/validators.ts +2 -6
  229. package/src/modules/auth/frontend/login.tsx +5 -134
  230. package/src/modules/auth/frontend/reset/[token]/page.tsx +11 -24
  231. package/src/modules/auth/i18n/de.json +1 -48
  232. package/src/modules/auth/i18n/en.json +1 -48
  233. package/src/modules/auth/i18n/es.json +1 -48
  234. package/src/modules/auth/i18n/pl.json +1 -48
  235. package/src/modules/auth/lib/setup-app.ts +9 -58
  236. package/src/modules/auth/services/authService.ts +4 -27
  237. package/src/modules/auth/services/rbacService.ts +1 -1
  238. package/src/modules/business_rules/api/execute/route.ts +1 -8
  239. package/src/modules/business_rules/backend/rules/page.tsx +0 -4
  240. package/src/modules/business_rules/backend/sets/page.tsx +0 -3
  241. package/src/modules/business_rules/cli.ts +1 -2
  242. package/src/modules/business_rules/i18n/en.json +1 -3
  243. package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +0 -51
  244. package/src/modules/business_rules/lib/rule-engine.ts +3 -57
  245. package/src/modules/catalog/components/PriceKindSettings.tsx +0 -2
  246. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
  247. package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -2
  248. package/src/modules/catalog/i18n/en.json +1 -3
  249. package/src/modules/configs/cli.ts +0 -6
  250. package/src/modules/configs/components/CachePanel.tsx +4 -4
  251. package/src/modules/configs/i18n/en.json +2 -12
  252. package/src/modules/configs/i18n/pl.json +2 -12
  253. package/src/modules/configs/lib/system-status.ts +1 -48
  254. package/src/modules/configs/lib/system-status.types.ts +0 -1
  255. package/src/modules/configs/lib/upgrade-actions.ts +0 -18
  256. package/src/modules/currencies/backend/currencies/page.tsx +0 -3
  257. package/src/modules/currencies/backend/exchange-rates/page.tsx +0 -2
  258. package/src/modules/customers/backend/customers/companies/page.tsx +0 -3
  259. package/src/modules/customers/backend/customers/deals/page.tsx +0 -3
  260. package/src/modules/customers/backend/customers/people/page.tsx +0 -3
  261. package/src/modules/customers/commands/deals.ts +0 -39
  262. package/src/modules/customers/components/CustomerTodosTable.tsx +0 -1
  263. package/src/modules/customers/i18n/en.json +1 -5
  264. package/src/modules/customers/widgets/dashboard/customer-todos/widget.ts +2 -2
  265. package/src/modules/customers/widgets/dashboard/new-customers/widget.ts +2 -2
  266. package/src/modules/customers/widgets/dashboard/new-deals/widget.ts +2 -2
  267. package/src/modules/customers/widgets/dashboard/next-interactions/widget.ts +2 -2
  268. package/src/modules/dashboards/cli.ts +5 -55
  269. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +11 -22
  270. package/src/modules/dashboards/services/widgetDataService.ts +4 -164
  271. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.ts +2 -2
  272. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.ts +2 -2
  273. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.ts +2 -2
  274. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.ts +2 -2
  275. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +2 -2
  276. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.ts +2 -2
  277. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.ts +2 -2
  278. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.ts +2 -2
  279. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.ts +2 -2
  280. package/src/modules/dashboards/widgets/dashboard/top-products/widget.ts +2 -2
  281. package/src/modules/dictionaries/components/DictionaryTable.tsx +0 -2
  282. package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
  283. package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
  284. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
  285. package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
  286. package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
  287. package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +4 -3
  288. package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
  289. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
  290. package/src/modules/query_index/cli.ts +13 -82
  291. package/src/modules/query_index/components/QueryIndexesTable.tsx +2 -8
  292. package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
  293. package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
  294. package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -2
  295. package/src/modules/sales/backend/sales/channels/page.tsx +0 -2
  296. package/src/modules/sales/commands/documents.ts +0 -65
  297. package/src/modules/sales/commands/payments.ts +0 -33
  298. package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
  299. package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
  300. package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
  301. package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
  302. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -2
  303. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +0 -2
  304. package/src/modules/sales/components/documents/PaymentsSection.tsx +1 -2
  305. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +0 -2
  306. package/src/modules/sales/i18n/de.json +0 -20
  307. package/src/modules/sales/i18n/en.json +1 -25
  308. package/src/modules/sales/i18n/es.json +0 -20
  309. package/src/modules/sales/i18n/pl.json +0 -20
  310. package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
  311. package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
  312. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
  313. package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
  314. package/src/modules/staff/commands/leave-requests.ts +0 -94
  315. package/src/modules/staff/i18n/de.json +0 -4
  316. package/src/modules/staff/i18n/en.json +1 -9
  317. package/src/modules/staff/i18n/es.json +0 -4
  318. package/src/modules/staff/i18n/pl.json +0 -4
  319. package/src/modules/workflows/backend/definitions/page.tsx +0 -5
  320. package/src/modules/workflows/backend/instances/page.tsx +1 -4
  321. package/src/modules/workflows/backend/tasks/page.tsx +1 -4
  322. package/src/modules/workflows/cli.ts +12 -12
  323. package/src/modules/workflows/i18n/en.json +1 -3
  324. package/src/modules/workflows/lib/transition-handler.ts +6 -18
  325. package/dist/generated/entities/notification/index.js +0 -57
  326. package/dist/generated/entities/notification/index.js.map +0 -7
  327. package/dist/modules/auth/api/profile/route.js +0 -157
  328. package/dist/modules/auth/api/profile/route.js.map +0 -7
  329. package/dist/modules/auth/backend/auth/profile/page.js +0 -141
  330. package/dist/modules/auth/backend/auth/profile/page.js.map +0 -7
  331. package/dist/modules/auth/backend/auth/profile/page.meta.js +0 -13
  332. package/dist/modules/auth/backend/auth/profile/page.meta.js.map +0 -7
  333. package/dist/modules/auth/notifications.js +0 -112
  334. package/dist/modules/auth/notifications.js.map +0 -7
  335. package/dist/modules/business_rules/notifications.js +0 -28
  336. package/dist/modules/business_rules/notifications.js.map +0 -7
  337. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +0 -37
  338. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +0 -7
  339. package/dist/modules/catalog/notifications.js +0 -28
  340. package/dist/modules/catalog/notifications.js.map +0 -7
  341. package/dist/modules/catalog/subscribers/low-stock-notification.js +0 -38
  342. package/dist/modules/catalog/subscribers/low-stock-notification.js.map +0 -7
  343. package/dist/modules/customers/notifications.js +0 -48
  344. package/dist/modules/customers/notifications.js.map +0 -7
  345. package/dist/modules/dashboards/lib/role-widgets.js +0 -58
  346. package/dist/modules/dashboards/lib/role-widgets.js.map +0 -7
  347. package/dist/modules/directory/api/get/tenants/lookup.js +0 -70
  348. package/dist/modules/directory/api/get/tenants/lookup.js.map +0 -7
  349. package/dist/modules/notifications/acl.js +0 -11
  350. package/dist/modules/notifications/acl.js.map +0 -7
  351. package/dist/modules/notifications/api/[id]/action/route.js +0 -74
  352. package/dist/modules/notifications/api/[id]/action/route.js.map +0 -7
  353. package/dist/modules/notifications/api/[id]/dismiss/route.js +0 -15
  354. package/dist/modules/notifications/api/[id]/dismiss/route.js.map +0 -7
  355. package/dist/modules/notifications/api/[id]/read/route.js +0 -15
  356. package/dist/modules/notifications/api/[id]/read/route.js.map +0 -7
  357. package/dist/modules/notifications/api/[id]/restore/route.js +0 -53
  358. package/dist/modules/notifications/api/[id]/restore/route.js.map +0 -7
  359. package/dist/modules/notifications/api/batch/route.js +0 -17
  360. package/dist/modules/notifications/api/batch/route.js.map +0 -7
  361. package/dist/modules/notifications/api/feature/route.js +0 -17
  362. package/dist/modules/notifications/api/feature/route.js.map +0 -7
  363. package/dist/modules/notifications/api/mark-all-read/route.js +0 -35
  364. package/dist/modules/notifications/api/mark-all-read/route.js.map +0 -7
  365. package/dist/modules/notifications/api/openapi.js +0 -76
  366. package/dist/modules/notifications/api/openapi.js.map +0 -7
  367. package/dist/modules/notifications/api/role/route.js +0 -17
  368. package/dist/modules/notifications/api/role/route.js.map +0 -7
  369. package/dist/modules/notifications/api/route.js +0 -85
  370. package/dist/modules/notifications/api/route.js.map +0 -7
  371. package/dist/modules/notifications/api/settings/route.js +0 -155
  372. package/dist/modules/notifications/api/settings/route.js.map +0 -7
  373. package/dist/modules/notifications/api/unread-count/route.js +0 -38
  374. package/dist/modules/notifications/api/unread-count/route.js.map +0 -7
  375. package/dist/modules/notifications/backend/config/notifications/page.js +0 -10
  376. package/dist/modules/notifications/backend/config/notifications/page.js.map +0 -7
  377. package/dist/modules/notifications/backend/config/notifications/page.meta.js +0 -24
  378. package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +0 -7
  379. package/dist/modules/notifications/cli.js +0 -16
  380. package/dist/modules/notifications/cli.js.map +0 -7
  381. package/dist/modules/notifications/data/entities.js +0 -112
  382. package/dist/modules/notifications/data/entities.js.map +0 -7
  383. package/dist/modules/notifications/data/validators.js +0 -98
  384. package/dist/modules/notifications/data/validators.js.map +0 -7
  385. package/dist/modules/notifications/di.js +0 -13
  386. package/dist/modules/notifications/di.js.map +0 -7
  387. package/dist/modules/notifications/emails/NotificationEmail.js +0 -58
  388. package/dist/modules/notifications/emails/NotificationEmail.js.map +0 -7
  389. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +0 -44
  390. package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +0 -7
  391. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +0 -220
  392. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +0 -7
  393. package/dist/modules/notifications/index.js +0 -14
  394. package/dist/modules/notifications/index.js.map +0 -7
  395. package/dist/modules/notifications/lib/deliveryConfig.js +0 -107
  396. package/dist/modules/notifications/lib/deliveryConfig.js.map +0 -7
  397. package/dist/modules/notifications/lib/deliveryStrategies.js +0 -14
  398. package/dist/modules/notifications/lib/deliveryStrategies.js.map +0 -7
  399. package/dist/modules/notifications/lib/events.js +0 -12
  400. package/dist/modules/notifications/lib/events.js.map +0 -7
  401. package/dist/modules/notifications/lib/notificationBuilder.js +0 -66
  402. package/dist/modules/notifications/lib/notificationBuilder.js.map +0 -7
  403. package/dist/modules/notifications/lib/notificationFactory.js +0 -54
  404. package/dist/modules/notifications/lib/notificationFactory.js.map +0 -7
  405. package/dist/modules/notifications/lib/notificationMapper.js +0 -34
  406. package/dist/modules/notifications/lib/notificationMapper.js.map +0 -7
  407. package/dist/modules/notifications/lib/notificationRecipients.js +0 -35
  408. package/dist/modules/notifications/lib/notificationRecipients.js.map +0 -7
  409. package/dist/modules/notifications/lib/notificationService.js +0 -279
  410. package/dist/modules/notifications/lib/notificationService.js.map +0 -7
  411. package/dist/modules/notifications/lib/routeHelpers.js +0 -101
  412. package/dist/modules/notifications/lib/routeHelpers.js.map +0 -7
  413. package/dist/modules/notifications/lib/safeHref.js +0 -24
  414. package/dist/modules/notifications/lib/safeHref.js.map +0 -7
  415. package/dist/modules/notifications/migrations/Migration20260123000001.js +0 -70
  416. package/dist/modules/notifications/migrations/Migration20260123000001.js.map +0 -7
  417. package/dist/modules/notifications/migrations/Migration20260126150000.js +0 -37
  418. package/dist/modules/notifications/migrations/Migration20260126150000.js.map +0 -7
  419. package/dist/modules/notifications/migrations/Migration20260129082610.js +0 -13
  420. package/dist/modules/notifications/migrations/Migration20260129082610.js.map +0 -7
  421. package/dist/modules/notifications/subscribers/deliver-notification.js +0 -165
  422. package/dist/modules/notifications/subscribers/deliver-notification.js.map +0 -7
  423. package/dist/modules/notifications/workers/create-notification.worker.js +0 -70
  424. package/dist/modules/notifications/workers/create-notification.worker.js.map +0 -7
  425. package/dist/modules/sales/notifications.client.js +0 -51
  426. package/dist/modules/sales/notifications.client.js.map +0 -7
  427. package/dist/modules/sales/notifications.js +0 -88
  428. package/dist/modules/sales/notifications.js.map +0 -7
  429. package/dist/modules/sales/subscribers/quote-expiring-notification.js +0 -38
  430. package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +0 -7
  431. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -137
  432. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +0 -7
  433. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -137
  434. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +0 -7
  435. package/dist/modules/sales/widgets/notifications/index.js +0 -7
  436. package/dist/modules/sales/widgets/notifications/index.js.map +0 -7
  437. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +0 -60
  438. package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +0 -7
  439. package/dist/modules/staff/notifications.js +0 -75
  440. package/dist/modules/staff/notifications.js.map +0 -7
  441. package/dist/modules/workflows/notifications.js +0 -28
  442. package/dist/modules/workflows/notifications.js.map +0 -7
  443. package/dist/modules/workflows/subscribers/task-assigned-notification.js +0 -38
  444. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +0 -7
  445. package/generated/entities/notification/index.ts +0 -27
  446. package/src/modules/auth/api/profile/route.ts +0 -163
  447. package/src/modules/auth/backend/auth/profile/page.meta.ts +0 -9
  448. package/src/modules/auth/backend/auth/profile/page.tsx +0 -174
  449. package/src/modules/auth/notifications.ts +0 -109
  450. package/src/modules/business_rules/notifications.ts +0 -25
  451. package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +0 -50
  452. package/src/modules/catalog/notifications.ts +0 -25
  453. package/src/modules/catalog/subscribers/low-stock-notification.ts +0 -52
  454. package/src/modules/customers/notifications.ts +0 -44
  455. package/src/modules/dashboards/lib/role-widgets.ts +0 -80
  456. package/src/modules/directory/api/get/tenants/lookup.ts +0 -75
  457. package/src/modules/notifications/__tests__/deliver-notification.test.ts +0 -195
  458. package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +0 -19
  459. package/src/modules/notifications/__tests__/notificationService.test.ts +0 -208
  460. package/src/modules/notifications/acl.ts +0 -7
  461. package/src/modules/notifications/api/[id]/action/route.ts +0 -75
  462. package/src/modules/notifications/api/[id]/dismiss/route.ts +0 -12
  463. package/src/modules/notifications/api/[id]/read/route.ts +0 -12
  464. package/src/modules/notifications/api/[id]/restore/route.ts +0 -53
  465. package/src/modules/notifications/api/batch/route.ts +0 -14
  466. package/src/modules/notifications/api/feature/route.ts +0 -14
  467. package/src/modules/notifications/api/mark-all-read/route.ts +0 -34
  468. package/src/modules/notifications/api/openapi.ts +0 -76
  469. package/src/modules/notifications/api/role/route.ts +0 -14
  470. package/src/modules/notifications/api/route.ts +0 -92
  471. package/src/modules/notifications/api/settings/route.ts +0 -157
  472. package/src/modules/notifications/api/unread-count/route.ts +0 -38
  473. package/src/modules/notifications/backend/config/notifications/page.meta.ts +0 -22
  474. package/src/modules/notifications/backend/config/notifications/page.tsx +0 -12
  475. package/src/modules/notifications/cli.ts +0 -18
  476. package/src/modules/notifications/data/entities.ts +0 -99
  477. package/src/modules/notifications/data/validators.ts +0 -115
  478. package/src/modules/notifications/di.ts +0 -11
  479. package/src/modules/notifications/emails/NotificationEmail.tsx +0 -98
  480. package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +0 -42
  481. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +0 -233
  482. package/src/modules/notifications/i18n/de.json +0 -50
  483. package/src/modules/notifications/i18n/en.json +0 -50
  484. package/src/modules/notifications/i18n/es.json +0 -50
  485. package/src/modules/notifications/i18n/pl.json +0 -50
  486. package/src/modules/notifications/index.ts +0 -12
  487. package/src/modules/notifications/lib/deliveryConfig.ts +0 -153
  488. package/src/modules/notifications/lib/deliveryStrategies.ts +0 -50
  489. package/src/modules/notifications/lib/events.ts +0 -48
  490. package/src/modules/notifications/lib/notificationBuilder.ts +0 -121
  491. package/src/modules/notifications/lib/notificationFactory.ts +0 -76
  492. package/src/modules/notifications/lib/notificationMapper.ts +0 -33
  493. package/src/modules/notifications/lib/notificationRecipients.ts +0 -83
  494. package/src/modules/notifications/lib/notificationService.ts +0 -414
  495. package/src/modules/notifications/lib/routeHelpers.ts +0 -151
  496. package/src/modules/notifications/lib/safeHref.ts +0 -29
  497. package/src/modules/notifications/migrations/.snapshot-open-mercato.json +0 -336
  498. package/src/modules/notifications/migrations/Migration20260123000001.ts +0 -73
  499. package/src/modules/notifications/migrations/Migration20260126150000.ts +0 -39
  500. package/src/modules/notifications/migrations/Migration20260129082610.ts +0 -13
  501. package/src/modules/notifications/subscribers/deliver-notification.ts +0 -204
  502. package/src/modules/notifications/workers/create-notification.worker.ts +0 -122
  503. package/src/modules/sales/notifications.client.ts +0 -65
  504. package/src/modules/sales/notifications.ts +0 -82
  505. package/src/modules/sales/subscribers/quote-expiring-notification.ts +0 -53
  506. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -156
  507. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -156
  508. package/src/modules/sales/widgets/notifications/index.ts +0 -2
  509. package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +0 -81
  510. package/src/modules/staff/notifications.ts +0 -71
  511. package/src/modules/workflows/notifications.ts +0 -25
  512. package/src/modules/workflows/subscribers/task-assigned-notification.ts +0 -53
@@ -10,9 +10,8 @@ import { AclEditor, type AclData } from '@open-mercato/core/modules/auth/compone
10
10
  import { OrganizationSelect } from '@open-mercato/core/modules/directory/components/OrganizationSelect'
11
11
  import { TenantSelect } from '@open-mercato/core/modules/directory/components/TenantSelect'
12
12
  import { fetchRoleOptions } from '@open-mercato/core/modules/auth/backend/users/roleOptions'
13
- import { WidgetVisibilityEditor, type WidgetVisibilityEditorHandle } from '@open-mercato/core/modules/dashboards/components/WidgetVisibilityEditor'
13
+ import { WidgetVisibilityEditor } from '@open-mercato/core/modules/dashboards/components/WidgetVisibilityEditor'
14
14
  import { useT } from '@open-mercato/shared/lib/i18n/context'
15
- import { formatPasswordRequirements, getPasswordPolicy } from '@open-mercato/shared/lib/auth/passwordPolicy'
16
15
 
17
16
  type EditUserFormValues = {
18
17
  email: string
@@ -109,17 +108,6 @@ export default function EditUserPage({ params }: { params?: { id?: string } }) {
109
108
  const [aclData, setAclData] = React.useState<AclData>({ isSuperAdmin: false, features: [], organizations: null })
110
109
  const [customFieldValues, setCustomFieldValues] = React.useState<Record<string, unknown>>({})
111
110
  const [actorIsSuperAdmin, setActorIsSuperAdmin] = React.useState(false)
112
- const widgetEditorRef = React.useRef<WidgetVisibilityEditorHandle | null>(null)
113
- const passwordPolicy = React.useMemo(() => getPasswordPolicy(), [])
114
- const passwordRequirements = React.useMemo(
115
- () => formatPasswordRequirements(passwordPolicy, t),
116
- [passwordPolicy, t],
117
- )
118
- const passwordDescription = React.useMemo(() => (
119
- passwordRequirements
120
- ? t('auth.password.requirements.help', 'Password requirements: {requirements}', { requirements: passwordRequirements })
121
- : undefined
122
- ), [passwordRequirements, t])
123
111
 
124
112
  React.useEffect(() => {
125
113
  if (!id) {
@@ -213,12 +201,7 @@ export default function EditUserPage({ params }: { params?: { id?: string } }) {
213
201
  const fields: CrudField[] = React.useMemo(() => {
214
202
  const items: CrudField[] = [
215
203
  { id: 'email', label: t('auth.users.form.field.email', 'Email'), type: 'text', required: true },
216
- {
217
- id: 'password',
218
- label: t('auth.users.form.field.password', 'Password'),
219
- type: 'text',
220
- description: passwordDescription,
221
- },
204
+ { id: 'password', label: t('auth.users.form.field.password', 'Password'), type: 'text' },
222
205
  ]
223
206
  if (actorIsSuperAdmin) {
224
207
  items.push({
@@ -268,7 +251,7 @@ export default function EditUserPage({ params }: { params?: { id?: string } }) {
268
251
  })
269
252
  items.push({ id: 'roles', label: t('auth.users.form.field.roles', 'Roles'), type: 'tags', loadOptions: loadRoleOptions })
270
253
  return items
271
- }, [actorIsSuperAdmin, loadRoleOptions, passwordDescription, preloadedTenants, selectedOrgId, selectedTenantId, t])
254
+ }, [actorIsSuperAdmin, loadRoleOptions, preloadedTenants, selectedOrgId, selectedTenantId, t])
272
255
 
273
256
  const detailFieldIds = React.useMemo(() => {
274
257
  const base: string[] = ['email', 'password', 'organizationId', 'roles']
@@ -309,7 +292,6 @@ export default function EditUserPage({ params }: { params?: { id?: string } }) {
309
292
  targetId={String(id)}
310
293
  tenantId={selectedTenantId ?? null}
311
294
  organizationId={initialUser?.organizationId ?? null}
312
- ref={widgetEditorRef}
313
295
  />
314
296
  ) : null
315
297
  ),
@@ -372,7 +354,6 @@ export default function EditUserPage({ params }: { params?: { id?: string } }) {
372
354
  await updateCrud('auth/users/acl', { userId: id, ...aclData }, {
373
355
  errorMessage: t('auth.users.form.errors.aclUpdate', 'Failed to update user access control'),
374
356
  })
375
- await widgetEditorRef.current?.save()
376
357
  try { window.dispatchEvent(new Event('om:refresh-sidebar')) } catch {}
377
358
  }}
378
359
  onDelete={async () => {
@@ -11,7 +11,6 @@ import { TenantSelect } from '@open-mercato/core/modules/directory/components/Te
11
11
  import { fetchRoleOptions } from '@open-mercato/core/modules/auth/backend/users/roleOptions'
12
12
  import { Spinner } from '@open-mercato/ui/primitives/spinner'
13
13
  import { useT } from '@open-mercato/shared/lib/i18n/context'
14
- import { formatPasswordRequirements, getPasswordPolicy } from '@open-mercato/shared/lib/auth/passwordPolicy'
15
14
 
16
15
  type CreateUserFormValues = {
17
16
  email: string
@@ -85,16 +84,6 @@ export default function CreateUserPage() {
85
84
  const [selectedWidgets, setSelectedWidgets] = React.useState<string[]>([])
86
85
  const [selectedTenantId, setSelectedTenantId] = React.useState<string | null>(null)
87
86
  const [actorIsSuperAdmin, setActorIsSuperAdmin] = React.useState(false)
88
- const passwordPolicy = React.useMemo(() => getPasswordPolicy(), [])
89
- const passwordRequirements = React.useMemo(
90
- () => formatPasswordRequirements(passwordPolicy, t),
91
- [passwordPolicy, t],
92
- )
93
- const passwordDescription = React.useMemo(() => (
94
- passwordRequirements
95
- ? t('auth.password.requirements.help', 'Password requirements: {requirements}', { requirements: passwordRequirements })
96
- : undefined
97
- ), [passwordRequirements, t])
98
87
 
99
88
  React.useEffect(() => {
100
89
  let cancelled = false
@@ -167,13 +156,7 @@ export default function CreateUserPage() {
167
156
  const fields: CrudField[] = React.useMemo(() => {
168
157
  const items: CrudField[] = [
169
158
  { id: 'email', label: t('auth.users.form.field.email', 'Email'), type: 'text', required: true },
170
- {
171
- id: 'password',
172
- label: t('auth.users.form.field.password', 'Password'),
173
- type: 'text',
174
- required: true,
175
- description: passwordDescription,
176
- },
159
+ { id: 'password', label: t('auth.users.form.field.password', 'Password'), type: 'text', required: true },
177
160
  ]
178
161
  if (actorIsSuperAdmin) {
179
162
  items.push({
@@ -220,7 +203,7 @@ export default function CreateUserPage() {
220
203
  })
221
204
  items.push({ id: 'roles', label: t('auth.users.form.field.roles', 'Roles'), type: 'tags', loadOptions: loadRoleOptions })
222
205
  return items
223
- }, [actorIsSuperAdmin, loadRoleOptions, passwordDescription, selectedTenantId, t])
206
+ }, [actorIsSuperAdmin, loadRoleOptions, selectedTenantId, t])
224
207
 
225
208
  const detailFieldIds = React.useMemo(() => {
226
209
  const base: string[] = ['email', 'password', 'organizationId', 'roles']
@@ -383,9 +383,9 @@ export default function UsersListPage() {
383
383
  perspective={{ tableId: 'auth.users.list' }}
384
384
  rowActions={(row) => (
385
385
  <RowActions items={[
386
- { id: 'edit', label: t('common.edit', 'Edit'), href: `/backend/users/${row.id}/edit` },
387
- { id: 'show-roles', label: t('auth.users.list.actions.showRoles', 'Show roles'), href: `/backend/roles?userId=${encodeURIComponent(row.id)}` },
388
- { id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },
386
+ { label: t('common.edit', 'Edit'), href: `/backend/users/${row.id}/edit` },
387
+ { label: t('auth.users.list.actions.showRoles', 'Show roles'), href: `/backend/roles?userId=${encodeURIComponent(row.id)}` },
388
+ { label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },
389
389
  ]} />
390
390
  )}
391
391
  pagination={{ page, pageSize: 50, total, totalPages, onPageChange: setPage }}
@@ -16,8 +16,6 @@ import { decryptWithAesGcm } from '@open-mercato/shared/lib/encryption/aes'
16
16
  import { env } from 'process'
17
17
  import type { KmsService, TenantDek } from '@open-mercato/shared/lib/encryption/kms'
18
18
  import crypto from 'node:crypto'
19
- import { formatPasswordRequirements, getPasswordPolicy, validatePassword } from '@open-mercato/shared/lib/auth/passwordPolicy'
20
- import { parseBooleanToken } from '@open-mercato/shared/lib/boolean'
21
19
 
22
20
  const addUser: ModuleCli = {
23
21
  command: 'add-user',
@@ -36,7 +34,6 @@ const addUser: ModuleCli = {
36
34
  console.error('Usage: mercato auth add-user --email <email> --password <password> --organizationId <id> [--roles customer,employee]')
37
35
  return
38
36
  }
39
- if (!ensurePasswordPolicy(password)) return
40
37
  const { resolve } = await createRequestContainer()
41
38
  const em = resolve('em') as any
42
39
  const org =
@@ -105,16 +102,6 @@ function hashSecret(value: string | null | undefined): string | null {
105
102
  return crypto.createHash('sha256').update(normalizeKeyInput(value)).digest('hex').slice(0, 12)
106
103
  }
107
104
 
108
- function ensurePasswordPolicy(password: string): boolean {
109
- const policy = getPasswordPolicy()
110
- const result = validatePassword(password, policy)
111
- if (result.ok) return true
112
- const requirements = formatPasswordRequirements(policy, (_key, fallback) => fallback)
113
- const suffix = requirements ? `: ${requirements}` : ''
114
- console.error(`Password does not meet the requirements${suffix}.`)
115
- return false
116
- }
117
-
118
105
  async function withEncryptionDebugDisabled<T>(fn: () => Promise<T>): Promise<T> {
119
106
  const previous = process.env.TENANT_DATA_ENCRYPTION_DEBUG
120
107
  process.env.TENANT_DATA_ENCRYPTION_DEBUG = 'no'
@@ -405,33 +392,20 @@ const addOrganization: ModuleCli = {
405
392
  const setupApp: ModuleCli = {
406
393
  command: 'setup',
407
394
  async run(rest) {
408
- const args = parseArgs(rest)
409
- const orgName = typeof args.orgName === 'string'
410
- ? args.orgName
411
- : typeof args.name === 'string'
412
- ? args.name
413
- : undefined
414
- const email = typeof args.email === 'string' ? args.email : undefined
415
- const password = typeof args.password === 'string' ? args.password : undefined
416
- const rolesCsv = typeof args.roles === 'string'
417
- ? args.roles.trim()
418
- : 'superadmin,admin,employee'
419
- const skipPasswordPolicyRaw =
420
- args['skip-password-policy'] ??
421
- args.skipPasswordPolicy ??
422
- args['allow-weak-password'] ??
423
- args.allowWeakPassword
424
- const skipPasswordPolicy = typeof skipPasswordPolicyRaw === 'boolean'
425
- ? skipPasswordPolicyRaw
426
- : parseBooleanToken(typeof skipPasswordPolicyRaw === 'string' ? skipPasswordPolicyRaw : null) ?? false
395
+ const args: Record<string, string> = {}
396
+ for (let i = 0; i < rest.length; i += 2) {
397
+ const k = rest[i]?.replace(/^--/, '')
398
+ const v = rest[i + 1]
399
+ if (k) args[k] = v
400
+ }
401
+ const orgName = args.orgName || args.name
402
+ const email = args.email
403
+ const password = args.password
404
+ const rolesCsv = (args.roles ?? 'superadmin,admin,employee').trim()
427
405
  if (!orgName || !email || !password) {
428
- console.error('Usage: mercato auth setup --orgName <name> --email <email> --password <password> [--roles superadmin,admin,employee] [--skip-password-policy]')
406
+ console.error('Usage: mercato auth setup --orgName <name> --email <email> --password <password> [--roles superadmin,admin,employee]')
429
407
  return
430
408
  }
431
- if (!skipPasswordPolicy && !ensurePasswordPolicy(password)) return
432
- if (skipPasswordPolicy) {
433
- console.warn('⚠️ Password policy validation skipped for setup.')
434
- }
435
409
  const { resolve } = await createRequestContainer()
436
410
  const em = resolve<EntityManager>('em')
437
411
  const roleNames = rolesCsv
@@ -621,7 +595,6 @@ const setPassword: ModuleCli = {
621
595
  console.error('Usage: mercato auth set-password --email <email> --password <newPassword>')
622
596
  return
623
597
  }
624
- if (!ensurePasswordPolicy(password)) return
625
598
 
626
599
  const { resolve } = await createRequestContainer()
627
600
  const em = resolve('em') as any
@@ -27,10 +27,6 @@ import {
27
27
  import { normalizeTenantId } from '@open-mercato/core/modules/auth/lib/tenantAccess'
28
28
  import { computeEmailHash } from '@open-mercato/core/modules/auth/lib/emailHash'
29
29
  import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
30
- import { buildNotificationFromType } from '@open-mercato/core/modules/notifications/lib/notificationBuilder'
31
- import { resolveNotificationService } from '@open-mercato/core/modules/notifications/lib/notificationService'
32
- import notificationTypes from '@open-mercato/core/modules/auth/notifications'
33
- import { buildPasswordSchema } from '@open-mercato/shared/lib/auth/passwordPolicy'
34
30
 
35
31
  type SerializedUser = {
36
32
  email: string
@@ -67,11 +63,9 @@ type UserSnapshots = {
67
63
  undo: UserUndoSnapshot
68
64
  }
69
65
 
70
- const passwordSchema = buildPasswordSchema()
71
-
72
66
  const createSchema = z.object({
73
67
  email: z.string().email(),
74
- password: passwordSchema,
68
+ password: z.string().min(6),
75
69
  organizationId: z.string().uuid(),
76
70
  roles: z.array(z.string()).optional(),
77
71
  })
@@ -79,7 +73,7 @@ const createSchema = z.object({
79
73
  const updateSchema = z.object({
80
74
  id: z.string().uuid(),
81
75
  email: z.string().email().optional(),
82
- password: passwordSchema.optional(),
76
+ password: z.string().min(6).optional(),
83
77
  organizationId: z.string().uuid().optional(),
84
78
  roles: z.array(z.string()).optional(),
85
79
  })
@@ -111,46 +105,6 @@ export const userCrudIndexer: CrudIndexerConfig = {
111
105
  }),
112
106
  }
113
107
 
114
- async function notifyRoleChanges(
115
- ctx: CommandRuntimeContext,
116
- user: User,
117
- assignedRoles: string[],
118
- revokedRoles: string[],
119
- ): Promise<void> {
120
- const tenantId = user.tenantId ? String(user.tenantId) : null
121
- if (!tenantId) return
122
- const organizationId = user.organizationId ? String(user.organizationId) : null
123
-
124
- try {
125
- const notificationService = resolveNotificationService(ctx.container)
126
- if (assignedRoles.length) {
127
- const assignedType = notificationTypes.find((type) => type.type === 'auth.role.assigned')
128
- if (assignedType) {
129
- const notificationInput = buildNotificationFromType(assignedType, {
130
- recipientUserId: String(user.id),
131
- sourceEntityType: 'auth:user',
132
- sourceEntityId: String(user.id),
133
- })
134
- await notificationService.create(notificationInput, { tenantId, organizationId })
135
- }
136
- }
137
-
138
- if (revokedRoles.length) {
139
- const revokedType = notificationTypes.find((type) => type.type === 'auth.role.revoked')
140
- if (revokedType) {
141
- const notificationInput = buildNotificationFromType(revokedType, {
142
- recipientUserId: String(user.id),
143
- sourceEntityType: 'auth:user',
144
- sourceEntityId: String(user.id),
145
- })
146
- await notificationService.create(notificationInput, { tenantId, organizationId })
147
- }
148
- }
149
- } catch (err) {
150
- console.error('[auth.users.roles] Failed to create notification:', err)
151
- }
152
- }
153
-
154
108
  const createUserCommand: CommandHandler<Record<string, unknown>, User> = {
155
109
  id: 'auth.users.create',
156
110
  async execute(rawInput, ctx) {
@@ -193,10 +147,8 @@ const createUserCommand: CommandHandler<Record<string, unknown>, User> = {
193
147
  throw error
194
148
  }
195
149
 
196
- let assignedRoles: string[] = []
197
150
  if (Array.isArray(parsed.roles) && parsed.roles.length) {
198
151
  await syncUserRoles(em, user, parsed.roles, tenantId)
199
- assignedRoles = await loadUserRoleNames(em, String(user.id))
200
152
  }
201
153
 
202
154
  await setCustomFieldsIfAny({
@@ -221,10 +173,6 @@ const createUserCommand: CommandHandler<Record<string, unknown>, User> = {
221
173
  indexer: userCrudIndexer,
222
174
  })
223
175
 
224
- if (assignedRoles.length) {
225
- await notifyRoleChanges(ctx, user, assignedRoles, [])
226
- }
227
-
228
176
  return user
229
177
  },
230
178
  captureAfter: async (_input, result, ctx) => {
@@ -340,9 +288,6 @@ const updateUserCommand: CommandHandler<Record<string, unknown>, User> = {
340
288
  async execute(rawInput, ctx) {
341
289
  const { parsed, custom } = parseWithCustomFields(updateSchema, rawInput)
342
290
  const em = (ctx.container.resolve('em') as EntityManager)
343
- const rolesBefore = Array.isArray(parsed.roles)
344
- ? await loadUserRoleNames(em, parsed.id)
345
- : null
346
291
 
347
292
  if (parsed.email !== undefined) {
348
293
  const emailHash = computeEmailHash(parsed.email)
@@ -432,14 +377,6 @@ const updateUserCommand: CommandHandler<Record<string, unknown>, User> = {
432
377
  indexer: userCrudIndexer,
433
378
  })
434
379
 
435
- if (Array.isArray(parsed.roles) && rolesBefore) {
436
- const rolesAfter = await loadUserRoleNames(em, String(user.id))
437
- const { assigned, revoked } = diffRoleChanges(rolesBefore, rolesAfter)
438
- if (assigned.length || revoked.length) {
439
- await notifyRoleChanges(ctx, user, assigned, revoked)
440
- }
441
- }
442
-
443
380
  await invalidateUserCache(ctx, parsed.id)
444
381
 
445
382
  return user
@@ -835,14 +772,6 @@ async function invalidateUserCache(ctx: CommandRuntimeContext, userId: string) {
835
772
  }
836
773
  }
837
774
 
838
- function diffRoleChanges(before: string[], after: string[]) {
839
- const beforeSet = new Set(before)
840
- const afterSet = new Set(after)
841
- const assigned = after.filter((role) => !beforeSet.has(role))
842
- const revoked = before.filter((role) => !afterSet.has(role))
843
- return { assigned, revoked }
844
- }
845
-
846
775
  function arrayEquals(left: string[] | undefined, right: string[]): boolean {
847
776
  if (!left) return false
848
777
  if (left.length !== right.length) return false
@@ -1,14 +1,10 @@
1
1
  import { z } from 'zod'
2
- import { buildPasswordSchema } from '@open-mercato/shared/lib/auth/passwordPolicy'
3
-
4
- const passwordSchema = buildPasswordSchema()
5
2
 
6
3
  // Core auth validators
7
4
  export const userLoginSchema = z.object({
8
5
  email: z.string().email(),
9
6
  password: z.string().min(6),
10
7
  requireRole: z.string().optional(),
11
- tenantId: z.string().uuid().optional(),
12
8
  })
13
9
 
14
10
  export const requestPasswordResetSchema = z.object({
@@ -17,7 +13,7 @@ export const requestPasswordResetSchema = z.object({
17
13
 
18
14
  export const confirmPasswordResetSchema = z.object({
19
15
  token: z.string().min(10),
20
- password: passwordSchema,
16
+ password: z.string().min(6),
21
17
  })
22
18
 
23
19
  export const sidebarPreferencesInputSchema = z.object({
@@ -33,7 +29,7 @@ export const sidebarPreferencesInputSchema = z.object({
33
29
  // Optional helpers for CLI or admin forms
34
30
  export const userCreateSchema = z.object({
35
31
  email: z.string().email(),
36
- password: passwordSchema,
32
+ password: z.string().min(6),
37
33
  tenantId: z.string().uuid().optional(),
38
34
  organizationId: z.string().uuid(),
39
35
  rolesCsv: z.string().optional(),
@@ -1,40 +1,14 @@
1
1
  "use client"
2
- import { useCallback, useEffect, useState } from 'react'
2
+ import { useState } from 'react'
3
3
  import Image from 'next/image'
4
4
  import Link from 'next/link'
5
5
  import { useRouter, useSearchParams } from 'next/navigation'
6
- import { Card, CardContent, CardHeader, CardDescription } from '@open-mercato/ui/primitives/card'
6
+ import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@open-mercato/ui/primitives/card'
7
7
  import { Input } from '@open-mercato/ui/primitives/input'
8
8
  import { Label } from '@open-mercato/ui/primitives/label'
9
- import { Button } from '@open-mercato/ui/primitives/button'
10
9
  import { useT } from '@open-mercato/shared/lib/i18n/context'
11
10
  import { translateWithFallback } from '@open-mercato/shared/lib/i18n/translate'
12
11
  import { clearAllOperations } from '@open-mercato/ui/backend/operations/store'
13
- import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
14
- import { X } from 'lucide-react'
15
-
16
- const loginTenantKey = 'om_login_tenant'
17
- const loginTenantCookieMaxAge = 60 * 60 * 24 * 14
18
-
19
- function readTenantCookie() {
20
- if (typeof document === 'undefined') return null
21
- const entries = document.cookie.split(';')
22
- for (const entry of entries) {
23
- const [name, ...rest] = entry.trim().split('=')
24
- if (name === loginTenantKey) return decodeURIComponent(rest.join('='))
25
- }
26
- return null
27
- }
28
-
29
- function setTenantCookie(value: string) {
30
- if (typeof document === 'undefined') return
31
- document.cookie = `${loginTenantKey}=${encodeURIComponent(value)}; path=/; max-age=${loginTenantCookieMaxAge}; samesite=lax`
32
- }
33
-
34
- function clearTenantCookie() {
35
- if (typeof document === 'undefined') return
36
- document.cookie = `${loginTenantKey}=; path=/; max-age=0; samesite=lax`
37
- }
38
12
 
39
13
  function extractErrorMessage(payload: unknown): string | null {
40
14
  if (!payload) return null
@@ -70,11 +44,8 @@ function looksLikeJsonString(value: string): boolean {
70
44
 
71
45
  export default function LoginPage() {
72
46
  const t = useT()
73
- const translate = useCallback(
74
- (key: string, fallback: string, params?: Record<string, string | number>) =>
75
- translateWithFallback(t, key, fallback, params),
76
- [t],
77
- )
47
+ const translate = (key: string, fallback: string, params?: Record<string, string | number>) =>
48
+ translateWithFallback(t, key, fallback, params)
78
49
  const router = useRouter()
79
50
  const searchParams = useSearchParams()
80
51
  const requireRole = (searchParams.get('requireRole') || searchParams.get('role') || '').trim()
@@ -85,80 +56,6 @@ export default function LoginPage() {
85
56
  const translatedFeatures = requiredFeatures.map((feature) => translate(`features.${feature}`, feature))
86
57
  const [error, setError] = useState<string | null>(null)
87
58
  const [submitting, setSubmitting] = useState(false)
88
- const [tenantId, setTenantId] = useState<string | null>(null)
89
- const [tenantName, setTenantName] = useState<string | null>(null)
90
- const [tenantLoading, setTenantLoading] = useState(false)
91
- const [tenantInvalid, setTenantInvalid] = useState<string | null>(null)
92
- const showTenantInvalid = tenantId != null && tenantInvalid === tenantId
93
-
94
- useEffect(() => {
95
- const tenantParam = (searchParams.get('tenant') || '').trim()
96
- if (tenantParam) {
97
- setTenantId(tenantParam)
98
- window.localStorage.setItem(loginTenantKey, tenantParam)
99
- setTenantCookie(tenantParam)
100
- return
101
- }
102
- const storedTenant = window.localStorage.getItem(loginTenantKey) || readTenantCookie()
103
- if (storedTenant) {
104
- setTenantId(storedTenant)
105
- }
106
- }, [searchParams])
107
-
108
- useEffect(() => {
109
- if (!tenantId) {
110
- setTenantName(null)
111
- setTenantInvalid(null)
112
- return
113
- }
114
- if (tenantInvalid === tenantId) {
115
- setTenantName(null)
116
- setTenantLoading(false)
117
- return
118
- }
119
- let active = true
120
- setTenantLoading(true)
121
- setTenantInvalid(null)
122
- apiCall<{ ok: boolean; tenant?: { id: string; name: string }; error?: string }>(
123
- `/api/directory/tenants/lookup?tenantId=${encodeURIComponent(tenantId)}`,
124
- )
125
- .then(({ result }) => {
126
- if (!active) return
127
- if (result?.ok && result.tenant) {
128
- setTenantName(result.tenant.name)
129
- return
130
- }
131
- const message = translate('auth.login.errors.tenantInvalid', 'Tenant not found. Clear the tenant selection and try again.')
132
- setTenantName(null)
133
- setTenantInvalid(tenantId)
134
- setError(null)
135
- })
136
- .catch(() => {
137
- if (!active) return
138
- setTenantName(null)
139
- setTenantInvalid(tenantId)
140
- setError(null)
141
- })
142
- .finally(() => {
143
- if (active) setTenantLoading(false)
144
- })
145
- return () => {
146
- active = false
147
- }
148
- }, [tenantId, translate])
149
-
150
- function handleClearTenant() {
151
- window.localStorage.removeItem(loginTenantKey)
152
- clearTenantCookie()
153
- setTenantId(null)
154
- setTenantName(null)
155
- setTenantInvalid(null)
156
- const params = new URLSearchParams(searchParams)
157
- params.delete('tenant')
158
- setError(null)
159
- const query = params.toString()
160
- router.replace(query ? `/login?${query}` : '/login')
161
- }
162
59
 
163
60
  async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
164
61
  e.preventDefault()
@@ -244,9 +141,6 @@ export default function LoginPage() {
244
141
  </CardHeader>
245
142
  <CardContent>
246
143
  <form className="grid gap-3" onSubmit={onSubmit} noValidate>
247
- {tenantId ? (
248
- <input type="hidden" name="tenantId" value={tenantId} />
249
- ) : null}
250
144
  {!!translatedRoles.length && (
251
145
  <div className="rounded-md border border-blue-200 bg-blue-50 px-3 py-2 text-center text-xs text-blue-900">
252
146
  {translate(
@@ -265,30 +159,7 @@ export default function LoginPage() {
265
159
  })}
266
160
  </div>
267
161
  )}
268
- {showTenantInvalid ? (
269
- <div className="rounded-md border border-red-200 bg-red-50 px-3 py-2 text-center text-xs text-red-700">
270
- <div className="font-medium">{translate('auth.login.errors.tenantInvalid', 'Tenant not found. Clear the tenant selection and try again.')}</div>
271
- <Button type="button" variant="outline" size="sm" className="mt-2 border-red-300 text-red-700" onClick={handleClearTenant}>
272
- <X className="mr-2 size-4" aria-hidden="true" />
273
- {translate('auth.login.tenantClear', 'Clear')}
274
- </Button>
275
- </div>
276
- ) : tenantId ? (
277
- <div className="rounded-md border border-emerald-200 bg-emerald-50 px-3 py-2 text-center text-xs text-emerald-900">
278
- <div className="font-medium">
279
- {tenantLoading
280
- ? translate('auth.login.tenantLoading', 'Loading tenant details...')
281
- : translate('auth.login.tenantBanner', "You're logging in to {tenant} tenant.", {
282
- tenant: tenantName || tenantId,
283
- })}
284
- </div>
285
- <Button type="button" variant="outline" size="sm" className="mt-2 border-emerald-300 text-emerald-900" onClick={handleClearTenant}>
286
- <X className="mr-2 size-4" aria-hidden="true" />
287
- {translate('auth.login.tenantClear', 'Clear')}
288
- </Button>
289
- </div>
290
- ) : null}
291
- {error && !showTenantInvalid && (
162
+ {error && (
292
163
  <div className="rounded-md border border-red-200 bg-red-50 px-3 py-2 text-center text-sm text-red-700" role="alert" aria-live="polite">
293
164
  {error}
294
165
  </div>
@@ -4,20 +4,11 @@ import { Input } from '@open-mercato/ui/primitives/input'
4
4
  import { Label } from '@open-mercato/ui/primitives/label'
5
5
  import { useState } from 'react'
6
6
  import { useRouter } from 'next/navigation'
7
- import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
8
- import { useT } from '@open-mercato/shared/lib/i18n/context'
9
- import { formatPasswordRequirements, getPasswordPolicy } from '@open-mercato/shared/lib/auth/passwordPolicy'
10
7
 
11
8
  export default function ResetWithTokenPage({ params }: { params: { token: string } }) {
12
9
  const router = useRouter()
13
- const t = useT()
14
10
  const [error, setError] = useState<string | null>(null)
15
11
  const [submitting, setSubmitting] = useState(false)
16
- const passwordPolicy = getPasswordPolicy()
17
- const passwordRequirements = formatPasswordRequirements(passwordPolicy, t)
18
- const passwordDescription = passwordRequirements
19
- ? t('auth.password.requirements.help', 'Password requirements: {requirements}', { requirements: passwordRequirements })
20
- : ''
21
12
 
22
13
  async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
23
14
  e.preventDefault()
@@ -26,15 +17,13 @@ export default function ResetWithTokenPage({ params }: { params: { token: string
26
17
  try {
27
18
  const form = new FormData(e.currentTarget)
28
19
  form.set('token', params.token)
29
- const { ok, result } = await apiCall<{ ok?: boolean; error?: string; redirect?: string }>(
30
- '/api/auth/reset/confirm',
31
- { method: 'POST', body: form },
32
- )
33
- if (!ok || result?.ok === false) {
34
- setError(result?.error || t('auth.reset.errors.failed', 'Unable to reset password'))
20
+ const res = await fetch('/api/auth/reset/confirm', { method: 'POST', body: form })
21
+ const data = await res.json().catch(() => null)
22
+ if (!res.ok) {
23
+ setError(data?.error || 'Unable to reset password')
35
24
  return
36
25
  }
37
- router.replace(result?.redirect || '/login')
26
+ router.replace(data?.redirect || '/login')
38
27
  } finally {
39
28
  setSubmitting(false)
40
29
  }
@@ -44,21 +33,18 @@ export default function ResetWithTokenPage({ params }: { params: { token: string
44
33
  <div className="min-h-svh flex items-center justify-center p-4">
45
34
  <Card className="w-full max-w-sm">
46
35
  <CardHeader>
47
- <CardTitle>{t('auth.reset.title', 'Set a new password')}</CardTitle>
48
- <CardDescription>{t('auth.reset.subtitle', 'Choose a strong password for your account.')}</CardDescription>
36
+ <CardTitle>Set a new password</CardTitle>
37
+ <CardDescription>Choose a strong password for your account.</CardDescription>
49
38
  </CardHeader>
50
39
  <CardContent>
51
40
  <form className="grid gap-3" onSubmit={onSubmit}>
52
41
  {error && <div className="text-sm text-red-600">{error}</div>}
53
42
  <div className="grid gap-1">
54
- <Label htmlFor="password">{t('auth.reset.form.password', 'New password')}</Label>
55
- <Input id="password" name="password" type="password" required minLength={passwordPolicy.minLength} />
56
- {passwordDescription ? (
57
- <p className="text-xs text-muted-foreground">{passwordDescription}</p>
58
- ) : null}
43
+ <Label htmlFor="password">New password</Label>
44
+ <Input id="password" name="password" type="password" required minLength={6} />
59
45
  </div>
60
46
  <button disabled={submitting} className="h-10 rounded-md bg-foreground text-background mt-2 hover:opacity-90 transition disabled:opacity-60">
61
- {submitting ? t('auth.reset.form.loading', '...') : t('auth.reset.form.submit', 'Update password')}
47
+ {submitting ? '...' : 'Update password'}
62
48
  </button>
63
49
  </form>
64
50
  </CardContent>
@@ -66,3 +52,4 @@ export default function ResetWithTokenPage({ params }: { params: { token: string
66
52
  </div>
67
53
  )
68
54
  }
55
+