@qwickapps/server 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +238 -0
- package/dist/core/control-panel.d.ts +7 -2
- package/dist/core/control-panel.d.ts.map +1 -1
- package/dist/core/control-panel.js +92 -54
- package/dist/core/control-panel.js.map +1 -1
- package/dist/core/gateway.d.ts +159 -79
- package/dist/core/gateway.d.ts.map +1 -1
- package/dist/core/gateway.js +679 -319
- package/dist/core/gateway.js.map +1 -1
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/plugin-registry.d.ts +271 -0
- package/dist/core/plugin-registry.d.ts.map +1 -0
- package/dist/core/plugin-registry.js +326 -0
- package/dist/core/plugin-registry.js.map +1 -0
- package/dist/core/types.d.ts +16 -33
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -7
- package/dist/index.js.map +1 -1
- package/dist/plugins/auth/adapters/auth0-adapter.d.ts +14 -0
- package/dist/plugins/auth/adapters/auth0-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/auth0-adapter.js +179 -0
- package/dist/plugins/auth/adapters/auth0-adapter.js.map +1 -0
- package/dist/plugins/auth/adapters/basic-adapter.d.ts +13 -0
- package/dist/plugins/auth/adapters/basic-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/basic-adapter.js +51 -0
- package/dist/plugins/auth/adapters/basic-adapter.js.map +1 -0
- package/dist/plugins/auth/adapters/index.d.ts +9 -0
- package/dist/plugins/auth/adapters/index.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/index.js +9 -0
- package/dist/plugins/auth/adapters/index.js.map +1 -0
- package/dist/plugins/auth/adapters/supabase-adapter.d.ts +13 -0
- package/dist/plugins/auth/adapters/supabase-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/supabase-adapter.js +109 -0
- package/dist/plugins/auth/adapters/supabase-adapter.js.map +1 -0
- package/dist/plugins/auth/auth-plugin.d.ts +40 -0
- package/dist/plugins/auth/auth-plugin.d.ts.map +1 -0
- package/dist/plugins/auth/auth-plugin.js +255 -0
- package/dist/plugins/auth/auth-plugin.js.map +1 -0
- package/dist/plugins/auth/auth-plugin.test.d.ts +9 -0
- package/dist/plugins/auth/auth-plugin.test.d.ts.map +1 -0
- package/dist/plugins/auth/auth-plugin.test.js +147 -0
- package/dist/plugins/auth/auth-plugin.test.js.map +1 -0
- package/dist/plugins/auth/index.d.ts +12 -0
- package/dist/plugins/auth/index.d.ts.map +1 -0
- package/dist/plugins/auth/index.js +13 -0
- package/dist/plugins/auth/index.js.map +1 -0
- package/dist/plugins/auth/types.d.ts +148 -0
- package/dist/plugins/auth/types.d.ts.map +1 -0
- package/dist/plugins/auth/types.js +14 -0
- package/dist/plugins/auth/types.js.map +1 -0
- package/dist/plugins/bans/bans-plugin.d.ts +59 -0
- package/dist/plugins/bans/bans-plugin.d.ts.map +1 -0
- package/dist/plugins/bans/bans-plugin.js +428 -0
- package/dist/plugins/bans/bans-plugin.js.map +1 -0
- package/dist/plugins/bans/index.d.ts +9 -0
- package/dist/plugins/bans/index.d.ts.map +1 -0
- package/dist/plugins/bans/index.js +10 -0
- package/dist/plugins/bans/index.js.map +1 -0
- package/dist/plugins/bans/stores/index.d.ts +7 -0
- package/dist/plugins/bans/stores/index.d.ts.map +1 -0
- package/dist/plugins/bans/stores/index.js +7 -0
- package/dist/plugins/bans/stores/index.js.map +1 -0
- package/dist/plugins/bans/stores/postgres-store.d.ts +29 -0
- package/dist/plugins/bans/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/bans/stores/postgres-store.js +132 -0
- package/dist/plugins/bans/stores/postgres-store.js.map +1 -0
- package/dist/plugins/bans/types.d.ts +128 -0
- package/dist/plugins/bans/types.d.ts.map +1 -0
- package/dist/plugins/bans/types.js +11 -0
- package/dist/plugins/bans/types.js.map +1 -0
- package/dist/plugins/cache-plugin.d.ts +14 -3
- package/dist/plugins/cache-plugin.d.ts.map +1 -1
- package/dist/plugins/cache-plugin.js +27 -7
- package/dist/plugins/cache-plugin.js.map +1 -1
- package/dist/plugins/cache-plugin.test.js +96 -32
- package/dist/plugins/cache-plugin.test.js.map +1 -1
- package/dist/plugins/config-plugin.d.ts +3 -2
- package/dist/plugins/config-plugin.d.ts.map +1 -1
- package/dist/plugins/config-plugin.js +17 -10
- package/dist/plugins/config-plugin.js.map +1 -1
- package/dist/plugins/diagnostics-plugin.d.ts +2 -2
- package/dist/plugins/diagnostics-plugin.d.ts.map +1 -1
- package/dist/plugins/diagnostics-plugin.js +17 -10
- package/dist/plugins/diagnostics-plugin.js.map +1 -1
- package/dist/plugins/entitlements/entitlements-plugin.d.ts +95 -0
- package/dist/plugins/entitlements/entitlements-plugin.d.ts.map +1 -0
- package/dist/plugins/entitlements/entitlements-plugin.js +707 -0
- package/dist/plugins/entitlements/entitlements-plugin.js.map +1 -0
- package/dist/plugins/entitlements/index.d.ts +12 -0
- package/dist/plugins/entitlements/index.d.ts.map +1 -0
- package/dist/plugins/entitlements/index.js +16 -0
- package/dist/plugins/entitlements/index.js.map +1 -0
- package/dist/plugins/entitlements/sources/index.d.ts +9 -0
- package/dist/plugins/entitlements/sources/index.d.ts.map +1 -0
- package/dist/plugins/entitlements/sources/index.js +9 -0
- package/dist/plugins/entitlements/sources/index.js.map +1 -0
- package/dist/plugins/entitlements/sources/postgres-source.d.ts +29 -0
- package/dist/plugins/entitlements/sources/postgres-source.d.ts.map +1 -0
- package/dist/plugins/entitlements/sources/postgres-source.js +169 -0
- package/dist/plugins/entitlements/sources/postgres-source.js.map +1 -0
- package/dist/plugins/entitlements/types.d.ts +232 -0
- package/dist/plugins/entitlements/types.d.ts.map +1 -0
- package/dist/plugins/entitlements/types.js +11 -0
- package/dist/plugins/entitlements/types.js.map +1 -0
- package/dist/plugins/frontend-app-plugin.d.ts +9 -3
- package/dist/plugins/frontend-app-plugin.d.ts.map +1 -1
- package/dist/plugins/frontend-app-plugin.js +14 -9
- package/dist/plugins/frontend-app-plugin.js.map +1 -1
- package/dist/plugins/health-plugin.d.ts +5 -2
- package/dist/plugins/health-plugin.d.ts.map +1 -1
- package/dist/plugins/health-plugin.js +20 -5
- package/dist/plugins/health-plugin.js.map +1 -1
- package/dist/plugins/index.d.ts +8 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +8 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/logs-plugin.d.ts +3 -2
- package/dist/plugins/logs-plugin.d.ts.map +1 -1
- package/dist/plugins/logs-plugin.js +21 -12
- package/dist/plugins/logs-plugin.js.map +1 -1
- package/dist/plugins/postgres-plugin.d.ts +3 -3
- package/dist/plugins/postgres-plugin.d.ts.map +1 -1
- package/dist/plugins/postgres-plugin.js +9 -7
- package/dist/plugins/postgres-plugin.js.map +1 -1
- package/dist/plugins/postgres-plugin.test.js +47 -29
- package/dist/plugins/postgres-plugin.test.js.map +1 -1
- package/dist/plugins/users/index.d.ts +12 -0
- package/dist/plugins/users/index.d.ts.map +1 -0
- package/dist/plugins/users/index.js +13 -0
- package/dist/plugins/users/index.js.map +1 -0
- package/dist/plugins/users/stores/index.d.ts +7 -0
- package/dist/plugins/users/stores/index.d.ts.map +1 -0
- package/dist/plugins/users/stores/index.js +7 -0
- package/dist/plugins/users/stores/index.js.map +1 -0
- package/dist/plugins/users/stores/postgres-store.d.ts +28 -0
- package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/users/stores/postgres-store.js +157 -0
- package/dist/plugins/users/stores/postgres-store.js.map +1 -0
- package/dist/plugins/users/types.d.ts +189 -0
- package/dist/plugins/users/types.d.ts.map +1 -0
- package/dist/plugins/users/types.js +12 -0
- package/dist/plugins/users/types.js.map +1 -0
- package/dist/plugins/users/users-plugin.d.ts +39 -0
- package/dist/plugins/users/users-plugin.d.ts.map +1 -0
- package/dist/plugins/users/users-plugin.js +242 -0
- package/dist/plugins/users/users-plugin.js.map +1 -0
- package/dist-ui/assets/index-Bsp2ntcw.js +465 -0
- package/dist-ui/assets/index-Bsp2ntcw.js.map +1 -0
- package/dist-ui/index.html +1 -1
- package/dist-ui-lib/api/controlPanelApi.d.ts +232 -0
- package/dist-ui-lib/components/ControlPanelApp.d.ts +61 -0
- package/dist-ui-lib/components/index.d.ts +18 -0
- package/dist-ui-lib/config/AppConfig.d.ts +7 -0
- package/dist-ui-lib/dashboard/DashboardWidgetRegistry.d.ts +62 -0
- package/dist-ui-lib/dashboard/DashboardWidgetRenderer.d.ts +8 -0
- package/dist-ui-lib/dashboard/PluginWidgetRenderer.d.ts +19 -0
- package/dist-ui-lib/dashboard/WidgetComponentRegistry.d.ts +44 -0
- package/dist-ui-lib/dashboard/builtInWidgets.d.ts +19 -0
- package/dist-ui-lib/dashboard/index.d.ts +13 -0
- package/dist-ui-lib/dashboard/widgets/ServiceHealthWidget.d.ts +12 -0
- package/dist-ui-lib/dashboard/widgets/index.d.ts +6 -0
- package/dist-ui-lib/index.js +6441 -0
- package/dist-ui-lib/index.js.map +1 -0
- package/dist-ui-lib/pages/ConfigPage.d.ts +1 -0
- package/dist-ui-lib/pages/DashboardPage.d.ts +1 -0
- package/dist-ui-lib/pages/DiagnosticsPage.d.ts +1 -0
- package/dist-ui-lib/pages/EntitlementsPage.d.ts +17 -0
- package/dist-ui-lib/pages/LogsPage.d.ts +1 -0
- package/dist-ui-lib/pages/NotFoundPage.d.ts +1 -0
- package/dist-ui-lib/pages/PluginPage.d.ts +15 -0
- package/dist-ui-lib/pages/SystemPage.d.ts +1 -0
- package/dist-ui-lib/pages/UsersPage.d.ts +22 -0
- package/package.json +18 -6
- package/src/core/control-panel.ts +114 -61
- package/src/core/gateway.ts +863 -403
- package/src/core/index.ts +21 -2
- package/src/core/plugin-registry.ts +653 -0
- package/src/core/types.ts +31 -37
- package/src/index.ts +118 -19
- package/src/plugins/auth/adapters/auth0-adapter.ts +214 -0
- package/src/plugins/auth/adapters/basic-adapter.ts +61 -0
- package/src/plugins/auth/adapters/index.ts +9 -0
- package/src/plugins/auth/adapters/supabase-adapter.ts +141 -0
- package/src/plugins/auth/auth-plugin.test.ts +176 -0
- package/src/plugins/auth/auth-plugin.ts +303 -0
- package/src/plugins/auth/index.ts +33 -0
- package/src/plugins/auth/types.ts +165 -0
- package/src/plugins/bans/bans-plugin.ts +485 -0
- package/src/plugins/bans/index.ts +31 -0
- package/src/plugins/bans/stores/index.ts +7 -0
- package/src/plugins/bans/stores/postgres-store.ts +195 -0
- package/src/plugins/bans/types.ts +141 -0
- package/src/plugins/cache-plugin.test.ts +105 -32
- package/src/plugins/cache-plugin.ts +40 -9
- package/src/plugins/config-plugin.ts +23 -12
- package/src/plugins/diagnostics-plugin.ts +22 -12
- package/src/plugins/entitlements/entitlements-plugin.ts +820 -0
- package/src/plugins/entitlements/index.ts +51 -0
- package/src/plugins/entitlements/sources/index.ts +9 -0
- package/src/plugins/entitlements/sources/postgres-source.ts +253 -0
- package/src/plugins/entitlements/types.ts +256 -0
- package/src/plugins/frontend-app-plugin.ts +24 -12
- package/src/plugins/health-plugin.ts +27 -7
- package/src/plugins/index.ts +106 -4
- package/src/plugins/logs-plugin.ts +28 -14
- package/src/plugins/postgres-plugin.test.ts +49 -29
- package/src/plugins/postgres-plugin.ts +11 -9
- package/src/plugins/users/index.ts +35 -0
- package/src/plugins/users/stores/index.ts +7 -0
- package/src/plugins/users/stores/postgres-store.ts +225 -0
- package/src/plugins/users/types.ts +209 -0
- package/src/plugins/users/users-plugin.ts +281 -0
- package/ui/src/App.tsx +185 -31
- package/ui/src/api/controlPanelApi.ts +354 -1
- package/ui/src/components/ControlPanelApp.tsx +209 -0
- package/ui/src/components/index.ts +62 -0
- package/ui/src/dashboard/DashboardWidgetRegistry.tsx +129 -0
- package/ui/src/dashboard/DashboardWidgetRenderer.tsx +34 -0
- package/ui/src/dashboard/PluginWidgetRenderer.tsx +115 -0
- package/ui/src/dashboard/WidgetComponentRegistry.tsx +116 -0
- package/ui/src/dashboard/builtInWidgets.tsx +29 -0
- package/ui/src/dashboard/index.ts +35 -0
- package/ui/src/dashboard/widgets/ServiceHealthWidget.tsx +140 -0
- package/ui/src/dashboard/widgets/index.ts +7 -0
- package/ui/src/pages/DashboardPage.tsx +28 -149
- package/ui/src/pages/EntitlementsPage.tsx +557 -0
- package/ui/src/pages/LogsPage.tsx +174 -8
- package/ui/src/pages/PluginPage.tsx +148 -0
- package/ui/src/pages/SystemPage.tsx +445 -0
- package/ui/src/pages/UsersPage.tsx +837 -0
- package/ui/tsconfig.lib.json +11 -0
- package/ui/vite.lib.config.ts +51 -0
- package/dist-ui/assets/index-CW1BviRn.js +0 -465
- package/dist-ui/assets/index-CW1BviRn.js.map +0 -1
- package/ui/src/pages/HealthPage.tsx +0 -204
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bans Plugin
|
|
3
|
+
*
|
|
4
|
+
* User ban management plugin for @qwickapps/server.
|
|
5
|
+
* Bans are always on USER entities (by user_id), not emails.
|
|
6
|
+
*
|
|
7
|
+
* This plugin depends on the Users Plugin for user resolution.
|
|
8
|
+
* Use `isEmailBanned()` convenience function to check bans by email,
|
|
9
|
+
* which internally resolves email → user_id → ban status.
|
|
10
|
+
*
|
|
11
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
12
|
+
*/
|
|
13
|
+
import type { Plugin } from '../../core/plugin-registry.js';
|
|
14
|
+
import type { BansPluginConfig, BanStore, Ban, CreateBanInput, RemoveBanInput } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Create the Bans plugin
|
|
17
|
+
*/
|
|
18
|
+
export declare function createBansPlugin(config: BansPluginConfig): Plugin;
|
|
19
|
+
/**
|
|
20
|
+
* Get the current ban store instance
|
|
21
|
+
*/
|
|
22
|
+
export declare function getBanStore(): BanStore | null;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a user is banned by user ID
|
|
25
|
+
*/
|
|
26
|
+
export declare function isUserBanned(userId: string): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a user is banned by email
|
|
29
|
+
*
|
|
30
|
+
* This is a convenience function that:
|
|
31
|
+
* 1. Resolves email → user via Users Plugin
|
|
32
|
+
* 2. Checks ban status by user_id
|
|
33
|
+
*
|
|
34
|
+
* Returns false if user doesn't exist (unknown user = not banned)
|
|
35
|
+
*/
|
|
36
|
+
export declare function isEmailBanned(email: string): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Get active ban for a user
|
|
39
|
+
*/
|
|
40
|
+
export declare function getActiveBan(userId: string): Promise<Ban | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Ban a user
|
|
43
|
+
*/
|
|
44
|
+
export declare function banUser(input: CreateBanInput): Promise<Ban>;
|
|
45
|
+
/**
|
|
46
|
+
* Unban a user
|
|
47
|
+
*/
|
|
48
|
+
export declare function unbanUser(input: RemoveBanInput): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* List all active bans
|
|
51
|
+
*/
|
|
52
|
+
export declare function listActiveBans(options?: {
|
|
53
|
+
limit?: number;
|
|
54
|
+
offset?: number;
|
|
55
|
+
}): Promise<{
|
|
56
|
+
bans: Ban[];
|
|
57
|
+
total: number;
|
|
58
|
+
}>;
|
|
59
|
+
//# sourceMappingURL=bans-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bans-plugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/bans/bans-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,+BAA+B,CAAC;AAC1F,OAAO,KAAK,EACV,gBAAgB,EAChB,QAAQ,EACR,GAAG,EACH,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AASpB;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA8UjE;AAMD;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKnE;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYnE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAKtE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAoBjE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBvE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAC3F,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAKD"}
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bans Plugin
|
|
3
|
+
*
|
|
4
|
+
* User ban management plugin for @qwickapps/server.
|
|
5
|
+
* Bans are always on USER entities (by user_id), not emails.
|
|
6
|
+
*
|
|
7
|
+
* This plugin depends on the Users Plugin for user resolution.
|
|
8
|
+
* Use `isEmailBanned()` convenience function to check bans by email,
|
|
9
|
+
* which internally resolves email → user_id → ban status.
|
|
10
|
+
*
|
|
11
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
12
|
+
*/
|
|
13
|
+
import { getUserByEmail, getUserById } from '../users/users-plugin.js';
|
|
14
|
+
// Store instance for helper access
|
|
15
|
+
let currentStore = null;
|
|
16
|
+
let banCleanupInterval = null;
|
|
17
|
+
let pluginConfig = null;
|
|
18
|
+
/**
|
|
19
|
+
* Create the Bans plugin
|
|
20
|
+
*/
|
|
21
|
+
export function createBansPlugin(config) {
|
|
22
|
+
const debug = config.debug || false;
|
|
23
|
+
// Routes are mounted under /api by the control panel, so don't include /api in prefix
|
|
24
|
+
const apiPrefix = config.api?.prefix || '/bans';
|
|
25
|
+
const apiEnabled = config.api?.enabled !== false;
|
|
26
|
+
function log(message, data) {
|
|
27
|
+
if (debug) {
|
|
28
|
+
console.log(`[BansPlugin] ${message}`, data || '');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
id: 'bans',
|
|
33
|
+
name: 'Bans',
|
|
34
|
+
version: '1.0.0',
|
|
35
|
+
async onStart(_pluginConfig, registry) {
|
|
36
|
+
log('Starting bans plugin');
|
|
37
|
+
// Check for users plugin dependency
|
|
38
|
+
if (!registry.hasPlugin('users')) {
|
|
39
|
+
throw new Error('Bans plugin requires Users plugin to be loaded first');
|
|
40
|
+
}
|
|
41
|
+
// Initialize the store (creates tables if needed)
|
|
42
|
+
await config.store.initialize();
|
|
43
|
+
log('Bans plugin migrations complete');
|
|
44
|
+
// Store references for helper access
|
|
45
|
+
currentStore = config.store;
|
|
46
|
+
pluginConfig = config;
|
|
47
|
+
// Start ban cleanup interval if temporary bans are supported
|
|
48
|
+
if (config.supportTemporary) {
|
|
49
|
+
banCleanupInterval = setInterval(async () => {
|
|
50
|
+
try {
|
|
51
|
+
const cleaned = await config.store.cleanupExpiredBans();
|
|
52
|
+
if (cleaned > 0) {
|
|
53
|
+
log('Cleaned up expired bans', { count: cleaned });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error('[BansPlugin] Ban cleanup error:', error);
|
|
58
|
+
}
|
|
59
|
+
}, 60 * 1000); // Check every minute
|
|
60
|
+
}
|
|
61
|
+
// Register health check
|
|
62
|
+
registry.registerHealthCheck({
|
|
63
|
+
name: 'bans-store',
|
|
64
|
+
type: 'custom',
|
|
65
|
+
check: async () => {
|
|
66
|
+
try {
|
|
67
|
+
// Simple health check - list with limit 0
|
|
68
|
+
await config.store.listActiveBans({ limit: 0 });
|
|
69
|
+
return { healthy: true };
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return { healthy: false };
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
// Add API routes if enabled
|
|
77
|
+
if (apiEnabled) {
|
|
78
|
+
// List active bans
|
|
79
|
+
registry.addRoute({
|
|
80
|
+
method: 'get',
|
|
81
|
+
path: apiPrefix,
|
|
82
|
+
pluginId: 'bans',
|
|
83
|
+
handler: async (req, res) => {
|
|
84
|
+
try {
|
|
85
|
+
const limit = Math.min(parseInt(req.query.limit) || 50, 100);
|
|
86
|
+
const offset = parseInt(req.query.offset) || 0;
|
|
87
|
+
const result = await config.store.listActiveBans({ limit, offset });
|
|
88
|
+
res.json(result);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('[BansPlugin] List bans error:', error);
|
|
92
|
+
res.status(500).json({ error: 'Failed to list bans' });
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
// Get user ban status by user ID
|
|
97
|
+
registry.addRoute({
|
|
98
|
+
method: 'get',
|
|
99
|
+
path: `${apiPrefix}/user/:userId`,
|
|
100
|
+
pluginId: 'bans',
|
|
101
|
+
handler: async (req, res) => {
|
|
102
|
+
try {
|
|
103
|
+
const ban = await config.store.getActiveBan(req.params.userId);
|
|
104
|
+
res.json({
|
|
105
|
+
isBanned: ban !== null,
|
|
106
|
+
ban,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error('[BansPlugin] Get ban status error:', error);
|
|
111
|
+
res.status(500).json({ error: 'Failed to get ban status' });
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
// Get user ban history
|
|
116
|
+
registry.addRoute({
|
|
117
|
+
method: 'get',
|
|
118
|
+
path: `${apiPrefix}/user/:userId/history`,
|
|
119
|
+
pluginId: 'bans',
|
|
120
|
+
handler: async (req, res) => {
|
|
121
|
+
try {
|
|
122
|
+
const bans = await config.store.listBans(req.params.userId);
|
|
123
|
+
res.json({ bans });
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error('[BansPlugin] Get ban history error:', error);
|
|
127
|
+
res.status(500).json({ error: 'Failed to get ban history' });
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
// Ban user by user ID
|
|
132
|
+
registry.addRoute({
|
|
133
|
+
method: 'post',
|
|
134
|
+
path: `${apiPrefix}/user/:userId`,
|
|
135
|
+
pluginId: 'bans',
|
|
136
|
+
handler: async (req, res) => {
|
|
137
|
+
try {
|
|
138
|
+
const authReq = req;
|
|
139
|
+
const bannedBy = authReq.auth?.user?.id || authReq.auth?.user?.email || 'system';
|
|
140
|
+
const input = {
|
|
141
|
+
user_id: req.params.userId,
|
|
142
|
+
reason: req.body.reason || 'No reason provided',
|
|
143
|
+
banned_by: bannedBy,
|
|
144
|
+
duration: config.supportTemporary ? req.body.duration : undefined,
|
|
145
|
+
metadata: req.body.metadata,
|
|
146
|
+
};
|
|
147
|
+
// Verify user exists via Users Plugin
|
|
148
|
+
const user = await getUserById(req.params.userId);
|
|
149
|
+
if (!user) {
|
|
150
|
+
return res.status(404).json({ error: 'User not found' });
|
|
151
|
+
}
|
|
152
|
+
const ban = await config.store.createBan(input);
|
|
153
|
+
// Call onBan callback if provided
|
|
154
|
+
if (config.callbacks?.onBan) {
|
|
155
|
+
try {
|
|
156
|
+
await config.callbacks.onBan(user, ban);
|
|
157
|
+
}
|
|
158
|
+
catch (callbackError) {
|
|
159
|
+
console.error('[BansPlugin] onBan callback error:', callbackError);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
log('User banned', { userId: req.params.userId, reason: input.reason });
|
|
163
|
+
res.status(201).json(ban);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.error('[BansPlugin] Ban user error:', error);
|
|
167
|
+
res.status(500).json({ error: 'Failed to ban user' });
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
// Unban user by user ID
|
|
172
|
+
registry.addRoute({
|
|
173
|
+
method: 'delete',
|
|
174
|
+
path: `${apiPrefix}/user/:userId`,
|
|
175
|
+
pluginId: 'bans',
|
|
176
|
+
handler: async (req, res) => {
|
|
177
|
+
try {
|
|
178
|
+
const authReq = req;
|
|
179
|
+
const removedBy = authReq.auth?.user?.id || authReq.auth?.user?.email || 'system';
|
|
180
|
+
// Verify user exists via Users Plugin
|
|
181
|
+
const user = await getUserById(req.params.userId);
|
|
182
|
+
if (!user) {
|
|
183
|
+
return res.status(404).json({ error: 'User not found' });
|
|
184
|
+
}
|
|
185
|
+
const input = {
|
|
186
|
+
user_id: req.params.userId,
|
|
187
|
+
removed_by: removedBy,
|
|
188
|
+
note: req.body?.note,
|
|
189
|
+
};
|
|
190
|
+
const removed = await config.store.removeBan(input);
|
|
191
|
+
if (!removed) {
|
|
192
|
+
return res.status(404).json({ error: 'No active ban found' });
|
|
193
|
+
}
|
|
194
|
+
// Call onUnban callback if provided
|
|
195
|
+
if (config.callbacks?.onUnban) {
|
|
196
|
+
try {
|
|
197
|
+
await config.callbacks.onUnban(user);
|
|
198
|
+
}
|
|
199
|
+
catch (callbackError) {
|
|
200
|
+
console.error('[BansPlugin] onUnban callback error:', callbackError);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
log('User unbanned', { userId: req.params.userId });
|
|
204
|
+
res.status(204).send();
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
console.error('[BansPlugin] Unban user error:', error);
|
|
208
|
+
res.status(500).json({ error: 'Failed to unban user' });
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
// Check ban status by email (convenience endpoint)
|
|
213
|
+
registry.addRoute({
|
|
214
|
+
method: 'get',
|
|
215
|
+
path: `${apiPrefix}/email/:email`,
|
|
216
|
+
pluginId: 'bans',
|
|
217
|
+
handler: async (req, res) => {
|
|
218
|
+
try {
|
|
219
|
+
const email = decodeURIComponent(req.params.email);
|
|
220
|
+
const isBanned = await isEmailBanned(email);
|
|
221
|
+
res.json({ email, isBanned });
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
console.error('[BansPlugin] Check email ban error:', error);
|
|
225
|
+
res.status(500).json({ error: 'Failed to check ban status' });
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
// Ban user by email (convenience endpoint)
|
|
230
|
+
registry.addRoute({
|
|
231
|
+
method: 'post',
|
|
232
|
+
path: `${apiPrefix}/email/:email`,
|
|
233
|
+
pluginId: 'bans',
|
|
234
|
+
handler: async (req, res) => {
|
|
235
|
+
try {
|
|
236
|
+
const email = decodeURIComponent(req.params.email);
|
|
237
|
+
const authReq = req;
|
|
238
|
+
const bannedBy = authReq.auth?.user?.id || authReq.auth?.user?.email || 'system';
|
|
239
|
+
// Resolve email to user via Users Plugin
|
|
240
|
+
const user = await getUserByEmail(email);
|
|
241
|
+
if (!user) {
|
|
242
|
+
return res.status(404).json({ error: 'User not found' });
|
|
243
|
+
}
|
|
244
|
+
const input = {
|
|
245
|
+
user_id: user.id,
|
|
246
|
+
reason: req.body.reason || 'No reason provided',
|
|
247
|
+
banned_by: bannedBy,
|
|
248
|
+
duration: config.supportTemporary ? req.body.duration : undefined,
|
|
249
|
+
metadata: req.body.metadata,
|
|
250
|
+
};
|
|
251
|
+
const ban = await config.store.createBan(input);
|
|
252
|
+
// Call onBan callback if provided
|
|
253
|
+
if (config.callbacks?.onBan) {
|
|
254
|
+
try {
|
|
255
|
+
await config.callbacks.onBan(user, ban);
|
|
256
|
+
}
|
|
257
|
+
catch (callbackError) {
|
|
258
|
+
console.error('[BansPlugin] onBan callback error:', callbackError);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
log('User banned by email', { email, userId: user.id, reason: input.reason });
|
|
262
|
+
res.status(201).json(ban);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
console.error('[BansPlugin] Ban user by email error:', error);
|
|
266
|
+
res.status(500).json({ error: 'Failed to ban user' });
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
// Unban user by email (convenience endpoint)
|
|
271
|
+
registry.addRoute({
|
|
272
|
+
method: 'delete',
|
|
273
|
+
path: `${apiPrefix}/email/:email`,
|
|
274
|
+
pluginId: 'bans',
|
|
275
|
+
handler: async (req, res) => {
|
|
276
|
+
try {
|
|
277
|
+
const email = decodeURIComponent(req.params.email);
|
|
278
|
+
const authReq = req;
|
|
279
|
+
const removedBy = authReq.auth?.user?.id || authReq.auth?.user?.email || 'system';
|
|
280
|
+
// Resolve email to user via Users Plugin
|
|
281
|
+
const user = await getUserByEmail(email);
|
|
282
|
+
if (!user) {
|
|
283
|
+
return res.status(404).json({ error: 'User not found' });
|
|
284
|
+
}
|
|
285
|
+
const input = {
|
|
286
|
+
user_id: user.id,
|
|
287
|
+
removed_by: removedBy,
|
|
288
|
+
note: req.body?.note,
|
|
289
|
+
};
|
|
290
|
+
const removed = await config.store.removeBan(input);
|
|
291
|
+
if (!removed) {
|
|
292
|
+
return res.status(404).json({ error: 'No active ban found' });
|
|
293
|
+
}
|
|
294
|
+
// Call onUnban callback if provided
|
|
295
|
+
if (config.callbacks?.onUnban) {
|
|
296
|
+
try {
|
|
297
|
+
await config.callbacks.onUnban(user);
|
|
298
|
+
}
|
|
299
|
+
catch (callbackError) {
|
|
300
|
+
console.error('[BansPlugin] onUnban callback error:', callbackError);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
log('User unbanned by email', { email, userId: user.id });
|
|
304
|
+
res.status(204).send();
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
console.error('[BansPlugin] Unban user by email error:', error);
|
|
308
|
+
res.status(500).json({ error: 'Failed to unban user' });
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
log('Bans plugin started');
|
|
314
|
+
},
|
|
315
|
+
async onStop() {
|
|
316
|
+
log('Stopping bans plugin');
|
|
317
|
+
if (banCleanupInterval) {
|
|
318
|
+
clearInterval(banCleanupInterval);
|
|
319
|
+
banCleanupInterval = null;
|
|
320
|
+
}
|
|
321
|
+
await config.store.shutdown();
|
|
322
|
+
currentStore = null;
|
|
323
|
+
pluginConfig = null;
|
|
324
|
+
log('Bans plugin stopped');
|
|
325
|
+
},
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
// ========================================
|
|
329
|
+
// Helper Functions
|
|
330
|
+
// ========================================
|
|
331
|
+
/**
|
|
332
|
+
* Get the current ban store instance
|
|
333
|
+
*/
|
|
334
|
+
export function getBanStore() {
|
|
335
|
+
return currentStore;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Check if a user is banned by user ID
|
|
339
|
+
*/
|
|
340
|
+
export async function isUserBanned(userId) {
|
|
341
|
+
if (!currentStore) {
|
|
342
|
+
throw new Error('Bans plugin not initialized');
|
|
343
|
+
}
|
|
344
|
+
return currentStore.isBanned(userId);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Check if a user is banned by email
|
|
348
|
+
*
|
|
349
|
+
* This is a convenience function that:
|
|
350
|
+
* 1. Resolves email → user via Users Plugin
|
|
351
|
+
* 2. Checks ban status by user_id
|
|
352
|
+
*
|
|
353
|
+
* Returns false if user doesn't exist (unknown user = not banned)
|
|
354
|
+
*/
|
|
355
|
+
export async function isEmailBanned(email) {
|
|
356
|
+
if (!currentStore) {
|
|
357
|
+
throw new Error('Bans plugin not initialized');
|
|
358
|
+
}
|
|
359
|
+
// Resolve email to user via Users Plugin
|
|
360
|
+
const user = await getUserByEmail(email);
|
|
361
|
+
if (!user) {
|
|
362
|
+
return false; // Unknown user = not banned
|
|
363
|
+
}
|
|
364
|
+
return currentStore.isBanned(user.id);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Get active ban for a user
|
|
368
|
+
*/
|
|
369
|
+
export async function getActiveBan(userId) {
|
|
370
|
+
if (!currentStore) {
|
|
371
|
+
throw new Error('Bans plugin not initialized');
|
|
372
|
+
}
|
|
373
|
+
return currentStore.getActiveBan(userId);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Ban a user
|
|
377
|
+
*/
|
|
378
|
+
export async function banUser(input) {
|
|
379
|
+
if (!currentStore) {
|
|
380
|
+
throw new Error('Bans plugin not initialized');
|
|
381
|
+
}
|
|
382
|
+
const ban = await currentStore.createBan(input);
|
|
383
|
+
// Call onBan callback if configured
|
|
384
|
+
if (pluginConfig?.callbacks?.onBan) {
|
|
385
|
+
const user = await getUserById(input.user_id);
|
|
386
|
+
if (user) {
|
|
387
|
+
try {
|
|
388
|
+
await pluginConfig.callbacks.onBan(user, ban);
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
console.error('[BansPlugin] onBan callback error:', error);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return ban;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Unban a user
|
|
399
|
+
*/
|
|
400
|
+
export async function unbanUser(input) {
|
|
401
|
+
if (!currentStore) {
|
|
402
|
+
throw new Error('Bans plugin not initialized');
|
|
403
|
+
}
|
|
404
|
+
const removed = await currentStore.removeBan(input);
|
|
405
|
+
// Call onUnban callback if configured
|
|
406
|
+
if (removed && pluginConfig?.callbacks?.onUnban) {
|
|
407
|
+
const user = await getUserById(input.user_id);
|
|
408
|
+
if (user) {
|
|
409
|
+
try {
|
|
410
|
+
await pluginConfig.callbacks.onUnban(user);
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
console.error('[BansPlugin] onUnban callback error:', error);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return removed;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* List all active bans
|
|
421
|
+
*/
|
|
422
|
+
export async function listActiveBans(options) {
|
|
423
|
+
if (!currentStore) {
|
|
424
|
+
throw new Error('Bans plugin not initialized');
|
|
425
|
+
}
|
|
426
|
+
return currentStore.listActiveBans(options);
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=bans-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bans-plugin.js","sourceRoot":"","sources":["../../../src/plugins/bans/bans-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bans Plugin Index
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
export { createBansPlugin, getBanStore, isUserBanned, isEmailBanned, getActiveBan, banUser, unbanUser, listActiveBans, } from './bans-plugin.js';
|
|
7
|
+
export type { BansPluginConfig, BanStore, Ban, CreateBanInput, RemoveBanInput, BanCallbacks, PostgresBanStoreConfig, } from './types.js';
|
|
8
|
+
export { postgresBanStore } from './stores/index.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/bans/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,OAAO,EACP,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,gBAAgB,EAChB,QAAQ,EACR,GAAG,EACH,cAAc,EACd,cAAc,EACd,YAAY,EACZ,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bans Plugin Index
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
// Main plugin
|
|
7
|
+
export { createBansPlugin, getBanStore, isUserBanned, isEmailBanned, getActiveBan, banUser, unbanUser, listActiveBans, } from './bans-plugin.js';
|
|
8
|
+
// Stores
|
|
9
|
+
export { postgresBanStore } from './stores/index.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/bans/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc;AACd,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,OAAO,EACP,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAC;AAa1B,SAAS;AACT,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/bans/stores/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/bans/stores/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Ban Store
|
|
3
|
+
*
|
|
4
|
+
* Ban storage implementation using PostgreSQL.
|
|
5
|
+
* Requires the 'pg' package and the Users plugin to be installed.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
import type { BanStore, PostgresBanStoreConfig } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Create a PostgreSQL ban store
|
|
12
|
+
*
|
|
13
|
+
* @param config Configuration including a pg Pool instance or a function that returns one
|
|
14
|
+
* @returns BanStore implementation
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { Pool } from 'pg';
|
|
19
|
+
* import { postgresBanStore } from '@qwickapps/server';
|
|
20
|
+
*
|
|
21
|
+
* const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
22
|
+
* const store = postgresBanStore({ pool });
|
|
23
|
+
*
|
|
24
|
+
* // Or with lazy initialization:
|
|
25
|
+
* const store = postgresBanStore({ pool: () => getPostgres().getPool() });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function postgresBanStore(config: PostgresBanStoreConfig): BanStore;
|
|
29
|
+
//# sourceMappingURL=postgres-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-store.d.ts","sourceRoot":"","sources":["../../../../src/plugins/bans/stores/postgres-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,QAAQ,EAIR,sBAAsB,EACvB,MAAM,aAAa,CAAC;AAOrB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,QAAQ,CA0JzE"}
|