@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.
Files changed (240) hide show
  1. package/README.md +238 -0
  2. package/dist/core/control-panel.d.ts +7 -2
  3. package/dist/core/control-panel.d.ts.map +1 -1
  4. package/dist/core/control-panel.js +92 -54
  5. package/dist/core/control-panel.js.map +1 -1
  6. package/dist/core/gateway.d.ts +159 -79
  7. package/dist/core/gateway.d.ts.map +1 -1
  8. package/dist/core/gateway.js +679 -319
  9. package/dist/core/gateway.js.map +1 -1
  10. package/dist/core/index.d.ts +3 -1
  11. package/dist/core/index.d.ts.map +1 -1
  12. package/dist/core/index.js +2 -0
  13. package/dist/core/index.js.map +1 -1
  14. package/dist/core/plugin-registry.d.ts +271 -0
  15. package/dist/core/plugin-registry.d.ts.map +1 -0
  16. package/dist/core/plugin-registry.js +326 -0
  17. package/dist/core/plugin-registry.js.map +1 -0
  18. package/dist/core/types.d.ts +16 -33
  19. package/dist/core/types.d.ts.map +1 -1
  20. package/dist/index.d.ts +8 -5
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +15 -7
  23. package/dist/index.js.map +1 -1
  24. package/dist/plugins/auth/adapters/auth0-adapter.d.ts +14 -0
  25. package/dist/plugins/auth/adapters/auth0-adapter.d.ts.map +1 -0
  26. package/dist/plugins/auth/adapters/auth0-adapter.js +179 -0
  27. package/dist/plugins/auth/adapters/auth0-adapter.js.map +1 -0
  28. package/dist/plugins/auth/adapters/basic-adapter.d.ts +13 -0
  29. package/dist/plugins/auth/adapters/basic-adapter.d.ts.map +1 -0
  30. package/dist/plugins/auth/adapters/basic-adapter.js +51 -0
  31. package/dist/plugins/auth/adapters/basic-adapter.js.map +1 -0
  32. package/dist/plugins/auth/adapters/index.d.ts +9 -0
  33. package/dist/plugins/auth/adapters/index.d.ts.map +1 -0
  34. package/dist/plugins/auth/adapters/index.js +9 -0
  35. package/dist/plugins/auth/adapters/index.js.map +1 -0
  36. package/dist/plugins/auth/adapters/supabase-adapter.d.ts +13 -0
  37. package/dist/plugins/auth/adapters/supabase-adapter.d.ts.map +1 -0
  38. package/dist/plugins/auth/adapters/supabase-adapter.js +109 -0
  39. package/dist/plugins/auth/adapters/supabase-adapter.js.map +1 -0
  40. package/dist/plugins/auth/auth-plugin.d.ts +40 -0
  41. package/dist/plugins/auth/auth-plugin.d.ts.map +1 -0
  42. package/dist/plugins/auth/auth-plugin.js +255 -0
  43. package/dist/plugins/auth/auth-plugin.js.map +1 -0
  44. package/dist/plugins/auth/auth-plugin.test.d.ts +9 -0
  45. package/dist/plugins/auth/auth-plugin.test.d.ts.map +1 -0
  46. package/dist/plugins/auth/auth-plugin.test.js +147 -0
  47. package/dist/plugins/auth/auth-plugin.test.js.map +1 -0
  48. package/dist/plugins/auth/index.d.ts +12 -0
  49. package/dist/plugins/auth/index.d.ts.map +1 -0
  50. package/dist/plugins/auth/index.js +13 -0
  51. package/dist/plugins/auth/index.js.map +1 -0
  52. package/dist/plugins/auth/types.d.ts +148 -0
  53. package/dist/plugins/auth/types.d.ts.map +1 -0
  54. package/dist/plugins/auth/types.js +14 -0
  55. package/dist/plugins/auth/types.js.map +1 -0
  56. package/dist/plugins/bans/bans-plugin.d.ts +59 -0
  57. package/dist/plugins/bans/bans-plugin.d.ts.map +1 -0
  58. package/dist/plugins/bans/bans-plugin.js +428 -0
  59. package/dist/plugins/bans/bans-plugin.js.map +1 -0
  60. package/dist/plugins/bans/index.d.ts +9 -0
  61. package/dist/plugins/bans/index.d.ts.map +1 -0
  62. package/dist/plugins/bans/index.js +10 -0
  63. package/dist/plugins/bans/index.js.map +1 -0
  64. package/dist/plugins/bans/stores/index.d.ts +7 -0
  65. package/dist/plugins/bans/stores/index.d.ts.map +1 -0
  66. package/dist/plugins/bans/stores/index.js +7 -0
  67. package/dist/plugins/bans/stores/index.js.map +1 -0
  68. package/dist/plugins/bans/stores/postgres-store.d.ts +29 -0
  69. package/dist/plugins/bans/stores/postgres-store.d.ts.map +1 -0
  70. package/dist/plugins/bans/stores/postgres-store.js +132 -0
  71. package/dist/plugins/bans/stores/postgres-store.js.map +1 -0
  72. package/dist/plugins/bans/types.d.ts +128 -0
  73. package/dist/plugins/bans/types.d.ts.map +1 -0
  74. package/dist/plugins/bans/types.js +11 -0
  75. package/dist/plugins/bans/types.js.map +1 -0
  76. package/dist/plugins/cache-plugin.d.ts +14 -3
  77. package/dist/plugins/cache-plugin.d.ts.map +1 -1
  78. package/dist/plugins/cache-plugin.js +27 -7
  79. package/dist/plugins/cache-plugin.js.map +1 -1
  80. package/dist/plugins/cache-plugin.test.js +96 -32
  81. package/dist/plugins/cache-plugin.test.js.map +1 -1
  82. package/dist/plugins/config-plugin.d.ts +3 -2
  83. package/dist/plugins/config-plugin.d.ts.map +1 -1
  84. package/dist/plugins/config-plugin.js +17 -10
  85. package/dist/plugins/config-plugin.js.map +1 -1
  86. package/dist/plugins/diagnostics-plugin.d.ts +2 -2
  87. package/dist/plugins/diagnostics-plugin.d.ts.map +1 -1
  88. package/dist/plugins/diagnostics-plugin.js +17 -10
  89. package/dist/plugins/diagnostics-plugin.js.map +1 -1
  90. package/dist/plugins/entitlements/entitlements-plugin.d.ts +95 -0
  91. package/dist/plugins/entitlements/entitlements-plugin.d.ts.map +1 -0
  92. package/dist/plugins/entitlements/entitlements-plugin.js +707 -0
  93. package/dist/plugins/entitlements/entitlements-plugin.js.map +1 -0
  94. package/dist/plugins/entitlements/index.d.ts +12 -0
  95. package/dist/plugins/entitlements/index.d.ts.map +1 -0
  96. package/dist/plugins/entitlements/index.js +16 -0
  97. package/dist/plugins/entitlements/index.js.map +1 -0
  98. package/dist/plugins/entitlements/sources/index.d.ts +9 -0
  99. package/dist/plugins/entitlements/sources/index.d.ts.map +1 -0
  100. package/dist/plugins/entitlements/sources/index.js +9 -0
  101. package/dist/plugins/entitlements/sources/index.js.map +1 -0
  102. package/dist/plugins/entitlements/sources/postgres-source.d.ts +29 -0
  103. package/dist/plugins/entitlements/sources/postgres-source.d.ts.map +1 -0
  104. package/dist/plugins/entitlements/sources/postgres-source.js +169 -0
  105. package/dist/plugins/entitlements/sources/postgres-source.js.map +1 -0
  106. package/dist/plugins/entitlements/types.d.ts +232 -0
  107. package/dist/plugins/entitlements/types.d.ts.map +1 -0
  108. package/dist/plugins/entitlements/types.js +11 -0
  109. package/dist/plugins/entitlements/types.js.map +1 -0
  110. package/dist/plugins/frontend-app-plugin.d.ts +9 -3
  111. package/dist/plugins/frontend-app-plugin.d.ts.map +1 -1
  112. package/dist/plugins/frontend-app-plugin.js +14 -9
  113. package/dist/plugins/frontend-app-plugin.js.map +1 -1
  114. package/dist/plugins/health-plugin.d.ts +5 -2
  115. package/dist/plugins/health-plugin.d.ts.map +1 -1
  116. package/dist/plugins/health-plugin.js +20 -5
  117. package/dist/plugins/health-plugin.js.map +1 -1
  118. package/dist/plugins/index.d.ts +8 -2
  119. package/dist/plugins/index.d.ts.map +1 -1
  120. package/dist/plugins/index.js +8 -2
  121. package/dist/plugins/index.js.map +1 -1
  122. package/dist/plugins/logs-plugin.d.ts +3 -2
  123. package/dist/plugins/logs-plugin.d.ts.map +1 -1
  124. package/dist/plugins/logs-plugin.js +21 -12
  125. package/dist/plugins/logs-plugin.js.map +1 -1
  126. package/dist/plugins/postgres-plugin.d.ts +3 -3
  127. package/dist/plugins/postgres-plugin.d.ts.map +1 -1
  128. package/dist/plugins/postgres-plugin.js +9 -7
  129. package/dist/plugins/postgres-plugin.js.map +1 -1
  130. package/dist/plugins/postgres-plugin.test.js +47 -29
  131. package/dist/plugins/postgres-plugin.test.js.map +1 -1
  132. package/dist/plugins/users/index.d.ts +12 -0
  133. package/dist/plugins/users/index.d.ts.map +1 -0
  134. package/dist/plugins/users/index.js +13 -0
  135. package/dist/plugins/users/index.js.map +1 -0
  136. package/dist/plugins/users/stores/index.d.ts +7 -0
  137. package/dist/plugins/users/stores/index.d.ts.map +1 -0
  138. package/dist/plugins/users/stores/index.js +7 -0
  139. package/dist/plugins/users/stores/index.js.map +1 -0
  140. package/dist/plugins/users/stores/postgres-store.d.ts +28 -0
  141. package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -0
  142. package/dist/plugins/users/stores/postgres-store.js +157 -0
  143. package/dist/plugins/users/stores/postgres-store.js.map +1 -0
  144. package/dist/plugins/users/types.d.ts +189 -0
  145. package/dist/plugins/users/types.d.ts.map +1 -0
  146. package/dist/plugins/users/types.js +12 -0
  147. package/dist/plugins/users/types.js.map +1 -0
  148. package/dist/plugins/users/users-plugin.d.ts +39 -0
  149. package/dist/plugins/users/users-plugin.d.ts.map +1 -0
  150. package/dist/plugins/users/users-plugin.js +242 -0
  151. package/dist/plugins/users/users-plugin.js.map +1 -0
  152. package/dist-ui/assets/index-Bsp2ntcw.js +465 -0
  153. package/dist-ui/assets/index-Bsp2ntcw.js.map +1 -0
  154. package/dist-ui/index.html +1 -1
  155. package/dist-ui-lib/api/controlPanelApi.d.ts +232 -0
  156. package/dist-ui-lib/components/ControlPanelApp.d.ts +61 -0
  157. package/dist-ui-lib/components/index.d.ts +18 -0
  158. package/dist-ui-lib/config/AppConfig.d.ts +7 -0
  159. package/dist-ui-lib/dashboard/DashboardWidgetRegistry.d.ts +62 -0
  160. package/dist-ui-lib/dashboard/DashboardWidgetRenderer.d.ts +8 -0
  161. package/dist-ui-lib/dashboard/PluginWidgetRenderer.d.ts +19 -0
  162. package/dist-ui-lib/dashboard/WidgetComponentRegistry.d.ts +44 -0
  163. package/dist-ui-lib/dashboard/builtInWidgets.d.ts +19 -0
  164. package/dist-ui-lib/dashboard/index.d.ts +13 -0
  165. package/dist-ui-lib/dashboard/widgets/ServiceHealthWidget.d.ts +12 -0
  166. package/dist-ui-lib/dashboard/widgets/index.d.ts +6 -0
  167. package/dist-ui-lib/index.js +6441 -0
  168. package/dist-ui-lib/index.js.map +1 -0
  169. package/dist-ui-lib/pages/ConfigPage.d.ts +1 -0
  170. package/dist-ui-lib/pages/DashboardPage.d.ts +1 -0
  171. package/dist-ui-lib/pages/DiagnosticsPage.d.ts +1 -0
  172. package/dist-ui-lib/pages/EntitlementsPage.d.ts +17 -0
  173. package/dist-ui-lib/pages/LogsPage.d.ts +1 -0
  174. package/dist-ui-lib/pages/NotFoundPage.d.ts +1 -0
  175. package/dist-ui-lib/pages/PluginPage.d.ts +15 -0
  176. package/dist-ui-lib/pages/SystemPage.d.ts +1 -0
  177. package/dist-ui-lib/pages/UsersPage.d.ts +22 -0
  178. package/package.json +18 -6
  179. package/src/core/control-panel.ts +114 -61
  180. package/src/core/gateway.ts +863 -403
  181. package/src/core/index.ts +21 -2
  182. package/src/core/plugin-registry.ts +653 -0
  183. package/src/core/types.ts +31 -37
  184. package/src/index.ts +118 -19
  185. package/src/plugins/auth/adapters/auth0-adapter.ts +214 -0
  186. package/src/plugins/auth/adapters/basic-adapter.ts +61 -0
  187. package/src/plugins/auth/adapters/index.ts +9 -0
  188. package/src/plugins/auth/adapters/supabase-adapter.ts +141 -0
  189. package/src/plugins/auth/auth-plugin.test.ts +176 -0
  190. package/src/plugins/auth/auth-plugin.ts +303 -0
  191. package/src/plugins/auth/index.ts +33 -0
  192. package/src/plugins/auth/types.ts +165 -0
  193. package/src/plugins/bans/bans-plugin.ts +485 -0
  194. package/src/plugins/bans/index.ts +31 -0
  195. package/src/plugins/bans/stores/index.ts +7 -0
  196. package/src/plugins/bans/stores/postgres-store.ts +195 -0
  197. package/src/plugins/bans/types.ts +141 -0
  198. package/src/plugins/cache-plugin.test.ts +105 -32
  199. package/src/plugins/cache-plugin.ts +40 -9
  200. package/src/plugins/config-plugin.ts +23 -12
  201. package/src/plugins/diagnostics-plugin.ts +22 -12
  202. package/src/plugins/entitlements/entitlements-plugin.ts +820 -0
  203. package/src/plugins/entitlements/index.ts +51 -0
  204. package/src/plugins/entitlements/sources/index.ts +9 -0
  205. package/src/plugins/entitlements/sources/postgres-source.ts +253 -0
  206. package/src/plugins/entitlements/types.ts +256 -0
  207. package/src/plugins/frontend-app-plugin.ts +24 -12
  208. package/src/plugins/health-plugin.ts +27 -7
  209. package/src/plugins/index.ts +106 -4
  210. package/src/plugins/logs-plugin.ts +28 -14
  211. package/src/plugins/postgres-plugin.test.ts +49 -29
  212. package/src/plugins/postgres-plugin.ts +11 -9
  213. package/src/plugins/users/index.ts +35 -0
  214. package/src/plugins/users/stores/index.ts +7 -0
  215. package/src/plugins/users/stores/postgres-store.ts +225 -0
  216. package/src/plugins/users/types.ts +209 -0
  217. package/src/plugins/users/users-plugin.ts +281 -0
  218. package/ui/src/App.tsx +185 -31
  219. package/ui/src/api/controlPanelApi.ts +354 -1
  220. package/ui/src/components/ControlPanelApp.tsx +209 -0
  221. package/ui/src/components/index.ts +62 -0
  222. package/ui/src/dashboard/DashboardWidgetRegistry.tsx +129 -0
  223. package/ui/src/dashboard/DashboardWidgetRenderer.tsx +34 -0
  224. package/ui/src/dashboard/PluginWidgetRenderer.tsx +115 -0
  225. package/ui/src/dashboard/WidgetComponentRegistry.tsx +116 -0
  226. package/ui/src/dashboard/builtInWidgets.tsx +29 -0
  227. package/ui/src/dashboard/index.ts +35 -0
  228. package/ui/src/dashboard/widgets/ServiceHealthWidget.tsx +140 -0
  229. package/ui/src/dashboard/widgets/index.ts +7 -0
  230. package/ui/src/pages/DashboardPage.tsx +28 -149
  231. package/ui/src/pages/EntitlementsPage.tsx +557 -0
  232. package/ui/src/pages/LogsPage.tsx +174 -8
  233. package/ui/src/pages/PluginPage.tsx +148 -0
  234. package/ui/src/pages/SystemPage.tsx +445 -0
  235. package/ui/src/pages/UsersPage.tsx +837 -0
  236. package/ui/tsconfig.lib.json +11 -0
  237. package/ui/vite.lib.config.ts +51 -0
  238. package/dist-ui/assets/index-CW1BviRn.js +0 -465
  239. package/dist-ui/assets/index-CW1BviRn.js.map +0 -1
  240. 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,7 @@
1
+ /**
2
+ * Ban Stores Index
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+ export { postgresBanStore } from './postgres-store.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * Ban Stores Index
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+ export { postgresBanStore } from './postgres-store.js';
7
+ //# sourceMappingURL=index.js.map
@@ -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"}