@qwickapps/server 1.5.2 → 1.6.1
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/CHANGELOG.md +86 -0
- package/README.md +177 -0
- package/dist/core/control-panel.d.ts.map +1 -1
- package/dist/core/control-panel.js +118 -261
- package/dist/core/control-panel.js.map +1 -1
- package/dist/core/plugin-registry.d.ts +20 -0
- package/dist/core/plugin-registry.d.ts.map +1 -1
- package/dist/core/plugin-registry.js +27 -2
- package/dist/core/plugin-registry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/plugins/api-keys/ApiKeysManagementPage.d.ts +9 -0
- package/dist/plugins/api-keys/ApiKeysManagementPage.d.ts.map +1 -0
- package/dist/plugins/api-keys/ApiKeysManagementPage.js +66 -0
- package/dist/plugins/api-keys/ApiKeysManagementPage.js.map +1 -0
- package/dist/plugins/api-keys/ApiKeysStatusWidget.d.ts +9 -0
- package/dist/plugins/api-keys/ApiKeysStatusWidget.d.ts.map +1 -0
- package/dist/plugins/api-keys/ApiKeysStatusWidget.js +30 -0
- package/dist/plugins/api-keys/ApiKeysStatusWidget.js.map +1 -0
- package/dist/plugins/api-keys/api-keys-plugin.d.ts +46 -0
- package/dist/plugins/api-keys/api-keys-plugin.d.ts.map +1 -0
- package/dist/plugins/api-keys/api-keys-plugin.js +452 -0
- package/dist/plugins/api-keys/api-keys-plugin.js.map +1 -0
- package/dist/plugins/api-keys/index.d.ts +18 -0
- package/dist/plugins/api-keys/index.d.ts.map +1 -0
- package/dist/plugins/api-keys/index.js +20 -0
- package/dist/plugins/api-keys/index.js.map +1 -0
- package/dist/plugins/api-keys/middleware/bearer-token-auth.d.ts +74 -0
- package/dist/plugins/api-keys/middleware/bearer-token-auth.d.ts.map +1 -0
- package/dist/plugins/api-keys/middleware/bearer-token-auth.js +201 -0
- package/dist/plugins/api-keys/middleware/bearer-token-auth.js.map +1 -0
- package/dist/plugins/api-keys/middleware/index.d.ts +8 -0
- package/dist/plugins/api-keys/middleware/index.d.ts.map +1 -0
- package/dist/plugins/api-keys/middleware/index.js +8 -0
- package/dist/plugins/api-keys/middleware/index.js.map +1 -0
- package/dist/plugins/api-keys/middleware/usage-logging.d.ts +21 -0
- package/dist/plugins/api-keys/middleware/usage-logging.d.ts.map +1 -0
- package/dist/plugins/api-keys/middleware/usage-logging.js +57 -0
- package/dist/plugins/api-keys/middleware/usage-logging.js.map +1 -0
- package/dist/plugins/api-keys/stores/index.d.ts +9 -0
- package/dist/plugins/api-keys/stores/index.d.ts.map +1 -0
- package/dist/plugins/api-keys/stores/index.js +9 -0
- package/dist/plugins/api-keys/stores/index.js.map +1 -0
- package/dist/plugins/api-keys/stores/plugin-scope-store.d.ts +81 -0
- package/dist/plugins/api-keys/stores/plugin-scope-store.d.ts.map +1 -0
- package/dist/plugins/api-keys/stores/plugin-scope-store.js +155 -0
- package/dist/plugins/api-keys/stores/plugin-scope-store.js.map +1 -0
- package/dist/plugins/api-keys/stores/postgres-store.d.ts +34 -0
- package/dist/plugins/api-keys/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/api-keys/stores/postgres-store.js +360 -0
- package/dist/plugins/api-keys/stores/postgres-store.js.map +1 -0
- package/dist/plugins/api-keys/stores/usage-log-store.d.ts +119 -0
- package/dist/plugins/api-keys/stores/usage-log-store.d.ts.map +1 -0
- package/dist/plugins/api-keys/stores/usage-log-store.js +246 -0
- package/dist/plugins/api-keys/stores/usage-log-store.js.map +1 -0
- package/dist/plugins/api-keys/types.d.ts +309 -0
- package/dist/plugins/api-keys/types.d.ts.map +1 -0
- package/dist/plugins/api-keys/types.js +105 -0
- package/dist/plugins/api-keys/types.js.map +1 -0
- package/dist/plugins/auth/AuthManagementPage.d.ts +9 -0
- package/dist/plugins/auth/AuthManagementPage.d.ts.map +1 -0
- package/dist/plugins/auth/AuthManagementPage.js +73 -0
- package/dist/plugins/auth/AuthManagementPage.js.map +1 -0
- package/dist/plugins/auth/AuthStatusWidget.d.ts +9 -0
- package/dist/plugins/auth/AuthStatusWidget.d.ts.map +1 -0
- package/dist/plugins/auth/AuthStatusWidget.js +30 -0
- package/dist/plugins/auth/AuthStatusWidget.js.map +1 -0
- package/dist/plugins/auth/adapters/basic-adapter.d.ts +1 -0
- package/dist/plugins/auth/adapters/basic-adapter.d.ts.map +1 -1
- package/dist/plugins/auth/adapters/basic-adapter.js +54 -0
- package/dist/plugins/auth/adapters/basic-adapter.js.map +1 -1
- package/dist/plugins/auth/auth-plugin.js +1 -1
- package/dist/plugins/auth/auth-plugin.js.map +1 -1
- package/dist/plugins/auth/env-config.d.ts +15 -1
- package/dist/plugins/auth/env-config.d.ts.map +1 -1
- package/dist/plugins/auth/env-config.js +16 -6
- package/dist/plugins/auth/env-config.js.map +1 -1
- package/dist/plugins/auth/index.d.ts +5 -1
- package/dist/plugins/auth/index.d.ts.map +1 -1
- package/dist/plugins/auth/index.js +7 -1
- package/dist/plugins/auth/index.js.map +1 -1
- package/dist/plugins/bans/BansManagementPage.d.ts +9 -0
- package/dist/plugins/bans/BansManagementPage.d.ts.map +1 -0
- package/dist/plugins/bans/BansManagementPage.js +65 -0
- package/dist/plugins/bans/BansManagementPage.js.map +1 -0
- package/dist/plugins/bans/BansStatusWidget.d.ts +9 -0
- package/dist/plugins/bans/BansStatusWidget.d.ts.map +1 -0
- package/dist/plugins/bans/BansStatusWidget.js +30 -0
- package/dist/plugins/bans/BansStatusWidget.js.map +1 -0
- package/dist/plugins/bans/bans-plugin.js +1 -1
- package/dist/plugins/bans/bans-plugin.js.map +1 -1
- package/dist/plugins/bans/index.d.ts +4 -0
- package/dist/plugins/bans/index.d.ts.map +1 -1
- package/dist/plugins/bans/index.js +3 -0
- package/dist/plugins/bans/index.js.map +1 -1
- package/dist/plugins/cache/CacheManagementPage.d.ts +13 -0
- package/dist/plugins/cache/CacheManagementPage.d.ts.map +1 -0
- package/dist/plugins/cache/CacheManagementPage.js +175 -0
- package/dist/plugins/cache/CacheManagementPage.js.map +1 -0
- package/dist/plugins/cache/CacheStatusWidget.d.ts +13 -0
- package/dist/plugins/cache/CacheStatusWidget.d.ts.map +1 -0
- package/dist/plugins/cache/CacheStatusWidget.js +80 -0
- package/dist/plugins/cache/CacheStatusWidget.js.map +1 -0
- package/dist/plugins/cache/index.d.ts +10 -0
- package/dist/plugins/cache/index.d.ts.map +1 -0
- package/dist/plugins/cache/index.js +8 -0
- package/dist/plugins/cache/index.js.map +1 -0
- package/dist/plugins/cms/cms-plugin.d.ts +24 -0
- package/dist/plugins/cms/cms-plugin.d.ts.map +1 -0
- package/dist/plugins/cms/cms-plugin.js +220 -0
- package/dist/plugins/cms/cms-plugin.js.map +1 -0
- package/dist/plugins/cms/index.d.ts +8 -0
- package/dist/plugins/cms/index.d.ts.map +1 -0
- package/dist/plugins/cms/index.js +7 -0
- package/dist/plugins/cms/index.js.map +1 -0
- package/dist/plugins/config-plugin.js +4 -4
- package/dist/plugins/config-plugin.js.map +1 -1
- package/dist/plugins/core/index.d.ts +32 -0
- package/dist/plugins/core/index.d.ts.map +1 -0
- package/dist/plugins/core/index.js +129 -0
- package/dist/plugins/core/index.js.map +1 -0
- package/dist/plugins/devices/DevicesManagementPage.d.ts +9 -0
- package/dist/plugins/devices/DevicesManagementPage.d.ts.map +1 -0
- package/dist/plugins/devices/DevicesManagementPage.js +65 -0
- package/dist/plugins/devices/DevicesManagementPage.js.map +1 -0
- package/dist/plugins/devices/DevicesStatusWidget.d.ts +9 -0
- package/dist/plugins/devices/DevicesStatusWidget.d.ts.map +1 -0
- package/dist/plugins/devices/DevicesStatusWidget.js +30 -0
- package/dist/plugins/devices/DevicesStatusWidget.js.map +1 -0
- package/dist/plugins/devices/devices-plugin.js +1 -1
- package/dist/plugins/devices/devices-plugin.js.map +1 -1
- package/dist/plugins/devices/index.d.ts +4 -0
- package/dist/plugins/devices/index.d.ts.map +1 -1
- package/dist/plugins/devices/index.js +3 -0
- package/dist/plugins/devices/index.js.map +1 -1
- package/dist/plugins/diagnostics/DiagnosticsManagementPage.d.ts +13 -0
- package/dist/plugins/diagnostics/DiagnosticsManagementPage.d.ts.map +1 -0
- package/dist/plugins/diagnostics/DiagnosticsManagementPage.js +78 -0
- package/dist/plugins/diagnostics/DiagnosticsManagementPage.js.map +1 -0
- package/dist/plugins/diagnostics/DiagnosticsStatusWidget.d.ts +13 -0
- package/dist/plugins/diagnostics/DiagnosticsStatusWidget.d.ts.map +1 -0
- package/dist/plugins/diagnostics/DiagnosticsStatusWidget.js +87 -0
- package/dist/plugins/diagnostics/DiagnosticsStatusWidget.js.map +1 -0
- package/dist/plugins/diagnostics/index.d.ts +10 -0
- package/dist/plugins/diagnostics/index.d.ts.map +1 -0
- package/dist/plugins/diagnostics/index.js +8 -0
- package/dist/plugins/diagnostics/index.js.map +1 -0
- package/dist/plugins/diagnostics-plugin.js +4 -3
- package/dist/plugins/diagnostics-plugin.js.map +1 -1
- package/dist/plugins/entitlements/EntitlementsManagementPage.d.ts +9 -0
- package/dist/plugins/entitlements/EntitlementsManagementPage.d.ts.map +1 -0
- package/dist/plugins/entitlements/EntitlementsManagementPage.js +59 -0
- package/dist/plugins/entitlements/EntitlementsManagementPage.js.map +1 -0
- package/dist/plugins/entitlements/EntitlementsStatusWidget.d.ts +9 -0
- package/dist/plugins/entitlements/EntitlementsStatusWidget.d.ts.map +1 -0
- package/dist/plugins/entitlements/EntitlementsStatusWidget.js +30 -0
- package/dist/plugins/entitlements/EntitlementsStatusWidget.js.map +1 -0
- package/dist/plugins/entitlements/entitlements-plugin.js +1 -1
- package/dist/plugins/entitlements/entitlements-plugin.js.map +1 -1
- package/dist/plugins/entitlements/index.d.ts +4 -0
- package/dist/plugins/entitlements/index.d.ts.map +1 -1
- package/dist/plugins/entitlements/index.js +3 -0
- package/dist/plugins/entitlements/index.js.map +1 -1
- package/dist/plugins/frontend-app-plugin.d.ts.map +1 -1
- package/dist/plugins/frontend-app-plugin.js +5 -2
- package/dist/plugins/frontend-app-plugin.js.map +1 -1
- package/dist/plugins/health/HealthManagementPage.d.ts +13 -0
- package/dist/plugins/health/HealthManagementPage.d.ts.map +1 -0
- package/dist/plugins/health/HealthManagementPage.js +120 -0
- package/dist/plugins/health/HealthManagementPage.js.map +1 -0
- package/dist/plugins/health/HealthStatusWidget.d.ts +13 -0
- package/dist/plugins/health/HealthStatusWidget.d.ts.map +1 -0
- package/dist/plugins/health/HealthStatusWidget.js +80 -0
- package/dist/plugins/health/HealthStatusWidget.js.map +1 -0
- package/dist/plugins/health/index.d.ts +10 -0
- package/dist/plugins/health/index.d.ts.map +1 -0
- package/dist/plugins/health/index.js +8 -0
- package/dist/plugins/health/index.js.map +1 -0
- package/dist/plugins/index.d.ts +9 -1
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +6 -1
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/logs/LogsManagementPage.d.ts +13 -0
- package/dist/plugins/logs/LogsManagementPage.d.ts.map +1 -0
- package/dist/plugins/logs/LogsManagementPage.js +151 -0
- package/dist/plugins/logs/LogsManagementPage.js.map +1 -0
- package/dist/plugins/logs/LogsStatusWidget.d.ts +13 -0
- package/dist/plugins/logs/LogsStatusWidget.d.ts.map +1 -0
- package/dist/plugins/logs/LogsStatusWidget.js +76 -0
- package/dist/plugins/logs/LogsStatusWidget.js.map +1 -0
- package/dist/plugins/logs/index.d.ts +10 -0
- package/dist/plugins/logs/index.d.ts.map +1 -0
- package/dist/plugins/logs/index.js +8 -0
- package/dist/plugins/logs/index.js.map +1 -0
- package/dist/plugins/logs-plugin.js +6 -6
- package/dist/plugins/logs-plugin.js.map +1 -1
- package/dist/plugins/maintenance/MaintenanceManagementPage.d.ts +13 -0
- package/dist/plugins/maintenance/MaintenanceManagementPage.d.ts.map +1 -0
- package/dist/plugins/maintenance/MaintenanceManagementPage.js +40 -0
- package/dist/plugins/maintenance/MaintenanceManagementPage.js.map +1 -0
- package/dist/plugins/maintenance/MaintenanceStatusWidget.d.ts +13 -0
- package/dist/plugins/maintenance/MaintenanceStatusWidget.d.ts.map +1 -0
- package/dist/plugins/maintenance/MaintenanceStatusWidget.js +76 -0
- package/dist/plugins/maintenance/MaintenanceStatusWidget.js.map +1 -0
- package/dist/plugins/maintenance/SeedExecutor.d.ts +17 -0
- package/dist/plugins/maintenance/SeedExecutor.d.ts.map +1 -0
- package/dist/plugins/maintenance/SeedExecutor.js +154 -0
- package/dist/plugins/maintenance/SeedExecutor.js.map +1 -0
- package/dist/plugins/maintenance/SeedHistory.d.ts +14 -0
- package/dist/plugins/maintenance/SeedHistory.d.ts.map +1 -0
- package/dist/plugins/maintenance/SeedHistory.js +183 -0
- package/dist/plugins/maintenance/SeedHistory.js.map +1 -0
- package/dist/plugins/maintenance/SeedList.d.ts +15 -0
- package/dist/plugins/maintenance/SeedList.d.ts.map +1 -0
- package/dist/plugins/maintenance/SeedList.js +68 -0
- package/dist/plugins/maintenance/SeedList.js.map +1 -0
- package/dist/plugins/maintenance/SeedManagementPage.d.ts +14 -0
- package/dist/plugins/maintenance/SeedManagementPage.d.ts.map +1 -0
- package/dist/plugins/maintenance/SeedManagementPage.js +42 -0
- package/dist/plugins/maintenance/SeedManagementPage.js.map +1 -0
- package/dist/plugins/maintenance/index.d.ts +20 -0
- package/dist/plugins/maintenance/index.d.ts.map +1 -0
- package/dist/plugins/maintenance/index.js +15 -0
- package/dist/plugins/maintenance/index.js.map +1 -0
- package/dist/plugins/maintenance/seed-executor.d.ts +55 -0
- package/dist/plugins/maintenance/seed-executor.d.ts.map +1 -0
- package/dist/plugins/maintenance/seed-executor.js +178 -0
- package/dist/plugins/maintenance/seed-executor.js.map +1 -0
- package/dist/plugins/maintenance-plugin.d.ts +35 -0
- package/dist/plugins/maintenance-plugin.d.ts.map +1 -0
- package/dist/plugins/maintenance-plugin.js +321 -0
- package/dist/plugins/maintenance-plugin.js.map +1 -0
- package/dist/plugins/notifications/NotificationsManagementPage.d.ts +13 -0
- package/dist/plugins/notifications/NotificationsManagementPage.d.ts.map +1 -0
- package/dist/plugins/notifications/NotificationsManagementPage.js +59 -0
- package/dist/plugins/notifications/NotificationsManagementPage.js.map +1 -0
- package/dist/plugins/notifications/NotificationsStatusWidget.d.ts +9 -0
- package/dist/plugins/notifications/NotificationsStatusWidget.d.ts.map +1 -0
- package/dist/plugins/notifications/NotificationsStatusWidget.js +30 -0
- package/dist/plugins/notifications/NotificationsStatusWidget.js.map +1 -0
- package/dist/plugins/notifications/index.d.ts +4 -0
- package/dist/plugins/notifications/index.d.ts.map +1 -1
- package/dist/plugins/notifications/index.js +3 -0
- package/dist/plugins/notifications/index.js.map +1 -1
- package/dist/plugins/notifications/notifications-plugin.js +1 -1
- package/dist/plugins/notifications/notifications-plugin.js.map +1 -1
- package/dist/plugins/parental/ParentalManagementPage.d.ts +9 -0
- package/dist/plugins/parental/ParentalManagementPage.d.ts.map +1 -0
- package/dist/plugins/parental/ParentalManagementPage.js +56 -0
- package/dist/plugins/parental/ParentalManagementPage.js.map +1 -0
- package/dist/plugins/parental/ParentalStatusWidget.d.ts +9 -0
- package/dist/plugins/parental/ParentalStatusWidget.d.ts.map +1 -0
- package/dist/plugins/parental/ParentalStatusWidget.js +30 -0
- package/dist/plugins/parental/ParentalStatusWidget.js.map +1 -0
- package/dist/plugins/parental/index.d.ts +4 -0
- package/dist/plugins/parental/index.d.ts.map +1 -1
- package/dist/plugins/parental/index.js +3 -0
- package/dist/plugins/parental/index.js.map +1 -1
- package/dist/plugins/parental/parental-plugin.js +1 -1
- package/dist/plugins/parental/parental-plugin.js.map +1 -1
- package/dist/plugins/postgres/PostgresManagementPage.d.ts +13 -0
- package/dist/plugins/postgres/PostgresManagementPage.d.ts.map +1 -0
- package/dist/plugins/postgres/PostgresManagementPage.js +139 -0
- package/dist/plugins/postgres/PostgresManagementPage.js.map +1 -0
- package/dist/plugins/postgres/PostgresStatusWidget.d.ts +13 -0
- package/dist/plugins/postgres/PostgresStatusWidget.d.ts.map +1 -0
- package/dist/plugins/postgres/PostgresStatusWidget.js +87 -0
- package/dist/plugins/postgres/PostgresStatusWidget.js.map +1 -0
- package/dist/plugins/postgres/index.d.ts +10 -0
- package/dist/plugins/postgres/index.d.ts.map +1 -0
- package/dist/plugins/postgres/index.js +8 -0
- package/dist/plugins/postgres/index.js.map +1 -0
- package/dist/plugins/preferences/PreferencesManagementPage.d.ts +9 -0
- package/dist/plugins/preferences/PreferencesManagementPage.d.ts.map +1 -0
- package/dist/plugins/preferences/PreferencesManagementPage.js +67 -0
- package/dist/plugins/preferences/PreferencesManagementPage.js.map +1 -0
- package/dist/plugins/preferences/PreferencesStatusWidget.d.ts +9 -0
- package/dist/plugins/preferences/PreferencesStatusWidget.d.ts.map +1 -0
- package/dist/plugins/preferences/PreferencesStatusWidget.js +30 -0
- package/dist/plugins/preferences/PreferencesStatusWidget.js.map +1 -0
- package/dist/plugins/preferences/index.d.ts +4 -0
- package/dist/plugins/preferences/index.d.ts.map +1 -1
- package/dist/plugins/preferences/index.js +3 -0
- package/dist/plugins/preferences/index.js.map +1 -1
- package/dist/plugins/preferences/preferences-plugin.d.ts.map +1 -1
- package/dist/plugins/preferences/preferences-plugin.js +9 -4
- package/dist/plugins/preferences/preferences-plugin.js.map +1 -1
- package/dist/plugins/preferences/types.d.ts +5 -0
- package/dist/plugins/preferences/types.d.ts.map +1 -1
- package/dist/plugins/preferences/types.js +5 -1
- package/dist/plugins/preferences/types.js.map +1 -1
- package/dist/plugins/profiles/ProfilesManagementPage.d.ts +9 -0
- package/dist/plugins/profiles/ProfilesManagementPage.d.ts.map +1 -0
- package/dist/plugins/profiles/ProfilesManagementPage.js +51 -0
- package/dist/plugins/profiles/ProfilesManagementPage.js.map +1 -0
- package/dist/plugins/profiles/ProfilesStatusWidget.d.ts +9 -0
- package/dist/plugins/profiles/ProfilesStatusWidget.d.ts.map +1 -0
- package/dist/plugins/profiles/ProfilesStatusWidget.js +30 -0
- package/dist/plugins/profiles/ProfilesStatusWidget.js.map +1 -0
- package/dist/plugins/profiles/index.d.ts +4 -0
- package/dist/plugins/profiles/index.d.ts.map +1 -1
- package/dist/plugins/profiles/index.js +3 -0
- package/dist/plugins/profiles/index.js.map +1 -1
- package/dist/plugins/profiles/profiles-plugin.js +1 -1
- package/dist/plugins/profiles/profiles-plugin.js.map +1 -1
- package/dist/plugins/qwickbrain/QwickbrainManagementPage.d.ts +13 -0
- package/dist/plugins/qwickbrain/QwickbrainManagementPage.d.ts.map +1 -0
- package/dist/plugins/qwickbrain/QwickbrainManagementPage.js +59 -0
- package/dist/plugins/qwickbrain/QwickbrainManagementPage.js.map +1 -0
- package/dist/plugins/qwickbrain/QwickbrainStatusWidget.d.ts +9 -0
- package/dist/plugins/qwickbrain/QwickbrainStatusWidget.d.ts.map +1 -0
- package/dist/plugins/qwickbrain/QwickbrainStatusWidget.js +30 -0
- package/dist/plugins/qwickbrain/QwickbrainStatusWidget.js.map +1 -0
- package/dist/plugins/qwickbrain/index.d.ts +4 -0
- package/dist/plugins/qwickbrain/index.d.ts.map +1 -1
- package/dist/plugins/qwickbrain/index.js +3 -0
- package/dist/plugins/qwickbrain/index.js.map +1 -1
- package/dist/plugins/qwickbrain/qwickbrain-plugin.d.ts.map +1 -1
- package/dist/plugins/qwickbrain/qwickbrain-plugin.js +12 -34
- package/dist/plugins/qwickbrain/qwickbrain-plugin.js.map +1 -1
- package/dist/plugins/qwickbrain/types.d.ts +0 -1
- package/dist/plugins/qwickbrain/types.d.ts.map +1 -1
- package/dist/plugins/rate-limit/RateLimitManagementPage.d.ts +13 -0
- package/dist/plugins/rate-limit/RateLimitManagementPage.d.ts.map +1 -0
- package/dist/plugins/rate-limit/RateLimitManagementPage.js +60 -0
- package/dist/plugins/rate-limit/RateLimitManagementPage.js.map +1 -0
- package/dist/plugins/rate-limit/RateLimitStatusWidget.d.ts +9 -0
- package/dist/plugins/rate-limit/RateLimitStatusWidget.d.ts.map +1 -0
- package/dist/plugins/rate-limit/RateLimitStatusWidget.js +30 -0
- package/dist/plugins/rate-limit/RateLimitStatusWidget.js.map +1 -0
- package/dist/plugins/rate-limit/index.d.ts +4 -0
- package/dist/plugins/rate-limit/index.d.ts.map +1 -1
- package/dist/plugins/rate-limit/index.js +3 -0
- package/dist/plugins/rate-limit/index.js.map +1 -1
- package/dist/plugins/rate-limit/rate-limit-plugin.js +5 -5
- package/dist/plugins/rate-limit/rate-limit-plugin.js.map +1 -1
- package/dist/plugins/subscriptions/SubscriptionsManagementPage.d.ts +9 -0
- package/dist/plugins/subscriptions/SubscriptionsManagementPage.d.ts.map +1 -0
- package/dist/plugins/subscriptions/SubscriptionsManagementPage.js +66 -0
- package/dist/plugins/subscriptions/SubscriptionsManagementPage.js.map +1 -0
- package/dist/plugins/subscriptions/SubscriptionsStatusWidget.d.ts +9 -0
- package/dist/plugins/subscriptions/SubscriptionsStatusWidget.d.ts.map +1 -0
- package/dist/plugins/subscriptions/SubscriptionsStatusWidget.js +30 -0
- package/dist/plugins/subscriptions/SubscriptionsStatusWidget.js.map +1 -0
- package/dist/plugins/subscriptions/index.d.ts +4 -0
- package/dist/plugins/subscriptions/index.d.ts.map +1 -1
- package/dist/plugins/subscriptions/index.js +3 -0
- package/dist/plugins/subscriptions/index.js.map +1 -1
- package/dist/plugins/subscriptions/subscriptions-plugin.js +1 -1
- package/dist/plugins/subscriptions/subscriptions-plugin.js.map +1 -1
- package/dist/plugins/usage/UsageManagementPage.d.ts +9 -0
- package/dist/plugins/usage/UsageManagementPage.d.ts.map +1 -0
- package/dist/plugins/usage/UsageManagementPage.js +42 -0
- package/dist/plugins/usage/UsageManagementPage.js.map +1 -0
- package/dist/plugins/usage/UsageStatusWidget.d.ts +9 -0
- package/dist/plugins/usage/UsageStatusWidget.d.ts.map +1 -0
- package/dist/plugins/usage/UsageStatusWidget.js +30 -0
- package/dist/plugins/usage/UsageStatusWidget.js.map +1 -0
- package/dist/plugins/usage/index.d.ts +4 -0
- package/dist/plugins/usage/index.d.ts.map +1 -1
- package/dist/plugins/usage/index.js +3 -0
- package/dist/plugins/usage/index.js.map +1 -1
- package/dist/plugins/usage/usage-plugin.js +1 -1
- package/dist/plugins/usage/usage-plugin.js.map +1 -1
- package/dist/plugins/users/UsersManagementPage.d.ts +13 -0
- package/dist/plugins/users/UsersManagementPage.d.ts.map +1 -0
- package/dist/plugins/users/UsersManagementPage.js +199 -0
- package/dist/plugins/users/UsersManagementPage.js.map +1 -0
- package/dist/plugins/users/UsersStatusWidget.d.ts +13 -0
- package/dist/plugins/users/UsersStatusWidget.d.ts.map +1 -0
- package/dist/plugins/users/UsersStatusWidget.js +79 -0
- package/dist/plugins/users/UsersStatusWidget.js.map +1 -0
- package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -1
- package/dist/plugins/users/stores/postgres-store.js +74 -19
- package/dist/plugins/users/stores/postgres-store.js.map +1 -1
- package/dist/plugins/users/types.d.ts +30 -1
- package/dist/plugins/users/types.d.ts.map +1 -1
- package/dist/plugins/users/users-plugin.d.ts.map +1 -1
- package/dist/plugins/users/users-plugin.js +118 -3
- package/dist/plugins/users/users-plugin.js.map +1 -1
- package/dist-ui/assets/index-BiEHWqD3.js +528 -0
- package/dist-ui/assets/index-BiEHWqD3.js.map +1 -0
- package/dist-ui/index.html +1 -1
- package/dist-ui-lib/index.js +3682 -2765
- package/dist-ui-lib/index.js.map +1 -1
- package/dist-ui-lib/src/api/clientBuilder.d.ts +33 -0
- package/dist-ui-lib/{api → src/api}/controlPanelApi.d.ts +124 -0
- package/dist-ui-lib/src/api/index.d.ts +11 -0
- package/dist-ui-lib/src/api/types.d.ts +313 -0
- package/dist-ui-lib/{components → src/components}/ControlPanelApp.d.ts +2 -1
- package/dist-ui-lib/src/components/auth/AcceptInvitationPage.d.ts +21 -0
- package/dist-ui-lib/src/components/auth/LoginPage.d.ts +27 -0
- package/dist-ui-lib/src/components/auth/PasswordResetConfirmPage.d.ts +17 -0
- package/dist-ui-lib/src/components/auth/PasswordResetPage.d.ts +12 -0
- package/dist-ui-lib/src/components/auth/SignupPage.d.ts +27 -0
- package/dist-ui-lib/src/components/auth/VerifyEmailPage.d.ts +12 -0
- package/dist-ui-lib/src/components/auth/index.d.ts +19 -0
- package/dist-ui-lib/src/components/auth/shared/AuthError.d.ts +9 -0
- package/dist-ui-lib/src/components/auth/shared/AuthLayout.d.ts +11 -0
- package/dist-ui-lib/src/components/auth/shared/index.d.ts +7 -0
- package/dist-ui-lib/{components → src/components}/index.d.ts +5 -2
- package/dist-ui-lib/src/components/plugins/PluginConfigPanel.d.ts +65 -0
- package/dist-ui-lib/src/components/plugins/PluginManagementPage.d.ts +62 -0
- package/dist-ui-lib/src/components/plugins/PluginStatusWidget.d.ts +51 -0
- package/dist-ui-lib/src/components/plugins/index.d.ts +13 -0
- package/dist-ui-lib/src/config/preferences.d.ts +16 -0
- package/dist-ui-lib/src/dashboard/widgets/CMSMaintenanceWidget.d.ts +8 -0
- package/dist-ui-lib/src/dashboard/widgets/CMSStatusWidget.d.ts +8 -0
- package/dist-ui-lib/{dashboard → src/dashboard}/widgets/index.d.ts +2 -0
- package/dist-ui-lib/src/hooks/useJobStream.d.ts +38 -0
- package/dist-ui-lib/src/pages/AcceptInvitationPage.d.ts +28 -0
- package/dist-ui-lib/src/pages/PreferencesPage.d.ts +9 -0
- package/package.json +12 -5
- package/src/core/control-panel.ts +141 -286
- package/src/core/plugin-registry.ts +52 -3
- package/src/index.ts +27 -0
- package/src/plugins/api-keys/API_ROUTES.md +165 -0
- package/src/plugins/api-keys/ApiKeysManagementPage.test.tsx +58 -0
- package/src/plugins/api-keys/ApiKeysManagementPage.tsx +131 -0
- package/src/plugins/api-keys/ApiKeysStatusWidget.test.tsx +112 -0
- package/src/plugins/api-keys/ApiKeysStatusWidget.tsx +53 -0
- package/src/plugins/api-keys/api-keys-plugin.ts +533 -0
- package/src/plugins/api-keys/index.ts +55 -0
- package/src/plugins/api-keys/middleware/bearer-token-auth.ts +250 -0
- package/src/plugins/api-keys/middleware/index.ts +15 -0
- package/src/plugins/api-keys/middleware/usage-logging.ts +78 -0
- package/src/plugins/api-keys/stores/index.ts +21 -0
- package/src/plugins/api-keys/stores/plugin-scope-store.ts +280 -0
- package/src/plugins/api-keys/stores/postgres-store.ts +487 -0
- package/src/plugins/api-keys/stores/usage-log-store.ts +423 -0
- package/src/plugins/api-keys/types.ts +307 -0
- package/src/plugins/auth/API_ROUTES.md +110 -0
- package/src/plugins/auth/AuthManagementPage.test.tsx +58 -0
- package/src/plugins/auth/AuthManagementPage.tsx +170 -0
- package/src/plugins/auth/AuthStatusWidget.test.tsx +112 -0
- package/src/plugins/auth/AuthStatusWidget.tsx +53 -0
- package/src/plugins/auth/adapters/basic-adapter.ts +62 -0
- package/src/plugins/auth/auth-plugin.ts +1 -1
- package/src/plugins/auth/env-config.ts +16 -6
- package/src/plugins/auth/index.ts +9 -0
- package/src/plugins/bans/API_ROUTES.md +183 -0
- package/src/plugins/bans/BansManagementPage.test.tsx +58 -0
- package/src/plugins/bans/BansManagementPage.tsx +129 -0
- package/src/plugins/bans/BansStatusWidget.test.tsx +112 -0
- package/src/plugins/bans/BansStatusWidget.tsx +53 -0
- package/src/plugins/bans/bans-plugin.ts +1 -1
- package/src/plugins/bans/index.ts +6 -0
- package/src/plugins/cache/API_ROUTES.md +312 -0
- package/src/plugins/cache/CacheManagementPage.test.tsx +57 -0
- package/src/plugins/cache/CacheManagementPage.tsx +360 -0
- package/src/plugins/cache/CacheStatusWidget.test.tsx +113 -0
- package/src/plugins/cache/CacheStatusWidget.tsx +122 -0
- package/src/plugins/cache/index.ts +10 -0
- package/src/plugins/cms/cms-plugin.ts +259 -0
- package/src/plugins/cms/index.ts +8 -0
- package/src/plugins/config-plugin.ts +4 -4
- package/src/plugins/core/index.ts +164 -0
- package/src/plugins/devices/API_ROUTES.md +27 -0
- package/src/plugins/devices/DevicesManagementPage.test.tsx +58 -0
- package/src/plugins/devices/DevicesManagementPage.tsx +124 -0
- package/src/plugins/devices/DevicesStatusWidget.test.tsx +109 -0
- package/src/plugins/devices/DevicesStatusWidget.tsx +52 -0
- package/src/plugins/devices/devices-plugin.ts +1 -1
- package/src/plugins/devices/index.ts +6 -0
- package/src/plugins/diagnostics/API_ROUTES.md +316 -0
- package/src/plugins/diagnostics/DiagnosticsManagementPage.test.tsx +58 -0
- package/src/plugins/diagnostics/DiagnosticsManagementPage.tsx +306 -0
- package/src/plugins/diagnostics/DiagnosticsStatusWidget.test.tsx +112 -0
- package/src/plugins/diagnostics/DiagnosticsStatusWidget.tsx +129 -0
- package/src/plugins/diagnostics/index.ts +10 -0
- package/src/plugins/diagnostics-plugin.ts +3 -3
- package/src/plugins/entitlements/API_ROUTES.md +27 -0
- package/src/plugins/entitlements/EntitlementsManagementPage.test.tsx +58 -0
- package/src/plugins/entitlements/EntitlementsManagementPage.tsx +113 -0
- package/src/plugins/entitlements/EntitlementsStatusWidget.test.tsx +109 -0
- package/src/plugins/entitlements/EntitlementsStatusWidget.tsx +52 -0
- package/src/plugins/entitlements/entitlements-plugin.ts +1 -1
- package/src/plugins/entitlements/index.ts +6 -0
- package/src/plugins/frontend-app-plugin.ts +7 -2
- package/src/plugins/health/API_ROUTES.md +283 -0
- package/src/plugins/health/HealthManagementPage.test.tsx +57 -0
- package/src/plugins/health/HealthManagementPage.tsx +320 -0
- package/src/plugins/health/HealthStatusWidget.test.tsx +107 -0
- package/src/plugins/health/HealthStatusWidget.tsx +134 -0
- package/src/plugins/health/index.ts +10 -0
- package/src/plugins/index.ts +49 -0
- package/src/plugins/logs/API_ROUTES.md +297 -0
- package/src/plugins/logs/LogsManagementPage.test.tsx +58 -0
- package/src/plugins/logs/LogsManagementPage.tsx +283 -0
- package/src/plugins/logs/LogsStatusWidget.test.tsx +119 -0
- package/src/plugins/logs/LogsStatusWidget.tsx +123 -0
- package/src/plugins/logs/index.ts +10 -0
- package/src/plugins/logs-plugin.ts +6 -6
- package/src/plugins/maintenance/MaintenanceManagementPage.tsx +193 -0
- package/src/plugins/maintenance/MaintenanceStatusWidget.tsx +120 -0
- package/src/plugins/maintenance/SeedExecutor.tsx +236 -0
- package/src/plugins/maintenance/SeedHistory.tsx +360 -0
- package/src/plugins/maintenance/SeedList.tsx +130 -0
- package/src/plugins/maintenance/SeedManagementPage.tsx +91 -0
- package/src/plugins/maintenance/index.ts +24 -0
- package/src/plugins/maintenance/seed-executor.ts +224 -0
- package/src/plugins/maintenance-plugin.ts +409 -0
- package/src/plugins/notifications/NotificationsManagementPage.test.tsx +58 -0
- package/src/plugins/notifications/NotificationsManagementPage.tsx +128 -0
- package/src/plugins/notifications/NotificationsStatusWidget.test.tsx +109 -0
- package/src/plugins/notifications/NotificationsStatusWidget.tsx +52 -0
- package/src/plugins/notifications/index.ts +6 -0
- package/src/plugins/notifications/notifications-plugin.ts +1 -1
- package/src/plugins/parental/API_ROUTES.md +30 -0
- package/src/plugins/parental/ParentalManagementPage.test.tsx +58 -0
- package/src/plugins/parental/ParentalManagementPage.tsx +119 -0
- package/src/plugins/parental/ParentalStatusWidget.test.tsx +109 -0
- package/src/plugins/parental/ParentalStatusWidget.tsx +52 -0
- package/src/plugins/parental/index.ts +6 -0
- package/src/plugins/parental/parental-plugin.ts +1 -1
- package/src/plugins/postgres/API_ROUTES.md +243 -0
- package/src/plugins/postgres/PostgresManagementPage.test.tsx +62 -0
- package/src/plugins/postgres/PostgresManagementPage.tsx +362 -0
- package/src/plugins/postgres/PostgresStatusWidget.test.tsx +117 -0
- package/src/plugins/postgres/PostgresStatusWidget.tsx +131 -0
- package/src/plugins/postgres/index.ts +10 -0
- package/src/plugins/preferences/API_ROUTES.md +162 -0
- package/src/plugins/preferences/PreferencesManagementPage.test.tsx +58 -0
- package/src/plugins/preferences/PreferencesManagementPage.tsx +139 -0
- package/src/plugins/preferences/PreferencesStatusWidget.test.tsx +109 -0
- package/src/plugins/preferences/PreferencesStatusWidget.tsx +52 -0
- package/src/plugins/preferences/index.ts +6 -0
- package/src/plugins/preferences/preferences-plugin.ts +10 -5
- package/src/plugins/preferences/types.d.ts +95 -0
- package/src/plugins/preferences/types.ts +6 -0
- package/src/plugins/profiles/API_ROUTES.md +27 -0
- package/src/plugins/profiles/ProfilesManagementPage.test.tsx +58 -0
- package/src/plugins/profiles/ProfilesManagementPage.tsx +113 -0
- package/src/plugins/profiles/ProfilesStatusWidget.test.tsx +109 -0
- package/src/plugins/profiles/ProfilesStatusWidget.tsx +52 -0
- package/src/plugins/profiles/index.ts +6 -0
- package/src/plugins/profiles/profiles-plugin.ts +1 -1
- package/src/plugins/qwickbrain/QwickbrainManagementPage.test.tsx +58 -0
- package/src/plugins/qwickbrain/QwickbrainManagementPage.tsx +126 -0
- package/src/plugins/qwickbrain/QwickbrainStatusWidget.test.tsx +109 -0
- package/src/plugins/qwickbrain/QwickbrainStatusWidget.tsx +52 -0
- package/src/plugins/qwickbrain/index.ts +6 -0
- package/src/plugins/qwickbrain/qwickbrain-plugin.ts +12 -36
- package/src/plugins/qwickbrain/types.ts +0 -1
- package/src/plugins/rate-limit/RateLimitManagementPage.test.tsx +58 -0
- package/src/plugins/rate-limit/RateLimitManagementPage.tsx +127 -0
- package/src/plugins/rate-limit/RateLimitStatusWidget.test.tsx +109 -0
- package/src/plugins/rate-limit/RateLimitStatusWidget.tsx +52 -0
- package/src/plugins/rate-limit/index.ts +6 -0
- package/src/plugins/rate-limit/rate-limit-plugin.ts +5 -5
- package/src/plugins/subscriptions/API_ROUTES.md +27 -0
- package/src/plugins/subscriptions/SubscriptionsManagementPage.test.tsx +58 -0
- package/src/plugins/subscriptions/SubscriptionsManagementPage.tsx +125 -0
- package/src/plugins/subscriptions/SubscriptionsStatusWidget.test.tsx +109 -0
- package/src/plugins/subscriptions/SubscriptionsStatusWidget.tsx +52 -0
- package/src/plugins/subscriptions/index.ts +6 -0
- package/src/plugins/subscriptions/subscriptions-plugin.ts +1 -1
- package/src/plugins/usage/API_ROUTES.md +24 -0
- package/src/plugins/usage/UsageManagementPage.test.tsx +58 -0
- package/src/plugins/usage/UsageManagementPage.tsx +93 -0
- package/src/plugins/usage/UsageStatusWidget.test.tsx +109 -0
- package/src/plugins/usage/UsageStatusWidget.tsx +52 -0
- package/src/plugins/usage/index.ts +6 -0
- package/src/plugins/usage/usage-plugin.ts +1 -1
- package/src/plugins/users/API_ROUTES.md +311 -0
- package/src/plugins/users/UsersManagementPage.test.tsx +58 -0
- package/src/plugins/users/UsersManagementPage.tsx +384 -0
- package/src/plugins/users/UsersStatusWidget.test.tsx +114 -0
- package/src/plugins/users/UsersStatusWidget.tsx +120 -0
- package/src/plugins/users/__tests__/postgres-store.test.ts +1 -0
- package/src/plugins/users/__tests__/users-plugin.test.ts +22 -18
- package/src/plugins/users/stores/postgres-store.ts +95 -17
- package/src/plugins/users/types.ts +33 -1
- package/src/plugins/users/users-plugin.ts +137 -3
- package/ui/src/App.tsx +18 -4
- package/ui/src/api/clientBuilder.ts +206 -0
- package/ui/src/api/controlPanelApi.ts +309 -122
- package/ui/src/api/index.ts +12 -0
- package/ui/src/api/types.ts +276 -0
- package/ui/src/components/ControlPanelApp.tsx +4 -5
- package/ui/src/components/auth/AcceptInvitationPage.tsx +151 -0
- package/ui/src/components/auth/LoginPage.tsx +122 -0
- package/ui/src/components/auth/PasswordResetConfirmPage.tsx +109 -0
- package/ui/src/components/auth/PasswordResetPage.tsx +95 -0
- package/ui/src/components/auth/SignupPage.tsx +140 -0
- package/ui/src/components/auth/VerifyEmailPage.tsx +38 -0
- package/ui/src/components/auth/__tests__/AcceptInvitationPage.test.tsx +201 -0
- package/ui/src/components/auth/__tests__/LoginPage.test.tsx +207 -0
- package/ui/src/components/auth/__tests__/PasswordResetConfirmPage.test.tsx +183 -0
- package/ui/src/components/auth/__tests__/PasswordResetPage.test.tsx +174 -0
- package/ui/src/components/auth/__tests__/SignupPage.test.tsx +210 -0
- package/ui/src/components/auth/__tests__/VerifyEmailPage.test.tsx +53 -0
- package/ui/src/components/auth/index.ts +26 -0
- package/ui/src/components/auth/shared/AuthError.tsx +28 -0
- package/ui/src/components/auth/shared/AuthLayout.tsx +42 -0
- package/ui/src/components/auth/shared/index.ts +9 -0
- package/ui/src/components/index.ts +21 -2
- package/ui/src/components/plugins/PluginConfigPanel.tsx +315 -0
- package/ui/src/components/plugins/PluginManagementPage.tsx +218 -0
- package/ui/src/components/plugins/PluginStatusWidget.tsx +158 -0
- package/ui/src/components/plugins/index.ts +20 -0
- package/ui/src/config/preferences.ts +18 -0
- package/ui/src/dashboard/builtInWidgets.tsx +15 -1
- package/ui/src/dashboard/widgets/CMSMaintenanceWidget.tsx +229 -0
- package/ui/src/dashboard/widgets/CMSStatusWidget.tsx +115 -0
- package/ui/src/dashboard/widgets/NotificationsStatsWidget.tsx +1 -1
- package/ui/src/dashboard/widgets/index.ts +2 -0
- package/ui/src/hooks/useJobStream.ts +194 -0
- package/ui/src/pages/APIKeysPage.tsx +849 -0
- package/ui/src/pages/AcceptInvitationPage.tsx +169 -0
- package/ui/src/pages/ContentOpsJobsPage.tsx +422 -0
- package/ui/src/pages/MaintenancePage.tsx +27 -0
- package/ui/src/pages/NotificationsPage.tsx +1 -1
- package/ui/src/pages/PluginPage.tsx +3 -1
- package/ui/src/pages/PreferencesPage.tsx +240 -0
- package/ui/src/pages/UsersPage.tsx +225 -2
- package/ui/src/pages/__tests__/PreferencesPage.test.tsx +273 -0
- package/ui/src/pages/index.ts +15 -0
- package/ui/tsconfig.lib.json +4 -2
- package/dist/plugins/auth/adapter-wrapper.test.d.ts +0 -7
- package/dist/plugins/auth/adapter-wrapper.test.d.ts.map +0 -1
- package/dist/plugins/auth/adapter-wrapper.test.js +0 -303
- package/dist/plugins/auth/adapter-wrapper.test.js.map +0 -1
- package/dist/plugins/auth/auth-plugin.test.d.ts +0 -9
- package/dist/plugins/auth/auth-plugin.test.d.ts.map +0 -1
- package/dist/plugins/auth/auth-plugin.test.js +0 -280
- package/dist/plugins/auth/auth-plugin.test.js.map +0 -1
- package/dist/plugins/auth/config-store.test.d.ts +0 -7
- package/dist/plugins/auth/config-store.test.d.ts.map +0 -1
- package/dist/plugins/auth/config-store.test.js +0 -299
- package/dist/plugins/auth/config-store.test.js.map +0 -1
- package/dist/plugins/auth/supertokens-adapter.test.d.ts +0 -10
- package/dist/plugins/auth/supertokens-adapter.test.d.ts.map +0 -1
- package/dist/plugins/auth/supertokens-adapter.test.js +0 -486
- package/dist/plugins/auth/supertokens-adapter.test.js.map +0 -1
- package/dist/plugins/cache-plugin.test.d.ts +0 -8
- package/dist/plugins/cache-plugin.test.d.ts.map +0 -1
- package/dist/plugins/cache-plugin.test.js +0 -255
- package/dist/plugins/cache-plugin.test.js.map +0 -1
- package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts +0 -11
- package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts.map +0 -1
- package/dist/plugins/devices/__tests__/devices-plugin.test.js +0 -410
- package/dist/plugins/devices/__tests__/devices-plugin.test.js.map +0 -1
- package/dist/plugins/devices/__tests__/token-utils.test.d.ts +0 -7
- package/dist/plugins/devices/__tests__/token-utils.test.d.ts.map +0 -1
- package/dist/plugins/devices/__tests__/token-utils.test.js +0 -199
- package/dist/plugins/devices/__tests__/token-utils.test.js.map +0 -1
- package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts +0 -5
- package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts.map +0 -1
- package/dist/plugins/notifications/__tests__/notifications-manager.test.js +0 -470
- package/dist/plugins/notifications/__tests__/notifications-manager.test.js.map +0 -1
- package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts +0 -12
- package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts.map +0 -1
- package/dist/plugins/parental/__tests__/parental-plugin.test.js +0 -349
- package/dist/plugins/parental/__tests__/parental-plugin.test.js.map +0 -1
- package/dist/plugins/postgres-plugin.test.d.ts +0 -8
- package/dist/plugins/postgres-plugin.test.d.ts.map +0 -1
- package/dist/plugins/postgres-plugin.test.js +0 -186
- package/dist/plugins/postgres-plugin.test.js.map +0 -1
- package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts +0 -7
- package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts.map +0 -1
- package/dist/plugins/preferences/__tests__/deep-merge.test.js +0 -215
- package/dist/plugins/preferences/__tests__/deep-merge.test.js.map +0 -1
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts +0 -7
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts.map +0 -1
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.js +0 -265
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.js.map +0 -1
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts +0 -11
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts.map +0 -1
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.js +0 -243
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.js.map +0 -1
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.d.ts +0 -7
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.d.ts.map +0 -1
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.js +0 -220
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.js.map +0 -1
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts +0 -11
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts.map +0 -1
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js +0 -305
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js.map +0 -1
- package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts +0 -11
- package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts.map +0 -1
- package/dist/plugins/usage/__tests__/usage-plugin.test.js +0 -218
- package/dist/plugins/usage/__tests__/usage-plugin.test.js.map +0 -1
- package/dist/plugins/users/__tests__/postgres-store.test.d.ts +0 -10
- package/dist/plugins/users/__tests__/postgres-store.test.d.ts.map +0 -1
- package/dist/plugins/users/__tests__/postgres-store.test.js +0 -229
- package/dist/plugins/users/__tests__/postgres-store.test.js.map +0 -1
- package/dist/plugins/users/__tests__/users-plugin.test.d.ts +0 -9
- package/dist/plugins/users/__tests__/users-plugin.test.d.ts.map +0 -1
- package/dist/plugins/users/__tests__/users-plugin.test.js +0 -549
- package/dist/plugins/users/__tests__/users-plugin.test.js.map +0 -1
- package/dist-ui/assets/index-BfC7mG5L.js +0 -469
- package/dist-ui/assets/index-BfC7mG5L.js.map +0 -1
- package/dist-ui-lib/components/StatCard.d.ts +0 -16
- package/dist-ui-lib/pages/ConfigPage.d.ts +0 -1
- package/dist-ui-lib/pages/DiagnosticsPage.d.ts +0 -1
- package/dist-ui-lib/pages/IntegrationsPage.d.ts +0 -1
- package/dist-ui-lib/pages/NotificationsPage.d.ts +0 -9
- package/dist-ui-lib/pages/PluginPage.d.ts +0 -15
- package/dist-ui-lib/pages/PluginsPage.d.ts +0 -1
- package/dist-ui-lib/pages/RateLimitPage.d.ts +0 -1
- package/ui/src/components/StatCard.tsx +0 -58
- /package/dist-ui-lib/{config → src/config}/AppConfig.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/DashboardWidgetRegistry.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/DashboardWidgetRenderer.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/PluginWidgetRenderer.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/WidgetComponentRegistry.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/builtInWidgets.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/index.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/AuthStatusWidget.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/IntegrationStatusWidget.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/NotificationsStatsWidget.d.ts +0 -0
- /package/dist-ui-lib/{dashboard → src/dashboard}/widgets/ServiceHealthWidget.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/AuthPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/DashboardPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/EntitlementsPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/LogsPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/NotFoundPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/SystemPage.d.ts +0 -0
- /package/dist-ui-lib/{pages → src/pages}/UsersPage.d.ts +0 -0
- /package/dist-ui-lib/{utils → src/utils}/formatters.d.ts +0 -0
|
@@ -44,6 +44,7 @@ describe('Users Plugin', () => {
|
|
|
44
44
|
external_id: 'auth0|abc123',
|
|
45
45
|
provider: 'auth0',
|
|
46
46
|
picture: 'https://example.com/avatar.jpg',
|
|
47
|
+
status: 'active',
|
|
47
48
|
created_at: new Date('2025-01-01'),
|
|
48
49
|
updated_at: new Date('2025-01-01'),
|
|
49
50
|
last_login_at: new Date('2025-12-13'),
|
|
@@ -64,6 +65,8 @@ describe('Users Plugin', () => {
|
|
|
64
65
|
delete: vi.fn().mockResolvedValue(true),
|
|
65
66
|
search: vi.fn().mockResolvedValue({ users: [mockUser], total: 1, page: 1, limit: 20, totalPages: 1 }),
|
|
66
67
|
updateLastLogin: vi.fn().mockResolvedValue(undefined),
|
|
68
|
+
getByInvitationToken: vi.fn().mockResolvedValue(mockUser),
|
|
69
|
+
acceptInvitation: vi.fn().mockResolvedValue(mockUser),
|
|
67
70
|
shutdown: vi.fn().mockResolvedValue(undefined),
|
|
68
71
|
});
|
|
69
72
|
|
|
@@ -155,9 +158,10 @@ describe('Users Plugin', () => {
|
|
|
155
158
|
const plugin = createUsersPlugin({ store: mockStore });
|
|
156
159
|
await plugin.onStart({}, mockRegistry);
|
|
157
160
|
|
|
158
|
-
// GET
|
|
159
|
-
// + GET
|
|
160
|
-
|
|
161
|
+
// GET /, GET /:id, POST /, POST /invite, PUT /:id, DELETE /:id
|
|
162
|
+
// + GET /:id/info, POST /sync, GET /stats
|
|
163
|
+
// (paths are relative to plugin slug, framework adds /api/users prefix)
|
|
164
|
+
expect(mockRegistry.addRoute).toHaveBeenCalledTimes(9);
|
|
161
165
|
});
|
|
162
166
|
|
|
163
167
|
it('should register /users/:id/info route', async () => {
|
|
@@ -165,12 +169,12 @@ describe('Users Plugin', () => {
|
|
|
165
169
|
await plugin.onStart({}, mockRegistry);
|
|
166
170
|
|
|
167
171
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
168
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
172
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
169
173
|
|
|
170
174
|
expect(infoRoute).toBeDefined();
|
|
171
175
|
expect(infoRoute[0]).toMatchObject({
|
|
172
176
|
method: 'get',
|
|
173
|
-
path: '
|
|
177
|
+
path: '/:id/info',
|
|
174
178
|
pluginId: 'users',
|
|
175
179
|
});
|
|
176
180
|
});
|
|
@@ -180,12 +184,12 @@ describe('Users Plugin', () => {
|
|
|
180
184
|
await plugin.onStart({}, mockRegistry);
|
|
181
185
|
|
|
182
186
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
183
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
187
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
184
188
|
|
|
185
189
|
expect(syncRoute).toBeDefined();
|
|
186
190
|
expect(syncRoute[0]).toMatchObject({
|
|
187
191
|
method: 'post',
|
|
188
|
-
path: '/
|
|
192
|
+
path: '/sync',
|
|
189
193
|
pluginId: 'users',
|
|
190
194
|
});
|
|
191
195
|
});
|
|
@@ -373,7 +377,7 @@ describe('Users Plugin', () => {
|
|
|
373
377
|
|
|
374
378
|
// Find the handler for /users/:id/info
|
|
375
379
|
const calls = (registryWithPlugins.addRoute as any).mock.calls;
|
|
376
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
380
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
377
381
|
const handler = infoRoute[0].handler;
|
|
378
382
|
|
|
379
383
|
// Mock request and response
|
|
@@ -402,7 +406,7 @@ describe('Users Plugin', () => {
|
|
|
402
406
|
|
|
403
407
|
// Find the handler
|
|
404
408
|
const calls = (registryNoPlugins.addRoute as any).mock.calls;
|
|
405
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
409
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
406
410
|
const handler = infoRoute[0].handler;
|
|
407
411
|
|
|
408
412
|
const req = { params: { id: mockUser.id } } as any;
|
|
@@ -424,7 +428,7 @@ describe('Users Plugin', () => {
|
|
|
424
428
|
await plugin.onStart({}, mockRegistry);
|
|
425
429
|
|
|
426
430
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
427
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
431
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
428
432
|
const handler = infoRoute[0].handler;
|
|
429
433
|
|
|
430
434
|
const req = { params: { id: 'non-existent' } } as any;
|
|
@@ -458,7 +462,7 @@ describe('Users Plugin', () => {
|
|
|
458
462
|
await plugin.onStart({}, registryWithBans);
|
|
459
463
|
|
|
460
464
|
const calls = (registryWithBans.addRoute as any).mock.calls;
|
|
461
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
465
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
462
466
|
const handler = infoRoute[0].handler;
|
|
463
467
|
|
|
464
468
|
const req = { params: { id: mockUser.id } } as any;
|
|
@@ -491,7 +495,7 @@ describe('Users Plugin', () => {
|
|
|
491
495
|
await plugin.onStart({}, registryWithPlugins);
|
|
492
496
|
|
|
493
497
|
const calls = (registryWithPlugins.addRoute as any).mock.calls;
|
|
494
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
498
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
495
499
|
const handler = infoRoute[0].handler;
|
|
496
500
|
|
|
497
501
|
const req = { params: { id: mockUser.id } } as any;
|
|
@@ -527,7 +531,7 @@ describe('Users Plugin', () => {
|
|
|
527
531
|
await plugin.onStart({}, registryWithPlugins);
|
|
528
532
|
|
|
529
533
|
const calls = (registryWithPlugins.addRoute as any).mock.calls;
|
|
530
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
534
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
531
535
|
const handler = syncRoute[0].handler;
|
|
532
536
|
|
|
533
537
|
const req = {
|
|
@@ -558,7 +562,7 @@ describe('Users Plugin', () => {
|
|
|
558
562
|
await plugin.onStart({}, mockRegistry);
|
|
559
563
|
|
|
560
564
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
561
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
565
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
562
566
|
const handler = syncRoute[0].handler;
|
|
563
567
|
|
|
564
568
|
const req = {
|
|
@@ -583,7 +587,7 @@ describe('Users Plugin', () => {
|
|
|
583
587
|
await plugin.onStart({}, mockRegistry);
|
|
584
588
|
|
|
585
589
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
586
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
590
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
587
591
|
const handler = syncRoute[0].handler;
|
|
588
592
|
|
|
589
593
|
const req = {
|
|
@@ -609,7 +613,7 @@ describe('Users Plugin', () => {
|
|
|
609
613
|
await plugin.onStart({}, mockRegistry);
|
|
610
614
|
|
|
611
615
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
612
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
616
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
613
617
|
const handler = syncRoute[0].handler;
|
|
614
618
|
|
|
615
619
|
const req = {
|
|
@@ -634,7 +638,7 @@ describe('Users Plugin', () => {
|
|
|
634
638
|
await plugin.onStart({}, mockRegistry);
|
|
635
639
|
|
|
636
640
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
637
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
641
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
638
642
|
const handler = syncRoute[0].handler;
|
|
639
643
|
|
|
640
644
|
const req = {
|
|
@@ -665,7 +669,7 @@ describe('Users Plugin', () => {
|
|
|
665
669
|
await plugin.onStart({}, registryWithPlugins);
|
|
666
670
|
|
|
667
671
|
const calls = (registryWithPlugins.addRoute as any).mock.calls;
|
|
668
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
672
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
669
673
|
const handler = syncRoute[0].handler;
|
|
670
674
|
|
|
671
675
|
const req = {
|
|
@@ -63,24 +63,71 @@ export function postgresUserStore(config: PostgresUserStoreConfig): UserStore {
|
|
|
63
63
|
async initialize(): Promise<void> {
|
|
64
64
|
if (!autoCreateTables) return;
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
66
|
+
try {
|
|
67
|
+
// Create users table
|
|
68
|
+
await getPool().query(`
|
|
69
|
+
CREATE TABLE IF NOT EXISTS ${usersTableFull} (
|
|
70
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
71
|
+
email VARCHAR(255) NOT NULL UNIQUE,
|
|
72
|
+
name VARCHAR(255),
|
|
73
|
+
external_id VARCHAR(255),
|
|
74
|
+
provider VARCHAR(50),
|
|
75
|
+
picture TEXT,
|
|
76
|
+
status VARCHAR(20) DEFAULT 'active',
|
|
77
|
+
invitation_token VARCHAR(255),
|
|
78
|
+
invitation_expires_at TIMESTAMPTZ,
|
|
79
|
+
metadata JSONB DEFAULT '{}',
|
|
80
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
81
|
+
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
82
|
+
last_login_at TIMESTAMPTZ
|
|
83
|
+
);
|
|
84
|
+
`);
|
|
85
|
+
|
|
86
|
+
// Add new columns to existing tables (migration)
|
|
87
|
+
// Use parameterized approach to avoid SQL injection
|
|
88
|
+
const pool = getPool();
|
|
89
|
+
|
|
90
|
+
// Check and add status column
|
|
91
|
+
const statusCheck = await pool.query(
|
|
92
|
+
`SELECT 1 FROM information_schema.columns
|
|
93
|
+
WHERE table_schema = $1 AND table_name = $2 AND column_name = 'status'`,
|
|
94
|
+
[schema, usersTable]
|
|
79
95
|
);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
96
|
+
if (statusCheck.rows.length === 0) {
|
|
97
|
+
await pool.query(`ALTER TABLE ${usersTableFull} ADD COLUMN status VARCHAR(20) DEFAULT 'active'`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Check and add invitation_token column
|
|
101
|
+
const tokenCheck = await pool.query(
|
|
102
|
+
`SELECT 1 FROM information_schema.columns
|
|
103
|
+
WHERE table_schema = $1 AND table_name = $2 AND column_name = 'invitation_token'`,
|
|
104
|
+
[schema, usersTable]
|
|
105
|
+
);
|
|
106
|
+
if (tokenCheck.rows.length === 0) {
|
|
107
|
+
await pool.query(`ALTER TABLE ${usersTableFull} ADD COLUMN invitation_token VARCHAR(255)`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Check and add invitation_expires_at column
|
|
111
|
+
const expiresCheck = await pool.query(
|
|
112
|
+
`SELECT 1 FROM information_schema.columns
|
|
113
|
+
WHERE table_schema = $1 AND table_name = $2 AND column_name = 'invitation_expires_at'`,
|
|
114
|
+
[schema, usersTable]
|
|
115
|
+
);
|
|
116
|
+
if (expiresCheck.rows.length === 0) {
|
|
117
|
+
await pool.query(`ALTER TABLE ${usersTableFull} ADD COLUMN invitation_expires_at TIMESTAMPTZ`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Create indexes after ensuring all columns exist
|
|
121
|
+
await pool.query(`
|
|
122
|
+
CREATE INDEX IF NOT EXISTS idx_${usersTable}_email ON ${usersTableFull}(email);
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_${usersTable}_external_id ON ${usersTableFull}(external_id, provider);
|
|
124
|
+
CREATE INDEX IF NOT EXISTS idx_${usersTable}_invitation_token ON ${usersTableFull}(invitation_token);
|
|
125
|
+
CREATE INDEX IF NOT EXISTS idx_${usersTable}_status ON ${usersTableFull}(status);
|
|
126
|
+
`);
|
|
127
|
+
} catch (error) {
|
|
128
|
+
console.error('[PostgresUserStore] Failed to initialize:', error);
|
|
129
|
+
throw new Error(`Failed to initialize users table: ${error instanceof Error ? error.message : String(error)}`);
|
|
130
|
+
}
|
|
84
131
|
},
|
|
85
132
|
|
|
86
133
|
async getById(id: string): Promise<User | null> {
|
|
@@ -263,6 +310,7 @@ export function postgresUserStore(config: PostgresUserStoreConfig): UserStore {
|
|
|
263
310
|
const {
|
|
264
311
|
query,
|
|
265
312
|
provider,
|
|
313
|
+
status,
|
|
266
314
|
page = 1,
|
|
267
315
|
limit = 20,
|
|
268
316
|
sortBy = 'created_at',
|
|
@@ -285,6 +333,12 @@ export function postgresUserStore(config: PostgresUserStoreConfig): UserStore {
|
|
|
285
333
|
paramIndex++;
|
|
286
334
|
}
|
|
287
335
|
|
|
336
|
+
if (status) {
|
|
337
|
+
conditions.push(`status = $${paramIndex}`);
|
|
338
|
+
values.push(status);
|
|
339
|
+
paramIndex++;
|
|
340
|
+
}
|
|
341
|
+
|
|
288
342
|
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
289
343
|
|
|
290
344
|
// Validate sort column to prevent SQL injection
|
|
@@ -322,6 +376,30 @@ export function postgresUserStore(config: PostgresUserStoreConfig): UserStore {
|
|
|
322
376
|
await getPool().query(`UPDATE ${usersTableFull} SET last_login_at = NOW() WHERE id = $1`, [id]);
|
|
323
377
|
},
|
|
324
378
|
|
|
379
|
+
async getByInvitationToken(token: string): Promise<User | null> {
|
|
380
|
+
const result = await getPool().query(
|
|
381
|
+
`SELECT * FROM ${usersTableFull} WHERE invitation_token = $1 AND invitation_expires_at > NOW()`,
|
|
382
|
+
[token]
|
|
383
|
+
);
|
|
384
|
+
return (result.rows[0] as User) || null;
|
|
385
|
+
},
|
|
386
|
+
|
|
387
|
+
async acceptInvitation(token: string): Promise<User | null> {
|
|
388
|
+
const result = await getPool().query(
|
|
389
|
+
`UPDATE ${usersTableFull}
|
|
390
|
+
SET status = 'active',
|
|
391
|
+
invitation_token = NULL,
|
|
392
|
+
invitation_expires_at = NULL,
|
|
393
|
+
updated_at = NOW()
|
|
394
|
+
WHERE invitation_token = $1
|
|
395
|
+
AND invitation_expires_at > NOW()
|
|
396
|
+
AND status = 'invited'
|
|
397
|
+
RETURNING *`,
|
|
398
|
+
[token]
|
|
399
|
+
);
|
|
400
|
+
return (result.rows[0] as User) || null;
|
|
401
|
+
},
|
|
402
|
+
|
|
325
403
|
async shutdown(): Promise<void> {
|
|
326
404
|
// Pool is managed externally, nothing to do here
|
|
327
405
|
},
|
|
@@ -9,6 +9,11 @@
|
|
|
9
9
|
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* User status in the system
|
|
14
|
+
*/
|
|
15
|
+
export type UserStatus = 'invited' | 'active' | 'suspended';
|
|
16
|
+
|
|
12
17
|
/**
|
|
13
18
|
* User record in the database
|
|
14
19
|
*/
|
|
@@ -25,6 +30,12 @@ export interface User {
|
|
|
25
30
|
provider?: string;
|
|
26
31
|
/** Profile picture URL */
|
|
27
32
|
picture?: string;
|
|
33
|
+
/** User status */
|
|
34
|
+
status: UserStatus;
|
|
35
|
+
/** Invitation token (set when user is invited) */
|
|
36
|
+
invitation_token?: string;
|
|
37
|
+
/** Invitation expiration timestamp */
|
|
38
|
+
invitation_expires_at?: Date;
|
|
28
39
|
/** Additional metadata (JSON) */
|
|
29
40
|
metadata?: Record<string, unknown>;
|
|
30
41
|
/** When the user was created */
|
|
@@ -90,6 +101,8 @@ export interface UserSearchParams {
|
|
|
90
101
|
query?: string;
|
|
91
102
|
/** Filter by provider */
|
|
92
103
|
provider?: string;
|
|
104
|
+
/** Filter by status */
|
|
105
|
+
status?: UserStatus;
|
|
93
106
|
/** Page number (1-indexed) */
|
|
94
107
|
page?: number;
|
|
95
108
|
/** Items per page */
|
|
@@ -182,6 +195,18 @@ export interface UserStore {
|
|
|
182
195
|
*/
|
|
183
196
|
updateLastLogin(id: string): Promise<void>;
|
|
184
197
|
|
|
198
|
+
/**
|
|
199
|
+
* Get a user by invitation token (only if invitation is valid and not expired)
|
|
200
|
+
*/
|
|
201
|
+
getByInvitationToken(token: string): Promise<User | null>;
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Accept an invitation by token.
|
|
205
|
+
* Sets status to 'active' and clears invitation token fields.
|
|
206
|
+
* Returns the updated user or null if token is invalid/expired.
|
|
207
|
+
*/
|
|
208
|
+
acceptInvitation(token: string): Promise<User | null>;
|
|
209
|
+
|
|
185
210
|
/**
|
|
186
211
|
* Shutdown the store
|
|
187
212
|
*/
|
|
@@ -219,7 +244,12 @@ export interface UserSyncConfig {
|
|
|
219
244
|
* API configuration
|
|
220
245
|
*/
|
|
221
246
|
export interface UsersApiConfig {
|
|
222
|
-
/**
|
|
247
|
+
/**
|
|
248
|
+
* API route prefix relative to plugin slug (default: '/')
|
|
249
|
+
* Final path will be /api/{slug}{prefix}
|
|
250
|
+
* Example: prefix='/' results in /api/users/
|
|
251
|
+
* prefix='/v2' results in /api/users/v2
|
|
252
|
+
*/
|
|
223
253
|
prefix?: string;
|
|
224
254
|
/** Enable CRUD endpoints */
|
|
225
255
|
crud?: boolean;
|
|
@@ -249,6 +279,8 @@ export interface UsersPluginConfig {
|
|
|
249
279
|
api?: UsersApiConfig;
|
|
250
280
|
/** UI configuration */
|
|
251
281
|
ui?: UsersUiConfig;
|
|
282
|
+
/** Control panel mount path (default: '/cpanel') - used for generating invitation links */
|
|
283
|
+
controlPanelPath?: string;
|
|
252
284
|
/** Enable debug logging */
|
|
253
285
|
debug?: boolean;
|
|
254
286
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import { randomBytes } from 'node:crypto';
|
|
12
13
|
import type { Request, Response } from 'express';
|
|
13
14
|
import type { Plugin, PluginConfig, PluginRegistry } from '../../core/plugin-registry.js';
|
|
14
15
|
import type {
|
|
@@ -39,7 +40,7 @@ let currentRegistry: PluginRegistry | null = null;
|
|
|
39
40
|
export function createUsersPlugin(config: UsersPluginConfig): Plugin {
|
|
40
41
|
const debug = config.debug || false;
|
|
41
42
|
// Routes are mounted under /api by the control panel, so don't include /api in prefix
|
|
42
|
-
const apiPrefix = config.api?.prefix || '/
|
|
43
|
+
const apiPrefix = config.api?.prefix || '/'; // Framework adds /users prefix automatically
|
|
43
44
|
|
|
44
45
|
function log(message: string, data?: Record<string, unknown>) {
|
|
45
46
|
if (debug) {
|
|
@@ -159,6 +160,110 @@ export function createUsersPlugin(config: UsersPluginConfig): Plugin {
|
|
|
159
160
|
},
|
|
160
161
|
});
|
|
161
162
|
|
|
163
|
+
// Invite user
|
|
164
|
+
registry.addRoute({
|
|
165
|
+
method: 'post',
|
|
166
|
+
path: apiPrefix === '/' ? '/invite' : `${apiPrefix}/invite`,
|
|
167
|
+
pluginId: 'users',
|
|
168
|
+
handler: async (req: Request, res: Response) => {
|
|
169
|
+
try {
|
|
170
|
+
const { email, name, role } = req.body;
|
|
171
|
+
|
|
172
|
+
if (!email) {
|
|
173
|
+
return res.status(400).json({ error: 'Email is required' });
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Check if user already exists
|
|
177
|
+
const existing = await config.store.getByEmail(email);
|
|
178
|
+
if (existing) {
|
|
179
|
+
return res.status(409).json({ error: 'User with this email already exists' });
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Generate invitation token (32 bytes = 64 hex chars)
|
|
183
|
+
const token = randomBytes(32).toString('hex');
|
|
184
|
+
|
|
185
|
+
// Set expiration to 7 days from now
|
|
186
|
+
const expiresAt = new Date();
|
|
187
|
+
expiresAt.setDate(expiresAt.getDate() + 7);
|
|
188
|
+
|
|
189
|
+
// Create user with invited status
|
|
190
|
+
const user = await config.store.create({
|
|
191
|
+
email,
|
|
192
|
+
name,
|
|
193
|
+
metadata: role ? { role } : undefined,
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// Update with invitation token
|
|
197
|
+
const { getPostgres } = await import('../postgres-plugin.js');
|
|
198
|
+
const pool = getPostgres().getPool();
|
|
199
|
+
await pool.query(
|
|
200
|
+
`UPDATE users SET
|
|
201
|
+
status = 'invited',
|
|
202
|
+
invitation_token = $1,
|
|
203
|
+
invitation_expires_at = $2
|
|
204
|
+
WHERE id = $3`,
|
|
205
|
+
[token, expiresAt, user.id]
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
// Get base URL from request
|
|
209
|
+
const protocol = req.get('x-forwarded-proto') || req.protocol;
|
|
210
|
+
const host = req.get('host');
|
|
211
|
+
const baseUrl = `${protocol}://${host}`;
|
|
212
|
+
const cpanelPath = config.controlPanelPath || '/cpanel';
|
|
213
|
+
const inviteLink = `${baseUrl}${cpanelPath}/accept-invitation/${token}`;
|
|
214
|
+
|
|
215
|
+
res.status(201).json({
|
|
216
|
+
user: { ...user, status: 'invited' as const, invitation_token: token, invitation_expires_at: expiresAt },
|
|
217
|
+
token,
|
|
218
|
+
inviteLink,
|
|
219
|
+
expiresAt: expiresAt.toISOString(),
|
|
220
|
+
});
|
|
221
|
+
} catch (error) {
|
|
222
|
+
console.error('[UsersPlugin] Invite user error:', error);
|
|
223
|
+
res.status(500).json({ error: 'Failed to invite user' });
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Accept invitation
|
|
229
|
+
registry.addRoute({
|
|
230
|
+
method: 'post',
|
|
231
|
+
path: apiPrefix === '/' ? '/accept-invitation/:token' : `${apiPrefix}/accept-invitation/:token`,
|
|
232
|
+
pluginId: 'users',
|
|
233
|
+
handler: async (req: Request, res: Response) => {
|
|
234
|
+
try {
|
|
235
|
+
const { token } = req.params;
|
|
236
|
+
|
|
237
|
+
if (!token) {
|
|
238
|
+
return res.status(400).json({ error: 'Invitation token is required' });
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const user = await config.store.acceptInvitation(token);
|
|
242
|
+
|
|
243
|
+
if (!user) {
|
|
244
|
+
return res.status(404).json({
|
|
245
|
+
error: 'Invalid or expired invitation token',
|
|
246
|
+
details: 'The invitation link may have expired or already been used'
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
res.json({
|
|
251
|
+
success: true,
|
|
252
|
+
user: {
|
|
253
|
+
id: user.id,
|
|
254
|
+
email: user.email,
|
|
255
|
+
name: user.name,
|
|
256
|
+
status: user.status,
|
|
257
|
+
},
|
|
258
|
+
message: 'Invitation accepted successfully. You can now log in.',
|
|
259
|
+
});
|
|
260
|
+
} catch (error) {
|
|
261
|
+
console.error('[UsersPlugin] Accept invitation error:', error);
|
|
262
|
+
res.status(500).json({ error: 'Failed to accept invitation' });
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
|
|
162
267
|
// Update user
|
|
163
268
|
registry.addRoute({
|
|
164
269
|
method: 'put',
|
|
@@ -206,7 +311,7 @@ export function createUsersPlugin(config: UsersPluginConfig): Plugin {
|
|
|
206
311
|
// GET /users/:id/info - Get comprehensive user info
|
|
207
312
|
registry.addRoute({
|
|
208
313
|
method: 'get',
|
|
209
|
-
path: `${apiPrefix}/:id/info`,
|
|
314
|
+
path: apiPrefix === '/' ? '/:id/info' : `${apiPrefix}/:id/info`,
|
|
210
315
|
pluginId: 'users',
|
|
211
316
|
handler: async (req: Request, res: Response) => {
|
|
212
317
|
try {
|
|
@@ -227,7 +332,7 @@ export function createUsersPlugin(config: UsersPluginConfig): Plugin {
|
|
|
227
332
|
// POST /users/sync - Find or create user, return comprehensive info
|
|
228
333
|
registry.addRoute({
|
|
229
334
|
method: 'post',
|
|
230
|
-
path: `${apiPrefix}/sync`,
|
|
335
|
+
path: apiPrefix === '/' ? '/sync' : `${apiPrefix}/sync`,
|
|
231
336
|
pluginId: 'users',
|
|
232
337
|
handler: async (req: Request, res: Response) => {
|
|
233
338
|
try {
|
|
@@ -265,6 +370,35 @@ export function createUsersPlugin(config: UsersPluginConfig): Plugin {
|
|
|
265
370
|
}
|
|
266
371
|
},
|
|
267
372
|
});
|
|
373
|
+
|
|
374
|
+
// GET /users/stats - Get user statistics
|
|
375
|
+
registry.addRoute({
|
|
376
|
+
method: 'get',
|
|
377
|
+
path: apiPrefix === '/' ? '/stats' : `${apiPrefix}/stats`,
|
|
378
|
+
pluginId: 'users',
|
|
379
|
+
handler: async (_req: Request, res: Response) => {
|
|
380
|
+
try {
|
|
381
|
+
const allUsers = await config.store.search({ limit: 10000 });
|
|
382
|
+
const now = Date.now();
|
|
383
|
+
const sevenDaysAgo = now - 7 * 24 * 60 * 60 * 1000;
|
|
384
|
+
|
|
385
|
+
const stats = {
|
|
386
|
+
totalUsers: allUsers.total,
|
|
387
|
+
activeUsers: allUsers.users.filter((u) => u.status === 'active').length,
|
|
388
|
+
invitedUsers: allUsers.users.filter((u) => u.status === 'invited').length,
|
|
389
|
+
suspendedUsers: allUsers.users.filter((u) => u.status === 'suspended').length,
|
|
390
|
+
recentSignups: allUsers.users.filter(
|
|
391
|
+
(u) => new Date(u.created_at).getTime() > sevenDaysAgo
|
|
392
|
+
).length,
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
res.json(stats);
|
|
396
|
+
} catch (error) {
|
|
397
|
+
console.error('[UsersPlugin] Get stats error:', error);
|
|
398
|
+
res.status(500).json({ error: 'Failed to get user stats' });
|
|
399
|
+
}
|
|
400
|
+
},
|
|
401
|
+
});
|
|
268
402
|
}
|
|
269
403
|
|
|
270
404
|
log('Users plugin started');
|
package/ui/src/App.tsx
CHANGED
|
@@ -18,6 +18,9 @@ import { AuthPage } from './pages/AuthPage';
|
|
|
18
18
|
import { RateLimitPage } from './pages/RateLimitPage';
|
|
19
19
|
import { NotificationsPage } from './pages/NotificationsPage';
|
|
20
20
|
import { IntegrationsPage } from './pages/IntegrationsPage';
|
|
21
|
+
import { APIKeysPage } from './pages/APIKeysPage';
|
|
22
|
+
import { ContentOpsJobsPage } from './pages/ContentOpsJobsPage';
|
|
23
|
+
import { MaintenancePage } from './pages/MaintenancePage';
|
|
21
24
|
import { PluginPage } from './pages/PluginPage';
|
|
22
25
|
import { NotFoundPage } from './pages/NotFoundPage';
|
|
23
26
|
import { api, type MenuContribution } from './api/controlPanelApi';
|
|
@@ -41,10 +44,11 @@ const coreNavigationItems: NavigationItem[] = [
|
|
|
41
44
|
// Built-in optional navigation items - shown if corresponding plugin is registered
|
|
42
45
|
const builtInPluginNavItems: Record<string, NavigationItem> = {
|
|
43
46
|
users: { id: 'users', label: 'Users', route: '/users', icon: 'people' },
|
|
47
|
+
'api-keys': { id: 'api-keys', label: 'API Keys', route: '/api-keys', icon: 'key' },
|
|
44
48
|
};
|
|
45
49
|
|
|
46
50
|
// Routes that have dedicated page components
|
|
47
|
-
const dedicatedRoutes = new Set(['/', '/plugins', '/logs', '/system', '/users', '/entitlements', '/auth', '/rate-limits', '/notifications', '/integrations']);
|
|
51
|
+
const dedicatedRoutes = new Set(['/', '/plugins', '/logs', '/system', '/users', '/entitlements', '/auth', '/rate-limits', '/notifications', '/integrations', '/api-keys', '/contentops/jobs', '/maintenance']);
|
|
48
52
|
|
|
49
53
|
// Package version - injected at build time or fallback
|
|
50
54
|
const SERVER_VERSION = '1.0.0';
|
|
@@ -61,12 +65,13 @@ declare global {
|
|
|
61
65
|
*
|
|
62
66
|
* The server injects window.__APP_BASE_PATH__ at runtime based on
|
|
63
67
|
* either the configured mountPath or X-Forwarded-Prefix header.
|
|
64
|
-
* This is
|
|
68
|
+
* This is used for BrowserRouter routing, but NOT for API calls.
|
|
65
69
|
*/
|
|
66
70
|
const basePath = window.__APP_BASE_PATH__ ?? '';
|
|
67
71
|
|
|
68
|
-
//
|
|
69
|
-
api
|
|
72
|
+
// API routes are always at '/api' regardless of control panel mount path
|
|
73
|
+
// The control panel might be mounted at /cpanel, but API is always at /api
|
|
74
|
+
api.setBaseUrl('');
|
|
70
75
|
|
|
71
76
|
// Footer content with QwickApps Server branding
|
|
72
77
|
const footerContent = (
|
|
@@ -222,6 +227,15 @@ export function App() {
|
|
|
222
227
|
{registeredPlugins.has('ai-proxy') && (
|
|
223
228
|
<Route path="/integrations" element={<IntegrationsPage />} />
|
|
224
229
|
)}
|
|
230
|
+
{registeredPlugins.has('api-keys') && (
|
|
231
|
+
<Route path="/api-keys" element={<APIKeysPage />} />
|
|
232
|
+
)}
|
|
233
|
+
{registeredPlugins.has('contentops') && (
|
|
234
|
+
<Route path="/contentops/jobs" element={<ContentOpsJobsPage />} />
|
|
235
|
+
)}
|
|
236
|
+
{registeredPlugins.has('maintenance') && (
|
|
237
|
+
<Route path="/maintenance" element={<MaintenancePage />} />
|
|
238
|
+
)}
|
|
225
239
|
|
|
226
240
|
{/* Dynamic plugin routes - render generic PluginPage for non-dedicated routes */}
|
|
227
241
|
{pluginMenuItems
|