@qwickapps/server 1.4.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +507 -0
- package/README.md +9 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/plugins/bans/bans-plugin.d.ts.map +1 -1
- package/dist/plugins/bans/bans-plugin.js +12 -3
- package/dist/plugins/bans/bans-plugin.js.map +1 -1
- package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts +11 -0
- package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts.map +1 -0
- package/dist/plugins/devices/__tests__/devices-plugin.test.js +410 -0
- package/dist/plugins/devices/__tests__/devices-plugin.test.js.map +1 -0
- package/dist/plugins/devices/__tests__/token-utils.test.d.ts +7 -0
- package/dist/plugins/devices/__tests__/token-utils.test.d.ts.map +1 -0
- package/dist/plugins/devices/__tests__/token-utils.test.js +197 -0
- package/dist/plugins/devices/__tests__/token-utils.test.js.map +1 -0
- package/dist/plugins/devices/adapters/compute-adapter.d.ts +36 -0
- package/dist/plugins/devices/adapters/compute-adapter.d.ts.map +1 -0
- package/dist/plugins/devices/adapters/compute-adapter.js +100 -0
- package/dist/plugins/devices/adapters/compute-adapter.js.map +1 -0
- package/dist/plugins/devices/adapters/index.d.ts +12 -0
- package/dist/plugins/devices/adapters/index.d.ts.map +1 -0
- package/dist/plugins/devices/adapters/index.js +10 -0
- package/dist/plugins/devices/adapters/index.js.map +1 -0
- package/dist/plugins/devices/adapters/mobile-adapter.d.ts +41 -0
- package/dist/plugins/devices/adapters/mobile-adapter.d.ts.map +1 -0
- package/dist/plugins/devices/adapters/mobile-adapter.js +131 -0
- package/dist/plugins/devices/adapters/mobile-adapter.js.map +1 -0
- package/dist/plugins/devices/devices-plugin.d.ts +70 -0
- package/dist/plugins/devices/devices-plugin.d.ts.map +1 -0
- package/dist/plugins/devices/devices-plugin.js +453 -0
- package/dist/plugins/devices/devices-plugin.js.map +1 -0
- package/dist/plugins/devices/index.d.ts +18 -0
- package/dist/plugins/devices/index.d.ts.map +1 -0
- package/dist/plugins/devices/index.js +18 -0
- package/dist/plugins/devices/index.js.map +1 -0
- package/dist/plugins/devices/stores/index.d.ts +9 -0
- package/dist/plugins/devices/stores/index.d.ts.map +1 -0
- package/dist/plugins/devices/stores/index.js +9 -0
- package/dist/plugins/devices/stores/index.js.map +1 -0
- package/dist/plugins/devices/stores/postgres-store.d.ts +26 -0
- package/dist/plugins/devices/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/devices/stores/postgres-store.js +199 -0
- package/dist/plugins/devices/stores/postgres-store.js.map +1 -0
- package/dist/plugins/devices/token-utils.d.ts +100 -0
- package/dist/plugins/devices/token-utils.d.ts.map +1 -0
- package/dist/plugins/devices/token-utils.js +162 -0
- package/dist/plugins/devices/token-utils.js.map +1 -0
- package/dist/plugins/devices/types.d.ts +307 -0
- package/dist/plugins/devices/types.d.ts.map +1 -0
- package/dist/plugins/devices/types.js +10 -0
- package/dist/plugins/devices/types.js.map +1 -0
- package/dist/plugins/index.d.ts +14 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +13 -1
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts +5 -0
- package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts.map +1 -0
- package/dist/plugins/notifications/__tests__/notifications-manager.test.js +470 -0
- package/dist/plugins/notifications/__tests__/notifications-manager.test.js.map +1 -0
- package/dist/plugins/notifications/index.d.ts +71 -0
- package/dist/plugins/notifications/index.d.ts.map +1 -0
- package/dist/plugins/notifications/index.js +72 -0
- package/dist/plugins/notifications/index.js.map +1 -0
- package/dist/plugins/notifications/notifications-manager.d.ts +182 -0
- package/dist/plugins/notifications/notifications-manager.d.ts.map +1 -0
- package/dist/plugins/notifications/notifications-manager.js +610 -0
- package/dist/plugins/notifications/notifications-manager.js.map +1 -0
- package/dist/plugins/notifications/notifications-plugin.d.ts +83 -0
- package/dist/plugins/notifications/notifications-plugin.d.ts.map +1 -0
- package/dist/plugins/notifications/notifications-plugin.js +337 -0
- package/dist/plugins/notifications/notifications-plugin.js.map +1 -0
- package/dist/plugins/notifications/types.d.ts +164 -0
- package/dist/plugins/notifications/types.d.ts.map +1 -0
- package/dist/plugins/notifications/types.js +9 -0
- package/dist/plugins/notifications/types.js.map +1 -0
- package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts +12 -0
- package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts.map +1 -0
- package/dist/plugins/parental/__tests__/parental-plugin.test.js +349 -0
- package/dist/plugins/parental/__tests__/parental-plugin.test.js.map +1 -0
- package/dist/plugins/parental/adapters/index.d.ts +8 -0
- package/dist/plugins/parental/adapters/index.d.ts.map +1 -0
- package/dist/plugins/parental/adapters/index.js +7 -0
- package/dist/plugins/parental/adapters/index.js.map +1 -0
- package/dist/plugins/parental/adapters/kids-adapter.d.ts +24 -0
- package/dist/plugins/parental/adapters/kids-adapter.d.ts.map +1 -0
- package/dist/plugins/parental/adapters/kids-adapter.js +174 -0
- package/dist/plugins/parental/adapters/kids-adapter.js.map +1 -0
- package/dist/plugins/parental/index.d.ts +14 -0
- package/dist/plugins/parental/index.d.ts.map +1 -0
- package/dist/plugins/parental/index.js +15 -0
- package/dist/plugins/parental/index.js.map +1 -0
- package/dist/plugins/parental/parental-plugin.d.ts +88 -0
- package/dist/plugins/parental/parental-plugin.d.ts.map +1 -0
- package/dist/plugins/parental/parental-plugin.js +666 -0
- package/dist/plugins/parental/parental-plugin.js.map +1 -0
- package/dist/plugins/parental/stores/index.d.ts +7 -0
- package/dist/plugins/parental/stores/index.d.ts.map +1 -0
- package/dist/plugins/parental/stores/index.js +7 -0
- package/dist/plugins/parental/stores/index.js.map +1 -0
- package/dist/plugins/parental/stores/postgres-store.d.ts +10 -0
- package/dist/plugins/parental/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/parental/stores/postgres-store.js +209 -0
- package/dist/plugins/parental/stores/postgres-store.js.map +1 -0
- package/dist/plugins/parental/types.d.ts +154 -0
- package/dist/plugins/parental/types.d.ts.map +1 -0
- package/dist/plugins/parental/types.js +10 -0
- package/dist/plugins/parental/types.js.map +1 -0
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts +11 -0
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts.map +1 -0
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.js +243 -0
- package/dist/plugins/profiles/__tests__/profiles-plugin.test.js.map +1 -0
- package/dist/plugins/profiles/index.d.ts +12 -0
- package/dist/plugins/profiles/index.d.ts.map +1 -0
- package/dist/plugins/profiles/index.js +13 -0
- package/dist/plugins/profiles/index.js.map +1 -0
- package/dist/plugins/profiles/profiles-plugin.d.ts +71 -0
- package/dist/plugins/profiles/profiles-plugin.d.ts.map +1 -0
- package/dist/plugins/profiles/profiles-plugin.js +481 -0
- package/dist/plugins/profiles/profiles-plugin.js.map +1 -0
- package/dist/plugins/profiles/stores/index.d.ts +9 -0
- package/dist/plugins/profiles/stores/index.d.ts.map +1 -0
- package/dist/plugins/profiles/stores/index.js +9 -0
- package/dist/plugins/profiles/stores/index.js.map +1 -0
- package/dist/plugins/profiles/stores/postgres-store.d.ts +18 -0
- package/dist/plugins/profiles/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/profiles/stores/postgres-store.js +310 -0
- package/dist/plugins/profiles/stores/postgres-store.js.map +1 -0
- package/dist/plugins/profiles/types.d.ts +289 -0
- package/dist/plugins/profiles/types.d.ts.map +1 -0
- package/dist/plugins/profiles/types.js +10 -0
- package/dist/plugins/profiles/types.js.map +1 -0
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts +11 -0
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts.map +1 -0
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js +305 -0
- package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js.map +1 -0
- package/dist/plugins/subscriptions/index.d.ts +12 -0
- package/dist/plugins/subscriptions/index.d.ts.map +1 -0
- package/dist/plugins/subscriptions/index.js +13 -0
- package/dist/plugins/subscriptions/index.js.map +1 -0
- package/dist/plugins/subscriptions/stores/index.d.ts +9 -0
- package/dist/plugins/subscriptions/stores/index.d.ts.map +1 -0
- package/dist/plugins/subscriptions/stores/index.js +9 -0
- package/dist/plugins/subscriptions/stores/index.js.map +1 -0
- package/dist/plugins/subscriptions/stores/postgres-store.d.ts +14 -0
- package/dist/plugins/subscriptions/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/subscriptions/stores/postgres-store.js +359 -0
- package/dist/plugins/subscriptions/stores/postgres-store.js.map +1 -0
- package/dist/plugins/subscriptions/subscriptions-plugin.d.ts +82 -0
- package/dist/plugins/subscriptions/subscriptions-plugin.d.ts.map +1 -0
- package/dist/plugins/subscriptions/subscriptions-plugin.js +449 -0
- package/dist/plugins/subscriptions/subscriptions-plugin.js.map +1 -0
- package/dist/plugins/subscriptions/types.d.ts +308 -0
- package/dist/plugins/subscriptions/types.d.ts.map +1 -0
- package/dist/plugins/subscriptions/types.js +10 -0
- package/dist/plugins/subscriptions/types.js.map +1 -0
- package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts +11 -0
- package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts.map +1 -0
- package/dist/plugins/usage/__tests__/usage-plugin.test.js +218 -0
- package/dist/plugins/usage/__tests__/usage-plugin.test.js.map +1 -0
- package/dist/plugins/usage/index.d.ts +12 -0
- package/dist/plugins/usage/index.d.ts.map +1 -0
- package/dist/plugins/usage/index.js +13 -0
- package/dist/plugins/usage/index.js.map +1 -0
- package/dist/plugins/usage/stores/index.d.ts +9 -0
- package/dist/plugins/usage/stores/index.d.ts.map +1 -0
- package/dist/plugins/usage/stores/index.js +9 -0
- package/dist/plugins/usage/stores/index.js.map +1 -0
- package/dist/plugins/usage/stores/postgres-store.d.ts +14 -0
- package/dist/plugins/usage/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/usage/stores/postgres-store.js +146 -0
- package/dist/plugins/usage/stores/postgres-store.js.map +1 -0
- package/dist/plugins/usage/types.d.ts +195 -0
- package/dist/plugins/usage/types.d.ts.map +1 -0
- package/dist/plugins/usage/types.js +10 -0
- package/dist/plugins/usage/types.js.map +1 -0
- package/dist/plugins/usage/usage-plugin.d.ts +51 -0
- package/dist/plugins/usage/usage-plugin.d.ts.map +1 -0
- package/dist/plugins/usage/usage-plugin.js +412 -0
- package/dist/plugins/usage/usage-plugin.js.map +1 -0
- package/dist/plugins/users/__tests__/postgres-store.test.d.ts +10 -0
- package/dist/plugins/users/__tests__/postgres-store.test.d.ts.map +1 -0
- package/dist/plugins/users/__tests__/postgres-store.test.js +229 -0
- package/dist/plugins/users/__tests__/postgres-store.test.js.map +1 -0
- package/dist/plugins/users/__tests__/users-plugin.test.js +3 -0
- package/dist/plugins/users/__tests__/users-plugin.test.js.map +1 -1
- 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/stores/postgres-store.d.ts.map +1 -1
- package/dist/plugins/users/stores/postgres-store.js +76 -0
- package/dist/plugins/users/stores/postgres-store.js.map +1 -1
- package/dist/plugins/users/types.d.ts +74 -6
- package/dist/plugins/users/types.d.ts.map +1 -1
- package/dist/plugins/users/users-plugin.d.ts +15 -1
- package/dist/plugins/users/users-plugin.d.ts.map +1 -1
- package/dist/plugins/users/users-plugin.js +29 -0
- package/dist/plugins/users/users-plugin.js.map +1 -1
- package/dist-ui/assets/index-CynOqPkb.js +469 -0
- package/dist-ui/assets/index-CynOqPkb.js.map +1 -0
- package/dist-ui/index.html +1 -1
- package/dist-ui-lib/api/controlPanelApi.d.ts +46 -0
- package/dist-ui-lib/components/StatCard.d.ts +16 -0
- package/dist-ui-lib/dashboard/widgets/NotificationsStatsWidget.d.ts +12 -0
- package/dist-ui-lib/dashboard/widgets/index.d.ts +1 -0
- package/dist-ui-lib/index.js +1822 -1611
- package/dist-ui-lib/index.js.map +1 -1
- package/dist-ui-lib/pages/NotificationsPage.d.ts +9 -0
- package/dist-ui-lib/utils/formatters.d.ts +19 -0
- package/package.json +3 -2
- package/src/index.ts +178 -0
- package/src/plugins/bans/bans-plugin.ts +15 -3
- package/src/plugins/devices/__tests__/devices-plugin.test.ts +551 -0
- package/src/plugins/devices/__tests__/token-utils.test.ts +264 -0
- package/src/plugins/devices/adapters/compute-adapter.ts +139 -0
- package/src/plugins/devices/adapters/index.ts +13 -0
- package/src/plugins/devices/adapters/mobile-adapter.ts +179 -0
- package/src/plugins/devices/devices-plugin.ts +538 -0
- package/src/plugins/devices/index.ts +69 -0
- package/src/plugins/devices/stores/index.ts +9 -0
- package/src/plugins/devices/stores/postgres-store.ts +304 -0
- package/src/plugins/devices/token-utils.ts +213 -0
- package/src/plugins/devices/types.ts +351 -0
- package/src/plugins/index.ts +218 -0
- package/src/plugins/notifications/__tests__/notifications-manager.test.ts +637 -0
- package/src/plugins/notifications/index.ts +91 -0
- package/src/plugins/notifications/notifications-manager.ts +773 -0
- package/src/plugins/notifications/notifications-plugin.ts +398 -0
- package/src/plugins/notifications/types.ts +207 -0
- package/src/plugins/parental/__tests__/parental-plugin.test.ts +465 -0
- package/src/plugins/parental/adapters/index.ts +8 -0
- package/src/plugins/parental/adapters/kids-adapter.ts +206 -0
- package/src/plugins/parental/index.ts +55 -0
- package/src/plugins/parental/parental-plugin.ts +759 -0
- package/src/plugins/parental/stores/index.ts +7 -0
- package/src/plugins/parental/stores/postgres-store.ts +304 -0
- package/src/plugins/parental/types.ts +180 -0
- package/src/plugins/profiles/__tests__/profiles-plugin.test.ts +321 -0
- package/src/plugins/profiles/index.ts +49 -0
- package/src/plugins/profiles/profiles-plugin.ts +546 -0
- package/src/plugins/profiles/stores/index.ts +9 -0
- package/src/plugins/profiles/stores/postgres-store.ts +439 -0
- package/src/plugins/profiles/types.ts +338 -0
- package/src/plugins/subscriptions/__tests__/subscriptions-plugin.test.ts +404 -0
- package/src/plugins/subscriptions/index.ts +51 -0
- package/src/plugins/subscriptions/stores/index.ts +9 -0
- package/src/plugins/subscriptions/stores/postgres-store.ts +482 -0
- package/src/plugins/subscriptions/subscriptions-plugin.ts +530 -0
- package/src/plugins/subscriptions/types.ts +355 -0
- package/src/plugins/usage/__tests__/usage-plugin.test.ts +288 -0
- package/src/plugins/usage/index.ts +39 -0
- package/src/plugins/usage/stores/index.ts +9 -0
- package/src/plugins/usage/stores/postgres-store.ts +213 -0
- package/src/plugins/usage/types.ts +222 -0
- package/src/plugins/usage/usage-plugin.ts +484 -0
- package/src/plugins/users/__tests__/postgres-store.test.ts +326 -0
- package/src/plugins/users/__tests__/users-plugin.test.ts +3 -0
- package/src/plugins/users/index.ts +6 -0
- package/src/plugins/users/stores/postgres-store.ts +104 -0
- package/src/plugins/users/types.ts +82 -6
- package/src/plugins/users/users-plugin.ts +37 -0
- package/ui/src/App.tsx +5 -1
- package/ui/src/api/controlPanelApi.ts +103 -6
- package/ui/src/components/StatCard.tsx +58 -0
- package/ui/src/dashboard/builtInWidgets.tsx +3 -1
- package/ui/src/dashboard/widgets/NotificationsStatsWidget.tsx +167 -0
- package/ui/src/dashboard/widgets/index.ts +1 -0
- package/ui/src/pages/NotificationsPage.tsx +417 -0
- package/ui/src/utils/formatters.ts +33 -0
- package/dist-ui/assets/index-D7DoZ9rL.js +0 -478
- package/dist-ui/assets/index-D7DoZ9rL.js.map +0 -1
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Profile Store
|
|
3
|
+
*
|
|
4
|
+
* Profile storage implementation using PostgreSQL.
|
|
5
|
+
* Includes automatic age group calculation.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
// Default age thresholds
|
|
10
|
+
const DEFAULT_AGE_THRESHOLDS = {
|
|
11
|
+
child: 12,
|
|
12
|
+
teen: 17,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Calculate age group from birth date or age
|
|
16
|
+
*/
|
|
17
|
+
function calculateAgeGroup(birthDate, age, thresholds = DEFAULT_AGE_THRESHOLDS) {
|
|
18
|
+
let calculatedAge = null;
|
|
19
|
+
if (birthDate) {
|
|
20
|
+
const today = new Date();
|
|
21
|
+
const birth = new Date(birthDate);
|
|
22
|
+
calculatedAge = today.getFullYear() - birth.getFullYear();
|
|
23
|
+
const monthDiff = today.getMonth() - birth.getMonth();
|
|
24
|
+
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) {
|
|
25
|
+
calculatedAge--;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else if (age !== undefined && age !== null) {
|
|
29
|
+
calculatedAge = age;
|
|
30
|
+
}
|
|
31
|
+
if (calculatedAge === null) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
if (calculatedAge <= thresholds.child) {
|
|
35
|
+
return 'child';
|
|
36
|
+
}
|
|
37
|
+
else if (calculatedAge <= thresholds.teen) {
|
|
38
|
+
return 'teen';
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return 'adult';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create a PostgreSQL profile store
|
|
46
|
+
*
|
|
47
|
+
* @param config Configuration including a pg Pool instance
|
|
48
|
+
* @param ageThresholds Optional age thresholds for categorization
|
|
49
|
+
* @returns ProfileStore implementation
|
|
50
|
+
*/
|
|
51
|
+
export function postgresProfileStore(config, ageThresholds = DEFAULT_AGE_THRESHOLDS) {
|
|
52
|
+
const { pool: poolOrFn, tableName = 'profiles', schema = 'public', autoCreateTables = true, } = config;
|
|
53
|
+
// Helper to get pool (supports lazy initialization via function)
|
|
54
|
+
const getPool = () => {
|
|
55
|
+
const pool = typeof poolOrFn === 'function' ? poolOrFn() : poolOrFn;
|
|
56
|
+
return pool;
|
|
57
|
+
};
|
|
58
|
+
const profilesTableFull = `"${schema}"."${tableName}"`;
|
|
59
|
+
return {
|
|
60
|
+
name: 'postgres',
|
|
61
|
+
async initialize() {
|
|
62
|
+
if (!autoCreateTables)
|
|
63
|
+
return;
|
|
64
|
+
// Create profiles table
|
|
65
|
+
await getPool().query(`
|
|
66
|
+
CREATE TABLE IF NOT EXISTS ${profilesTableFull} (
|
|
67
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
68
|
+
org_id UUID,
|
|
69
|
+
user_id UUID NOT NULL,
|
|
70
|
+
name VARCHAR(100) NOT NULL,
|
|
71
|
+
avatar VARCHAR(255),
|
|
72
|
+
|
|
73
|
+
-- Age-based features
|
|
74
|
+
birth_date DATE,
|
|
75
|
+
age INTEGER,
|
|
76
|
+
age_group VARCHAR(20) CHECK (age_group IN ('child', 'teen', 'adult')),
|
|
77
|
+
|
|
78
|
+
-- Content/access control
|
|
79
|
+
content_filter_level VARCHAR(20) DEFAULT 'moderate'
|
|
80
|
+
CHECK (content_filter_level IN ('strict', 'moderate', 'minimal', 'none')),
|
|
81
|
+
|
|
82
|
+
-- Time restrictions
|
|
83
|
+
daily_time_limit_minutes INTEGER,
|
|
84
|
+
allowed_hours_start TIME,
|
|
85
|
+
allowed_hours_end TIME,
|
|
86
|
+
|
|
87
|
+
-- Status
|
|
88
|
+
is_active BOOLEAN DEFAULT true,
|
|
89
|
+
is_default BOOLEAN DEFAULT false,
|
|
90
|
+
|
|
91
|
+
-- Extensibility
|
|
92
|
+
metadata JSONB DEFAULT '{}',
|
|
93
|
+
|
|
94
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
95
|
+
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
96
|
+
deleted_at TIMESTAMPTZ
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
CREATE INDEX IF NOT EXISTS idx_${tableName}_org ON ${profilesTableFull}(org_id) WHERE deleted_at IS NULL;
|
|
100
|
+
CREATE INDEX IF NOT EXISTS idx_${tableName}_user ON ${profilesTableFull}(user_id) WHERE deleted_at IS NULL;
|
|
101
|
+
CREATE INDEX IF NOT EXISTS idx_${tableName}_age_group ON ${profilesTableFull}(age_group) WHERE age_group IS NOT NULL AND deleted_at IS NULL;
|
|
102
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_${tableName}_default ON ${profilesTableFull}(user_id) WHERE is_default = true AND deleted_at IS NULL;
|
|
103
|
+
`);
|
|
104
|
+
},
|
|
105
|
+
async getById(id) {
|
|
106
|
+
const result = await getPool().query(`SELECT * FROM ${profilesTableFull} WHERE id = $1 AND deleted_at IS NULL`, [id]);
|
|
107
|
+
return result.rows[0] || null;
|
|
108
|
+
},
|
|
109
|
+
async create(input) {
|
|
110
|
+
// Calculate age group
|
|
111
|
+
const ageGroup = calculateAgeGroup(input.birth_date, input.age, ageThresholds);
|
|
112
|
+
// If this is set as default, unset other defaults first
|
|
113
|
+
if (input.is_default) {
|
|
114
|
+
await getPool().query(`UPDATE ${profilesTableFull} SET is_default = false, updated_at = NOW()
|
|
115
|
+
WHERE user_id = $1 AND is_default = true AND deleted_at IS NULL`, [input.user_id]);
|
|
116
|
+
}
|
|
117
|
+
const result = await getPool().query(`INSERT INTO ${profilesTableFull}
|
|
118
|
+
(org_id, user_id, name, avatar, birth_date, age, age_group,
|
|
119
|
+
content_filter_level, daily_time_limit_minutes,
|
|
120
|
+
allowed_hours_start, allowed_hours_end, is_default, metadata)
|
|
121
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
|
|
122
|
+
RETURNING *`, [
|
|
123
|
+
input.org_id || null,
|
|
124
|
+
input.user_id,
|
|
125
|
+
input.name,
|
|
126
|
+
input.avatar || null,
|
|
127
|
+
input.birth_date || null,
|
|
128
|
+
input.age || null,
|
|
129
|
+
ageGroup,
|
|
130
|
+
input.content_filter_level || 'moderate',
|
|
131
|
+
input.daily_time_limit_minutes || null,
|
|
132
|
+
input.allowed_hours_start || null,
|
|
133
|
+
input.allowed_hours_end || null,
|
|
134
|
+
input.is_default || false,
|
|
135
|
+
JSON.stringify(input.metadata || {}),
|
|
136
|
+
]);
|
|
137
|
+
return result.rows[0];
|
|
138
|
+
},
|
|
139
|
+
async update(id, input) {
|
|
140
|
+
// First get the current profile to get user_id
|
|
141
|
+
const current = await this.getById(id);
|
|
142
|
+
if (!current) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
const updates = [];
|
|
146
|
+
const values = [];
|
|
147
|
+
let paramIndex = 1;
|
|
148
|
+
// Handle is_default first (needs to unset others)
|
|
149
|
+
if (input.is_default === true) {
|
|
150
|
+
await getPool().query(`UPDATE ${profilesTableFull} SET is_default = false, updated_at = NOW()
|
|
151
|
+
WHERE user_id = $1 AND id != $2 AND is_default = true AND deleted_at IS NULL`, [current.user_id, id]);
|
|
152
|
+
updates.push(`is_default = $${paramIndex++}`);
|
|
153
|
+
values.push(true);
|
|
154
|
+
}
|
|
155
|
+
else if (input.is_default === false) {
|
|
156
|
+
updates.push(`is_default = $${paramIndex++}`);
|
|
157
|
+
values.push(false);
|
|
158
|
+
}
|
|
159
|
+
if (input.name !== undefined) {
|
|
160
|
+
updates.push(`name = $${paramIndex++}`);
|
|
161
|
+
values.push(input.name);
|
|
162
|
+
}
|
|
163
|
+
if (input.avatar !== undefined) {
|
|
164
|
+
updates.push(`avatar = $${paramIndex++}`);
|
|
165
|
+
values.push(input.avatar);
|
|
166
|
+
}
|
|
167
|
+
// Handle birth_date (null means clear it)
|
|
168
|
+
if (input.birth_date !== undefined) {
|
|
169
|
+
updates.push(`birth_date = $${paramIndex++}`);
|
|
170
|
+
values.push(input.birth_date);
|
|
171
|
+
}
|
|
172
|
+
// Handle age (null means clear it)
|
|
173
|
+
if (input.age !== undefined) {
|
|
174
|
+
updates.push(`age = $${paramIndex++}`);
|
|
175
|
+
values.push(input.age);
|
|
176
|
+
}
|
|
177
|
+
// Recalculate age group if birth_date or age changed
|
|
178
|
+
if (input.birth_date !== undefined || input.age !== undefined) {
|
|
179
|
+
const newBirthDate = input.birth_date !== undefined ? input.birth_date : current.birth_date;
|
|
180
|
+
const newAge = input.age !== undefined ? input.age : current.age;
|
|
181
|
+
const ageGroup = calculateAgeGroup(newBirthDate, newAge, ageThresholds);
|
|
182
|
+
updates.push(`age_group = $${paramIndex++}`);
|
|
183
|
+
values.push(ageGroup);
|
|
184
|
+
}
|
|
185
|
+
if (input.content_filter_level !== undefined) {
|
|
186
|
+
updates.push(`content_filter_level = $${paramIndex++}`);
|
|
187
|
+
values.push(input.content_filter_level);
|
|
188
|
+
}
|
|
189
|
+
if (input.daily_time_limit_minutes !== undefined) {
|
|
190
|
+
updates.push(`daily_time_limit_minutes = $${paramIndex++}`);
|
|
191
|
+
values.push(input.daily_time_limit_minutes);
|
|
192
|
+
}
|
|
193
|
+
if (input.allowed_hours_start !== undefined) {
|
|
194
|
+
updates.push(`allowed_hours_start = $${paramIndex++}`);
|
|
195
|
+
values.push(input.allowed_hours_start);
|
|
196
|
+
}
|
|
197
|
+
if (input.allowed_hours_end !== undefined) {
|
|
198
|
+
updates.push(`allowed_hours_end = $${paramIndex++}`);
|
|
199
|
+
values.push(input.allowed_hours_end);
|
|
200
|
+
}
|
|
201
|
+
if (input.is_active !== undefined) {
|
|
202
|
+
updates.push(`is_active = $${paramIndex++}`);
|
|
203
|
+
values.push(input.is_active);
|
|
204
|
+
}
|
|
205
|
+
if (input.metadata !== undefined) {
|
|
206
|
+
updates.push(`metadata = $${paramIndex++}`);
|
|
207
|
+
values.push(JSON.stringify(input.metadata));
|
|
208
|
+
}
|
|
209
|
+
if (updates.length === 0) {
|
|
210
|
+
return current;
|
|
211
|
+
}
|
|
212
|
+
updates.push(`updated_at = NOW()`);
|
|
213
|
+
values.push(id);
|
|
214
|
+
const result = await getPool().query(`UPDATE ${profilesTableFull}
|
|
215
|
+
SET ${updates.join(', ')}
|
|
216
|
+
WHERE id = $${paramIndex} AND deleted_at IS NULL
|
|
217
|
+
RETURNING *`, values);
|
|
218
|
+
return result.rows[0] || null;
|
|
219
|
+
},
|
|
220
|
+
async delete(id) {
|
|
221
|
+
// Soft delete
|
|
222
|
+
const result = await getPool().query(`UPDATE ${profilesTableFull}
|
|
223
|
+
SET deleted_at = NOW(), is_active = false, is_default = false, updated_at = NOW()
|
|
224
|
+
WHERE id = $1 AND deleted_at IS NULL`, [id]);
|
|
225
|
+
return (result.rowCount ?? 0) > 0;
|
|
226
|
+
},
|
|
227
|
+
async search(params) {
|
|
228
|
+
const { org_id, user_id, age_group, is_active, query, page = 1, limit = 20, sortBy = 'created_at', sortOrder = 'desc', } = params;
|
|
229
|
+
const conditions = ['deleted_at IS NULL'];
|
|
230
|
+
const values = [];
|
|
231
|
+
let paramIndex = 1;
|
|
232
|
+
if (org_id) {
|
|
233
|
+
conditions.push(`org_id = $${paramIndex++}`);
|
|
234
|
+
values.push(org_id);
|
|
235
|
+
}
|
|
236
|
+
if (user_id) {
|
|
237
|
+
conditions.push(`user_id = $${paramIndex++}`);
|
|
238
|
+
values.push(user_id);
|
|
239
|
+
}
|
|
240
|
+
if (age_group) {
|
|
241
|
+
conditions.push(`age_group = $${paramIndex++}`);
|
|
242
|
+
values.push(age_group);
|
|
243
|
+
}
|
|
244
|
+
if (is_active !== undefined) {
|
|
245
|
+
conditions.push(`is_active = $${paramIndex++}`);
|
|
246
|
+
values.push(is_active);
|
|
247
|
+
}
|
|
248
|
+
if (query) {
|
|
249
|
+
conditions.push(`LOWER(name) LIKE $${paramIndex++}`);
|
|
250
|
+
values.push(`%${query.toLowerCase()}%`);
|
|
251
|
+
}
|
|
252
|
+
const whereClause = `WHERE ${conditions.join(' AND ')}`;
|
|
253
|
+
// Validate sort column to prevent SQL injection
|
|
254
|
+
const validSortColumns = ['name', 'created_at', 'age'];
|
|
255
|
+
const sortColumn = validSortColumns.includes(sortBy) ? sortBy : 'created_at';
|
|
256
|
+
const sortDir = sortOrder === 'asc' ? 'ASC' : 'DESC';
|
|
257
|
+
const offset = (page - 1) * limit;
|
|
258
|
+
// Get total count
|
|
259
|
+
const countResult = await getPool().query(`SELECT COUNT(*) FROM ${profilesTableFull} ${whereClause}`, values);
|
|
260
|
+
const total = parseInt(countResult.rows[0].count, 10);
|
|
261
|
+
// Get profiles
|
|
262
|
+
const result = await getPool().query(`SELECT * FROM ${profilesTableFull} ${whereClause}
|
|
263
|
+
ORDER BY ${sortColumn} ${sortDir}
|
|
264
|
+
LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`, [...values, limit, offset]);
|
|
265
|
+
return {
|
|
266
|
+
profiles: result.rows,
|
|
267
|
+
total,
|
|
268
|
+
page,
|
|
269
|
+
limit,
|
|
270
|
+
totalPages: Math.ceil(total / limit),
|
|
271
|
+
};
|
|
272
|
+
},
|
|
273
|
+
async listByUser(userId) {
|
|
274
|
+
const result = await getPool().query(`SELECT * FROM ${profilesTableFull}
|
|
275
|
+
WHERE user_id = $1 AND deleted_at IS NULL
|
|
276
|
+
ORDER BY is_default DESC, created_at ASC`, [userId]);
|
|
277
|
+
return result.rows;
|
|
278
|
+
},
|
|
279
|
+
async getDefaultProfile(userId) {
|
|
280
|
+
const result = await getPool().query(`SELECT * FROM ${profilesTableFull}
|
|
281
|
+
WHERE user_id = $1 AND is_default = true AND deleted_at IS NULL`, [userId]);
|
|
282
|
+
return result.rows[0] || null;
|
|
283
|
+
},
|
|
284
|
+
async getProfileCount(userId) {
|
|
285
|
+
const result = await getPool().query(`SELECT COUNT(*) FROM ${profilesTableFull}
|
|
286
|
+
WHERE user_id = $1 AND deleted_at IS NULL`, [userId]);
|
|
287
|
+
const row = result.rows[0];
|
|
288
|
+
return row ? parseInt(row.count, 10) : 0;
|
|
289
|
+
},
|
|
290
|
+
async getByAgeGroup(userId, ageGroup) {
|
|
291
|
+
const result = await getPool().query(`SELECT * FROM ${profilesTableFull}
|
|
292
|
+
WHERE user_id = $1 AND age_group = $2 AND deleted_at IS NULL
|
|
293
|
+
ORDER BY created_at ASC`, [userId, ageGroup]);
|
|
294
|
+
return result.rows;
|
|
295
|
+
},
|
|
296
|
+
async setDefaultProfile(profileId, userId) {
|
|
297
|
+
// Unset current default
|
|
298
|
+
await getPool().query(`UPDATE ${profilesTableFull} SET is_default = false, updated_at = NOW()
|
|
299
|
+
WHERE user_id = $1 AND is_default = true AND deleted_at IS NULL`, [userId]);
|
|
300
|
+
// Set new default
|
|
301
|
+
const result = await getPool().query(`UPDATE ${profilesTableFull} SET is_default = true, updated_at = NOW()
|
|
302
|
+
WHERE id = $1 AND user_id = $2 AND deleted_at IS NULL`, [profileId, userId]);
|
|
303
|
+
return (result.rowCount ?? 0) > 0;
|
|
304
|
+
},
|
|
305
|
+
async shutdown() {
|
|
306
|
+
// Pool is managed externally, nothing to do here
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=postgres-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-store.js","sourceRoot":"","sources":["../../../../src/plugins/profiles/stores/postgres-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profiles Plugin Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for generic multi-profile management with age support.
|
|
5
|
+
* Supports child profiles for QwickBot, player profiles for gaming, etc.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Content filter levels for age-appropriate content
|
|
11
|
+
*/
|
|
12
|
+
export type ContentFilterLevel = 'strict' | 'moderate' | 'minimal' | 'none';
|
|
13
|
+
/**
|
|
14
|
+
* Age groups for categorization
|
|
15
|
+
*/
|
|
16
|
+
export type AgeGroup = 'child' | 'teen' | 'adult';
|
|
17
|
+
/**
|
|
18
|
+
* Profile record in the database
|
|
19
|
+
*/
|
|
20
|
+
export interface Profile {
|
|
21
|
+
/** Primary key - UUID */
|
|
22
|
+
id: string;
|
|
23
|
+
/** Organization ID for multi-tenant isolation */
|
|
24
|
+
org_id?: string;
|
|
25
|
+
/** Owner/parent user ID */
|
|
26
|
+
user_id: string;
|
|
27
|
+
/** Profile name */
|
|
28
|
+
name: string;
|
|
29
|
+
/** Avatar identifier or URL */
|
|
30
|
+
avatar?: string;
|
|
31
|
+
/** Birth date for precise age calculation */
|
|
32
|
+
birth_date?: Date;
|
|
33
|
+
/** Static age (if birth_date not provided) */
|
|
34
|
+
age?: number;
|
|
35
|
+
/** Computed age group (child, teen, adult) */
|
|
36
|
+
age_group?: AgeGroup;
|
|
37
|
+
/** Content filter level */
|
|
38
|
+
content_filter_level: ContentFilterLevel;
|
|
39
|
+
/** Daily time limit in minutes (null = no limit) */
|
|
40
|
+
daily_time_limit_minutes?: number;
|
|
41
|
+
/** Allowed hours start (null = no restriction) */
|
|
42
|
+
allowed_hours_start?: string;
|
|
43
|
+
/** Allowed hours end (null = no restriction) */
|
|
44
|
+
allowed_hours_end?: string;
|
|
45
|
+
/** Whether profile is active */
|
|
46
|
+
is_active: boolean;
|
|
47
|
+
/** Whether this is the default profile for the user */
|
|
48
|
+
is_default: boolean;
|
|
49
|
+
/** App-specific metadata */
|
|
50
|
+
metadata: Record<string, unknown>;
|
|
51
|
+
/** When the profile was created */
|
|
52
|
+
created_at: Date;
|
|
53
|
+
/** When the profile was last updated */
|
|
54
|
+
updated_at: Date;
|
|
55
|
+
/** Soft delete timestamp */
|
|
56
|
+
deleted_at?: Date;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Profile creation payload
|
|
60
|
+
*/
|
|
61
|
+
export interface CreateProfileInput {
|
|
62
|
+
/** Organization ID */
|
|
63
|
+
org_id?: string;
|
|
64
|
+
/** Owner user ID */
|
|
65
|
+
user_id: string;
|
|
66
|
+
/** Profile name */
|
|
67
|
+
name: string;
|
|
68
|
+
/** Avatar identifier or URL */
|
|
69
|
+
avatar?: string;
|
|
70
|
+
/** Birth date for age calculation */
|
|
71
|
+
birth_date?: Date;
|
|
72
|
+
/** Static age (if birth_date not provided) */
|
|
73
|
+
age?: number;
|
|
74
|
+
/** Content filter level (default: 'moderate') */
|
|
75
|
+
content_filter_level?: ContentFilterLevel;
|
|
76
|
+
/** Daily time limit in minutes */
|
|
77
|
+
daily_time_limit_minutes?: number;
|
|
78
|
+
/** Allowed hours start (HH:MM format) */
|
|
79
|
+
allowed_hours_start?: string;
|
|
80
|
+
/** Allowed hours end (HH:MM format) */
|
|
81
|
+
allowed_hours_end?: string;
|
|
82
|
+
/** Whether this is the default profile */
|
|
83
|
+
is_default?: boolean;
|
|
84
|
+
/** App-specific metadata */
|
|
85
|
+
metadata?: Record<string, unknown>;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Profile update payload
|
|
89
|
+
*/
|
|
90
|
+
export interface UpdateProfileInput {
|
|
91
|
+
/** Profile name */
|
|
92
|
+
name?: string;
|
|
93
|
+
/** Avatar identifier or URL */
|
|
94
|
+
avatar?: string;
|
|
95
|
+
/** Birth date for age calculation */
|
|
96
|
+
birth_date?: Date | null;
|
|
97
|
+
/** Static age */
|
|
98
|
+
age?: number | null;
|
|
99
|
+
/** Content filter level */
|
|
100
|
+
content_filter_level?: ContentFilterLevel;
|
|
101
|
+
/** Daily time limit in minutes (null to remove) */
|
|
102
|
+
daily_time_limit_minutes?: number | null;
|
|
103
|
+
/** Allowed hours start (null to remove) */
|
|
104
|
+
allowed_hours_start?: string | null;
|
|
105
|
+
/** Allowed hours end (null to remove) */
|
|
106
|
+
allowed_hours_end?: string | null;
|
|
107
|
+
/** Whether profile is active */
|
|
108
|
+
is_active?: boolean;
|
|
109
|
+
/** Whether this is the default profile */
|
|
110
|
+
is_default?: boolean;
|
|
111
|
+
/** App-specific metadata */
|
|
112
|
+
metadata?: Record<string, unknown>;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Profile search parameters
|
|
116
|
+
*/
|
|
117
|
+
export interface ProfileSearchParams {
|
|
118
|
+
/** Organization ID filter */
|
|
119
|
+
org_id?: string;
|
|
120
|
+
/** User ID filter */
|
|
121
|
+
user_id?: string;
|
|
122
|
+
/** Age group filter */
|
|
123
|
+
age_group?: AgeGroup;
|
|
124
|
+
/** Active status filter */
|
|
125
|
+
is_active?: boolean;
|
|
126
|
+
/** Search query (searches name) */
|
|
127
|
+
query?: string;
|
|
128
|
+
/** Page number (1-indexed) */
|
|
129
|
+
page?: number;
|
|
130
|
+
/** Items per page */
|
|
131
|
+
limit?: number;
|
|
132
|
+
/** Sort field */
|
|
133
|
+
sortBy?: 'name' | 'created_at' | 'age';
|
|
134
|
+
/** Sort direction */
|
|
135
|
+
sortOrder?: 'asc' | 'desc';
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Paginated profile list response
|
|
139
|
+
*/
|
|
140
|
+
export interface ProfileListResponse {
|
|
141
|
+
profiles: Profile[];
|
|
142
|
+
total: number;
|
|
143
|
+
page: number;
|
|
144
|
+
limit: number;
|
|
145
|
+
totalPages: number;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Time restriction check result
|
|
149
|
+
*/
|
|
150
|
+
export interface TimeRestrictionResult {
|
|
151
|
+
/** Whether access is allowed right now */
|
|
152
|
+
allowed: boolean;
|
|
153
|
+
/** Reason if not allowed */
|
|
154
|
+
reason?: string;
|
|
155
|
+
/** Minutes remaining today (if has limit) */
|
|
156
|
+
minutes_remaining?: number;
|
|
157
|
+
/** When restriction ends (if currently restricted) */
|
|
158
|
+
available_at?: Date;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Profile store interface - all storage backends must implement this
|
|
162
|
+
*/
|
|
163
|
+
export interface ProfileStore {
|
|
164
|
+
/** Store name (e.g., 'postgres', 'memory') */
|
|
165
|
+
name: string;
|
|
166
|
+
/**
|
|
167
|
+
* Initialize the store (create tables, etc.)
|
|
168
|
+
*/
|
|
169
|
+
initialize(): Promise<void>;
|
|
170
|
+
/**
|
|
171
|
+
* Get a profile by ID
|
|
172
|
+
*/
|
|
173
|
+
getById(id: string): Promise<Profile | null>;
|
|
174
|
+
/**
|
|
175
|
+
* Create a new profile
|
|
176
|
+
*/
|
|
177
|
+
create(input: CreateProfileInput): Promise<Profile>;
|
|
178
|
+
/**
|
|
179
|
+
* Update an existing profile
|
|
180
|
+
*/
|
|
181
|
+
update(id: string, input: UpdateProfileInput): Promise<Profile | null>;
|
|
182
|
+
/**
|
|
183
|
+
* Soft delete a profile
|
|
184
|
+
*/
|
|
185
|
+
delete(id: string): Promise<boolean>;
|
|
186
|
+
/**
|
|
187
|
+
* Search/list profiles
|
|
188
|
+
*/
|
|
189
|
+
search(params: ProfileSearchParams): Promise<ProfileListResponse>;
|
|
190
|
+
/**
|
|
191
|
+
* List profiles for a user
|
|
192
|
+
*/
|
|
193
|
+
listByUser(userId: string): Promise<Profile[]>;
|
|
194
|
+
/**
|
|
195
|
+
* Get the default profile for a user
|
|
196
|
+
*/
|
|
197
|
+
getDefaultProfile(userId: string): Promise<Profile | null>;
|
|
198
|
+
/**
|
|
199
|
+
* Count profiles for a user
|
|
200
|
+
*/
|
|
201
|
+
getProfileCount(userId: string): Promise<number>;
|
|
202
|
+
/**
|
|
203
|
+
* Get profiles by age group
|
|
204
|
+
*/
|
|
205
|
+
getByAgeGroup(userId: string, ageGroup: AgeGroup): Promise<Profile[]>;
|
|
206
|
+
/**
|
|
207
|
+
* Set a profile as default (unsets others)
|
|
208
|
+
*/
|
|
209
|
+
setDefaultProfile(profileId: string, userId: string): Promise<boolean>;
|
|
210
|
+
/**
|
|
211
|
+
* Shutdown the store
|
|
212
|
+
*/
|
|
213
|
+
shutdown(): Promise<void>;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* PostgreSQL profile store configuration
|
|
217
|
+
*/
|
|
218
|
+
export interface PostgresProfileStoreConfig {
|
|
219
|
+
/** PostgreSQL pool instance or a function that returns one (for lazy initialization) */
|
|
220
|
+
pool: unknown | (() => unknown);
|
|
221
|
+
/** Profiles table name (default: 'profiles') */
|
|
222
|
+
tableName?: string;
|
|
223
|
+
/** Schema name (default: 'public') */
|
|
224
|
+
schema?: string;
|
|
225
|
+
/** Auto-create tables on init (default: true) */
|
|
226
|
+
autoCreateTables?: boolean;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Age thresholds for categorization
|
|
230
|
+
*/
|
|
231
|
+
export interface AgeThresholds {
|
|
232
|
+
/** Maximum age for 'child' (default: 12) */
|
|
233
|
+
child: number;
|
|
234
|
+
/** Maximum age for 'teen' (default: 17) */
|
|
235
|
+
teen: number;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* API configuration
|
|
239
|
+
*/
|
|
240
|
+
export interface ProfilesApiConfig {
|
|
241
|
+
/** API route prefix (default: '/profiles') */
|
|
242
|
+
prefix?: string;
|
|
243
|
+
/** Enable CRUD endpoints */
|
|
244
|
+
crud?: boolean;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Profiles plugin configuration
|
|
248
|
+
*/
|
|
249
|
+
export interface ProfilesPluginConfig {
|
|
250
|
+
/** Profile storage backend */
|
|
251
|
+
store: ProfileStore;
|
|
252
|
+
/** Maximum profiles per user (default: 10) */
|
|
253
|
+
maxProfilesPerUser?: number;
|
|
254
|
+
/** Default content filter level (default: 'moderate') */
|
|
255
|
+
defaultFilterLevel?: ContentFilterLevel;
|
|
256
|
+
/** Age thresholds for categorization */
|
|
257
|
+
ageThresholds?: AgeThresholds;
|
|
258
|
+
/** API configuration */
|
|
259
|
+
api?: ProfilesApiConfig;
|
|
260
|
+
/** Enable debug logging */
|
|
261
|
+
debug?: boolean;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* QwickBot profile metadata (stored in metadata field)
|
|
265
|
+
*/
|
|
266
|
+
export interface QwickBotProfileMetadata {
|
|
267
|
+
/** Voice ID for text-to-speech */
|
|
268
|
+
voice_id?: string;
|
|
269
|
+
/** Avatar style identifier */
|
|
270
|
+
avatar_style?: string;
|
|
271
|
+
/** Personality prompt for AI */
|
|
272
|
+
personality_prompt?: string;
|
|
273
|
+
/** User's interests */
|
|
274
|
+
interests?: string[];
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Gaming profile metadata (stored in metadata field)
|
|
278
|
+
*/
|
|
279
|
+
export interface GamingProfileMetadata {
|
|
280
|
+
/** Gamer tag */
|
|
281
|
+
gamer_tag?: string;
|
|
282
|
+
/** Avatar URL */
|
|
283
|
+
avatar_url?: string;
|
|
284
|
+
/** Allowed game ratings (E, E10+, T, M) */
|
|
285
|
+
allowed_ratings?: string[];
|
|
286
|
+
/** Preferred genres */
|
|
287
|
+
preferred_genres?: string[];
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugins/profiles/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profiles Plugin Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for generic multi-profile management with age support.
|
|
5
|
+
* Supports child profiles for QwickBot, player profiles for gaming, etc.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/plugins/profiles/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscriptions Plugin Tests
|
|
3
|
+
*
|
|
4
|
+
* Unit tests for the subscriptions plugin including:
|
|
5
|
+
* - Plugin lifecycle
|
|
6
|
+
* - Tier management
|
|
7
|
+
* - Entitlement checks
|
|
8
|
+
* - User subscription management
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=subscriptions-plugin.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions-plugin.test.d.ts","sourceRoot":"","sources":["../../../../src/plugins/subscriptions/__tests__/subscriptions-plugin.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|