@qwickapps/server 1.3.0 → 1.4.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 +311 -0
- package/dist/core/control-panel.d.ts.map +1 -1
- package/dist/core/control-panel.js +144 -2
- package/dist/core/control-panel.js.map +1 -1
- package/dist/core/plugin-registry.d.ts +36 -0
- package/dist/core/plugin-registry.d.ts.map +1 -1
- package/dist/core/plugin-registry.js +26 -0
- package/dist/core/plugin-registry.js.map +1 -1
- package/dist/core/types.d.ts +19 -0
- package/dist/core/types.d.ts.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/auth/adapter-wrapper.d.ts +47 -0
- package/dist/plugins/auth/adapter-wrapper.d.ts.map +1 -0
- package/dist/plugins/auth/adapter-wrapper.js +166 -0
- package/dist/plugins/auth/adapter-wrapper.js.map +1 -0
- package/dist/plugins/auth/adapter-wrapper.test.d.ts +7 -0
- package/dist/plugins/auth/adapter-wrapper.test.d.ts.map +1 -0
- package/dist/plugins/auth/adapter-wrapper.test.js +303 -0
- package/dist/plugins/auth/adapter-wrapper.test.js.map +1 -0
- package/dist/plugins/auth/adapters/index.d.ts +1 -0
- package/dist/plugins/auth/adapters/index.d.ts.map +1 -1
- package/dist/plugins/auth/adapters/index.js +1 -0
- package/dist/plugins/auth/adapters/index.js.map +1 -1
- package/dist/plugins/auth/adapters/supabase-adapter.d.ts.map +1 -1
- package/dist/plugins/auth/adapters/supabase-adapter.js.map +1 -1
- package/dist/plugins/auth/adapters/supertokens-adapter.d.ts +18 -0
- package/dist/plugins/auth/adapters/supertokens-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/supertokens-adapter.js +267 -0
- package/dist/plugins/auth/adapters/supertokens-adapter.js.map +1 -0
- package/dist/plugins/auth/config-store.d.ts +11 -0
- package/dist/plugins/auth/config-store.d.ts.map +1 -0
- package/dist/plugins/auth/config-store.js +232 -0
- package/dist/plugins/auth/config-store.js.map +1 -0
- package/dist/plugins/auth/config-store.test.d.ts +7 -0
- package/dist/plugins/auth/config-store.test.d.ts.map +1 -0
- package/dist/plugins/auth/config-store.test.js +299 -0
- package/dist/plugins/auth/config-store.test.js.map +1 -0
- package/dist/plugins/auth/env-config.d.ts +138 -0
- package/dist/plugins/auth/env-config.d.ts.map +1 -0
- package/dist/plugins/auth/env-config.js +1122 -0
- package/dist/plugins/auth/env-config.js.map +1 -0
- package/dist/plugins/auth/index.d.ts +7 -1
- package/dist/plugins/auth/index.d.ts.map +1 -1
- package/dist/plugins/auth/index.js +7 -0
- package/dist/plugins/auth/index.js.map +1 -1
- package/dist/plugins/auth/supertokens-adapter.test.d.ts +10 -0
- package/dist/plugins/auth/supertokens-adapter.test.d.ts.map +1 -0
- package/dist/plugins/auth/supertokens-adapter.test.js +486 -0
- package/dist/plugins/auth/supertokens-adapter.test.js.map +1 -0
- package/dist/plugins/auth/types.d.ts +176 -0
- package/dist/plugins/auth/types.d.ts.map +1 -1
- package/dist/plugins/auth/types.js.map +1 -1
- package/dist/plugins/cache-plugin.test.js +3 -0
- package/dist/plugins/cache-plugin.test.js.map +1 -1
- package/dist/plugins/index.d.ts +6 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +5 -1
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/postgres-plugin.test.js +3 -0
- package/dist/plugins/postgres-plugin.test.js.map +1 -1
- package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts +7 -0
- package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts.map +1 -0
- package/dist/plugins/preferences/__tests__/deep-merge.test.js +215 -0
- package/dist/plugins/preferences/__tests__/deep-merge.test.js.map +1 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts +7 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts.map +1 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.js +265 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.js.map +1 -0
- package/dist/plugins/preferences/index.d.ts +12 -0
- package/dist/plugins/preferences/index.d.ts.map +1 -0
- package/dist/plugins/preferences/index.js +13 -0
- package/dist/plugins/preferences/index.js.map +1 -0
- package/dist/plugins/preferences/preferences-plugin.d.ts +39 -0
- package/dist/plugins/preferences/preferences-plugin.d.ts.map +1 -0
- package/dist/plugins/preferences/preferences-plugin.js +226 -0
- package/dist/plugins/preferences/preferences-plugin.js.map +1 -0
- package/dist/plugins/preferences/stores/index.d.ts +9 -0
- package/dist/plugins/preferences/stores/index.d.ts.map +1 -0
- package/dist/plugins/preferences/stores/index.js +9 -0
- package/dist/plugins/preferences/stores/index.js.map +1 -0
- package/dist/plugins/preferences/stores/postgres-store.d.ts +41 -0
- package/dist/plugins/preferences/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/preferences/stores/postgres-store.js +181 -0
- package/dist/plugins/preferences/stores/postgres-store.js.map +1 -0
- package/dist/plugins/preferences/types.d.ts +91 -0
- package/dist/plugins/preferences/types.d.ts.map +1 -0
- package/dist/plugins/preferences/types.js +10 -0
- package/dist/plugins/preferences/types.js.map +1 -0
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.d.ts +7 -0
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.d.ts.map +1 -0
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.js +220 -0
- package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.js.map +1 -0
- package/dist/plugins/rate-limit/cleanup.d.ts +40 -0
- package/dist/plugins/rate-limit/cleanup.d.ts.map +1 -0
- package/dist/plugins/rate-limit/cleanup.js +72 -0
- package/dist/plugins/rate-limit/cleanup.js.map +1 -0
- package/dist/plugins/rate-limit/env-config.d.ts +91 -0
- package/dist/plugins/rate-limit/env-config.d.ts.map +1 -0
- package/dist/plugins/rate-limit/env-config.js +318 -0
- package/dist/plugins/rate-limit/env-config.js.map +1 -0
- package/dist/plugins/rate-limit/index.d.ts +76 -0
- package/dist/plugins/rate-limit/index.d.ts.map +1 -0
- package/dist/plugins/rate-limit/index.js +79 -0
- package/dist/plugins/rate-limit/index.js.map +1 -0
- package/dist/plugins/rate-limit/middleware.d.ts +40 -0
- package/dist/plugins/rate-limit/middleware.d.ts.map +1 -0
- package/dist/plugins/rate-limit/middleware.js +169 -0
- package/dist/plugins/rate-limit/middleware.js.map +1 -0
- package/dist/plugins/rate-limit/rate-limit-plugin.d.ts +44 -0
- package/dist/plugins/rate-limit/rate-limit-plugin.d.ts.map +1 -0
- package/dist/plugins/rate-limit/rate-limit-plugin.js +354 -0
- package/dist/plugins/rate-limit/rate-limit-plugin.js.map +1 -0
- package/dist/plugins/rate-limit/rate-limit-service.d.ts +110 -0
- package/dist/plugins/rate-limit/rate-limit-service.d.ts.map +1 -0
- package/dist/plugins/rate-limit/rate-limit-service.js +172 -0
- package/dist/plugins/rate-limit/rate-limit-service.js.map +1 -0
- package/dist/plugins/rate-limit/stores/cache-store.d.ts +33 -0
- package/dist/plugins/rate-limit/stores/cache-store.d.ts.map +1 -0
- package/dist/plugins/rate-limit/stores/cache-store.js +225 -0
- package/dist/plugins/rate-limit/stores/cache-store.js.map +1 -0
- package/dist/plugins/rate-limit/stores/index.d.ts +8 -0
- package/dist/plugins/rate-limit/stores/index.d.ts.map +1 -0
- package/dist/plugins/rate-limit/stores/index.js +8 -0
- package/dist/plugins/rate-limit/stores/index.js.map +1 -0
- package/dist/plugins/rate-limit/stores/postgres-store.d.ts +34 -0
- package/dist/plugins/rate-limit/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/rate-limit/stores/postgres-store.js +320 -0
- package/dist/plugins/rate-limit/stores/postgres-store.js.map +1 -0
- package/dist/plugins/rate-limit/strategies/fixed-window.d.ts +21 -0
- package/dist/plugins/rate-limit/strategies/fixed-window.d.ts.map +1 -0
- package/dist/plugins/rate-limit/strategies/fixed-window.js +97 -0
- package/dist/plugins/rate-limit/strategies/fixed-window.js.map +1 -0
- package/dist/plugins/rate-limit/strategies/index.d.ts +14 -0
- package/dist/plugins/rate-limit/strategies/index.d.ts.map +1 -0
- package/dist/plugins/rate-limit/strategies/index.js +27 -0
- package/dist/plugins/rate-limit/strategies/index.js.map +1 -0
- package/dist/plugins/rate-limit/strategies/sliding-window.d.ts +22 -0
- package/dist/plugins/rate-limit/strategies/sliding-window.d.ts.map +1 -0
- package/dist/plugins/rate-limit/strategies/sliding-window.js +122 -0
- package/dist/plugins/rate-limit/strategies/sliding-window.js.map +1 -0
- package/dist/plugins/rate-limit/strategies/token-bucket.d.ts +28 -0
- package/dist/plugins/rate-limit/strategies/token-bucket.d.ts.map +1 -0
- package/dist/plugins/rate-limit/strategies/token-bucket.js +121 -0
- package/dist/plugins/rate-limit/strategies/token-bucket.js.map +1 -0
- package/dist/plugins/rate-limit/types.d.ts +265 -0
- package/dist/plugins/rate-limit/types.d.ts.map +1 -0
- package/dist/plugins/rate-limit/types.js +9 -0
- package/dist/plugins/rate-limit/types.js.map +1 -0
- package/dist/plugins/users/__tests__/users-plugin.test.d.ts +9 -0
- package/dist/plugins/users/__tests__/users-plugin.test.d.ts.map +1 -0
- package/dist/plugins/users/__tests__/users-plugin.test.js +546 -0
- package/dist/plugins/users/__tests__/users-plugin.test.js.map +1 -0
- package/dist/plugins/users/index.d.ts +2 -2
- package/dist/plugins/users/index.d.ts.map +1 -1
- package/dist/plugins/users/index.js +1 -1
- package/dist/plugins/users/index.js.map +1 -1
- package/dist/plugins/users/types.d.ts +36 -0
- package/dist/plugins/users/types.d.ts.map +1 -1
- package/dist/plugins/users/users-plugin.d.ts +8 -2
- package/dist/plugins/users/users-plugin.d.ts.map +1 -1
- package/dist/plugins/users/users-plugin.js +122 -5
- package/dist/plugins/users/users-plugin.js.map +1 -1
- package/dist-ui/assets/index-D7DoZ9rL.js +478 -0
- package/dist-ui/assets/index-D7DoZ9rL.js.map +1 -0
- package/dist-ui/index.html +1 -1
- package/dist-ui-lib/api/controlPanelApi.d.ts +194 -7
- package/dist-ui-lib/dashboard/WidgetComponentRegistry.d.ts +9 -5
- package/dist-ui-lib/dashboard/builtInWidgets.d.ts +7 -1
- package/dist-ui-lib/dashboard/widgets/AuthStatusWidget.d.ts +9 -0
- package/dist-ui-lib/dashboard/widgets/IntegrationStatusWidget.d.ts +9 -0
- package/dist-ui-lib/dashboard/widgets/index.d.ts +2 -0
- package/dist-ui-lib/index.js +3665 -3945
- package/dist-ui-lib/index.js.map +1 -1
- package/dist-ui-lib/pages/AuthPage.d.ts +1 -0
- package/dist-ui-lib/pages/IntegrationsPage.d.ts +1 -0
- package/dist-ui-lib/pages/PluginsPage.d.ts +1 -0
- package/dist-ui-lib/pages/RateLimitPage.d.ts +1 -0
- package/package.json +7 -2
- package/src/core/control-panel.ts +161 -2
- package/src/core/plugin-registry.ts +63 -0
- package/src/core/types.ts +17 -0
- package/src/index.ts +45 -0
- package/src/plugins/auth/adapter-wrapper.test.ts +395 -0
- package/src/plugins/auth/adapter-wrapper.ts +205 -0
- package/src/plugins/auth/adapters/index.ts +1 -0
- package/src/plugins/auth/adapters/supabase-adapter.ts +22 -14
- package/src/plugins/auth/adapters/supertokens-adapter.ts +326 -0
- package/src/plugins/auth/config-store.test.ts +417 -0
- package/src/plugins/auth/config-store.ts +305 -0
- package/src/plugins/auth/env-config.ts +1279 -0
- package/src/plugins/auth/index.ts +30 -0
- package/src/plugins/auth/supertokens-adapter.test.ts +621 -0
- package/src/plugins/auth/types.ts +218 -0
- package/src/plugins/cache-plugin.test.ts +3 -0
- package/src/plugins/index.ts +75 -0
- package/src/plugins/postgres-plugin.test.ts +3 -0
- package/src/plugins/preferences/__tests__/deep-merge.test.ts +242 -0
- package/src/plugins/preferences/__tests__/preferences-plugin.test.ts +350 -0
- package/src/plugins/preferences/index.ts +30 -0
- package/src/plugins/preferences/preferences-plugin.ts +270 -0
- package/src/plugins/preferences/stores/index.ts +9 -0
- package/src/plugins/preferences/stores/postgres-store.ts +252 -0
- package/src/plugins/preferences/types.ts +100 -0
- package/src/plugins/rate-limit/__tests__/rate-limit-plugin.test.ts +259 -0
- package/src/plugins/rate-limit/cleanup.ts +117 -0
- package/src/plugins/rate-limit/env-config.ts +400 -0
- package/src/plugins/rate-limit/index.ts +128 -0
- package/src/plugins/rate-limit/middleware.ts +212 -0
- package/src/plugins/rate-limit/rate-limit-plugin.ts +400 -0
- package/src/plugins/rate-limit/rate-limit-service.ts +228 -0
- package/src/plugins/rate-limit/stores/cache-store.ts +261 -0
- package/src/plugins/rate-limit/stores/index.ts +8 -0
- package/src/plugins/rate-limit/stores/postgres-store.ts +402 -0
- package/src/plugins/rate-limit/strategies/fixed-window.ts +116 -0
- package/src/plugins/rate-limit/strategies/index.ts +30 -0
- package/src/plugins/rate-limit/strategies/sliding-window.ts +157 -0
- package/src/plugins/rate-limit/strategies/token-bucket.ts +154 -0
- package/src/plugins/rate-limit/types.ts +338 -0
- package/src/plugins/users/__tests__/users-plugin.test.ts +690 -0
- package/src/plugins/users/index.ts +3 -0
- package/src/plugins/users/types.ts +38 -0
- package/src/plugins/users/users-plugin.ts +142 -5
- package/ui/src/App.tsx +35 -14
- package/ui/src/api/controlPanelApi.ts +326 -1
- package/ui/src/components/ControlPanelApp.tsx +3 -0
- package/ui/src/dashboard/PluginWidgetRenderer.tsx +13 -10
- package/ui/src/dashboard/WidgetComponentRegistry.tsx +13 -9
- package/ui/src/dashboard/builtInWidgets.tsx +13 -3
- package/ui/src/dashboard/widgets/AuthStatusWidget.tsx +143 -0
- package/ui/src/dashboard/widgets/IntegrationStatusWidget.tsx +135 -0
- package/ui/src/dashboard/widgets/index.ts +2 -0
- package/ui/src/pages/AuthPage.tsx +1103 -0
- package/ui/src/pages/IntegrationsPage.tsx +288 -0
- package/ui/src/pages/PluginsPage.tsx +394 -0
- package/ui/src/pages/RateLimitPage.tsx +292 -0
- package/ui/vite.lib.config.ts +5 -0
- package/dist-ui/assets/index-Bsp2ntcw.js +0 -465
- package/dist-ui/assets/index-Bsp2ntcw.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-merge.test.js","sourceRoot":"","sources":["../../../../src/plugins/preferences/__tests__/deep-merge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences-plugin.test.d.ts","sourceRoot":"","sources":["../../../../src/plugins/preferences/__tests__/preferences-plugin.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preferences Plugin Tests
|
|
3
|
+
*
|
|
4
|
+
* Unit tests for the preferences plugin using mocked dependencies.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { createPreferencesPlugin, getPreferencesStore, getPreferences, updatePreferences, deletePreferences, getDefaultPreferences, } from '../preferences-plugin.js';
|
|
8
|
+
describe('Preferences Plugin', () => {
|
|
9
|
+
// Mock store
|
|
10
|
+
const createMockStore = () => ({
|
|
11
|
+
name: 'mock',
|
|
12
|
+
initialize: vi.fn().mockResolvedValue(undefined),
|
|
13
|
+
get: vi.fn().mockResolvedValue(null),
|
|
14
|
+
update: vi.fn().mockResolvedValue({}),
|
|
15
|
+
delete: vi.fn().mockResolvedValue(true),
|
|
16
|
+
shutdown: vi.fn().mockResolvedValue(undefined),
|
|
17
|
+
});
|
|
18
|
+
// Mock registry
|
|
19
|
+
const createMockRegistry = (hasUsers = true) => ({
|
|
20
|
+
hasPlugin: vi.fn().mockImplementation((id) => id === 'users' && hasUsers),
|
|
21
|
+
getPlugin: vi.fn().mockReturnValue(null),
|
|
22
|
+
listPlugins: vi.fn().mockReturnValue([]),
|
|
23
|
+
addRoute: vi.fn(),
|
|
24
|
+
addMenuItem: vi.fn(),
|
|
25
|
+
addPage: vi.fn(),
|
|
26
|
+
addWidget: vi.fn(),
|
|
27
|
+
getRoutes: vi.fn().mockReturnValue([]),
|
|
28
|
+
getMenuItems: vi.fn().mockReturnValue([]),
|
|
29
|
+
getPages: vi.fn().mockReturnValue([]),
|
|
30
|
+
getWidgets: vi.fn().mockReturnValue([]),
|
|
31
|
+
getConfig: vi.fn().mockReturnValue({}),
|
|
32
|
+
setConfig: vi.fn().mockResolvedValue(undefined),
|
|
33
|
+
subscribe: vi.fn().mockReturnValue(() => { }),
|
|
34
|
+
emit: vi.fn(),
|
|
35
|
+
registerHealthCheck: vi.fn(),
|
|
36
|
+
getApp: vi.fn().mockReturnValue({}),
|
|
37
|
+
getRouter: vi.fn().mockReturnValue({}),
|
|
38
|
+
getLogger: vi.fn().mockReturnValue({
|
|
39
|
+
debug: vi.fn(),
|
|
40
|
+
info: vi.fn(),
|
|
41
|
+
warn: vi.fn(),
|
|
42
|
+
error: vi.fn(),
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
let mockStore;
|
|
46
|
+
let mockRegistry;
|
|
47
|
+
beforeEach(() => {
|
|
48
|
+
vi.clearAllMocks();
|
|
49
|
+
mockStore = createMockStore();
|
|
50
|
+
mockRegistry = createMockRegistry();
|
|
51
|
+
});
|
|
52
|
+
afterEach(async () => {
|
|
53
|
+
// Clean up by stopping the plugin if it was started
|
|
54
|
+
const store = getPreferencesStore();
|
|
55
|
+
if (store) {
|
|
56
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
57
|
+
await plugin.onStop();
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
describe('createPreferencesPlugin', () => {
|
|
61
|
+
it('should create a plugin with correct id', () => {
|
|
62
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
63
|
+
expect(plugin.id).toBe('preferences');
|
|
64
|
+
});
|
|
65
|
+
it('should create a plugin with correct name', () => {
|
|
66
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
67
|
+
expect(plugin.name).toBe('Preferences');
|
|
68
|
+
});
|
|
69
|
+
it('should create a plugin with version', () => {
|
|
70
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
71
|
+
expect(plugin.version).toBe('1.0.0');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('onStart', () => {
|
|
75
|
+
it('should throw error if users plugin is not loaded', async () => {
|
|
76
|
+
const registryWithoutUsers = createMockRegistry(false);
|
|
77
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
78
|
+
await expect(plugin.onStart({}, registryWithoutUsers)).rejects.toThrow('Preferences plugin requires Users plugin to be loaded first');
|
|
79
|
+
});
|
|
80
|
+
it('should initialize store on start', async () => {
|
|
81
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
82
|
+
await plugin.onStart({}, mockRegistry);
|
|
83
|
+
expect(mockStore.initialize).toHaveBeenCalled();
|
|
84
|
+
});
|
|
85
|
+
it('should register health check', async () => {
|
|
86
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
87
|
+
await plugin.onStart({}, mockRegistry);
|
|
88
|
+
expect(mockRegistry.registerHealthCheck).toHaveBeenCalledWith(expect.objectContaining({
|
|
89
|
+
name: 'preferences-store',
|
|
90
|
+
type: 'custom',
|
|
91
|
+
}));
|
|
92
|
+
});
|
|
93
|
+
it('should register API routes by default', async () => {
|
|
94
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
95
|
+
await plugin.onStart({}, mockRegistry);
|
|
96
|
+
expect(mockRegistry.addRoute).toHaveBeenCalledTimes(3); // GET, PUT, DELETE
|
|
97
|
+
});
|
|
98
|
+
it('should register routes with correct paths', async () => {
|
|
99
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
100
|
+
await plugin.onStart({}, mockRegistry);
|
|
101
|
+
const calls = mockRegistry.addRoute.mock.calls;
|
|
102
|
+
// Check GET route
|
|
103
|
+
expect(calls[0][0]).toMatchObject({
|
|
104
|
+
method: 'get',
|
|
105
|
+
path: '/preferences',
|
|
106
|
+
pluginId: 'preferences',
|
|
107
|
+
});
|
|
108
|
+
// Check PUT route
|
|
109
|
+
expect(calls[1][0]).toMatchObject({
|
|
110
|
+
method: 'put',
|
|
111
|
+
path: '/preferences',
|
|
112
|
+
pluginId: 'preferences',
|
|
113
|
+
});
|
|
114
|
+
// Check DELETE route
|
|
115
|
+
expect(calls[2][0]).toMatchObject({
|
|
116
|
+
method: 'delete',
|
|
117
|
+
path: '/preferences',
|
|
118
|
+
pluginId: 'preferences',
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
it('should use custom API prefix when provided', async () => {
|
|
122
|
+
const plugin = createPreferencesPlugin({
|
|
123
|
+
store: mockStore,
|
|
124
|
+
api: { prefix: '/user-prefs' },
|
|
125
|
+
});
|
|
126
|
+
await plugin.onStart({}, mockRegistry);
|
|
127
|
+
const calls = mockRegistry.addRoute.mock.calls;
|
|
128
|
+
expect(calls[0][0].path).toBe('/user-prefs');
|
|
129
|
+
});
|
|
130
|
+
it('should not register routes when API is disabled', async () => {
|
|
131
|
+
const plugin = createPreferencesPlugin({
|
|
132
|
+
store: mockStore,
|
|
133
|
+
api: { enabled: false },
|
|
134
|
+
});
|
|
135
|
+
await plugin.onStart({}, mockRegistry);
|
|
136
|
+
expect(mockRegistry.addRoute).not.toHaveBeenCalled();
|
|
137
|
+
});
|
|
138
|
+
it('should set store reference for helper functions', async () => {
|
|
139
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
140
|
+
await plugin.onStart({}, mockRegistry);
|
|
141
|
+
expect(getPreferencesStore()).toBe(mockStore);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('onStop', () => {
|
|
145
|
+
it('should shutdown store', async () => {
|
|
146
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
147
|
+
await plugin.onStart({}, mockRegistry);
|
|
148
|
+
await plugin.onStop();
|
|
149
|
+
expect(mockStore.shutdown).toHaveBeenCalled();
|
|
150
|
+
});
|
|
151
|
+
it('should clear store reference', async () => {
|
|
152
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
153
|
+
await plugin.onStart({}, mockRegistry);
|
|
154
|
+
await plugin.onStop();
|
|
155
|
+
expect(getPreferencesStore()).toBeNull();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('helper functions', () => {
|
|
159
|
+
describe('getPreferencesStore', () => {
|
|
160
|
+
it('should return null when plugin not started', () => {
|
|
161
|
+
expect(getPreferencesStore()).toBeNull();
|
|
162
|
+
});
|
|
163
|
+
it('should return store when plugin started', async () => {
|
|
164
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
165
|
+
await plugin.onStart({}, mockRegistry);
|
|
166
|
+
expect(getPreferencesStore()).toBe(mockStore);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe('getPreferences', () => {
|
|
170
|
+
it('should throw when plugin not initialized', async () => {
|
|
171
|
+
await expect(getPreferences('user-id')).rejects.toThrow('Preferences plugin not initialized');
|
|
172
|
+
});
|
|
173
|
+
it('should return defaults when no stored preferences', async () => {
|
|
174
|
+
const defaults = { theme: 'light' };
|
|
175
|
+
const plugin = createPreferencesPlugin({ store: mockStore, defaults });
|
|
176
|
+
await plugin.onStart({}, mockRegistry);
|
|
177
|
+
mockStore.get.mockResolvedValue(null);
|
|
178
|
+
const result = await getPreferences('user-id');
|
|
179
|
+
expect(result).toEqual({ theme: 'light' });
|
|
180
|
+
});
|
|
181
|
+
it('should merge stored preferences with defaults', async () => {
|
|
182
|
+
const defaults = { theme: 'light', notifications: { email: true } };
|
|
183
|
+
const plugin = createPreferencesPlugin({ store: mockStore, defaults });
|
|
184
|
+
await plugin.onStart({}, mockRegistry);
|
|
185
|
+
mockStore.get.mockResolvedValue({ theme: 'dark' });
|
|
186
|
+
const result = await getPreferences('user-id');
|
|
187
|
+
expect(result).toEqual({
|
|
188
|
+
theme: 'dark',
|
|
189
|
+
notifications: { email: true },
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
it('should call store.get with userId', async () => {
|
|
193
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
194
|
+
await plugin.onStart({}, mockRegistry);
|
|
195
|
+
await getPreferences('test-user-id');
|
|
196
|
+
expect(mockStore.get).toHaveBeenCalledWith('test-user-id');
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe('updatePreferences', () => {
|
|
200
|
+
it('should throw when plugin not initialized', async () => {
|
|
201
|
+
await expect(updatePreferences('user-id', {})).rejects.toThrow('Preferences plugin not initialized');
|
|
202
|
+
});
|
|
203
|
+
it('should call store.update with userId and preferences', async () => {
|
|
204
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
205
|
+
await plugin.onStart({}, mockRegistry);
|
|
206
|
+
const prefs = { theme: 'dark' };
|
|
207
|
+
mockStore.update.mockResolvedValue(prefs);
|
|
208
|
+
await updatePreferences('test-user-id', prefs);
|
|
209
|
+
expect(mockStore.update).toHaveBeenCalledWith('test-user-id', prefs);
|
|
210
|
+
});
|
|
211
|
+
it('should merge result with defaults', async () => {
|
|
212
|
+
const defaults = { notifications: { email: true } };
|
|
213
|
+
const plugin = createPreferencesPlugin({ store: mockStore, defaults });
|
|
214
|
+
await plugin.onStart({}, mockRegistry);
|
|
215
|
+
mockStore.update.mockResolvedValue({ theme: 'dark' });
|
|
216
|
+
const result = await updatePreferences('user-id', { theme: 'dark' });
|
|
217
|
+
expect(result).toEqual({
|
|
218
|
+
theme: 'dark',
|
|
219
|
+
notifications: { email: true },
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe('deletePreferences', () => {
|
|
224
|
+
it('should throw when plugin not initialized', async () => {
|
|
225
|
+
await expect(deletePreferences('user-id')).rejects.toThrow('Preferences plugin not initialized');
|
|
226
|
+
});
|
|
227
|
+
it('should call store.delete with userId', async () => {
|
|
228
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
229
|
+
await plugin.onStart({}, mockRegistry);
|
|
230
|
+
await deletePreferences('test-user-id');
|
|
231
|
+
expect(mockStore.delete).toHaveBeenCalledWith('test-user-id');
|
|
232
|
+
});
|
|
233
|
+
it('should return store.delete result', async () => {
|
|
234
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
235
|
+
await plugin.onStart({}, mockRegistry);
|
|
236
|
+
mockStore.delete.mockResolvedValue(true);
|
|
237
|
+
expect(await deletePreferences('user-id')).toBe(true);
|
|
238
|
+
mockStore.delete.mockResolvedValue(false);
|
|
239
|
+
expect(await deletePreferences('user-id')).toBe(false);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
describe('getDefaultPreferences', () => {
|
|
243
|
+
it('should return empty object when no defaults configured', async () => {
|
|
244
|
+
const plugin = createPreferencesPlugin({ store: mockStore });
|
|
245
|
+
await plugin.onStart({}, mockRegistry);
|
|
246
|
+
expect(getDefaultPreferences()).toEqual({});
|
|
247
|
+
});
|
|
248
|
+
it('should return configured defaults', async () => {
|
|
249
|
+
const defaults = { theme: 'light', lang: 'en' };
|
|
250
|
+
const plugin = createPreferencesPlugin({ store: mockStore, defaults });
|
|
251
|
+
await plugin.onStart({}, mockRegistry);
|
|
252
|
+
expect(getDefaultPreferences()).toEqual(defaults);
|
|
253
|
+
});
|
|
254
|
+
it('should return a copy (not reference)', async () => {
|
|
255
|
+
const defaults = { theme: 'light' };
|
|
256
|
+
const plugin = createPreferencesPlugin({ store: mockStore, defaults });
|
|
257
|
+
await plugin.onStart({}, mockRegistry);
|
|
258
|
+
const result = getDefaultPreferences();
|
|
259
|
+
expect(result).not.toBe(defaults);
|
|
260
|
+
expect(result).toEqual(defaults);
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
//# sourceMappingURL=preferences-plugin.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences-plugin.test.js","sourceRoot":"","sources":["../../../../src/plugins/preferences/__tests__/preferences-plugin.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preferences Plugin Index
|
|
3
|
+
*
|
|
4
|
+
* User preferences management plugin with PostgreSQL RLS.
|
|
5
|
+
* Depends on the Users Plugin for user identity.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
export { createPreferencesPlugin, getPreferencesStore, getPreferences, updatePreferences, deletePreferences, getDefaultPreferences, } from './preferences-plugin.js';
|
|
10
|
+
export type { PreferencesPluginConfig, PreferencesStore, UserPreferences, PostgresPreferencesStoreConfig, PreferencesApiConfig, } from './types.js';
|
|
11
|
+
export { postgresPreferencesStore, deepMerge } from './stores/index.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/preferences/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EACV,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preferences Plugin Index
|
|
3
|
+
*
|
|
4
|
+
* User preferences management plugin with PostgreSQL RLS.
|
|
5
|
+
* Depends on the Users Plugin for user identity.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
// Main plugin
|
|
10
|
+
export { createPreferencesPlugin, getPreferencesStore, getPreferences, updatePreferences, deletePreferences, getDefaultPreferences, } from './preferences-plugin.js';
|
|
11
|
+
// Stores
|
|
12
|
+
export { postgresPreferencesStore, deepMerge } from './stores/index.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/preferences/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc;AACd,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAWjC,SAAS;AACT,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preferences Plugin
|
|
3
|
+
*
|
|
4
|
+
* User preferences management plugin for @qwickapps/server.
|
|
5
|
+
* Provides per-user preference storage with PostgreSQL RLS for data isolation.
|
|
6
|
+
*
|
|
7
|
+
* This plugin depends on the Users Plugin for user identity.
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
10
|
+
*/
|
|
11
|
+
import type { Plugin } from '../../core/plugin-registry.js';
|
|
12
|
+
import type { PreferencesPluginConfig, PreferencesStore } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Create the Preferences plugin
|
|
15
|
+
*/
|
|
16
|
+
export declare function createPreferencesPlugin(config: PreferencesPluginConfig): Plugin;
|
|
17
|
+
/**
|
|
18
|
+
* Get the current preferences store instance
|
|
19
|
+
*/
|
|
20
|
+
export declare function getPreferencesStore(): PreferencesStore | null;
|
|
21
|
+
/**
|
|
22
|
+
* Get preferences for a user (merged with defaults)
|
|
23
|
+
*/
|
|
24
|
+
export declare function getPreferences(userId: string): Promise<Record<string, unknown>>;
|
|
25
|
+
/**
|
|
26
|
+
* Update preferences for a user
|
|
27
|
+
* Returns the merged preferences (stored + defaults)
|
|
28
|
+
*/
|
|
29
|
+
export declare function updatePreferences(userId: string, preferences: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
30
|
+
/**
|
|
31
|
+
* Delete preferences for a user (reset to defaults)
|
|
32
|
+
* Returns true if preferences existed and were deleted
|
|
33
|
+
*/
|
|
34
|
+
export declare function deletePreferences(userId: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Get the configured default preferences
|
|
37
|
+
*/
|
|
38
|
+
export declare function getDefaultPreferences(): Record<string, unknown>;
|
|
39
|
+
//# sourceMappingURL=preferences-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences-plugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/preferences/preferences-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,+BAA+B,CAAC;AAC1F,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AA0BpB;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,CAsK/E;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAE7D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOrF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOlC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMxE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE/D"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preferences Plugin
|
|
3
|
+
*
|
|
4
|
+
* User preferences management plugin for @qwickapps/server.
|
|
5
|
+
* Provides per-user preference storage with PostgreSQL RLS for data isolation.
|
|
6
|
+
*
|
|
7
|
+
* This plugin depends on the Users Plugin for user identity.
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
10
|
+
*/
|
|
11
|
+
import { deepMerge } from './stores/postgres-store.js';
|
|
12
|
+
// Configuration limits
|
|
13
|
+
const MAX_PREFERENCES_SIZE = 100000; // 100KB JSON string limit
|
|
14
|
+
const MAX_NESTING_DEPTH = 10;
|
|
15
|
+
/**
|
|
16
|
+
* Check if an object exceeds maximum nesting depth
|
|
17
|
+
*/
|
|
18
|
+
function exceedsMaxDepth(obj, depth = 0) {
|
|
19
|
+
if (depth > MAX_NESTING_DEPTH)
|
|
20
|
+
return true;
|
|
21
|
+
if (obj && typeof obj === 'object' && !Array.isArray(obj)) {
|
|
22
|
+
return Object.values(obj).some(v => exceedsMaxDepth(v, depth + 1));
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(obj)) {
|
|
25
|
+
return obj.some(v => exceedsMaxDepth(v, depth + 1));
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
// Store instance for helper access
|
|
30
|
+
let currentStore = null;
|
|
31
|
+
let pluginDefaults = {};
|
|
32
|
+
/**
|
|
33
|
+
* Create the Preferences plugin
|
|
34
|
+
*/
|
|
35
|
+
export function createPreferencesPlugin(config) {
|
|
36
|
+
const debug = config.debug || false;
|
|
37
|
+
// Routes are mounted under /api by the control panel, so don't include /api in prefix
|
|
38
|
+
const apiPrefix = config.api?.prefix || '/preferences';
|
|
39
|
+
const apiEnabled = config.api?.enabled !== false;
|
|
40
|
+
function log(message, data) {
|
|
41
|
+
if (debug) {
|
|
42
|
+
console.log(`[PreferencesPlugin] ${message}`, data || '');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
id: 'preferences',
|
|
47
|
+
name: 'Preferences',
|
|
48
|
+
version: '1.0.0',
|
|
49
|
+
async onStart(_pluginConfig, registry) {
|
|
50
|
+
log('Starting preferences plugin');
|
|
51
|
+
// Check for users plugin dependency
|
|
52
|
+
if (!registry.hasPlugin('users')) {
|
|
53
|
+
throw new Error('Preferences plugin requires Users plugin to be loaded first');
|
|
54
|
+
}
|
|
55
|
+
// Initialize the store (creates tables and RLS policies if needed)
|
|
56
|
+
await config.store.initialize();
|
|
57
|
+
log('Preferences plugin migrations complete');
|
|
58
|
+
// Store references for helper access
|
|
59
|
+
currentStore = config.store;
|
|
60
|
+
pluginDefaults = config.defaults || {};
|
|
61
|
+
// Register health check
|
|
62
|
+
registry.registerHealthCheck({
|
|
63
|
+
name: 'preferences-store',
|
|
64
|
+
type: 'custom',
|
|
65
|
+
check: async () => {
|
|
66
|
+
try {
|
|
67
|
+
// Simple health check - store is accessible
|
|
68
|
+
// We can't actually query without a user context due to RLS,
|
|
69
|
+
// but we can verify the store is initialized
|
|
70
|
+
return { healthy: currentStore !== null };
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return { healthy: false };
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
// Add API routes if enabled
|
|
78
|
+
if (apiEnabled) {
|
|
79
|
+
// GET /preferences - Get current user's preferences
|
|
80
|
+
registry.addRoute({
|
|
81
|
+
method: 'get',
|
|
82
|
+
path: apiPrefix,
|
|
83
|
+
pluginId: 'preferences',
|
|
84
|
+
handler: async (req, res) => {
|
|
85
|
+
try {
|
|
86
|
+
const authReq = req;
|
|
87
|
+
const userId = authReq.auth?.user?.id;
|
|
88
|
+
if (!userId) {
|
|
89
|
+
return res.status(401).json({ error: 'Authentication required' });
|
|
90
|
+
}
|
|
91
|
+
const stored = await config.store.get(userId);
|
|
92
|
+
// Merge with defaults (defaults as base, stored values override)
|
|
93
|
+
const preferences = stored
|
|
94
|
+
? deepMerge(pluginDefaults, stored)
|
|
95
|
+
: { ...pluginDefaults };
|
|
96
|
+
res.json({
|
|
97
|
+
user_id: userId,
|
|
98
|
+
preferences,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error('[PreferencesPlugin] Get preferences error:', error);
|
|
103
|
+
res.status(500).json({ error: 'Failed to get preferences' });
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
// PUT /preferences - Update current user's preferences
|
|
108
|
+
registry.addRoute({
|
|
109
|
+
method: 'put',
|
|
110
|
+
path: apiPrefix,
|
|
111
|
+
pluginId: 'preferences',
|
|
112
|
+
handler: async (req, res) => {
|
|
113
|
+
try {
|
|
114
|
+
const authReq = req;
|
|
115
|
+
const userId = authReq.auth?.user?.id;
|
|
116
|
+
if (!userId) {
|
|
117
|
+
return res.status(401).json({ error: 'Authentication required' });
|
|
118
|
+
}
|
|
119
|
+
const newPreferences = req.body;
|
|
120
|
+
if (!newPreferences || typeof newPreferences !== 'object' || Array.isArray(newPreferences)) {
|
|
121
|
+
return res.status(400).json({ error: 'Request body must be a JSON object' });
|
|
122
|
+
}
|
|
123
|
+
// Validate payload size
|
|
124
|
+
const jsonSize = JSON.stringify(newPreferences).length;
|
|
125
|
+
if (jsonSize > MAX_PREFERENCES_SIZE) {
|
|
126
|
+
return res.status(413).json({ error: 'Preferences payload too large (max 100KB)' });
|
|
127
|
+
}
|
|
128
|
+
// Validate nesting depth
|
|
129
|
+
if (exceedsMaxDepth(newPreferences)) {
|
|
130
|
+
return res.status(400).json({ error: 'Preferences object too deeply nested (max 10 levels)' });
|
|
131
|
+
}
|
|
132
|
+
const updated = await config.store.update(userId, newPreferences);
|
|
133
|
+
// Merge with defaults for response
|
|
134
|
+
const preferences = deepMerge(pluginDefaults, updated);
|
|
135
|
+
res.json({
|
|
136
|
+
user_id: userId,
|
|
137
|
+
preferences,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.error('[PreferencesPlugin] Update preferences error:', error);
|
|
142
|
+
res.status(500).json({ error: 'Failed to update preferences' });
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
// DELETE /preferences - Reset preferences to defaults
|
|
147
|
+
registry.addRoute({
|
|
148
|
+
method: 'delete',
|
|
149
|
+
path: apiPrefix,
|
|
150
|
+
pluginId: 'preferences',
|
|
151
|
+
handler: async (req, res) => {
|
|
152
|
+
try {
|
|
153
|
+
const authReq = req;
|
|
154
|
+
const userId = authReq.auth?.user?.id;
|
|
155
|
+
if (!userId) {
|
|
156
|
+
return res.status(401).json({ error: 'Authentication required' });
|
|
157
|
+
}
|
|
158
|
+
await config.store.delete(userId);
|
|
159
|
+
// Return 204 No Content (idempotent - success even if no row existed)
|
|
160
|
+
res.status(204).send();
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
console.error('[PreferencesPlugin] Delete preferences error:', error);
|
|
164
|
+
res.status(500).json({ error: 'Failed to delete preferences' });
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
log('Preferences plugin started');
|
|
170
|
+
},
|
|
171
|
+
async onStop() {
|
|
172
|
+
log('Stopping preferences plugin');
|
|
173
|
+
await config.store.shutdown();
|
|
174
|
+
currentStore = null;
|
|
175
|
+
pluginDefaults = {};
|
|
176
|
+
log('Preferences plugin stopped');
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// ========================================
|
|
181
|
+
// Helper Functions
|
|
182
|
+
// ========================================
|
|
183
|
+
/**
|
|
184
|
+
* Get the current preferences store instance
|
|
185
|
+
*/
|
|
186
|
+
export function getPreferencesStore() {
|
|
187
|
+
return currentStore;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get preferences for a user (merged with defaults)
|
|
191
|
+
*/
|
|
192
|
+
export async function getPreferences(userId) {
|
|
193
|
+
if (!currentStore) {
|
|
194
|
+
throw new Error('Preferences plugin not initialized');
|
|
195
|
+
}
|
|
196
|
+
const stored = await currentStore.get(userId);
|
|
197
|
+
return stored ? deepMerge(pluginDefaults, stored) : { ...pluginDefaults };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Update preferences for a user
|
|
201
|
+
* Returns the merged preferences (stored + defaults)
|
|
202
|
+
*/
|
|
203
|
+
export async function updatePreferences(userId, preferences) {
|
|
204
|
+
if (!currentStore) {
|
|
205
|
+
throw new Error('Preferences plugin not initialized');
|
|
206
|
+
}
|
|
207
|
+
const updated = await currentStore.update(userId, preferences);
|
|
208
|
+
return deepMerge(pluginDefaults, updated);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Delete preferences for a user (reset to defaults)
|
|
212
|
+
* Returns true if preferences existed and were deleted
|
|
213
|
+
*/
|
|
214
|
+
export async function deletePreferences(userId) {
|
|
215
|
+
if (!currentStore) {
|
|
216
|
+
throw new Error('Preferences plugin not initialized');
|
|
217
|
+
}
|
|
218
|
+
return currentStore.delete(userId);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get the configured default preferences
|
|
222
|
+
*/
|
|
223
|
+
export function getDefaultPreferences() {
|
|
224
|
+
return { ...pluginDefaults };
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=preferences-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences-plugin.js","sourceRoot":"","sources":["../../../src/plugins/preferences/preferences-plugin.ts"],"names":[],"mappings":"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"}
|