@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.
Files changed (273) hide show
  1. package/CHANGELOG.md +507 -0
  2. package/README.md +9 -0
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +12 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/plugins/bans/bans-plugin.d.ts.map +1 -1
  8. package/dist/plugins/bans/bans-plugin.js +12 -3
  9. package/dist/plugins/bans/bans-plugin.js.map +1 -1
  10. package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts +11 -0
  11. package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts.map +1 -0
  12. package/dist/plugins/devices/__tests__/devices-plugin.test.js +410 -0
  13. package/dist/plugins/devices/__tests__/devices-plugin.test.js.map +1 -0
  14. package/dist/plugins/devices/__tests__/token-utils.test.d.ts +7 -0
  15. package/dist/plugins/devices/__tests__/token-utils.test.d.ts.map +1 -0
  16. package/dist/plugins/devices/__tests__/token-utils.test.js +197 -0
  17. package/dist/plugins/devices/__tests__/token-utils.test.js.map +1 -0
  18. package/dist/plugins/devices/adapters/compute-adapter.d.ts +36 -0
  19. package/dist/plugins/devices/adapters/compute-adapter.d.ts.map +1 -0
  20. package/dist/plugins/devices/adapters/compute-adapter.js +100 -0
  21. package/dist/plugins/devices/adapters/compute-adapter.js.map +1 -0
  22. package/dist/plugins/devices/adapters/index.d.ts +12 -0
  23. package/dist/plugins/devices/adapters/index.d.ts.map +1 -0
  24. package/dist/plugins/devices/adapters/index.js +10 -0
  25. package/dist/plugins/devices/adapters/index.js.map +1 -0
  26. package/dist/plugins/devices/adapters/mobile-adapter.d.ts +41 -0
  27. package/dist/plugins/devices/adapters/mobile-adapter.d.ts.map +1 -0
  28. package/dist/plugins/devices/adapters/mobile-adapter.js +131 -0
  29. package/dist/plugins/devices/adapters/mobile-adapter.js.map +1 -0
  30. package/dist/plugins/devices/devices-plugin.d.ts +70 -0
  31. package/dist/plugins/devices/devices-plugin.d.ts.map +1 -0
  32. package/dist/plugins/devices/devices-plugin.js +453 -0
  33. package/dist/plugins/devices/devices-plugin.js.map +1 -0
  34. package/dist/plugins/devices/index.d.ts +18 -0
  35. package/dist/plugins/devices/index.d.ts.map +1 -0
  36. package/dist/plugins/devices/index.js +18 -0
  37. package/dist/plugins/devices/index.js.map +1 -0
  38. package/dist/plugins/devices/stores/index.d.ts +9 -0
  39. package/dist/plugins/devices/stores/index.d.ts.map +1 -0
  40. package/dist/plugins/devices/stores/index.js +9 -0
  41. package/dist/plugins/devices/stores/index.js.map +1 -0
  42. package/dist/plugins/devices/stores/postgres-store.d.ts +26 -0
  43. package/dist/plugins/devices/stores/postgres-store.d.ts.map +1 -0
  44. package/dist/plugins/devices/stores/postgres-store.js +199 -0
  45. package/dist/plugins/devices/stores/postgres-store.js.map +1 -0
  46. package/dist/plugins/devices/token-utils.d.ts +100 -0
  47. package/dist/plugins/devices/token-utils.d.ts.map +1 -0
  48. package/dist/plugins/devices/token-utils.js +162 -0
  49. package/dist/plugins/devices/token-utils.js.map +1 -0
  50. package/dist/plugins/devices/types.d.ts +307 -0
  51. package/dist/plugins/devices/types.d.ts.map +1 -0
  52. package/dist/plugins/devices/types.js +10 -0
  53. package/dist/plugins/devices/types.js.map +1 -0
  54. package/dist/plugins/index.d.ts +14 -2
  55. package/dist/plugins/index.d.ts.map +1 -1
  56. package/dist/plugins/index.js +13 -1
  57. package/dist/plugins/index.js.map +1 -1
  58. package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts +5 -0
  59. package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts.map +1 -0
  60. package/dist/plugins/notifications/__tests__/notifications-manager.test.js +470 -0
  61. package/dist/plugins/notifications/__tests__/notifications-manager.test.js.map +1 -0
  62. package/dist/plugins/notifications/index.d.ts +71 -0
  63. package/dist/plugins/notifications/index.d.ts.map +1 -0
  64. package/dist/plugins/notifications/index.js +72 -0
  65. package/dist/plugins/notifications/index.js.map +1 -0
  66. package/dist/plugins/notifications/notifications-manager.d.ts +182 -0
  67. package/dist/plugins/notifications/notifications-manager.d.ts.map +1 -0
  68. package/dist/plugins/notifications/notifications-manager.js +610 -0
  69. package/dist/plugins/notifications/notifications-manager.js.map +1 -0
  70. package/dist/plugins/notifications/notifications-plugin.d.ts +83 -0
  71. package/dist/plugins/notifications/notifications-plugin.d.ts.map +1 -0
  72. package/dist/plugins/notifications/notifications-plugin.js +337 -0
  73. package/dist/plugins/notifications/notifications-plugin.js.map +1 -0
  74. package/dist/plugins/notifications/types.d.ts +164 -0
  75. package/dist/plugins/notifications/types.d.ts.map +1 -0
  76. package/dist/plugins/notifications/types.js +9 -0
  77. package/dist/plugins/notifications/types.js.map +1 -0
  78. package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts +12 -0
  79. package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts.map +1 -0
  80. package/dist/plugins/parental/__tests__/parental-plugin.test.js +349 -0
  81. package/dist/plugins/parental/__tests__/parental-plugin.test.js.map +1 -0
  82. package/dist/plugins/parental/adapters/index.d.ts +8 -0
  83. package/dist/plugins/parental/adapters/index.d.ts.map +1 -0
  84. package/dist/plugins/parental/adapters/index.js +7 -0
  85. package/dist/plugins/parental/adapters/index.js.map +1 -0
  86. package/dist/plugins/parental/adapters/kids-adapter.d.ts +24 -0
  87. package/dist/plugins/parental/adapters/kids-adapter.d.ts.map +1 -0
  88. package/dist/plugins/parental/adapters/kids-adapter.js +174 -0
  89. package/dist/plugins/parental/adapters/kids-adapter.js.map +1 -0
  90. package/dist/plugins/parental/index.d.ts +14 -0
  91. package/dist/plugins/parental/index.d.ts.map +1 -0
  92. package/dist/plugins/parental/index.js +15 -0
  93. package/dist/plugins/parental/index.js.map +1 -0
  94. package/dist/plugins/parental/parental-plugin.d.ts +88 -0
  95. package/dist/plugins/parental/parental-plugin.d.ts.map +1 -0
  96. package/dist/plugins/parental/parental-plugin.js +666 -0
  97. package/dist/plugins/parental/parental-plugin.js.map +1 -0
  98. package/dist/plugins/parental/stores/index.d.ts +7 -0
  99. package/dist/plugins/parental/stores/index.d.ts.map +1 -0
  100. package/dist/plugins/parental/stores/index.js +7 -0
  101. package/dist/plugins/parental/stores/index.js.map +1 -0
  102. package/dist/plugins/parental/stores/postgres-store.d.ts +10 -0
  103. package/dist/plugins/parental/stores/postgres-store.d.ts.map +1 -0
  104. package/dist/plugins/parental/stores/postgres-store.js +209 -0
  105. package/dist/plugins/parental/stores/postgres-store.js.map +1 -0
  106. package/dist/plugins/parental/types.d.ts +154 -0
  107. package/dist/plugins/parental/types.d.ts.map +1 -0
  108. package/dist/plugins/parental/types.js +10 -0
  109. package/dist/plugins/parental/types.js.map +1 -0
  110. package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts +11 -0
  111. package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts.map +1 -0
  112. package/dist/plugins/profiles/__tests__/profiles-plugin.test.js +243 -0
  113. package/dist/plugins/profiles/__tests__/profiles-plugin.test.js.map +1 -0
  114. package/dist/plugins/profiles/index.d.ts +12 -0
  115. package/dist/plugins/profiles/index.d.ts.map +1 -0
  116. package/dist/plugins/profiles/index.js +13 -0
  117. package/dist/plugins/profiles/index.js.map +1 -0
  118. package/dist/plugins/profiles/profiles-plugin.d.ts +71 -0
  119. package/dist/plugins/profiles/profiles-plugin.d.ts.map +1 -0
  120. package/dist/plugins/profiles/profiles-plugin.js +481 -0
  121. package/dist/plugins/profiles/profiles-plugin.js.map +1 -0
  122. package/dist/plugins/profiles/stores/index.d.ts +9 -0
  123. package/dist/plugins/profiles/stores/index.d.ts.map +1 -0
  124. package/dist/plugins/profiles/stores/index.js +9 -0
  125. package/dist/plugins/profiles/stores/index.js.map +1 -0
  126. package/dist/plugins/profiles/stores/postgres-store.d.ts +18 -0
  127. package/dist/plugins/profiles/stores/postgres-store.d.ts.map +1 -0
  128. package/dist/plugins/profiles/stores/postgres-store.js +310 -0
  129. package/dist/plugins/profiles/stores/postgres-store.js.map +1 -0
  130. package/dist/plugins/profiles/types.d.ts +289 -0
  131. package/dist/plugins/profiles/types.d.ts.map +1 -0
  132. package/dist/plugins/profiles/types.js +10 -0
  133. package/dist/plugins/profiles/types.js.map +1 -0
  134. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts +11 -0
  135. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts.map +1 -0
  136. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js +305 -0
  137. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js.map +1 -0
  138. package/dist/plugins/subscriptions/index.d.ts +12 -0
  139. package/dist/plugins/subscriptions/index.d.ts.map +1 -0
  140. package/dist/plugins/subscriptions/index.js +13 -0
  141. package/dist/plugins/subscriptions/index.js.map +1 -0
  142. package/dist/plugins/subscriptions/stores/index.d.ts +9 -0
  143. package/dist/plugins/subscriptions/stores/index.d.ts.map +1 -0
  144. package/dist/plugins/subscriptions/stores/index.js +9 -0
  145. package/dist/plugins/subscriptions/stores/index.js.map +1 -0
  146. package/dist/plugins/subscriptions/stores/postgres-store.d.ts +14 -0
  147. package/dist/plugins/subscriptions/stores/postgres-store.d.ts.map +1 -0
  148. package/dist/plugins/subscriptions/stores/postgres-store.js +359 -0
  149. package/dist/plugins/subscriptions/stores/postgres-store.js.map +1 -0
  150. package/dist/plugins/subscriptions/subscriptions-plugin.d.ts +82 -0
  151. package/dist/plugins/subscriptions/subscriptions-plugin.d.ts.map +1 -0
  152. package/dist/plugins/subscriptions/subscriptions-plugin.js +449 -0
  153. package/dist/plugins/subscriptions/subscriptions-plugin.js.map +1 -0
  154. package/dist/plugins/subscriptions/types.d.ts +308 -0
  155. package/dist/plugins/subscriptions/types.d.ts.map +1 -0
  156. package/dist/plugins/subscriptions/types.js +10 -0
  157. package/dist/plugins/subscriptions/types.js.map +1 -0
  158. package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts +11 -0
  159. package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts.map +1 -0
  160. package/dist/plugins/usage/__tests__/usage-plugin.test.js +218 -0
  161. package/dist/plugins/usage/__tests__/usage-plugin.test.js.map +1 -0
  162. package/dist/plugins/usage/index.d.ts +12 -0
  163. package/dist/plugins/usage/index.d.ts.map +1 -0
  164. package/dist/plugins/usage/index.js +13 -0
  165. package/dist/plugins/usage/index.js.map +1 -0
  166. package/dist/plugins/usage/stores/index.d.ts +9 -0
  167. package/dist/plugins/usage/stores/index.d.ts.map +1 -0
  168. package/dist/plugins/usage/stores/index.js +9 -0
  169. package/dist/plugins/usage/stores/index.js.map +1 -0
  170. package/dist/plugins/usage/stores/postgres-store.d.ts +14 -0
  171. package/dist/plugins/usage/stores/postgres-store.d.ts.map +1 -0
  172. package/dist/plugins/usage/stores/postgres-store.js +146 -0
  173. package/dist/plugins/usage/stores/postgres-store.js.map +1 -0
  174. package/dist/plugins/usage/types.d.ts +195 -0
  175. package/dist/plugins/usage/types.d.ts.map +1 -0
  176. package/dist/plugins/usage/types.js +10 -0
  177. package/dist/plugins/usage/types.js.map +1 -0
  178. package/dist/plugins/usage/usage-plugin.d.ts +51 -0
  179. package/dist/plugins/usage/usage-plugin.d.ts.map +1 -0
  180. package/dist/plugins/usage/usage-plugin.js +412 -0
  181. package/dist/plugins/usage/usage-plugin.js.map +1 -0
  182. package/dist/plugins/users/__tests__/postgres-store.test.d.ts +10 -0
  183. package/dist/plugins/users/__tests__/postgres-store.test.d.ts.map +1 -0
  184. package/dist/plugins/users/__tests__/postgres-store.test.js +229 -0
  185. package/dist/plugins/users/__tests__/postgres-store.test.js.map +1 -0
  186. package/dist/plugins/users/__tests__/users-plugin.test.js +3 -0
  187. package/dist/plugins/users/__tests__/users-plugin.test.js.map +1 -1
  188. package/dist/plugins/users/index.d.ts +2 -2
  189. package/dist/plugins/users/index.d.ts.map +1 -1
  190. package/dist/plugins/users/index.js +1 -1
  191. package/dist/plugins/users/index.js.map +1 -1
  192. package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -1
  193. package/dist/plugins/users/stores/postgres-store.js +76 -0
  194. package/dist/plugins/users/stores/postgres-store.js.map +1 -1
  195. package/dist/plugins/users/types.d.ts +74 -6
  196. package/dist/plugins/users/types.d.ts.map +1 -1
  197. package/dist/plugins/users/users-plugin.d.ts +15 -1
  198. package/dist/plugins/users/users-plugin.d.ts.map +1 -1
  199. package/dist/plugins/users/users-plugin.js +29 -0
  200. package/dist/plugins/users/users-plugin.js.map +1 -1
  201. package/dist-ui/assets/index-CynOqPkb.js +469 -0
  202. package/dist-ui/assets/index-CynOqPkb.js.map +1 -0
  203. package/dist-ui/index.html +1 -1
  204. package/dist-ui-lib/api/controlPanelApi.d.ts +46 -0
  205. package/dist-ui-lib/components/StatCard.d.ts +16 -0
  206. package/dist-ui-lib/dashboard/widgets/NotificationsStatsWidget.d.ts +12 -0
  207. package/dist-ui-lib/dashboard/widgets/index.d.ts +1 -0
  208. package/dist-ui-lib/index.js +1822 -1611
  209. package/dist-ui-lib/index.js.map +1 -1
  210. package/dist-ui-lib/pages/NotificationsPage.d.ts +9 -0
  211. package/dist-ui-lib/utils/formatters.d.ts +19 -0
  212. package/package.json +3 -2
  213. package/src/index.ts +178 -0
  214. package/src/plugins/bans/bans-plugin.ts +15 -3
  215. package/src/plugins/devices/__tests__/devices-plugin.test.ts +551 -0
  216. package/src/plugins/devices/__tests__/token-utils.test.ts +264 -0
  217. package/src/plugins/devices/adapters/compute-adapter.ts +139 -0
  218. package/src/plugins/devices/adapters/index.ts +13 -0
  219. package/src/plugins/devices/adapters/mobile-adapter.ts +179 -0
  220. package/src/plugins/devices/devices-plugin.ts +538 -0
  221. package/src/plugins/devices/index.ts +69 -0
  222. package/src/plugins/devices/stores/index.ts +9 -0
  223. package/src/plugins/devices/stores/postgres-store.ts +304 -0
  224. package/src/plugins/devices/token-utils.ts +213 -0
  225. package/src/plugins/devices/types.ts +351 -0
  226. package/src/plugins/index.ts +218 -0
  227. package/src/plugins/notifications/__tests__/notifications-manager.test.ts +637 -0
  228. package/src/plugins/notifications/index.ts +91 -0
  229. package/src/plugins/notifications/notifications-manager.ts +773 -0
  230. package/src/plugins/notifications/notifications-plugin.ts +398 -0
  231. package/src/plugins/notifications/types.ts +207 -0
  232. package/src/plugins/parental/__tests__/parental-plugin.test.ts +465 -0
  233. package/src/plugins/parental/adapters/index.ts +8 -0
  234. package/src/plugins/parental/adapters/kids-adapter.ts +206 -0
  235. package/src/plugins/parental/index.ts +55 -0
  236. package/src/plugins/parental/parental-plugin.ts +759 -0
  237. package/src/plugins/parental/stores/index.ts +7 -0
  238. package/src/plugins/parental/stores/postgres-store.ts +304 -0
  239. package/src/plugins/parental/types.ts +180 -0
  240. package/src/plugins/profiles/__tests__/profiles-plugin.test.ts +321 -0
  241. package/src/plugins/profiles/index.ts +49 -0
  242. package/src/plugins/profiles/profiles-plugin.ts +546 -0
  243. package/src/plugins/profiles/stores/index.ts +9 -0
  244. package/src/plugins/profiles/stores/postgres-store.ts +439 -0
  245. package/src/plugins/profiles/types.ts +338 -0
  246. package/src/plugins/subscriptions/__tests__/subscriptions-plugin.test.ts +404 -0
  247. package/src/plugins/subscriptions/index.ts +51 -0
  248. package/src/plugins/subscriptions/stores/index.ts +9 -0
  249. package/src/plugins/subscriptions/stores/postgres-store.ts +482 -0
  250. package/src/plugins/subscriptions/subscriptions-plugin.ts +530 -0
  251. package/src/plugins/subscriptions/types.ts +355 -0
  252. package/src/plugins/usage/__tests__/usage-plugin.test.ts +288 -0
  253. package/src/plugins/usage/index.ts +39 -0
  254. package/src/plugins/usage/stores/index.ts +9 -0
  255. package/src/plugins/usage/stores/postgres-store.ts +213 -0
  256. package/src/plugins/usage/types.ts +222 -0
  257. package/src/plugins/usage/usage-plugin.ts +484 -0
  258. package/src/plugins/users/__tests__/postgres-store.test.ts +326 -0
  259. package/src/plugins/users/__tests__/users-plugin.test.ts +3 -0
  260. package/src/plugins/users/index.ts +6 -0
  261. package/src/plugins/users/stores/postgres-store.ts +104 -0
  262. package/src/plugins/users/types.ts +82 -6
  263. package/src/plugins/users/users-plugin.ts +37 -0
  264. package/ui/src/App.tsx +5 -1
  265. package/ui/src/api/controlPanelApi.ts +103 -6
  266. package/ui/src/components/StatCard.tsx +58 -0
  267. package/ui/src/dashboard/builtInWidgets.tsx +3 -1
  268. package/ui/src/dashboard/widgets/NotificationsStatsWidget.tsx +167 -0
  269. package/ui/src/dashboard/widgets/index.ts +1 -0
  270. package/ui/src/pages/NotificationsPage.tsx +417 -0
  271. package/ui/src/utils/formatters.ts +33 -0
  272. package/dist-ui/assets/index-D7DoZ9rL.js +0 -478
  273. 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"}