@qwickapps/server 1.6.0 → 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 +64 -0
- package/README.md +177 -0
- package/dist/core/control-panel.d.ts.map +1 -1
- package/dist/core/control-panel.js +111 -254
- 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.map +1 -1
- package/dist/plugins/api-keys/api-keys-plugin.js +126 -3
- package/dist/plugins/api-keys/api-keys-plugin.js.map +1 -1
- package/dist/plugins/api-keys/index.d.ts +4 -0
- package/dist/plugins/api-keys/index.d.ts.map +1 -1
- package/dist/plugins/api-keys/index.js +3 -0
- package/dist/plugins/api-keys/index.js.map +1 -1
- package/dist/plugins/api-keys/middleware/index.d.ts +1 -0
- package/dist/plugins/api-keys/middleware/index.d.ts.map +1 -1
- package/dist/plugins/api-keys/middleware/index.js +1 -0
- package/dist/plugins/api-keys/middleware/index.js.map +1 -1
- 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 +2 -0
- package/dist/plugins/api-keys/stores/index.d.ts.map +1 -1
- package/dist/plugins/api-keys/stores/index.js +2 -0
- package/dist/plugins/api-keys/stores/index.js.map +1 -1
- 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/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 +62 -21
- package/dist/plugins/api-keys/types.d.ts.map +1 -1
- package/dist/plugins/api-keys/types.js +50 -1
- package/dist/plugins/api-keys/types.js.map +1 -1
- 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/env-config.d.ts +15 -1
- package/dist/plugins/auth/env-config.d.ts.map +1 -1
- package/dist/plugins/auth/env-config.js +14 -4
- 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/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 +52 -55
- package/dist/plugins/users/stores/postgres-store.js.map +1 -1
- package/dist/plugins/users/types.d.ts +8 -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 +3693 -3126
- 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 +65 -3
- 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 +3 -1
- 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/PreferencesPage.d.ts +9 -0
- package/package.json +10 -4
- package/src/core/control-panel.ts +134 -279
- 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 +139 -3
- package/src/plugins/api-keys/index.ts +6 -0
- package/src/plugins/api-keys/middleware/index.ts +3 -0
- package/src/plugins/api-keys/middleware/usage-logging.ts +78 -0
- package/src/plugins/api-keys/stores/index.ts +14 -0
- package/src/plugins/api-keys/stores/plugin-scope-store.ts +280 -0
- package/src/plugins/api-keys/stores/usage-log-store.ts +423 -0
- package/src/plugins/api-keys/types.ts +66 -2
- 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/env-config.ts +14 -4
- 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/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__/users-plugin.test.ts +19 -18
- package/src/plugins/users/stores/postgres-store.ts +64 -55
- package/src/plugins/users/types.ts +8 -1
- package/src/plugins/users/users-plugin.ts +137 -3
- package/ui/src/App.tsx +13 -4
- package/ui/src/api/clientBuilder.ts +206 -0
- package/ui/src/api/controlPanelApi.ts +199 -169
- 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 +15 -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 +262 -74
- 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/__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 -230
- 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 -552
- package/dist/plugins/users/__tests__/users-plugin.test.js.map +0 -1
- package/dist-ui/assets/index-5nX8fM1a.js +0 -469
- package/dist-ui/assets/index-5nX8fM1a.js.map +0 -1
- package/dist-ui-lib/components/StatCard.d.ts +0 -16
- package/dist-ui-lib/pages/APIKeysPage.d.ts +0 -13
- 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}/AcceptInvitationPage.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
|
@@ -158,9 +158,10 @@ describe('Users Plugin', () => {
|
|
|
158
158
|
const plugin = createUsersPlugin({ store: mockStore });
|
|
159
159
|
await plugin.onStart({}, mockRegistry);
|
|
160
160
|
|
|
161
|
-
// GET
|
|
162
|
-
// + GET
|
|
163
|
-
|
|
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);
|
|
164
165
|
});
|
|
165
166
|
|
|
166
167
|
it('should register /users/:id/info route', async () => {
|
|
@@ -168,12 +169,12 @@ describe('Users Plugin', () => {
|
|
|
168
169
|
await plugin.onStart({}, mockRegistry);
|
|
169
170
|
|
|
170
171
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
171
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
172
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
172
173
|
|
|
173
174
|
expect(infoRoute).toBeDefined();
|
|
174
175
|
expect(infoRoute[0]).toMatchObject({
|
|
175
176
|
method: 'get',
|
|
176
|
-
path: '
|
|
177
|
+
path: '/:id/info',
|
|
177
178
|
pluginId: 'users',
|
|
178
179
|
});
|
|
179
180
|
});
|
|
@@ -183,12 +184,12 @@ describe('Users Plugin', () => {
|
|
|
183
184
|
await plugin.onStart({}, mockRegistry);
|
|
184
185
|
|
|
185
186
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
186
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
187
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
187
188
|
|
|
188
189
|
expect(syncRoute).toBeDefined();
|
|
189
190
|
expect(syncRoute[0]).toMatchObject({
|
|
190
191
|
method: 'post',
|
|
191
|
-
path: '/
|
|
192
|
+
path: '/sync',
|
|
192
193
|
pluginId: 'users',
|
|
193
194
|
});
|
|
194
195
|
});
|
|
@@ -376,7 +377,7 @@ describe('Users Plugin', () => {
|
|
|
376
377
|
|
|
377
378
|
// Find the handler for /users/:id/info
|
|
378
379
|
const calls = (registryWithPlugins.addRoute as any).mock.calls;
|
|
379
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
380
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
380
381
|
const handler = infoRoute[0].handler;
|
|
381
382
|
|
|
382
383
|
// Mock request and response
|
|
@@ -405,7 +406,7 @@ describe('Users Plugin', () => {
|
|
|
405
406
|
|
|
406
407
|
// Find the handler
|
|
407
408
|
const calls = (registryNoPlugins.addRoute as any).mock.calls;
|
|
408
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
409
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
409
410
|
const handler = infoRoute[0].handler;
|
|
410
411
|
|
|
411
412
|
const req = { params: { id: mockUser.id } } as any;
|
|
@@ -427,7 +428,7 @@ describe('Users Plugin', () => {
|
|
|
427
428
|
await plugin.onStart({}, mockRegistry);
|
|
428
429
|
|
|
429
430
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
430
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
431
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
431
432
|
const handler = infoRoute[0].handler;
|
|
432
433
|
|
|
433
434
|
const req = { params: { id: 'non-existent' } } as any;
|
|
@@ -461,7 +462,7 @@ describe('Users Plugin', () => {
|
|
|
461
462
|
await plugin.onStart({}, registryWithBans);
|
|
462
463
|
|
|
463
464
|
const calls = (registryWithBans.addRoute as any).mock.calls;
|
|
464
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
465
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
465
466
|
const handler = infoRoute[0].handler;
|
|
466
467
|
|
|
467
468
|
const req = { params: { id: mockUser.id } } as any;
|
|
@@ -494,7 +495,7 @@ describe('Users Plugin', () => {
|
|
|
494
495
|
await plugin.onStart({}, registryWithPlugins);
|
|
495
496
|
|
|
496
497
|
const calls = (registryWithPlugins.addRoute as any).mock.calls;
|
|
497
|
-
const infoRoute = calls.find((c: any) => c[0].path === '
|
|
498
|
+
const infoRoute = calls.find((c: any) => c[0].path === '/:id/info');
|
|
498
499
|
const handler = infoRoute[0].handler;
|
|
499
500
|
|
|
500
501
|
const req = { params: { id: mockUser.id } } as any;
|
|
@@ -530,7 +531,7 @@ describe('Users Plugin', () => {
|
|
|
530
531
|
await plugin.onStart({}, registryWithPlugins);
|
|
531
532
|
|
|
532
533
|
const calls = (registryWithPlugins.addRoute as any).mock.calls;
|
|
533
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
534
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
534
535
|
const handler = syncRoute[0].handler;
|
|
535
536
|
|
|
536
537
|
const req = {
|
|
@@ -561,7 +562,7 @@ describe('Users Plugin', () => {
|
|
|
561
562
|
await plugin.onStart({}, mockRegistry);
|
|
562
563
|
|
|
563
564
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
564
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
565
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
565
566
|
const handler = syncRoute[0].handler;
|
|
566
567
|
|
|
567
568
|
const req = {
|
|
@@ -586,7 +587,7 @@ describe('Users Plugin', () => {
|
|
|
586
587
|
await plugin.onStart({}, mockRegistry);
|
|
587
588
|
|
|
588
589
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
589
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
590
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
590
591
|
const handler = syncRoute[0].handler;
|
|
591
592
|
|
|
592
593
|
const req = {
|
|
@@ -612,7 +613,7 @@ describe('Users Plugin', () => {
|
|
|
612
613
|
await plugin.onStart({}, mockRegistry);
|
|
613
614
|
|
|
614
615
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
615
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
616
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
616
617
|
const handler = syncRoute[0].handler;
|
|
617
618
|
|
|
618
619
|
const req = {
|
|
@@ -637,7 +638,7 @@ describe('Users Plugin', () => {
|
|
|
637
638
|
await plugin.onStart({}, mockRegistry);
|
|
638
639
|
|
|
639
640
|
const calls = (mockRegistry.addRoute as any).mock.calls;
|
|
640
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
641
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
641
642
|
const handler = syncRoute[0].handler;
|
|
642
643
|
|
|
643
644
|
const req = {
|
|
@@ -668,7 +669,7 @@ describe('Users Plugin', () => {
|
|
|
668
669
|
await plugin.onStart({}, registryWithPlugins);
|
|
669
670
|
|
|
670
671
|
const calls = (registryWithPlugins.addRoute as any).mock.calls;
|
|
671
|
-
const syncRoute = calls.find((c: any) => c[0].path === '/
|
|
672
|
+
const syncRoute = calls.find((c: any) => c[0].path === '/sync');
|
|
672
673
|
const handler = syncRoute[0].handler;
|
|
673
674
|
|
|
674
675
|
const req = {
|
|
@@ -63,62 +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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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]
|
|
82
95
|
);
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
IF NOT EXISTS (
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
ALTER TABLE ${usersTableFull} ADD COLUMN invitation_expires_at TIMESTAMPTZ;
|
|
119
|
-
END IF;
|
|
120
|
-
END $$;
|
|
121
|
-
`);
|
|
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
|
+
}
|
|
122
131
|
},
|
|
123
132
|
|
|
124
133
|
async getById(id: string): Promise<User | null> {
|
|
@@ -244,7 +244,12 @@ export interface UserSyncConfig {
|
|
|
244
244
|
* API configuration
|
|
245
245
|
*/
|
|
246
246
|
export interface UsersApiConfig {
|
|
247
|
-
/**
|
|
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
|
+
*/
|
|
248
253
|
prefix?: string;
|
|
249
254
|
/** Enable CRUD endpoints */
|
|
250
255
|
crud?: boolean;
|
|
@@ -274,6 +279,8 @@ export interface UsersPluginConfig {
|
|
|
274
279
|
api?: UsersApiConfig;
|
|
275
280
|
/** UI configuration */
|
|
276
281
|
ui?: UsersUiConfig;
|
|
282
|
+
/** Control panel mount path (default: '/cpanel') - used for generating invitation links */
|
|
283
|
+
controlPanelPath?: string;
|
|
277
284
|
/** Enable debug logging */
|
|
278
285
|
debug?: boolean;
|
|
279
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
|
@@ -19,6 +19,8 @@ import { RateLimitPage } from './pages/RateLimitPage';
|
|
|
19
19
|
import { NotificationsPage } from './pages/NotificationsPage';
|
|
20
20
|
import { IntegrationsPage } from './pages/IntegrationsPage';
|
|
21
21
|
import { APIKeysPage } from './pages/APIKeysPage';
|
|
22
|
+
import { ContentOpsJobsPage } from './pages/ContentOpsJobsPage';
|
|
23
|
+
import { MaintenancePage } from './pages/MaintenancePage';
|
|
22
24
|
import { PluginPage } from './pages/PluginPage';
|
|
23
25
|
import { NotFoundPage } from './pages/NotFoundPage';
|
|
24
26
|
import { api, type MenuContribution } from './api/controlPanelApi';
|
|
@@ -46,7 +48,7 @@ const builtInPluginNavItems: Record<string, NavigationItem> = {
|
|
|
46
48
|
};
|
|
47
49
|
|
|
48
50
|
// Routes that have dedicated page components
|
|
49
|
-
const dedicatedRoutes = new Set(['/', '/plugins', '/logs', '/system', '/users', '/entitlements', '/auth', '/rate-limits', '/notifications', '/integrations', '/api-keys']);
|
|
51
|
+
const dedicatedRoutes = new Set(['/', '/plugins', '/logs', '/system', '/users', '/entitlements', '/auth', '/rate-limits', '/notifications', '/integrations', '/api-keys', '/contentops/jobs', '/maintenance']);
|
|
50
52
|
|
|
51
53
|
// Package version - injected at build time or fallback
|
|
52
54
|
const SERVER_VERSION = '1.0.0';
|
|
@@ -63,12 +65,13 @@ declare global {
|
|
|
63
65
|
*
|
|
64
66
|
* The server injects window.__APP_BASE_PATH__ at runtime based on
|
|
65
67
|
* either the configured mountPath or X-Forwarded-Prefix header.
|
|
66
|
-
* This is
|
|
68
|
+
* This is used for BrowserRouter routing, but NOT for API calls.
|
|
67
69
|
*/
|
|
68
70
|
const basePath = window.__APP_BASE_PATH__ ?? '';
|
|
69
71
|
|
|
70
|
-
//
|
|
71
|
-
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('');
|
|
72
75
|
|
|
73
76
|
// Footer content with QwickApps Server branding
|
|
74
77
|
const footerContent = (
|
|
@@ -227,6 +230,12 @@ export function App() {
|
|
|
227
230
|
{registeredPlugins.has('api-keys') && (
|
|
228
231
|
<Route path="/api-keys" element={<APIKeysPage />} />
|
|
229
232
|
)}
|
|
233
|
+
{registeredPlugins.has('contentops') && (
|
|
234
|
+
<Route path="/contentops/jobs" element={<ContentOpsJobsPage />} />
|
|
235
|
+
)}
|
|
236
|
+
{registeredPlugins.has('maintenance') && (
|
|
237
|
+
<Route path="/maintenance" element={<MaintenancePage />} />
|
|
238
|
+
)}
|
|
230
239
|
|
|
231
240
|
{/* Dynamic plugin routes - render generic PluginPage for non-dedicated routes */}
|
|
232
241
|
{pluginMenuItems
|