@baasix/baasix 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.MD +85 -0
- package/README.md +526 -0
- package/assets/banner.jpg +0 -0
- package/assets/banner_small.jpg +0 -0
- package/assets/logo_icon.svg +20 -0
- package/assets/logo_icon_rounded.svg +20 -0
- package/dist/LICENSE.MD +85 -0
- package/dist/README.md +526 -0
- package/dist/app/404/index.html +1 -0
- package/dist/app/404.html +1 -0
- package/dist/app/_next/static/chunks/041e1f03-56ae8a902a7f2fe6.js +24 -0
- package/dist/app/_next/static/chunks/1117-05479929a8da73e3.js +1 -0
- package/dist/app/_next/static/chunks/1299.77cc7b7b76b75cba.js +1 -0
- package/dist/app/_next/static/chunks/1303-35a96e9c9cdeab9d.js +1 -0
- package/dist/app/_next/static/chunks/1509-56ac00cdaaecdf53.js +1 -0
- package/dist/app/_next/static/chunks/1668-e3eabd0f6753c780.js +1 -0
- package/dist/app/_next/static/chunks/1783-d9fb550fd324300c.js +1 -0
- package/dist/app/_next/static/chunks/2117-29b5fa47421595ad.js +2 -0
- package/dist/app/_next/static/chunks/2344.35b46d2179a765b5.js +1 -0
- package/dist/app/_next/static/chunks/257.990da16794a31292.js +1 -0
- package/dist/app/_next/static/chunks/2676-73b0ee7c80073a84.js +1 -0
- package/dist/app/_next/static/chunks/3563-b8842744384391fe.js +1 -0
- package/dist/app/_next/static/chunks/363642f4-933b579ed3c85f60.js +1 -0
- package/dist/app/_next/static/chunks/3817-e20c8f0a0810fc95.js +1 -0
- package/dist/app/_next/static/chunks/3834.84944e390d902509.js +2 -0
- package/dist/app/_next/static/chunks/4043-3a30c8a75896f241.js +1 -0
- package/dist/app/_next/static/chunks/4225-14090c7c0cd9dec6.js +1 -0
- package/dist/app/_next/static/chunks/4438-c9a12ca15b6e9160.js +1 -0
- package/dist/app/_next/static/chunks/4458-679fd0c6884f456a.js +1 -0
- package/dist/app/_next/static/chunks/4475-8bdfbd536fba8c48.js +1 -0
- package/dist/app/_next/static/chunks/4883-8a924721bb21b3b0.js +1 -0
- package/dist/app/_next/static/chunks/489-683ab07188f9df2b.js +1 -0
- package/dist/app/_next/static/chunks/4952-1b97320cf61f3f21.js +1 -0
- package/dist/app/_next/static/chunks/5094-8d53e403235d4ca6.js +1 -0
- package/dist/app/_next/static/chunks/5101-3a146e0625747ad1.js +1 -0
- package/dist/app/_next/static/chunks/54a60aa6-d9747982e0a81f58.js +79 -0
- package/dist/app/_next/static/chunks/5650-f096291df402bfc2.js +1 -0
- package/dist/app/_next/static/chunks/600-539045311240f579.js +1 -0
- package/dist/app/_next/static/chunks/6170-803b82e19d3ade6d.js +89 -0
- package/dist/app/_next/static/chunks/6241-30d7169d1010e5a4.js +1 -0
- package/dist/app/_next/static/chunks/6530-a91e10cffa4200c4.js +1 -0
- package/dist/app/_next/static/chunks/6547-4bbbdb5c399aef1e.js +1 -0
- package/dist/app/_next/static/chunks/6712-781937c53a2c49da.js +1 -0
- package/dist/app/_next/static/chunks/6fcbdc68-90be1a5480b8d353.js +1 -0
- package/dist/app/_next/static/chunks/70e0d97a-aeaf0cdc26ba1a58.js +1 -0
- package/dist/app/_next/static/chunks/7214-5154a89d08d24dde.js +1 -0
- package/dist/app/_next/static/chunks/7324-b53229c59a640880.js +10 -0
- package/dist/app/_next/static/chunks/7636-66424f0b51d350e9.js +1 -0
- package/dist/app/_next/static/chunks/7874-39a3f2541165a675.js +1 -0
- package/dist/app/_next/static/chunks/7982-9da12b83f11e3f5f.js +1 -0
- package/dist/app/_next/static/chunks/8213a2eb-da25a3b3c5521b2b.js +1 -0
- package/dist/app/_next/static/chunks/8473-6598318371eca31b.js +1 -0
- package/dist/app/_next/static/chunks/8640fa6b-72e43370f68e5587.js +1 -0
- package/dist/app/_next/static/chunks/9090-3ef676f29c95f1c7.js +1 -0
- package/dist/app/_next/static/chunks/9124-a02f9e209e6e3cce.js +1 -0
- package/dist/app/_next/static/chunks/926-156f32067d111d6b.js +1 -0
- package/dist/app/_next/static/chunks/9487-b17481605e513b83.js +1 -0
- package/dist/app/_next/static/chunks/9599-a7e572bb88c3392b.js +1 -0
- package/dist/app/_next/static/chunks/9881-419697138376e755.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/all-activity/page-8917930b4d663405.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/email-log/page-b27a6ee32782d7df.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/notifications/page-b7eda523ede2702c.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/page-1cfa62d1caedaed0.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/sessions/page-3e21e20db90aeff7.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/workflow-executions/page-27bcc26b747fb29b.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/activity-log/workflow-logs/page-9f9e9e952aef436e.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/change-password/page-8d61aa499eabb127.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/dashboard/page-1ceeac9e72997a8a.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/data-browser/page-8cda2b57759dd670.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/file-manager/page-8c6f1b1da66ad7e4.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/layout-f70d225b2759c998.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/migrations/page-aacec8f7cfb40ab2.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/permissions/page-828110cfcde429c6.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/project/page-420e794bb76bd204.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/roles/page-9001d02b28f70708.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/schema/page-899574f35091dd58.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/tasks/page-ad7ab3e27c83f44f.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/templates/edit/page-bd83414cb8c4cb04.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/templates/page-3181447f8772b1d3.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/settings/tenants/page-ef9bfbacef5a1d73.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/users/invites/page-480306b7b2bbac7e.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/users/list/page-74da51254c2606b3.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/users/page-e99c6f0b915001b2.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/users/preferences/page-1a935630ce8f2b12.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/users/user-roles/page-901dfb8ea1f39ca8.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/workflows/detail/page-9a6b839aea688ca4.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/workflows/edit/page-11774efbc2fecae2.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/workflows/execution/page-8ec1aea90412c03d.js +1 -0
- package/dist/app/_next/static/chunks/app/(authenticated)/workflows/page-88bc5b36ccb0a1f7.js +1 -0
- package/dist/app/_next/static/chunks/app/(public)/forgot-password/page-ed263fd46ef81c20.js +1 -0
- package/dist/app/_next/static/chunks/app/(public)/layout-f538977545844af8.js +1 -0
- package/dist/app/_next/static/chunks/app/(public)/login/page-c0a10b137f346096.js +1 -0
- package/dist/app/_next/static/chunks/app/(public)/register/page-4cb7644893efd9b3.js +1 -0
- package/dist/app/_next/static/chunks/app/_not-found/page-653f8815b78256cc.js +1 -0
- package/dist/app/_next/static/chunks/app/layout-591ca7a3e16528a1.js +1 -0
- package/dist/app/_next/static/chunks/app/page-dd19d124b5fa2577.js +1 -0
- package/dist/app/_next/static/chunks/c37d3baf.c2ff165f5b02c692.js +1 -0
- package/dist/app/_next/static/chunks/d0deef33.0379166a4ec23470.js +1 -0
- package/dist/app/_next/static/chunks/fd9d1056-54169f07cd680d6c.js +1 -0
- package/dist/app/_next/static/chunks/framework-8e0e0f4a6b83a956.js +1 -0
- package/dist/app/_next/static/chunks/main-324e91f5a430cddf.js +1 -0
- package/dist/app/_next/static/chunks/main-app-55bcae20c77aaf0e.js +1 -0
- package/dist/app/_next/static/chunks/pages/_app-3c9ca398d360b709.js +1 -0
- package/dist/app/_next/static/chunks/pages/_error-cf5ca766ac8f493f.js +1 -0
- package/dist/app/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/app/_next/static/chunks/webpack-2c306566f7ee1b63.js +1 -0
- package/dist/app/_next/static/css/6c4002bae4e236b2.css +3 -0
- package/dist/app/_next/static/css/a275cc2b185e04f8.css +1 -0
- package/dist/app/_next/static/eCWhKA8XHqmB1zgFcEtN2/_buildManifest.js +1 -0
- package/dist/app/_next/static/eCWhKA8XHqmB1zgFcEtN2/_ssgManifest.js +1 -0
- package/dist/app/activity-log/all-activity/index.html +1 -0
- package/dist/app/activity-log/all-activity/index.txt +14 -0
- package/dist/app/activity-log/email-log/index.html +1 -0
- package/dist/app/activity-log/email-log/index.txt +14 -0
- package/dist/app/activity-log/index.html +1 -0
- package/dist/app/activity-log/index.txt +14 -0
- package/dist/app/activity-log/notifications/index.html +1 -0
- package/dist/app/activity-log/notifications/index.txt +14 -0
- package/dist/app/activity-log/sessions/index.html +1 -0
- package/dist/app/activity-log/sessions/index.txt +14 -0
- package/dist/app/activity-log/workflow-executions/index.html +1 -0
- package/dist/app/activity-log/workflow-executions/index.txt +14 -0
- package/dist/app/activity-log/workflow-logs/index.html +1 -0
- package/dist/app/activity-log/workflow-logs/index.txt +14 -0
- package/dist/app/change-password/index.html +1 -0
- package/dist/app/change-password/index.txt +14 -0
- package/dist/app/dashboard/index.html +1 -0
- package/dist/app/dashboard/index.txt +14 -0
- package/dist/app/data-browser/index.html +1 -0
- package/dist/app/data-browser/index.txt +14 -0
- package/dist/app/file-manager/index.html +1 -0
- package/dist/app/file-manager/index.txt +14 -0
- package/dist/app/forgot-password/index.html +1 -0
- package/dist/app/forgot-password/index.txt +13 -0
- package/dist/app/index.html +1 -0
- package/dist/app/index.txt +9 -0
- package/dist/app/login/index.html +1 -0
- package/dist/app/login/index.txt +13 -0
- package/dist/app/logo-dark.png +0 -0
- package/dist/app/logo-icon.svg +81 -0
- package/dist/app/logo-light.png +0 -0
- package/dist/app/register/index.html +1 -0
- package/dist/app/register/index.txt +13 -0
- package/dist/app/settings/migrations/index.html +1 -0
- package/dist/app/settings/migrations/index.txt +14 -0
- package/dist/app/settings/permissions/index.html +1 -0
- package/dist/app/settings/permissions/index.txt +14 -0
- package/dist/app/settings/project/index.html +1 -0
- package/dist/app/settings/project/index.txt +14 -0
- package/dist/app/settings/roles/index.html +1 -0
- package/dist/app/settings/roles/index.txt +14 -0
- package/dist/app/settings/schema/index.html +1 -0
- package/dist/app/settings/schema/index.txt +14 -0
- package/dist/app/settings/tasks/index.html +1 -0
- package/dist/app/settings/tasks/index.txt +14 -0
- package/dist/app/settings/templates/edit/index.html +1 -0
- package/dist/app/settings/templates/edit/index.txt +14 -0
- package/dist/app/settings/templates/index.html +1 -0
- package/dist/app/settings/templates/index.txt +14 -0
- package/dist/app/settings/tenants/index.html +1 -0
- package/dist/app/settings/tenants/index.txt +14 -0
- package/dist/app/users/index.html +1 -0
- package/dist/app/users/index.txt +14 -0
- package/dist/app/users/invites/index.html +1 -0
- package/dist/app/users/invites/index.txt +14 -0
- package/dist/app/users/list/index.html +1 -0
- package/dist/app/users/list/index.txt +14 -0
- package/dist/app/users/preferences/index.html +1 -0
- package/dist/app/users/preferences/index.txt +14 -0
- package/dist/app/users/user-roles/index.html +1 -0
- package/dist/app/users/user-roles/index.txt +14 -0
- package/dist/app/workflows/detail/index.html +1 -0
- package/dist/app/workflows/detail/index.txt +14 -0
- package/dist/app/workflows/edit/index.html +1 -0
- package/dist/app/workflows/edit/index.txt +14 -0
- package/dist/app/workflows/execution/index.html +1 -0
- package/dist/app/workflows/execution/index.txt +14 -0
- package/dist/app/workflows/index.html +1 -0
- package/dist/app/workflows/index.txt +14 -0
- package/dist/app.d.ts +36 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +546 -0
- package/dist/app.js.map +1 -0
- package/dist/auth/adapters/baasix-adapter.d.ts +12 -0
- package/dist/auth/adapters/baasix-adapter.d.ts.map +1 -0
- package/dist/auth/adapters/baasix-adapter.js +318 -0
- package/dist/auth/adapters/baasix-adapter.js.map +1 -0
- package/dist/auth/adapters/index.d.ts +6 -0
- package/dist/auth/adapters/index.d.ts.map +1 -0
- package/dist/auth/adapters/index.js +5 -0
- package/dist/auth/adapters/index.js.map +1 -0
- package/dist/auth/core.d.ts +73 -0
- package/dist/auth/core.d.ts.map +1 -0
- package/dist/auth/core.js +528 -0
- package/dist/auth/core.js.map +1 -0
- package/dist/auth/index.d.ts +56 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +58 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oauth2/index.d.ts +5 -0
- package/dist/auth/oauth2/index.d.ts.map +1 -0
- package/dist/auth/oauth2/index.js +5 -0
- package/dist/auth/oauth2/index.js.map +1 -0
- package/dist/auth/oauth2/utils.d.ts +90 -0
- package/dist/auth/oauth2/utils.d.ts.map +1 -0
- package/dist/auth/oauth2/utils.js +167 -0
- package/dist/auth/oauth2/utils.js.map +1 -0
- package/dist/auth/providers/apple.d.ts +28 -0
- package/dist/auth/providers/apple.d.ts.map +1 -0
- package/dist/auth/providers/apple.js +192 -0
- package/dist/auth/providers/apple.js.map +1 -0
- package/dist/auth/providers/credential.d.ts +87 -0
- package/dist/auth/providers/credential.d.ts.map +1 -0
- package/dist/auth/providers/credential.js +162 -0
- package/dist/auth/providers/credential.js.map +1 -0
- package/dist/auth/providers/facebook.d.ts +26 -0
- package/dist/auth/providers/facebook.d.ts.map +1 -0
- package/dist/auth/providers/facebook.js +112 -0
- package/dist/auth/providers/facebook.js.map +1 -0
- package/dist/auth/providers/github.d.ts +29 -0
- package/dist/auth/providers/github.d.ts.map +1 -0
- package/dist/auth/providers/github.js +144 -0
- package/dist/auth/providers/github.js.map +1 -0
- package/dist/auth/providers/google.d.ts +32 -0
- package/dist/auth/providers/google.d.ts.map +1 -0
- package/dist/auth/providers/google.js +145 -0
- package/dist/auth/providers/google.js.map +1 -0
- package/dist/auth/providers/index.d.ts +22 -0
- package/dist/auth/providers/index.d.ts.map +1 -0
- package/dist/auth/providers/index.js +17 -0
- package/dist/auth/providers/index.js.map +1 -0
- package/dist/auth/routes.d.ts +63 -0
- package/dist/auth/routes.d.ts.map +1 -0
- package/dist/auth/routes.js +827 -0
- package/dist/auth/routes.js.map +1 -0
- package/dist/auth/services/index.d.ts +10 -0
- package/dist/auth/services/index.d.ts.map +1 -0
- package/dist/auth/services/index.js +7 -0
- package/dist/auth/services/index.js.map +1 -0
- package/dist/auth/services/session.d.ts +81 -0
- package/dist/auth/services/session.d.ts.map +1 -0
- package/dist/auth/services/session.js +186 -0
- package/dist/auth/services/session.js.map +1 -0
- package/dist/auth/services/token.d.ts +41 -0
- package/dist/auth/services/token.d.ts.map +1 -0
- package/dist/auth/services/token.js +44 -0
- package/dist/auth/services/token.js.map +1 -0
- package/dist/auth/services/verification.d.ts +77 -0
- package/dist/auth/services/verification.d.ts.map +1 -0
- package/dist/auth/services/verification.js +143 -0
- package/dist/auth/services/verification.js.map +1 -0
- package/dist/auth/types.d.ts +318 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +6 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/customTypes/arrays.d.ts +200 -0
- package/dist/customTypes/arrays.d.ts.map +1 -0
- package/dist/customTypes/arrays.js +309 -0
- package/dist/customTypes/arrays.js.map +1 -0
- package/dist/customTypes/index.d.ts +8 -0
- package/dist/customTypes/index.d.ts.map +1 -0
- package/dist/customTypes/index.js +11 -0
- package/dist/customTypes/index.js.map +1 -0
- package/dist/customTypes/postgis.d.ts +146 -0
- package/dist/customTypes/postgis.d.ts.map +1 -0
- package/dist/customTypes/postgis.js +315 -0
- package/dist/customTypes/postgis.js.map +1 -0
- package/dist/customTypes/ranges.d.ts +128 -0
- package/dist/customTypes/ranges.d.ts.map +1 -0
- package/dist/customTypes/ranges.js +257 -0
- package/dist/customTypes/ranges.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/0.1.0-alpha.0_initial_setup.d.ts +29 -0
- package/dist/migrations/0.1.0-alpha.0_initial_setup.d.ts.map +1 -0
- package/dist/migrations/0.1.0-alpha.0_initial_setup.js +72 -0
- package/dist/migrations/0.1.0-alpha.0_initial_setup.js.map +1 -0
- package/dist/migrations/_example_migration.d.ts +31 -0
- package/dist/migrations/_example_migration.d.ts.map +1 -0
- package/dist/migrations/_example_migration.js +75 -0
- package/dist/migrations/_example_migration.js.map +1 -0
- package/dist/plugins/definePlugin.d.ts +49 -0
- package/dist/plugins/definePlugin.d.ts.map +1 -0
- package/dist/plugins/definePlugin.js +131 -0
- package/dist/plugins/definePlugin.js.map +1 -0
- package/dist/plugins/softDelete.d.ts +179 -0
- package/dist/plugins/softDelete.d.ts.map +1 -0
- package/dist/plugins/softDelete.js +235 -0
- package/dist/plugins/softDelete.js.map +1 -0
- package/dist/routes/auth.route.d.ts +14 -0
- package/dist/routes/auth.route.d.ts.map +1 -0
- package/dist/routes/auth.route.js +421 -0
- package/dist/routes/auth.route.js.map +1 -0
- package/dist/routes/file.route.d.ts +7 -0
- package/dist/routes/file.route.d.ts.map +1 -0
- package/dist/routes/file.route.js +274 -0
- package/dist/routes/file.route.js.map +1 -0
- package/dist/routes/items.route.d.ts +7 -0
- package/dist/routes/items.route.d.ts.map +1 -0
- package/dist/routes/items.route.js +369 -0
- package/dist/routes/items.route.js.map +1 -0
- package/dist/routes/migration.route.d.ts +7 -0
- package/dist/routes/migration.route.d.ts.map +1 -0
- package/dist/routes/migration.route.js +225 -0
- package/dist/routes/migration.route.js.map +1 -0
- package/dist/routes/notification.route.d.ts +7 -0
- package/dist/routes/notification.route.d.ts.map +1 -0
- package/dist/routes/notification.route.js +124 -0
- package/dist/routes/notification.route.js.map +1 -0
- package/dist/routes/openapi.route.d.ts +7 -0
- package/dist/routes/openapi.route.d.ts.map +1 -0
- package/dist/routes/openapi.route.js +2169 -0
- package/dist/routes/openapi.route.js.map +1 -0
- package/dist/routes/permission.route.d.ts +7 -0
- package/dist/routes/permission.route.d.ts.map +1 -0
- package/dist/routes/permission.route.js +158 -0
- package/dist/routes/permission.route.js.map +1 -0
- package/dist/routes/realtime.route.d.ts +21 -0
- package/dist/routes/realtime.route.d.ts.map +1 -0
- package/dist/routes/realtime.route.js +243 -0
- package/dist/routes/realtime.route.js.map +1 -0
- package/dist/routes/reports.route.d.ts +7 -0
- package/dist/routes/reports.route.d.ts.map +1 -0
- package/dist/routes/reports.route.js +95 -0
- package/dist/routes/reports.route.js.map +1 -0
- package/dist/routes/schema.route.d.ts +7 -0
- package/dist/routes/schema.route.d.ts.map +1 -0
- package/dist/routes/schema.route.js +1780 -0
- package/dist/routes/schema.route.js.map +1 -0
- package/dist/routes/settings.route.d.ts +7 -0
- package/dist/routes/settings.route.d.ts.map +1 -0
- package/dist/routes/settings.route.js +154 -0
- package/dist/routes/settings.route.js.map +1 -0
- package/dist/routes/templates.route.d.ts +7 -0
- package/dist/routes/templates.route.d.ts.map +1 -0
- package/dist/routes/templates.route.js +91 -0
- package/dist/routes/templates.route.js.map +1 -0
- package/dist/routes/utils.route.d.ts +7 -0
- package/dist/routes/utils.route.d.ts.map +1 -0
- package/dist/routes/utils.route.js +33 -0
- package/dist/routes/utils.route.js.map +1 -0
- package/dist/routes/workflow.route.d.ts +7 -0
- package/dist/routes/workflow.route.d.ts.map +1 -0
- package/dist/routes/workflow.route.js +787 -0
- package/dist/routes/workflow.route.js.map +1 -0
- package/dist/services/AssetsService.d.ts +39 -0
- package/dist/services/AssetsService.d.ts.map +1 -0
- package/dist/services/AssetsService.js +255 -0
- package/dist/services/AssetsService.js.map +1 -0
- package/dist/services/CacheService.d.ts +169 -0
- package/dist/services/CacheService.d.ts.map +1 -0
- package/dist/services/CacheService.js +722 -0
- package/dist/services/CacheService.js.map +1 -0
- package/dist/services/FilesService.d.ts +30 -0
- package/dist/services/FilesService.d.ts.map +1 -0
- package/dist/services/FilesService.js +268 -0
- package/dist/services/FilesService.js.map +1 -0
- package/dist/services/HooksManager.d.ts +38 -0
- package/dist/services/HooksManager.d.ts.map +1 -0
- package/dist/services/HooksManager.js +165 -0
- package/dist/services/HooksManager.js.map +1 -0
- package/dist/services/ItemsService.d.ts +273 -0
- package/dist/services/ItemsService.d.ts.map +1 -0
- package/dist/services/ItemsService.js +2458 -0
- package/dist/services/ItemsService.js.map +1 -0
- package/dist/services/MailService.d.ts +76 -0
- package/dist/services/MailService.d.ts.map +1 -0
- package/dist/services/MailService.js +585 -0
- package/dist/services/MailService.js.map +1 -0
- package/dist/services/MigrationService.d.ts +243 -0
- package/dist/services/MigrationService.d.ts.map +1 -0
- package/dist/services/MigrationService.js +914 -0
- package/dist/services/MigrationService.js.map +1 -0
- package/dist/services/NotificationService.d.ts +35 -0
- package/dist/services/NotificationService.d.ts.map +1 -0
- package/dist/services/NotificationService.js +159 -0
- package/dist/services/NotificationService.js.map +1 -0
- package/dist/services/PermissionService.d.ts +128 -0
- package/dist/services/PermissionService.d.ts.map +1 -0
- package/dist/services/PermissionService.js +373 -0
- package/dist/services/PermissionService.js.map +1 -0
- package/dist/services/PluginManager.d.ts +138 -0
- package/dist/services/PluginManager.d.ts.map +1 -0
- package/dist/services/PluginManager.js +463 -0
- package/dist/services/PluginManager.js.map +1 -0
- package/dist/services/RealtimeService.d.ts +209 -0
- package/dist/services/RealtimeService.d.ts.map +1 -0
- package/dist/services/RealtimeService.js +978 -0
- package/dist/services/RealtimeService.js.map +1 -0
- package/dist/services/ReportService.d.ts +13 -0
- package/dist/services/ReportService.d.ts.map +1 -0
- package/dist/services/ReportService.js +91 -0
- package/dist/services/ReportService.js.map +1 -0
- package/dist/services/SettingsService.d.ts +60 -0
- package/dist/services/SettingsService.d.ts.map +1 -0
- package/dist/services/SettingsService.js +474 -0
- package/dist/services/SettingsService.js.map +1 -0
- package/dist/services/SocketService.d.ts +129 -0
- package/dist/services/SocketService.d.ts.map +1 -0
- package/dist/services/SocketService.js +600 -0
- package/dist/services/SocketService.js.map +1 -0
- package/dist/services/StatsService.d.ts +10 -0
- package/dist/services/StatsService.d.ts.map +1 -0
- package/dist/services/StatsService.js +40 -0
- package/dist/services/StatsService.js.map +1 -0
- package/dist/services/StorageService.d.ts +20 -0
- package/dist/services/StorageService.d.ts.map +1 -0
- package/dist/services/StorageService.js +164 -0
- package/dist/services/StorageService.js.map +1 -0
- package/dist/services/TasksService.d.ts +74 -0
- package/dist/services/TasksService.d.ts.map +1 -0
- package/dist/services/TasksService.js +404 -0
- package/dist/services/TasksService.js.map +1 -0
- package/dist/services/WorkflowService.d.ts +305 -0
- package/dist/services/WorkflowService.d.ts.map +1 -0
- package/dist/services/WorkflowService.js +1811 -0
- package/dist/services/WorkflowService.js.map +1 -0
- package/dist/templates/logo/logo.png +0 -0
- package/dist/templates/mails/default.liquid +23 -0
- package/dist/types/aggregation.d.ts +40 -0
- package/dist/types/aggregation.d.ts.map +1 -0
- package/dist/types/aggregation.js +6 -0
- package/dist/types/aggregation.js.map +1 -0
- package/dist/types/assets.d.ts +32 -0
- package/dist/types/assets.d.ts.map +1 -0
- package/dist/types/assets.js +6 -0
- package/dist/types/assets.js.map +1 -0
- package/dist/types/auth.d.ts +50 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +6 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/cache.d.ts +47 -0
- package/dist/types/cache.d.ts.map +1 -0
- package/dist/types/cache.js +6 -0
- package/dist/types/cache.js.map +1 -0
- package/dist/types/database.d.ts +16 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/database.js +6 -0
- package/dist/types/database.js.map +1 -0
- package/dist/types/fields.d.ts +71 -0
- package/dist/types/fields.d.ts.map +1 -0
- package/dist/types/fields.js +6 -0
- package/dist/types/fields.js.map +1 -0
- package/dist/types/files.d.ts +33 -0
- package/dist/types/files.d.ts.map +1 -0
- package/dist/types/files.js +6 -0
- package/dist/types/files.js.map +1 -0
- package/dist/types/hooks.d.ts +29 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/hooks.js +6 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/import-export.d.ts +62 -0
- package/dist/types/import-export.d.ts.map +1 -0
- package/dist/types/import-export.js +6 -0
- package/dist/types/import-export.js.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +58 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mail.d.ts +34 -0
- package/dist/types/mail.d.ts.map +1 -0
- package/dist/types/mail.js +6 -0
- package/dist/types/mail.js.map +1 -0
- package/dist/types/notifications.d.ts +16 -0
- package/dist/types/notifications.d.ts.map +1 -0
- package/dist/types/notifications.js +6 -0
- package/dist/types/notifications.js.map +1 -0
- package/dist/types/plugin.d.ts +351 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +8 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/types/query.d.ts +71 -0
- package/dist/types/query.d.ts.map +1 -0
- package/dist/types/query.js +6 -0
- package/dist/types/query.js.map +1 -0
- package/dist/types/relations.d.ts +111 -0
- package/dist/types/relations.d.ts.map +1 -0
- package/dist/types/relations.js +6 -0
- package/dist/types/relations.js.map +1 -0
- package/dist/types/reports.d.ts +17 -0
- package/dist/types/reports.d.ts.map +1 -0
- package/dist/types/reports.js +6 -0
- package/dist/types/reports.js.map +1 -0
- package/dist/types/schema.d.ts +26 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +6 -0
- package/dist/types/schema.js.map +1 -0
- package/dist/types/seed.d.ts +27 -0
- package/dist/types/seed.d.ts.map +1 -0
- package/dist/types/seed.js +6 -0
- package/dist/types/seed.js.map +1 -0
- package/dist/types/services.d.ts +68 -0
- package/dist/types/services.d.ts.map +1 -0
- package/dist/types/services.js +6 -0
- package/dist/types/services.js.map +1 -0
- package/dist/types/settings.d.ts +36 -0
- package/dist/types/settings.d.ts.map +1 -0
- package/dist/types/settings.js +6 -0
- package/dist/types/settings.js.map +1 -0
- package/dist/types/sockets.d.ts +26 -0
- package/dist/types/sockets.d.ts.map +1 -0
- package/dist/types/sockets.js +6 -0
- package/dist/types/sockets.js.map +1 -0
- package/dist/types/sort.d.ts +25 -0
- package/dist/types/sort.d.ts.map +1 -0
- package/dist/types/sort.js +6 -0
- package/dist/types/sort.js.map +1 -0
- package/dist/types/spatial.d.ts +19 -0
- package/dist/types/spatial.d.ts.map +1 -0
- package/dist/types/spatial.js +6 -0
- package/dist/types/spatial.js.map +1 -0
- package/dist/types/stats.d.ts +21 -0
- package/dist/types/stats.d.ts.map +1 -0
- package/dist/types/stats.js +6 -0
- package/dist/types/stats.js.map +1 -0
- package/dist/types/storage.d.ts +19 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +6 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/types/tasks.d.ts +14 -0
- package/dist/types/tasks.d.ts.map +1 -0
- package/dist/types/tasks.js +6 -0
- package/dist/types/tasks.js.map +1 -0
- package/dist/types/utils.d.ts +54 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/types/utils.js +6 -0
- package/dist/types/utils.js.map +1 -0
- package/dist/types/workflow.d.ts +17 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +6 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/utils/aggregationUtils.d.ts +192 -0
- package/dist/utils/aggregationUtils.d.ts.map +1 -0
- package/dist/utils/aggregationUtils.js +450 -0
- package/dist/utils/aggregationUtils.js.map +1 -0
- package/dist/utils/auth.d.ts +93 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +557 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/cache.d.ts +64 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +464 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/common.d.ts +53 -0
- package/dist/utils/common.d.ts.map +1 -0
- package/dist/utils/common.js +162 -0
- package/dist/utils/common.js.map +1 -0
- package/dist/utils/db.d.ts +101 -0
- package/dist/utils/db.d.ts.map +1 -0
- package/dist/utils/db.js +413 -0
- package/dist/utils/db.js.map +1 -0
- package/dist/utils/dirname.d.ts +30 -0
- package/dist/utils/dirname.d.ts.map +1 -0
- package/dist/utils/dirname.js +95 -0
- package/dist/utils/dirname.js.map +1 -0
- package/dist/utils/dynamicVariableResolver.d.ts +17 -0
- package/dist/utils/dynamicVariableResolver.d.ts.map +1 -0
- package/dist/utils/dynamicVariableResolver.js +262 -0
- package/dist/utils/dynamicVariableResolver.js.map +1 -0
- package/dist/utils/env.d.ts +38 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +80 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/errorHandler.d.ts +14 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +79 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/dist/utils/fieldExpansion.d.ts +30 -0
- package/dist/utils/fieldExpansion.d.ts.map +1 -0
- package/dist/utils/fieldExpansion.js +145 -0
- package/dist/utils/fieldExpansion.js.map +1 -0
- package/dist/utils/fieldUtils.d.ts +179 -0
- package/dist/utils/fieldUtils.d.ts.map +1 -0
- package/dist/utils/fieldUtils.js +424 -0
- package/dist/utils/fieldUtils.js.map +1 -0
- package/dist/utils/filterOperators.d.ts +472 -0
- package/dist/utils/filterOperators.d.ts.map +1 -0
- package/dist/utils/filterOperators.js +1229 -0
- package/dist/utils/filterOperators.js.map +1 -0
- package/dist/utils/importUtils.d.ts +127 -0
- package/dist/utils/importUtils.d.ts.map +1 -0
- package/dist/utils/importUtils.js +437 -0
- package/dist/utils/importUtils.js.map +1 -0
- package/dist/utils/index.d.ts +75 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +101 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +41 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +217 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/orderUtils.d.ts +117 -0
- package/dist/utils/orderUtils.d.ts.map +1 -0
- package/dist/utils/orderUtils.js +249 -0
- package/dist/utils/orderUtils.js.map +1 -0
- package/dist/utils/queryBuilder.d.ts +118 -0
- package/dist/utils/queryBuilder.d.ts.map +1 -0
- package/dist/utils/queryBuilder.js +489 -0
- package/dist/utils/queryBuilder.js.map +1 -0
- package/dist/utils/relationLoader.d.ts +65 -0
- package/dist/utils/relationLoader.d.ts.map +1 -0
- package/dist/utils/relationLoader.js +1081 -0
- package/dist/utils/relationLoader.js.map +1 -0
- package/dist/utils/relationPathResolver.d.ts +30 -0
- package/dist/utils/relationPathResolver.d.ts.map +1 -0
- package/dist/utils/relationPathResolver.js +173 -0
- package/dist/utils/relationPathResolver.js.map +1 -0
- package/dist/utils/relationUtils.d.ts +139 -0
- package/dist/utils/relationUtils.d.ts.map +1 -0
- package/dist/utils/relationUtils.js +711 -0
- package/dist/utils/relationUtils.js.map +1 -0
- package/dist/utils/router.d.ts +6 -0
- package/dist/utils/router.d.ts.map +1 -0
- package/dist/utils/router.js +95 -0
- package/dist/utils/router.js.map +1 -0
- package/dist/utils/schema.d.ts +88 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +24 -0
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/schemaManager.d.ts +238 -0
- package/dist/utils/schemaManager.d.ts.map +1 -0
- package/dist/utils/schemaManager.js +1992 -0
- package/dist/utils/schemaManager.js.map +1 -0
- package/dist/utils/schemaValidator.d.ts +83 -0
- package/dist/utils/schemaValidator.d.ts.map +1 -0
- package/dist/utils/schemaValidator.js +491 -0
- package/dist/utils/schemaValidator.js.map +1 -0
- package/dist/utils/seed.d.ts +45 -0
- package/dist/utils/seed.d.ts.map +1 -0
- package/dist/utils/seed.js +248 -0
- package/dist/utils/seed.js.map +1 -0
- package/dist/utils/sessionCleanup.d.ts +10 -0
- package/dist/utils/sessionCleanup.d.ts.map +1 -0
- package/dist/utils/sessionCleanup.js +49 -0
- package/dist/utils/sessionCleanup.js.map +1 -0
- package/dist/utils/sortUtils.d.ts +117 -0
- package/dist/utils/sortUtils.d.ts.map +1 -0
- package/dist/utils/sortUtils.js +232 -0
- package/dist/utils/sortUtils.js.map +1 -0
- package/dist/utils/spatialUtils.d.ts +244 -0
- package/dist/utils/spatialUtils.d.ts.map +1 -0
- package/dist/utils/spatialUtils.js +359 -0
- package/dist/utils/spatialUtils.js.map +1 -0
- package/dist/utils/systemschema.d.ts +11040 -0
- package/dist/utils/systemschema.d.ts.map +1 -0
- package/dist/utils/systemschema.js +1777 -0
- package/dist/utils/systemschema.js.map +1 -0
- package/dist/utils/tenantUtils.d.ts +34 -0
- package/dist/utils/tenantUtils.d.ts.map +1 -0
- package/dist/utils/tenantUtils.js +124 -0
- package/dist/utils/tenantUtils.js.map +1 -0
- package/dist/utils/typeMapper.d.ts +25 -0
- package/dist/utils/typeMapper.d.ts.map +1 -0
- package/dist/utils/typeMapper.js +282 -0
- package/dist/utils/typeMapper.js.map +1 -0
- package/dist/utils/valueValidator.d.ts +60 -0
- package/dist/utils/valueValidator.d.ts.map +1 -0
- package/dist/utils/valueValidator.js +303 -0
- package/dist/utils/valueValidator.js.map +1 -0
- package/dist/utils/workflow.d.ts +87 -0
- package/dist/utils/workflow.d.ts.map +1 -0
- package/dist/utils/workflow.js +205 -0
- package/dist/utils/workflow.js.map +1 -0
- package/package.json +115 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common utilities for routes
|
|
3
|
+
* Contains reusable functions that are duplicated across multiple route files
|
|
4
|
+
*/
|
|
5
|
+
import { schemaManager } from "./schemaManager.js";
|
|
6
|
+
import { APIError } from "./errorHandler.js";
|
|
7
|
+
import { getCache } from "./cache.js";
|
|
8
|
+
import { getCacheService } from "./db.js";
|
|
9
|
+
import settingsService from "../services/SettingsService.js";
|
|
10
|
+
import env from "./env.js";
|
|
11
|
+
/**
|
|
12
|
+
* Middleware to check if a model/collection exists
|
|
13
|
+
* Used in: items.route.ts, reports.route.ts
|
|
14
|
+
*/
|
|
15
|
+
export const modelExistsMiddleware = (req, res, next) => {
|
|
16
|
+
const modelName = req.params.collection;
|
|
17
|
+
if (!schemaManager.modelExists(modelName)) {
|
|
18
|
+
return next(new APIError(`Model ${modelName} not found`, 404));
|
|
19
|
+
}
|
|
20
|
+
next();
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Throws APIError if user is not authenticated
|
|
24
|
+
* Used in: notification.route.ts (4 times)
|
|
25
|
+
*/
|
|
26
|
+
export function requireAuth(req) {
|
|
27
|
+
if (!req.accountability?.user?.id) {
|
|
28
|
+
throw new APIError("Authentication required", 401);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if a collection has a tenant_Id field (supports tenant isolation)
|
|
33
|
+
*/
|
|
34
|
+
export function collectionHasTenantField(collection) {
|
|
35
|
+
try {
|
|
36
|
+
const table = schemaManager.getTable(collection);
|
|
37
|
+
// Check if table has tenant_Id column
|
|
38
|
+
return 'tenant_Id' in table;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validates and adjusts accountability for imports
|
|
46
|
+
*
|
|
47
|
+
* Rules:
|
|
48
|
+
* - User must be authenticated (not public)
|
|
49
|
+
* - In multi-tenant mode, for collections with tenant_Id field:
|
|
50
|
+
* - Tenant-specific users: use their tenant from accountability (already set)
|
|
51
|
+
* - Administrators/non-tenant-specific users: must provide tenant in body
|
|
52
|
+
* - In single-tenant mode or for collections without tenant_Id: no tenant handling needed
|
|
53
|
+
*
|
|
54
|
+
* Used in: items.route.ts (import-csv and import-json)
|
|
55
|
+
*/
|
|
56
|
+
export function getImportAccountability(req, collection) {
|
|
57
|
+
const accountability = req.accountability;
|
|
58
|
+
// Check if user is authenticated (not public)
|
|
59
|
+
if (!accountability?.user?.id) {
|
|
60
|
+
throw new APIError("Authentication required for import operations", 401);
|
|
61
|
+
}
|
|
62
|
+
const isMultiTenant = env.get('MULTI_TENANT') === 'true';
|
|
63
|
+
// If not multi-tenant mode, just return original accountability
|
|
64
|
+
if (!isMultiTenant) {
|
|
65
|
+
return accountability;
|
|
66
|
+
}
|
|
67
|
+
// Check if the collection supports tenant isolation
|
|
68
|
+
const hasTenantField = collection ? collectionHasTenantField(collection) : false;
|
|
69
|
+
// If collection doesn't have tenant field, no tenant handling needed
|
|
70
|
+
if (!hasTenantField) {
|
|
71
|
+
return accountability;
|
|
72
|
+
}
|
|
73
|
+
// Check if user has a tenant-specific role (accountability already has tenant set)
|
|
74
|
+
const isTenantSpecific = accountability?.role?.isTenantSpecific === true;
|
|
75
|
+
const userTenant = accountability?.tenant;
|
|
76
|
+
if (isTenantSpecific && userTenant) {
|
|
77
|
+
// Tenant-specific users: tenant is already in accountability, just return it
|
|
78
|
+
return accountability;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Administrators or non-tenant-specific users
|
|
82
|
+
// They must provide tenant in body for tenant-enabled tables
|
|
83
|
+
const tenant = req.body?.tenant;
|
|
84
|
+
if (tenant) {
|
|
85
|
+
return {
|
|
86
|
+
...accountability,
|
|
87
|
+
tenant: tenant,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
throw new APIError("Tenant is required for importing into tenant-enabled collections. Provide 'tenant' in the request body.", 400);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Invalidate auth cache for a specific role or all roles
|
|
97
|
+
* Used in: permission.route.ts
|
|
98
|
+
*/
|
|
99
|
+
export async function invalidateAuthCache(roleId) {
|
|
100
|
+
try {
|
|
101
|
+
const cache = getCache();
|
|
102
|
+
if (roleId) {
|
|
103
|
+
const cacheKey = `auth:role:${roleId}:permissions`;
|
|
104
|
+
await cache.delete(cacheKey);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
await cache.invalidateModel("auth");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error(`[Common] Failed to invalidate auth cache:`, error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Invalidate cache for a collection
|
|
116
|
+
* Used in: permission.route.ts
|
|
117
|
+
*/
|
|
118
|
+
export async function invalidateCollectionCache(collection) {
|
|
119
|
+
try {
|
|
120
|
+
const cache = getCacheService();
|
|
121
|
+
if (cache) {
|
|
122
|
+
await cache.onMutate({ tables: [collection] });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error(`[Common] Failed to invalidate cache for ${collection}:`, error);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Invalidate settings cache for a tenant or global
|
|
131
|
+
* Used in: items.route.ts
|
|
132
|
+
* @param corsInvalidator - Function to invalidate CORS cache (from app.ts)
|
|
133
|
+
*/
|
|
134
|
+
export async function invalidateSettingsCache(item, corsInvalidator) {
|
|
135
|
+
try {
|
|
136
|
+
const tenantId = item?.tenant_Id;
|
|
137
|
+
console.info(`Settings modified - invalidating cache for tenant: ${tenantId || "global"}`);
|
|
138
|
+
if (tenantId) {
|
|
139
|
+
await settingsService.invalidateTenantCache(tenantId);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
await settingsService.loadGlobalSettings();
|
|
143
|
+
await settingsService.invalidateAllCaches();
|
|
144
|
+
}
|
|
145
|
+
if (corsInvalidator) {
|
|
146
|
+
corsInvalidator();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
console.error("Error invalidating settings cache:", error);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Invalidate settings cache after import (always invalidates all)
|
|
155
|
+
* Used in: items.route.ts (import-csv and import-json)
|
|
156
|
+
*/
|
|
157
|
+
export async function invalidateSettingsCacheAfterImport() {
|
|
158
|
+
console.info(`Settings imported - invalidating all caches`);
|
|
159
|
+
await settingsService.loadGlobalSettings();
|
|
160
|
+
await settingsService.invalidateAllCaches();
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../baasix/utils/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Connection Layer for Drizzle ORM
|
|
3
|
+
* Provides PostgreSQL connection with pooling, SSL support, and read replicas
|
|
4
|
+
* Matches Sequelize database configuration for parity
|
|
5
|
+
*/
|
|
6
|
+
import { drizzle, PostgresJsDatabase } from 'drizzle-orm/postgres-js';
|
|
7
|
+
import postgres from 'postgres';
|
|
8
|
+
import type { Transaction as TransactionType } from '../types/database.js';
|
|
9
|
+
declare global {
|
|
10
|
+
var __baasix_db: ReturnType<typeof drizzle> | null;
|
|
11
|
+
var __baasix_sql: ReturnType<typeof postgres> | null;
|
|
12
|
+
var __baasix_readSql: ReturnType<typeof postgres> | null;
|
|
13
|
+
}
|
|
14
|
+
type DrizzleDb = ReturnType<typeof drizzle>;
|
|
15
|
+
export type TransactionClient = Parameters<Parameters<DrizzleDb['transaction']>[0]>[0];
|
|
16
|
+
export type Transaction = TransactionType;
|
|
17
|
+
/**
|
|
18
|
+
* Initialize database connection
|
|
19
|
+
* Synchronous function that starts async cache initialization
|
|
20
|
+
*/
|
|
21
|
+
export declare function initializeDatabase(): PostgresJsDatabase<Record<string, unknown>>;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize database with cache service (async version)
|
|
24
|
+
* Use this when you need to ensure cache is ready before proceeding
|
|
25
|
+
*/
|
|
26
|
+
export declare function initializeDatabaseWithCache(): Promise<PostgresJsDatabase<Record<string, unknown>>>;
|
|
27
|
+
/**
|
|
28
|
+
* Get database instance (synchronous - initializes if needed)
|
|
29
|
+
*/
|
|
30
|
+
export declare function getDatabase(): PostgresJsDatabase<Record<string, unknown>>;
|
|
31
|
+
export declare const db: PostgresJsDatabase<Record<string, unknown>>;
|
|
32
|
+
/**
|
|
33
|
+
* Get postgres SQL client (for raw queries)
|
|
34
|
+
*/
|
|
35
|
+
export declare function getSqlClient(): postgres.Sql<{}>;
|
|
36
|
+
export declare const sqlClient: ReturnType<typeof postgres>;
|
|
37
|
+
/**
|
|
38
|
+
* Get read replica SQL client (if configured)
|
|
39
|
+
*/
|
|
40
|
+
export declare function getReadSqlClient(): postgres.Sql<{}>;
|
|
41
|
+
/**
|
|
42
|
+
* Close database connections
|
|
43
|
+
*/
|
|
44
|
+
export declare function closeDatabase(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Create a new transaction with Sequelize-compatible API
|
|
47
|
+
* Returns a transaction that must be explicitly committed or rolled back
|
|
48
|
+
*
|
|
49
|
+
* Usage matching Sequelize:
|
|
50
|
+
* const transaction = await createTransaction();
|
|
51
|
+
* try {
|
|
52
|
+
* await transaction.insert(table).values(data);
|
|
53
|
+
* await transaction.commit();
|
|
54
|
+
* } catch (error) {
|
|
55
|
+
* await transaction.rollback();
|
|
56
|
+
* throw error;
|
|
57
|
+
* }
|
|
58
|
+
*/
|
|
59
|
+
export declare function createTransaction(): Promise<Transaction>;
|
|
60
|
+
/**
|
|
61
|
+
* Test database connection
|
|
62
|
+
*/
|
|
63
|
+
export declare function testConnection(): Promise<boolean>;
|
|
64
|
+
/**
|
|
65
|
+
* Get PostgreSQL server version
|
|
66
|
+
* Returns { major: number, minor: number, full: string }
|
|
67
|
+
* Caches the result after first call
|
|
68
|
+
*/
|
|
69
|
+
export declare function getPostgresVersion(): Promise<{
|
|
70
|
+
major: number;
|
|
71
|
+
minor: number;
|
|
72
|
+
full: string;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* Check if PostgreSQL version supports a feature
|
|
76
|
+
* @param minMajor Minimum major version required
|
|
77
|
+
* @param minMinor Minimum minor version required (default: 0)
|
|
78
|
+
*/
|
|
79
|
+
export declare function isPgVersionAtLeast(minMajor: number, minMinor?: number): Promise<boolean>;
|
|
80
|
+
/**
|
|
81
|
+
* Get helper to extract instance ID
|
|
82
|
+
*/
|
|
83
|
+
export declare function getInstanceId(instance: any): any;
|
|
84
|
+
declare const _default: {
|
|
85
|
+
db: PostgresJsDatabase<Record<string, unknown>>;
|
|
86
|
+
sql: postgres.Sql<{}>;
|
|
87
|
+
initializeDatabase: typeof initializeDatabase;
|
|
88
|
+
initializeDatabaseWithCache: typeof initializeDatabaseWithCache;
|
|
89
|
+
getDatabase: typeof getDatabase;
|
|
90
|
+
getSqlClient: typeof getSqlClient;
|
|
91
|
+
getReadSqlClient: typeof getReadSqlClient;
|
|
92
|
+
closeDatabase: typeof closeDatabase;
|
|
93
|
+
createTransaction: typeof createTransaction;
|
|
94
|
+
testConnection: typeof testConnection;
|
|
95
|
+
getInstanceId: typeof getInstanceId;
|
|
96
|
+
getPostgresVersion: typeof getPostgresVersion;
|
|
97
|
+
isPgVersionAtLeast: typeof isPgVersionAtLeast;
|
|
98
|
+
};
|
|
99
|
+
export default _default;
|
|
100
|
+
export { getCacheService, closeCacheService, initializeCacheService } from '../services/CacheService.js';
|
|
101
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../baasix/utils/db.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,QAAQ,MAAM,UAAU,CAAC;AAKhC,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI3E,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,WAAW,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,GAAG,IAAI,CAAC;IACnD,IAAI,YAAY,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC;IACrD,IAAI,gBAAgB,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC;CAC1D;AAkBD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAG5C,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAGvF,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AA2B1C;;;GAGG;AACH,wBAAgB,kBAAkB,gDAqEjC;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,yDA0DhD;AAED;;GAEG;AACH,wBAAgB,WAAW,gDAK1B;AAKD,eAAO,MAAM,EAAE,6CAMb,CAAC;AAEH;;GAEG;AACH,wBAAgB,YAAY,qBAK3B;AAGD,eAAO,MAAM,SAAS,EAShB,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAElC;;GAEG;AACH,wBAAgB,gBAAgB,qBAK/B;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAiG9D;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAUvD;AAKD;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BlG;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAMhD;;;;;;;;;;;;;;;;AAED,wBAcE;AAGF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
|
package/dist/utils/db.js
ADDED
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Connection Layer for Drizzle ORM
|
|
3
|
+
* Provides PostgreSQL connection with pooling, SSL support, and read replicas
|
|
4
|
+
* Matches Sequelize database configuration for parity
|
|
5
|
+
*/
|
|
6
|
+
import { drizzle } from 'drizzle-orm/postgres-js';
|
|
7
|
+
import postgres from 'postgres';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import env from './env.js';
|
|
10
|
+
import { initializeCacheService, closeCacheService } from '../services/CacheService.js';
|
|
11
|
+
// Initialize globals if not already set
|
|
12
|
+
globalThis.__baasix_db = globalThis.__baasix_db ?? null;
|
|
13
|
+
globalThis.__baasix_sql = globalThis.__baasix_sql ?? null;
|
|
14
|
+
globalThis.__baasix_readSql = globalThis.__baasix_readSql ?? null;
|
|
15
|
+
// Use getters to access the global instances
|
|
16
|
+
const getDbInstance = () => globalThis.__baasix_db;
|
|
17
|
+
const setDbInstance = (val) => { globalThis.__baasix_db = val; };
|
|
18
|
+
const getSql = () => globalThis.__baasix_sql;
|
|
19
|
+
const setSql = (val) => { globalThis.__baasix_sql = val; };
|
|
20
|
+
const getReadSql = () => globalThis.__baasix_readSql;
|
|
21
|
+
const setReadSql = (val) => { globalThis.__baasix_readSql = val; };
|
|
22
|
+
const excludeModels = ['baasix_AuditLog', 'baasix_Sessions'];
|
|
23
|
+
/**
|
|
24
|
+
* Get database connection configuration
|
|
25
|
+
*/
|
|
26
|
+
function getConnectionConfig() {
|
|
27
|
+
const config = {
|
|
28
|
+
max: parseInt(env.get('DATABASE_POOL_MAX') || '20'),
|
|
29
|
+
idle_timeout: parseInt(env.get('DATABASE_POOL_IDLE') || '10000') / 1000, // Convert to seconds
|
|
30
|
+
connect_timeout: parseInt(env.get('DATABASE_POOL_ACQUIRE') || '30000') / 1000, // Convert to seconds
|
|
31
|
+
max_lifetime: parseInt(env.get('DATABASE_POOL_EVICT') || '1000') / 1000 * 60, // Convert to seconds
|
|
32
|
+
onnotice: env.get('DATABASE_LOGGING') === 'true' ? console.log : undefined,
|
|
33
|
+
};
|
|
34
|
+
// SSL configuration
|
|
35
|
+
if (env.get('DATABASE_SSL_CERTIFICATE') && env.get('DATABASE_SSL_CERTIFICATE') !== 'false') {
|
|
36
|
+
const caCert = fs.readFileSync(env.get('DATABASE_SSL_CERTIFICATE'));
|
|
37
|
+
config.ssl = {
|
|
38
|
+
ca: caCert.toString(),
|
|
39
|
+
rejectUnauthorized: env.get('DATABASE_SSL_REJECT_UNAUTHORIZED') === 'true',
|
|
40
|
+
};
|
|
41
|
+
console.info('Using SSL certificate for database connection');
|
|
42
|
+
}
|
|
43
|
+
return config;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Initialize database connection
|
|
47
|
+
* Synchronous function that starts async cache initialization
|
|
48
|
+
*/
|
|
49
|
+
export function initializeDatabase() {
|
|
50
|
+
if (getDbInstance()) {
|
|
51
|
+
return getDbInstance();
|
|
52
|
+
}
|
|
53
|
+
const config = getConnectionConfig();
|
|
54
|
+
// Start cache service initialization (async) but don't wait
|
|
55
|
+
// The cache will be available for subsequent queries
|
|
56
|
+
initializeCacheService().then(cacheService => {
|
|
57
|
+
if (cacheService && getDbInstance()) {
|
|
58
|
+
console.info('[Database] Cache service initialized and ready');
|
|
59
|
+
// Note: Drizzle cache is set during drizzle() initialization below
|
|
60
|
+
// We can't change it after creation, so cache is passed during init
|
|
61
|
+
}
|
|
62
|
+
}).catch(err => {
|
|
63
|
+
console.error('[Database] Cache service initialization failed:', err);
|
|
64
|
+
});
|
|
65
|
+
// Check if read replicas are enabled
|
|
66
|
+
if (env.get('DATABASE_READ_REPLICA_ENABLED') === 'true' && env.get('DATABASE_READ_REPLICA_URLS')) {
|
|
67
|
+
const readReplicaUrls = env.get('DATABASE_READ_REPLICA_URLS').split(',').map(url => url.trim());
|
|
68
|
+
// Write connection (primary)
|
|
69
|
+
setSql(postgres(env.get('DATABASE_URL'), {
|
|
70
|
+
...config,
|
|
71
|
+
debug: env.get('DATABASE_LOGGING') === 'true',
|
|
72
|
+
}));
|
|
73
|
+
// Read connections (replicas) - use first replica for now
|
|
74
|
+
// In production, could implement load balancing across replicas
|
|
75
|
+
const replicaConfig = {
|
|
76
|
+
max: parseInt(env.get('DATABASE_READ_REPLICA_POOL_MAX') || '20'),
|
|
77
|
+
idle_timeout: parseInt(env.get('DATABASE_READ_REPLICA_POOL_IDLE') || '10000') / 1000,
|
|
78
|
+
connect_timeout: parseInt(env.get('DATABASE_READ_REPLICA_POOL_ACQUIRE') || '30000') / 1000,
|
|
79
|
+
max_lifetime: parseInt(env.get('DATABASE_READ_REPLICA_POOL_EVICT') || '1000') / 1000 * 60,
|
|
80
|
+
onnotice: env.get('DATABASE_LOGGING') === 'true' ? console.log : undefined,
|
|
81
|
+
debug: env.get('DATABASE_LOGGING') === 'true',
|
|
82
|
+
};
|
|
83
|
+
// Copy SSL config to replica if configured
|
|
84
|
+
if (config.ssl) {
|
|
85
|
+
replicaConfig.ssl = config.ssl;
|
|
86
|
+
}
|
|
87
|
+
setReadSql(postgres(readReplicaUrls[0], replicaConfig));
|
|
88
|
+
setDbInstance(drizzle(getSql(), {
|
|
89
|
+
logger: env.get('DATABASE_LOGGING') === 'true',
|
|
90
|
+
// Cache will be initialized asynchronously and used on subsequent queries
|
|
91
|
+
}));
|
|
92
|
+
console.info(`Database initialized with read replicas: ${readReplicaUrls.length} replica(s) configured`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Single connection
|
|
96
|
+
setSql(postgres(env.get('DATABASE_URL'), {
|
|
97
|
+
...config,
|
|
98
|
+
debug: env.get('DATABASE_LOGGING') === 'true',
|
|
99
|
+
}));
|
|
100
|
+
setDbInstance(drizzle(getSql(), {
|
|
101
|
+
logger: env.get('DATABASE_LOGGING') === 'true',
|
|
102
|
+
// Cache will be initialized asynchronously and used on subsequent queries
|
|
103
|
+
}));
|
|
104
|
+
console.info('Database initialized without read replicas');
|
|
105
|
+
}
|
|
106
|
+
return getDbInstance();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Initialize database with cache service (async version)
|
|
110
|
+
* Use this when you need to ensure cache is ready before proceeding
|
|
111
|
+
*/
|
|
112
|
+
export async function initializeDatabaseWithCache() {
|
|
113
|
+
if (getDbInstance()) {
|
|
114
|
+
return getDbInstance();
|
|
115
|
+
}
|
|
116
|
+
const config = getConnectionConfig();
|
|
117
|
+
// Initialize cache service first and wait for it
|
|
118
|
+
const cacheService = await initializeCacheService();
|
|
119
|
+
// Check if read replicas are enabled
|
|
120
|
+
if (env.get('DATABASE_READ_REPLICA_ENABLED') === 'true' && env.get('DATABASE_READ_REPLICA_URLS')) {
|
|
121
|
+
const readReplicaUrls = env.get('DATABASE_READ_REPLICA_URLS').split(',').map(url => url.trim());
|
|
122
|
+
// Write connection (primary)
|
|
123
|
+
setSql(postgres(env.get('DATABASE_URL'), {
|
|
124
|
+
...config,
|
|
125
|
+
debug: env.get('DATABASE_LOGGING') === 'true',
|
|
126
|
+
}));
|
|
127
|
+
// Read connections (replicas)
|
|
128
|
+
const replicaConfig = {
|
|
129
|
+
max: parseInt(env.get('DATABASE_READ_REPLICA_POOL_MAX') || '20'),
|
|
130
|
+
idle_timeout: parseInt(env.get('DATABASE_READ_REPLICA_POOL_IDLE') || '10000') / 1000,
|
|
131
|
+
connect_timeout: parseInt(env.get('DATABASE_READ_REPLICA_POOL_ACQUIRE') || '30000') / 1000,
|
|
132
|
+
max_lifetime: parseInt(env.get('DATABASE_READ_REPLICA_POOL_EVICT') || '1000') / 1000 * 60,
|
|
133
|
+
onnotice: env.get('DATABASE_LOGGING') === 'true' ? console.log : undefined,
|
|
134
|
+
debug: env.get('DATABASE_LOGGING') === 'true',
|
|
135
|
+
};
|
|
136
|
+
if (config.ssl) {
|
|
137
|
+
replicaConfig.ssl = config.ssl;
|
|
138
|
+
}
|
|
139
|
+
setReadSql(postgres(readReplicaUrls[0], replicaConfig));
|
|
140
|
+
setDbInstance(drizzle(getSql(), {
|
|
141
|
+
logger: env.get('DATABASE_LOGGING') === 'true',
|
|
142
|
+
cache: cacheService || undefined,
|
|
143
|
+
}));
|
|
144
|
+
console.info(`Database initialized with read replicas and cache: ${readReplicaUrls.length} replica(s) configured`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
// Single connection
|
|
148
|
+
setSql(postgres(env.get('DATABASE_URL'), {
|
|
149
|
+
...config,
|
|
150
|
+
debug: env.get('DATABASE_LOGGING') === 'true',
|
|
151
|
+
}));
|
|
152
|
+
setDbInstance(drizzle(getSql(), {
|
|
153
|
+
logger: env.get('DATABASE_LOGGING') === 'true',
|
|
154
|
+
cache: cacheService || undefined,
|
|
155
|
+
}));
|
|
156
|
+
console.info('Database initialized with cache (no read replicas)');
|
|
157
|
+
}
|
|
158
|
+
return getDbInstance();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get database instance (synchronous - initializes if needed)
|
|
162
|
+
*/
|
|
163
|
+
export function getDatabase() {
|
|
164
|
+
if (!getDbInstance()) {
|
|
165
|
+
return initializeDatabase();
|
|
166
|
+
}
|
|
167
|
+
return getDbInstance();
|
|
168
|
+
}
|
|
169
|
+
// Export db as a getter to always return the current instance
|
|
170
|
+
// This ensures that even if the module is loaded from different paths,
|
|
171
|
+
// we always get the same database instance
|
|
172
|
+
export const db = new Proxy({}, {
|
|
173
|
+
get(_, prop) {
|
|
174
|
+
const instance = getDatabase();
|
|
175
|
+
const value = instance[prop];
|
|
176
|
+
return typeof value === 'function' ? value.bind(instance) : value;
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
/**
|
|
180
|
+
* Get postgres SQL client (for raw queries)
|
|
181
|
+
*/
|
|
182
|
+
export function getSqlClient() {
|
|
183
|
+
if (!getSql()) {
|
|
184
|
+
initializeDatabase();
|
|
185
|
+
}
|
|
186
|
+
return getSql();
|
|
187
|
+
}
|
|
188
|
+
// Export sql for backward compatibility
|
|
189
|
+
export const sqlClient = new Proxy({}, {
|
|
190
|
+
get(_, prop) {
|
|
191
|
+
const instance = getSqlClient();
|
|
192
|
+
const value = instance[prop];
|
|
193
|
+
return typeof value === 'function' ? value.bind(instance) : value;
|
|
194
|
+
},
|
|
195
|
+
apply(_, thisArg, args) {
|
|
196
|
+
return getSqlClient().apply(thisArg, args);
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
/**
|
|
200
|
+
* Get read replica SQL client (if configured)
|
|
201
|
+
*/
|
|
202
|
+
export function getReadSqlClient() {
|
|
203
|
+
if (!getSql()) {
|
|
204
|
+
initializeDatabase();
|
|
205
|
+
}
|
|
206
|
+
return getReadSql() || getSql();
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Close database connections
|
|
210
|
+
*/
|
|
211
|
+
export async function closeDatabase() {
|
|
212
|
+
// Close cache service first
|
|
213
|
+
await closeCacheService();
|
|
214
|
+
const sql = getSql();
|
|
215
|
+
const readSql = getReadSql();
|
|
216
|
+
if (sql) {
|
|
217
|
+
await sql.end();
|
|
218
|
+
setSql(null);
|
|
219
|
+
}
|
|
220
|
+
if (readSql) {
|
|
221
|
+
await readSql.end();
|
|
222
|
+
setReadSql(null);
|
|
223
|
+
}
|
|
224
|
+
setDbInstance(null);
|
|
225
|
+
console.info('Database connections closed');
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Create a new transaction with Sequelize-compatible API
|
|
229
|
+
* Returns a transaction that must be explicitly committed or rolled back
|
|
230
|
+
*
|
|
231
|
+
* Usage matching Sequelize:
|
|
232
|
+
* const transaction = await createTransaction();
|
|
233
|
+
* try {
|
|
234
|
+
* await transaction.insert(table).values(data);
|
|
235
|
+
* await transaction.commit();
|
|
236
|
+
* } catch (error) {
|
|
237
|
+
* await transaction.rollback();
|
|
238
|
+
* throw error;
|
|
239
|
+
* }
|
|
240
|
+
*/
|
|
241
|
+
export async function createTransaction() {
|
|
242
|
+
let resolveTransaction;
|
|
243
|
+
let rejectTransaction;
|
|
244
|
+
let resolveTxComplete;
|
|
245
|
+
let rejectTxComplete;
|
|
246
|
+
// Transaction timeout (default 30 seconds, configurable via env)
|
|
247
|
+
const TRANSACTION_TIMEOUT_MS = parseInt(env.get('TRANSACTION_TIMEOUT_MS') || '60000');
|
|
248
|
+
const transactionPromise = new Promise((resolve, reject) => {
|
|
249
|
+
resolveTransaction = resolve;
|
|
250
|
+
rejectTransaction = reject;
|
|
251
|
+
});
|
|
252
|
+
// Promise that resolves when Drizzle's transaction completes
|
|
253
|
+
const txCompletePromise = new Promise((resolve, reject) => {
|
|
254
|
+
resolveTxComplete = resolve;
|
|
255
|
+
rejectTxComplete = reject;
|
|
256
|
+
});
|
|
257
|
+
// Start the Drizzle transaction
|
|
258
|
+
const txPromise = db.transaction(async (tx) => {
|
|
259
|
+
// Create wrapper with commit/rollback methods
|
|
260
|
+
const transaction = tx;
|
|
261
|
+
transaction._committed = false;
|
|
262
|
+
transaction._rolledBack = false;
|
|
263
|
+
// Store the completion resolver
|
|
264
|
+
transaction._resolveTxComplete = resolveTxComplete;
|
|
265
|
+
transaction._rejectTxComplete = rejectTxComplete;
|
|
266
|
+
transaction.commit = async () => {
|
|
267
|
+
if (transaction._rolledBack) {
|
|
268
|
+
throw new Error('Transaction already rolled back');
|
|
269
|
+
}
|
|
270
|
+
transaction._committed = true;
|
|
271
|
+
// Wait for Drizzle transaction to complete before returning
|
|
272
|
+
await txCompletePromise;
|
|
273
|
+
};
|
|
274
|
+
transaction.rollback = async () => {
|
|
275
|
+
if (transaction._committed) {
|
|
276
|
+
throw new Error('Transaction already committed');
|
|
277
|
+
}
|
|
278
|
+
transaction._rolledBack = true;
|
|
279
|
+
throw new Error('__ROLLBACK__');
|
|
280
|
+
};
|
|
281
|
+
// Resolve with the transaction wrapper
|
|
282
|
+
resolveTransaction(transaction);
|
|
283
|
+
// Wait for explicit commit or rollback with timeout
|
|
284
|
+
await new Promise((resolve, reject) => {
|
|
285
|
+
let resolved = false;
|
|
286
|
+
// Timeout to prevent transaction from hanging forever
|
|
287
|
+
const timeoutId = setTimeout(() => {
|
|
288
|
+
if (!resolved) {
|
|
289
|
+
resolved = true;
|
|
290
|
+
console.error(`[Transaction] Transaction timeout after ${TRANSACTION_TIMEOUT_MS}ms - forcing rollback`);
|
|
291
|
+
transaction._rolledBack = true;
|
|
292
|
+
resolve();
|
|
293
|
+
}
|
|
294
|
+
}, TRANSACTION_TIMEOUT_MS);
|
|
295
|
+
const checkInterval = setInterval(() => {
|
|
296
|
+
if (transaction._committed || transaction._rolledBack) {
|
|
297
|
+
if (!resolved) {
|
|
298
|
+
resolved = true;
|
|
299
|
+
clearTimeout(timeoutId);
|
|
300
|
+
clearInterval(checkInterval);
|
|
301
|
+
resolve();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}, 10);
|
|
305
|
+
});
|
|
306
|
+
// If rolled back, throw to trigger Drizzle's rollback
|
|
307
|
+
if (transaction._rolledBack) {
|
|
308
|
+
throw new Error('__ROLLBACK__');
|
|
309
|
+
}
|
|
310
|
+
// If committed, transaction will complete successfully here
|
|
311
|
+
}).then(() => {
|
|
312
|
+
// Transaction completed successfully
|
|
313
|
+
resolveTxComplete();
|
|
314
|
+
}).catch((error) => {
|
|
315
|
+
// Swallow intentional rollback errors
|
|
316
|
+
if (error.message === '__ROLLBACK__') {
|
|
317
|
+
resolveTxComplete(); // Rollback is also a valid completion
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
rejectTxComplete(error);
|
|
321
|
+
throw error;
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
return transactionPromise;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Test database connection
|
|
328
|
+
*/
|
|
329
|
+
export async function testConnection() {
|
|
330
|
+
try {
|
|
331
|
+
const sqlClient = getSqlClient();
|
|
332
|
+
await sqlClient `SELECT 1 as test`;
|
|
333
|
+
console.info('Database connection test successful');
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
console.error('Database connection test failed:', error);
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Cache for PostgreSQL version
|
|
342
|
+
let pgVersionCache = null;
|
|
343
|
+
/**
|
|
344
|
+
* Get PostgreSQL server version
|
|
345
|
+
* Returns { major: number, minor: number, full: string }
|
|
346
|
+
* Caches the result after first call
|
|
347
|
+
*/
|
|
348
|
+
export async function getPostgresVersion() {
|
|
349
|
+
if (pgVersionCache) {
|
|
350
|
+
return pgVersionCache;
|
|
351
|
+
}
|
|
352
|
+
try {
|
|
353
|
+
const sqlClient = getSqlClient();
|
|
354
|
+
const result = await sqlClient `SHOW server_version`;
|
|
355
|
+
const versionString = result[0].server_version;
|
|
356
|
+
// Parse version like "15.4" or "14.9 (Ubuntu 14.9-0ubuntu0.22.04.1)"
|
|
357
|
+
const match = versionString.match(/^(\d+)\.(\d+)/);
|
|
358
|
+
if (match) {
|
|
359
|
+
pgVersionCache = {
|
|
360
|
+
major: parseInt(match[1], 10),
|
|
361
|
+
minor: parseInt(match[2], 10),
|
|
362
|
+
full: versionString,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
// Fallback if parsing fails
|
|
367
|
+
pgVersionCache = { major: 14, minor: 0, full: versionString };
|
|
368
|
+
}
|
|
369
|
+
return pgVersionCache;
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
console.warn('Failed to get PostgreSQL version, defaulting to 14:', error);
|
|
373
|
+
pgVersionCache = { major: 14, minor: 0, full: 'unknown' };
|
|
374
|
+
return pgVersionCache;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Check if PostgreSQL version supports a feature
|
|
379
|
+
* @param minMajor Minimum major version required
|
|
380
|
+
* @param minMinor Minimum minor version required (default: 0)
|
|
381
|
+
*/
|
|
382
|
+
export async function isPgVersionAtLeast(minMajor, minMinor = 0) {
|
|
383
|
+
const version = await getPostgresVersion();
|
|
384
|
+
return version.major > minMajor || (version.major === minMajor && version.minor >= minMinor);
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Get helper to extract instance ID
|
|
388
|
+
*/
|
|
389
|
+
export function getInstanceId(instance) {
|
|
390
|
+
let id = instance.id || instance?._previousData?.id;
|
|
391
|
+
if (instance.constructor?.name === 'baasix_SchemaDefinition') {
|
|
392
|
+
return instance.collectionName;
|
|
393
|
+
}
|
|
394
|
+
return id;
|
|
395
|
+
}
|
|
396
|
+
export default {
|
|
397
|
+
db,
|
|
398
|
+
sql: sqlClient,
|
|
399
|
+
initializeDatabase,
|
|
400
|
+
initializeDatabaseWithCache,
|
|
401
|
+
getDatabase,
|
|
402
|
+
getSqlClient,
|
|
403
|
+
getReadSqlClient,
|
|
404
|
+
closeDatabase,
|
|
405
|
+
createTransaction,
|
|
406
|
+
testConnection,
|
|
407
|
+
getInstanceId,
|
|
408
|
+
getPostgresVersion,
|
|
409
|
+
isPgVersionAtLeast,
|
|
410
|
+
};
|
|
411
|
+
// Export cache service for use in other modules
|
|
412
|
+
export { getCacheService, closeCacheService, initializeCacheService } from '../services/CacheService.js';
|
|
413
|
+
//# sourceMappingURL=db.js.map
|