@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
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Key Usage Log Store - PostgreSQL Implementation
|
|
3
|
+
*
|
|
4
|
+
* Tracks all API calls made with API keys for audit trails and usage analytics.
|
|
5
|
+
* Uses table partitioning for efficient storage and querying of large log volumes.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { Pool } from 'pg';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* API key usage log entry
|
|
14
|
+
*/
|
|
15
|
+
export interface UsageLogEntry {
|
|
16
|
+
/** Log entry ID */
|
|
17
|
+
id?: string;
|
|
18
|
+
/** API key ID that made the request */
|
|
19
|
+
key_id: string;
|
|
20
|
+
/** Endpoint path (e.g., '/cpanel/api/qwickbrain/tools') */
|
|
21
|
+
endpoint: string;
|
|
22
|
+
/** HTTP method (GET, POST, etc.) */
|
|
23
|
+
method: string;
|
|
24
|
+
/** HTTP response status code */
|
|
25
|
+
status_code?: number;
|
|
26
|
+
/** Client IP address */
|
|
27
|
+
ip_address?: string;
|
|
28
|
+
/** User agent string */
|
|
29
|
+
user_agent?: string;
|
|
30
|
+
/** Request timestamp */
|
|
31
|
+
timestamp?: Date;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Usage log query options
|
|
36
|
+
*/
|
|
37
|
+
export interface UsageLogQueryOptions {
|
|
38
|
+
/** Limit number of results */
|
|
39
|
+
limit?: number;
|
|
40
|
+
/** Offset for pagination */
|
|
41
|
+
offset?: number;
|
|
42
|
+
/** Filter by start date */
|
|
43
|
+
since?: Date;
|
|
44
|
+
/** Filter by end date */
|
|
45
|
+
until?: Date;
|
|
46
|
+
/** Filter by endpoint pattern */
|
|
47
|
+
endpoint?: string;
|
|
48
|
+
/** Filter by HTTP method */
|
|
49
|
+
method?: string;
|
|
50
|
+
/** Filter by status code */
|
|
51
|
+
statusCode?: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Usage log statistics
|
|
56
|
+
*/
|
|
57
|
+
export interface UsageLogStats {
|
|
58
|
+
/** Total number of calls */
|
|
59
|
+
totalCalls: number;
|
|
60
|
+
/** Last call timestamp */
|
|
61
|
+
lastUsed?: Date;
|
|
62
|
+
/** Calls by status code */
|
|
63
|
+
callsByStatus: Record<number, number>;
|
|
64
|
+
/** Calls by endpoint */
|
|
65
|
+
callsByEndpoint: Record<string, number>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Usage log store interface
|
|
70
|
+
*/
|
|
71
|
+
export interface UsageLogStore {
|
|
72
|
+
/** Store name */
|
|
73
|
+
name: string;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Initialize the store (create tables, partitions, indexes, etc.)
|
|
77
|
+
*/
|
|
78
|
+
initialize(): Promise<void>;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Log an API key usage
|
|
82
|
+
*/
|
|
83
|
+
log(entry: UsageLogEntry): Promise<void>;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Batch log multiple entries (more efficient)
|
|
87
|
+
*/
|
|
88
|
+
logBatch(entries: UsageLogEntry[]): Promise<void>;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Get usage logs for a specific API key
|
|
92
|
+
*/
|
|
93
|
+
getKeyUsage(keyId: string, options?: UsageLogQueryOptions): Promise<UsageLogEntry[]>;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Get usage statistics for a specific API key
|
|
97
|
+
*/
|
|
98
|
+
getKeyStats(keyId: string, options?: Pick<UsageLogQueryOptions, 'since' | 'until'>): Promise<UsageLogStats>;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Delete old logs (for retention policy)
|
|
102
|
+
*/
|
|
103
|
+
deleteOlderThan(date: Date): Promise<number>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Shutdown the store
|
|
107
|
+
*/
|
|
108
|
+
shutdown(): Promise<void>;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* PostgreSQL usage log store configuration
|
|
113
|
+
*/
|
|
114
|
+
export interface PostgresUsageLogStoreConfig {
|
|
115
|
+
/** PostgreSQL pool instance or a function that returns one (for lazy initialization) */
|
|
116
|
+
pool: Pool | (() => Pool);
|
|
117
|
+
/** Table name (default: 'api_key_usage_logs') */
|
|
118
|
+
tableName?: string;
|
|
119
|
+
/** Schema name (default: 'public') */
|
|
120
|
+
schema?: string;
|
|
121
|
+
/** Auto-create tables on init (default: true) */
|
|
122
|
+
autoCreateTables?: boolean;
|
|
123
|
+
/** Enable table partitioning (default: true) */
|
|
124
|
+
enablePartitioning?: boolean;
|
|
125
|
+
/** Partition interval in days (default: 30) */
|
|
126
|
+
partitionIntervalDays?: number;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* PostgreSQL implementation of UsageLogStore
|
|
131
|
+
*/
|
|
132
|
+
export function createPostgresUsageLogStore(
|
|
133
|
+
config: PostgresUsageLogStoreConfig
|
|
134
|
+
): UsageLogStore {
|
|
135
|
+
const tableName = config.tableName || 'api_key_usage_logs';
|
|
136
|
+
const schema = config.schema || 'public';
|
|
137
|
+
const tableFullName = `"${schema}"."${tableName}"`;
|
|
138
|
+
const autoCreateTables = config.autoCreateTables !== false;
|
|
139
|
+
const enablePartitioning = config.enablePartitioning !== false;
|
|
140
|
+
const partitionIntervalDays = config.partitionIntervalDays || 30;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Get PostgreSQL pool (lazy initialization support)
|
|
144
|
+
*/
|
|
145
|
+
function getPool(): Pool {
|
|
146
|
+
if (typeof config.pool === 'function') {
|
|
147
|
+
return config.pool();
|
|
148
|
+
}
|
|
149
|
+
return config.pool;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Create partition for a specific date range
|
|
154
|
+
*/
|
|
155
|
+
async function createPartition(pool: Pool, startDate: Date, endDate: Date): Promise<void> {
|
|
156
|
+
const partitionName = `${tableName}_${startDate.toISOString().slice(0, 7).replace('-', '_')}`;
|
|
157
|
+
const partitionFullName = `"${schema}"."${partitionName}"`;
|
|
158
|
+
|
|
159
|
+
try {
|
|
160
|
+
await pool.query(`
|
|
161
|
+
CREATE TABLE IF NOT EXISTS ${partitionFullName}
|
|
162
|
+
PARTITION OF ${tableFullName}
|
|
163
|
+
FOR VALUES FROM ('${startDate.toISOString()}') TO ('${endDate.toISOString()}');
|
|
164
|
+
`);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
// Ignore if partition already exists
|
|
167
|
+
if ((error as Error).message?.includes('already exists')) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Create partitions for the next N days
|
|
176
|
+
*/
|
|
177
|
+
async function createUpcomingPartitions(pool: Pool, days: number): Promise<void> {
|
|
178
|
+
const now = new Date();
|
|
179
|
+
const intervals = Math.ceil(days / partitionIntervalDays);
|
|
180
|
+
|
|
181
|
+
for (let i = 0; i < intervals; i++) {
|
|
182
|
+
const startDate = new Date(now);
|
|
183
|
+
startDate.setDate(startDate.getDate() + (i * partitionIntervalDays));
|
|
184
|
+
startDate.setUTCHours(0, 0, 0, 0);
|
|
185
|
+
|
|
186
|
+
const endDate = new Date(startDate);
|
|
187
|
+
endDate.setDate(endDate.getDate() + partitionIntervalDays);
|
|
188
|
+
|
|
189
|
+
await createPartition(pool, startDate, endDate);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
name: 'postgres',
|
|
195
|
+
|
|
196
|
+
async initialize(): Promise<void> {
|
|
197
|
+
if (!autoCreateTables) return;
|
|
198
|
+
|
|
199
|
+
const pool = getPool();
|
|
200
|
+
|
|
201
|
+
if (enablePartitioning) {
|
|
202
|
+
// Create partitioned table
|
|
203
|
+
await pool.query(`
|
|
204
|
+
CREATE TABLE IF NOT EXISTS ${tableFullName} (
|
|
205
|
+
id UUID DEFAULT gen_random_uuid(),
|
|
206
|
+
key_id UUID NOT NULL,
|
|
207
|
+
endpoint VARCHAR(500) NOT NULL,
|
|
208
|
+
method VARCHAR(10) NOT NULL,
|
|
209
|
+
status_code INTEGER,
|
|
210
|
+
ip_address INET,
|
|
211
|
+
user_agent TEXT,
|
|
212
|
+
timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
213
|
+
|
|
214
|
+
CONSTRAINT valid_status_code CHECK (status_code >= 100 AND status_code < 600),
|
|
215
|
+
PRIMARY KEY (id, timestamp)
|
|
216
|
+
) PARTITION BY RANGE (timestamp);
|
|
217
|
+
`);
|
|
218
|
+
|
|
219
|
+
// Create default partition for current and future data
|
|
220
|
+
await pool.query(`
|
|
221
|
+
CREATE TABLE IF NOT EXISTS "${schema}"."${tableName}_default"
|
|
222
|
+
PARTITION OF ${tableFullName}
|
|
223
|
+
DEFAULT;
|
|
224
|
+
`);
|
|
225
|
+
|
|
226
|
+
// Create partitions for the next 90 days
|
|
227
|
+
await createUpcomingPartitions(pool, 90);
|
|
228
|
+
} else {
|
|
229
|
+
// Create regular table (no partitioning)
|
|
230
|
+
await pool.query(`
|
|
231
|
+
CREATE TABLE IF NOT EXISTS ${tableFullName} (
|
|
232
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
233
|
+
key_id UUID NOT NULL,
|
|
234
|
+
endpoint VARCHAR(500) NOT NULL,
|
|
235
|
+
method VARCHAR(10) NOT NULL,
|
|
236
|
+
status_code INTEGER,
|
|
237
|
+
ip_address INET,
|
|
238
|
+
user_agent TEXT,
|
|
239
|
+
timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
240
|
+
|
|
241
|
+
CONSTRAINT valid_status_code CHECK (status_code >= 100 AND status_code < 600)
|
|
242
|
+
);
|
|
243
|
+
`);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Create indexes for performance
|
|
247
|
+
await pool.query(`
|
|
248
|
+
CREATE INDEX IF NOT EXISTS idx_${tableName}_key_id_timestamp
|
|
249
|
+
ON ${tableFullName}(key_id, timestamp DESC);
|
|
250
|
+
|
|
251
|
+
CREATE INDEX IF NOT EXISTS idx_${tableName}_timestamp
|
|
252
|
+
ON ${tableFullName}(timestamp DESC);
|
|
253
|
+
|
|
254
|
+
CREATE INDEX IF NOT EXISTS idx_${tableName}_endpoint
|
|
255
|
+
ON ${tableFullName}(endpoint);
|
|
256
|
+
`);
|
|
257
|
+
},
|
|
258
|
+
|
|
259
|
+
async log(entry: UsageLogEntry): Promise<void> {
|
|
260
|
+
const pool = getPool();
|
|
261
|
+
await pool.query(
|
|
262
|
+
`INSERT INTO ${tableFullName} (key_id, endpoint, method, status_code, ip_address, user_agent, timestamp)
|
|
263
|
+
VALUES ($1, $2, $3, $4, $5, $6, COALESCE($7, NOW()))`,
|
|
264
|
+
[
|
|
265
|
+
entry.key_id,
|
|
266
|
+
entry.endpoint,
|
|
267
|
+
entry.method,
|
|
268
|
+
entry.status_code || null,
|
|
269
|
+
entry.ip_address || null,
|
|
270
|
+
entry.user_agent || null,
|
|
271
|
+
entry.timestamp || null,
|
|
272
|
+
]
|
|
273
|
+
);
|
|
274
|
+
},
|
|
275
|
+
|
|
276
|
+
async logBatch(entries: UsageLogEntry[]): Promise<void> {
|
|
277
|
+
if (entries.length === 0) return;
|
|
278
|
+
|
|
279
|
+
const pool = getPool();
|
|
280
|
+
const values = entries.map((entry, index) => {
|
|
281
|
+
const baseIndex = index * 7;
|
|
282
|
+
return `($${baseIndex + 1}, $${baseIndex + 2}, $${baseIndex + 3}, $${baseIndex + 4}, $${baseIndex + 5}, $${baseIndex + 6}, COALESCE($${baseIndex + 7}, NOW()))`;
|
|
283
|
+
}).join(', ');
|
|
284
|
+
|
|
285
|
+
const params = entries.flatMap(entry => [
|
|
286
|
+
entry.key_id,
|
|
287
|
+
entry.endpoint,
|
|
288
|
+
entry.method,
|
|
289
|
+
entry.status_code || null,
|
|
290
|
+
entry.ip_address || null,
|
|
291
|
+
entry.user_agent || null,
|
|
292
|
+
entry.timestamp || null,
|
|
293
|
+
]);
|
|
294
|
+
|
|
295
|
+
await pool.query(
|
|
296
|
+
`INSERT INTO ${tableFullName} (key_id, endpoint, method, status_code, ip_address, user_agent, timestamp)
|
|
297
|
+
VALUES ${values}`,
|
|
298
|
+
params
|
|
299
|
+
);
|
|
300
|
+
},
|
|
301
|
+
|
|
302
|
+
async getKeyUsage(keyId: string, options: UsageLogQueryOptions = {}): Promise<UsageLogEntry[]> {
|
|
303
|
+
const pool = getPool();
|
|
304
|
+
const conditions: string[] = ['key_id = $1'];
|
|
305
|
+
const params: unknown[] = [keyId];
|
|
306
|
+
let paramIndex = 2;
|
|
307
|
+
|
|
308
|
+
if (options.since) {
|
|
309
|
+
conditions.push(`timestamp >= $${paramIndex++}`);
|
|
310
|
+
params.push(options.since);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (options.until) {
|
|
314
|
+
conditions.push(`timestamp <= $${paramIndex++}`);
|
|
315
|
+
params.push(options.until);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (options.endpoint) {
|
|
319
|
+
conditions.push(`endpoint LIKE $${paramIndex++}`);
|
|
320
|
+
params.push(`%${options.endpoint}%`);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (options.method) {
|
|
324
|
+
conditions.push(`method = $${paramIndex++}`);
|
|
325
|
+
params.push(options.method.toUpperCase());
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (options.statusCode) {
|
|
329
|
+
conditions.push(`status_code = $${paramIndex++}`);
|
|
330
|
+
params.push(options.statusCode);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const limit = options.limit || 100;
|
|
334
|
+
const offset = options.offset || 0;
|
|
335
|
+
|
|
336
|
+
const result = await pool.query<UsageLogEntry>(
|
|
337
|
+
`SELECT id, key_id, endpoint, method, status_code, ip_address, user_agent, timestamp
|
|
338
|
+
FROM ${tableFullName}
|
|
339
|
+
WHERE ${conditions.join(' AND ')}
|
|
340
|
+
ORDER BY timestamp DESC
|
|
341
|
+
LIMIT ${limit} OFFSET ${offset}`,
|
|
342
|
+
params
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
return result.rows;
|
|
346
|
+
},
|
|
347
|
+
|
|
348
|
+
async getKeyStats(keyId: string, options: Pick<UsageLogQueryOptions, 'since' | 'until'> = {}): Promise<UsageLogStats> {
|
|
349
|
+
const pool = getPool();
|
|
350
|
+
const conditions: string[] = ['key_id = $1'];
|
|
351
|
+
const params: unknown[] = [keyId];
|
|
352
|
+
let paramIndex = 2;
|
|
353
|
+
|
|
354
|
+
if (options.since) {
|
|
355
|
+
conditions.push(`timestamp >= $${paramIndex++}`);
|
|
356
|
+
params.push(options.since);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
if (options.until) {
|
|
360
|
+
conditions.push(`timestamp <= $${paramIndex++}`);
|
|
361
|
+
params.push(options.until);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Get total calls and last used
|
|
365
|
+
const totalResult = await pool.query<{ total: string; last_used: Date }>(
|
|
366
|
+
`SELECT COUNT(*)::text as total, MAX(timestamp) as last_used
|
|
367
|
+
FROM ${tableFullName}
|
|
368
|
+
WHERE ${conditions.join(' AND ')}`,
|
|
369
|
+
params
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
// Get calls by status code
|
|
373
|
+
const statusResult = await pool.query<{ status_code: number; count: string }>(
|
|
374
|
+
`SELECT status_code, COUNT(*)::text as count
|
|
375
|
+
FROM ${tableFullName}
|
|
376
|
+
WHERE ${conditions.join(' AND ')} AND status_code IS NOT NULL
|
|
377
|
+
GROUP BY status_code`,
|
|
378
|
+
params
|
|
379
|
+
);
|
|
380
|
+
|
|
381
|
+
// Get calls by endpoint (top 10)
|
|
382
|
+
const endpointResult = await pool.query<{ endpoint: string; count: string }>(
|
|
383
|
+
`SELECT endpoint, COUNT(*)::text as count
|
|
384
|
+
FROM ${tableFullName}
|
|
385
|
+
WHERE ${conditions.join(' AND ')}
|
|
386
|
+
GROUP BY endpoint
|
|
387
|
+
ORDER BY count DESC
|
|
388
|
+
LIMIT 10`,
|
|
389
|
+
params
|
|
390
|
+
);
|
|
391
|
+
|
|
392
|
+
const callsByStatus: Record<number, number> = {};
|
|
393
|
+
statusResult.rows.forEach(row => {
|
|
394
|
+
callsByStatus[row.status_code] = parseInt(row.count, 10);
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
const callsByEndpoint: Record<string, number> = {};
|
|
398
|
+
endpointResult.rows.forEach(row => {
|
|
399
|
+
callsByEndpoint[row.endpoint] = parseInt(row.count, 10);
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
return {
|
|
403
|
+
totalCalls: parseInt(totalResult.rows[0]?.total || '0', 10),
|
|
404
|
+
lastUsed: totalResult.rows[0]?.last_used,
|
|
405
|
+
callsByStatus,
|
|
406
|
+
callsByEndpoint,
|
|
407
|
+
};
|
|
408
|
+
},
|
|
409
|
+
|
|
410
|
+
async deleteOlderThan(date: Date): Promise<number> {
|
|
411
|
+
const pool = getPool();
|
|
412
|
+
const result = await pool.query(
|
|
413
|
+
`DELETE FROM ${tableFullName} WHERE timestamp < $1`,
|
|
414
|
+
[date]
|
|
415
|
+
);
|
|
416
|
+
return result.rowCount || 0;
|
|
417
|
+
},
|
|
418
|
+
|
|
419
|
+
async shutdown(): Promise<void> {
|
|
420
|
+
// No cleanup needed
|
|
421
|
+
},
|
|
422
|
+
};
|
|
423
|
+
}
|
|
@@ -11,8 +11,61 @@ import { z } from 'zod';
|
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* API key scope type
|
|
14
|
+
*
|
|
15
|
+
* Scopes follow the format: 'plugin-id:action' (e.g., 'qwickbrain:execute')
|
|
16
|
+
*
|
|
17
|
+
* Legacy scopes ('read', 'write', 'admin') are automatically converted to
|
|
18
|
+
* 'system:read', 'system:write', 'system:admin' for backwards compatibility.
|
|
19
|
+
*/
|
|
20
|
+
export type ApiKeyScope = string;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Validate scope name format
|
|
24
|
+
*
|
|
25
|
+
* Valid formats:
|
|
26
|
+
* - Plugin scope: 'plugin-id:action' (e.g., 'qwickbrain:execute')
|
|
27
|
+
* - Legacy scope: 'read', 'write', 'admin' (converted to 'system:*')
|
|
28
|
+
*
|
|
29
|
+
* @param scope Scope name to validate
|
|
30
|
+
* @returns True if scope format is valid
|
|
14
31
|
*/
|
|
15
|
-
export
|
|
32
|
+
export function isValidScopeFormat(scope: string): boolean {
|
|
33
|
+
// Plugin scope format: plugin-id:action
|
|
34
|
+
if (/^[a-z0-9-]+:[a-z0-9-]+$/.test(scope)) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
// Legacy format: read, write, admin
|
|
38
|
+
if (['read', 'write', 'admin'].includes(scope)) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Normalize scope to new format
|
|
46
|
+
*
|
|
47
|
+
* Converts legacy scopes ('read', 'write', 'admin') to new format ('system:*')
|
|
48
|
+
*
|
|
49
|
+
* @param scope Scope to normalize
|
|
50
|
+
* @returns Normalized scope
|
|
51
|
+
*/
|
|
52
|
+
export function normalizeScope(scope: string): string {
|
|
53
|
+
const legacyMap: Record<string, string> = {
|
|
54
|
+
'read': 'system:read',
|
|
55
|
+
'write': 'system:write',
|
|
56
|
+
'admin': 'system:admin',
|
|
57
|
+
};
|
|
58
|
+
return legacyMap[scope] || scope;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* System scopes for backwards compatibility
|
|
63
|
+
*/
|
|
64
|
+
export const SystemScopes = {
|
|
65
|
+
READ: 'system:read',
|
|
66
|
+
WRITE: 'system:write',
|
|
67
|
+
ADMIN: 'system:admin',
|
|
68
|
+
} as const;
|
|
16
69
|
|
|
17
70
|
/**
|
|
18
71
|
* API key type (M2M = machine-to-machine, PAT = personal access token)
|
|
@@ -181,6 +234,10 @@ export interface ApiKeysApiConfig {
|
|
|
181
234
|
export interface ApiKeysPluginConfig {
|
|
182
235
|
/** API key storage backend */
|
|
183
236
|
store: ApiKeyStore;
|
|
237
|
+
/** Plugin scope storage backend (optional, for Phase 2) */
|
|
238
|
+
scopeStore?: import('./stores/plugin-scope-store.js').PluginScopeStore;
|
|
239
|
+
/** Usage log storage backend (optional, for Phase 2) */
|
|
240
|
+
usageStore?: import('./stores/usage-log-store.js').UsageLogStore;
|
|
184
241
|
/** API configuration */
|
|
185
242
|
api?: ApiKeysApiConfig;
|
|
186
243
|
/** Enable debug logging */
|
|
@@ -193,8 +250,15 @@ export interface ApiKeysPluginConfig {
|
|
|
193
250
|
|
|
194
251
|
/**
|
|
195
252
|
* Zod schema for API key scope
|
|
253
|
+
*
|
|
254
|
+
* Validates scope format:
|
|
255
|
+
* - Plugin scope: 'plugin-id:action' (e.g., 'qwickbrain:execute')
|
|
256
|
+
* - Legacy scope: 'read', 'write', 'admin'
|
|
196
257
|
*/
|
|
197
|
-
export const ApiKeyScopeSchema = z.
|
|
258
|
+
export const ApiKeyScopeSchema = z.string().refine(
|
|
259
|
+
(scope) => isValidScopeFormat(scope),
|
|
260
|
+
{ message: 'Scope must be in format "plugin-id:action" or a legacy scope (read, write, admin)' }
|
|
261
|
+
);
|
|
198
262
|
|
|
199
263
|
/**
|
|
200
264
|
* Zod schema for API key type
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Auth Plugin API Routes
|
|
2
|
+
|
|
3
|
+
This document describes the API routes needed to support the AuthStatusWidget and AuthManagementPage UI components.
|
|
4
|
+
|
|
5
|
+
## Routes to Implement
|
|
6
|
+
|
|
7
|
+
### 1. GET /api/auth/stats
|
|
8
|
+
|
|
9
|
+
Returns authentication statistics for the status widget.
|
|
10
|
+
|
|
11
|
+
**Response:**
|
|
12
|
+
```typescript
|
|
13
|
+
{
|
|
14
|
+
totalProviders: number;
|
|
15
|
+
activeProviders: number;
|
|
16
|
+
totalSessions: number;
|
|
17
|
+
activeSessions: number;
|
|
18
|
+
recentLogins: number; // Last 7 days
|
|
19
|
+
health: 'healthy' | 'warning' | 'error';
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 2. GET /api/auth/providers
|
|
24
|
+
|
|
25
|
+
Returns list of configured authentication providers.
|
|
26
|
+
|
|
27
|
+
**Response:**
|
|
28
|
+
```typescript
|
|
29
|
+
{
|
|
30
|
+
providers: Array<{
|
|
31
|
+
id: string;
|
|
32
|
+
name: string;
|
|
33
|
+
type: 'oauth2' | 'saml' | 'local' | 'ldap';
|
|
34
|
+
status: 'active' | 'inactive';
|
|
35
|
+
userCount: number;
|
|
36
|
+
lastUsed?: string;
|
|
37
|
+
config?: Record<string, unknown>;
|
|
38
|
+
}>;
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 3. GET /api/auth/sessions
|
|
43
|
+
|
|
44
|
+
Returns list of active authentication sessions.
|
|
45
|
+
|
|
46
|
+
**Query Parameters:**
|
|
47
|
+
- `limit` - Max sessions to return (default: 100)
|
|
48
|
+
- `offset` - Pagination offset
|
|
49
|
+
- `userId` - Filter by user ID
|
|
50
|
+
|
|
51
|
+
**Response:**
|
|
52
|
+
```typescript
|
|
53
|
+
{
|
|
54
|
+
sessions: Array<{
|
|
55
|
+
id: string;
|
|
56
|
+
userId: string;
|
|
57
|
+
userEmail: string;
|
|
58
|
+
provider: string;
|
|
59
|
+
createdAt: string;
|
|
60
|
+
expiresAt: string;
|
|
61
|
+
ipAddress?: string;
|
|
62
|
+
userAgent?: string;
|
|
63
|
+
}>;
|
|
64
|
+
total: number;
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 4. DELETE /api/auth/sessions/:id
|
|
69
|
+
|
|
70
|
+
Revoke a specific authentication session.
|
|
71
|
+
|
|
72
|
+
**Response:**
|
|
73
|
+
```typescript
|
|
74
|
+
{
|
|
75
|
+
success: boolean;
|
|
76
|
+
message: string;
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 5. POST /api/auth/sessions/revoke
|
|
81
|
+
|
|
82
|
+
Revoke multiple sessions (bulk operation).
|
|
83
|
+
|
|
84
|
+
**Request Body:**
|
|
85
|
+
```typescript
|
|
86
|
+
{
|
|
87
|
+
sessionIds: string[];
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Response:**
|
|
92
|
+
```typescript
|
|
93
|
+
{
|
|
94
|
+
success: boolean;
|
|
95
|
+
revokedCount: number;
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Security Considerations
|
|
100
|
+
|
|
101
|
+
1. **Authentication**: All endpoints require admin authentication
|
|
102
|
+
2. **Authorization**: Only admin roles can manage auth providers and sessions
|
|
103
|
+
3. **Rate Limiting**: Apply strict rate limits to prevent abuse
|
|
104
|
+
4. **Audit Logging**: Log all session revocations and provider changes
|
|
105
|
+
5. **Session Security**: Ensure secure session token storage and transmission
|
|
106
|
+
6. **Provider Secrets**: Never expose provider secrets in API responses
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuthManagementPage Tests
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
8
|
+
import { render, screen, waitFor } from '@testing-library/react';
|
|
9
|
+
import { AuthManagementPage } from './AuthManagementPage';
|
|
10
|
+
|
|
11
|
+
describe('AuthManagementPage', () => {
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
vi.clearAllMocks();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('renders page title', () => {
|
|
17
|
+
(global.fetch as ReturnType<typeof vi.fn>).mockImplementation(
|
|
18
|
+
() => Promise.resolve({
|
|
19
|
+
ok: true,
|
|
20
|
+
json: async () => ([]),
|
|
21
|
+
})
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
render(<AuthManagementPage apiPrefix="/api/auth" />);
|
|
25
|
+
|
|
26
|
+
expect(screen.getByText('Authentication Management')).toBeInTheDocument();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('fetches auth data on mount', async () => {
|
|
30
|
+
(global.fetch as ReturnType<typeof vi.fn>).mockImplementation(
|
|
31
|
+
() => Promise.resolve({
|
|
32
|
+
ok: true,
|
|
33
|
+
json: async () => ([]),
|
|
34
|
+
})
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
render(<AuthManagementPage apiPrefix="/api/auth" />);
|
|
38
|
+
|
|
39
|
+
await waitFor(() => {
|
|
40
|
+
expect(global.fetch).toHaveBeenCalled();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('renders with custom apiPrefix', async () => {
|
|
45
|
+
(global.fetch as ReturnType<typeof vi.fn>).mockImplementation(
|
|
46
|
+
() => Promise.resolve({
|
|
47
|
+
ok: true,
|
|
48
|
+
json: async () => ([]),
|
|
49
|
+
})
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
render(<AuthManagementPage apiPrefix="/custom/auth" />);
|
|
53
|
+
|
|
54
|
+
await waitFor(() => {
|
|
55
|
+
expect(global.fetch).toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|