@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,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devices Plugin Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for device management with adapter support.
|
|
5
|
+
* Supports different device types through adapters (compute, mobile, IoT).
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Core device record in the database
|
|
12
|
+
*/
|
|
13
|
+
export interface Device {
|
|
14
|
+
/** Primary key - UUID */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Organization ID for multi-tenant isolation */
|
|
17
|
+
org_id?: string;
|
|
18
|
+
/** Owner user ID */
|
|
19
|
+
user_id?: string;
|
|
20
|
+
/** Adapter type that created this device */
|
|
21
|
+
adapter_type: string;
|
|
22
|
+
/** Device name */
|
|
23
|
+
name: string;
|
|
24
|
+
/** First 8 characters of token for identification */
|
|
25
|
+
token_prefix?: string;
|
|
26
|
+
/** Token expiration time */
|
|
27
|
+
token_expires_at: Date;
|
|
28
|
+
/** Last time device was seen */
|
|
29
|
+
last_seen_at?: Date;
|
|
30
|
+
/** Last known IP address */
|
|
31
|
+
last_ip?: string;
|
|
32
|
+
/** Whether device is active */
|
|
33
|
+
is_active: boolean;
|
|
34
|
+
/** Adapter-specific metadata */
|
|
35
|
+
metadata: Record<string, unknown>;
|
|
36
|
+
/** When the device was created */
|
|
37
|
+
created_at: Date;
|
|
38
|
+
/** When the device was last updated */
|
|
39
|
+
updated_at: Date;
|
|
40
|
+
/** Soft delete timestamp */
|
|
41
|
+
deleted_at?: Date;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Device with token (returned only on create)
|
|
46
|
+
*/
|
|
47
|
+
export interface DeviceWithToken extends Device {
|
|
48
|
+
/** Raw token (only returned on create, never stored) */
|
|
49
|
+
token: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Device creation payload (adapter-agnostic)
|
|
54
|
+
*/
|
|
55
|
+
export interface CreateDeviceInput {
|
|
56
|
+
/** Organization ID */
|
|
57
|
+
org_id?: string;
|
|
58
|
+
/** Owner user ID */
|
|
59
|
+
user_id?: string;
|
|
60
|
+
/** Device name */
|
|
61
|
+
name: string;
|
|
62
|
+
/** Token validity in days (default: 90) */
|
|
63
|
+
token_validity_days?: number;
|
|
64
|
+
/** Adapter-specific fields */
|
|
65
|
+
metadata?: Record<string, unknown>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Device update payload
|
|
70
|
+
*/
|
|
71
|
+
export interface UpdateDeviceInput {
|
|
72
|
+
/** Device name */
|
|
73
|
+
name?: string;
|
|
74
|
+
/** Whether device is active */
|
|
75
|
+
is_active?: boolean;
|
|
76
|
+
/** Adapter-specific metadata */
|
|
77
|
+
metadata?: Record<string, unknown>;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Device search parameters
|
|
82
|
+
*/
|
|
83
|
+
export interface DeviceSearchParams {
|
|
84
|
+
/** Organization ID filter */
|
|
85
|
+
org_id?: string;
|
|
86
|
+
/** User ID filter */
|
|
87
|
+
user_id?: string;
|
|
88
|
+
/** Adapter type filter */
|
|
89
|
+
adapter_type?: string;
|
|
90
|
+
/** Active status filter */
|
|
91
|
+
is_active?: boolean;
|
|
92
|
+
/** Search query (searches name) */
|
|
93
|
+
query?: string;
|
|
94
|
+
/** Page number (1-indexed) */
|
|
95
|
+
page?: number;
|
|
96
|
+
/** Items per page */
|
|
97
|
+
limit?: number;
|
|
98
|
+
/** Sort field */
|
|
99
|
+
sortBy?: 'name' | 'created_at' | 'last_seen_at';
|
|
100
|
+
/** Sort direction */
|
|
101
|
+
sortOrder?: 'asc' | 'desc';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Paginated device list response
|
|
106
|
+
*/
|
|
107
|
+
export interface DeviceListResponse {
|
|
108
|
+
devices: Device[];
|
|
109
|
+
total: number;
|
|
110
|
+
page: number;
|
|
111
|
+
limit: number;
|
|
112
|
+
totalPages: number;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Token verification result
|
|
117
|
+
*/
|
|
118
|
+
export interface TokenVerificationResult {
|
|
119
|
+
/** Whether the token is valid */
|
|
120
|
+
valid: boolean;
|
|
121
|
+
/** The device if valid */
|
|
122
|
+
device?: Device;
|
|
123
|
+
/** Error message if invalid */
|
|
124
|
+
error?: string;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
128
|
+
// Adapter Interface
|
|
129
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Validation result from adapter
|
|
133
|
+
*/
|
|
134
|
+
export interface ValidationResult {
|
|
135
|
+
/** Whether validation passed */
|
|
136
|
+
valid: boolean;
|
|
137
|
+
/** Error messages if invalid */
|
|
138
|
+
errors?: string[];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Device adapter interface - all adapters must implement this
|
|
143
|
+
*/
|
|
144
|
+
export interface DeviceAdapter {
|
|
145
|
+
/** Adapter name (e.g., 'compute', 'mobile', 'iot') */
|
|
146
|
+
name: string;
|
|
147
|
+
|
|
148
|
+
/** Token prefix for this adapter (e.g., 'qwf_dev', 'qwb_mob') */
|
|
149
|
+
tokenPrefix: string;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Validate device input before creation
|
|
153
|
+
*/
|
|
154
|
+
validateDeviceInput(input: CreateDeviceInput): ValidationResult;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Transform input for storage (add adapter-specific defaults)
|
|
158
|
+
*/
|
|
159
|
+
transformForStorage(input: CreateDeviceInput): Record<string, unknown>;
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Transform row from storage to typed device
|
|
163
|
+
*/
|
|
164
|
+
transformFromStorage(row: Record<string, unknown>): Record<string, unknown>;
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Hook called after device is created (optional)
|
|
168
|
+
*/
|
|
169
|
+
onDeviceCreated?(device: Device): Promise<void>;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Hook called after device is deleted (optional)
|
|
173
|
+
*/
|
|
174
|
+
onDeviceDeleted?(device: Device): Promise<void>;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Hook called when device token is verified (optional)
|
|
178
|
+
*/
|
|
179
|
+
onDeviceVerified?(device: Device, ip?: string): Promise<void>;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
183
|
+
// Store Interface
|
|
184
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Device store interface - all storage backends must implement this
|
|
188
|
+
*/
|
|
189
|
+
export interface DeviceStore {
|
|
190
|
+
/** Store name (e.g., 'postgres', 'memory') */
|
|
191
|
+
name: string;
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Initialize the store (create tables, etc.)
|
|
195
|
+
*/
|
|
196
|
+
initialize(): Promise<void>;
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Get a device by ID
|
|
200
|
+
*/
|
|
201
|
+
getById(id: string): Promise<Device | null>;
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Get a device by token hash
|
|
205
|
+
*/
|
|
206
|
+
getByTokenHash(tokenHash: string): Promise<Device | null>;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Create a new device (stores token hash, not raw token)
|
|
210
|
+
*/
|
|
211
|
+
create(input: CreateDeviceInput & { tokenHash: string; tokenPrefix: string; tokenExpiresAt: Date; adapterType: string }): Promise<Device>;
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Update an existing device
|
|
215
|
+
*/
|
|
216
|
+
update(id: string, input: UpdateDeviceInput): Promise<Device | null>;
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Soft delete a device
|
|
220
|
+
*/
|
|
221
|
+
delete(id: string): Promise<boolean>;
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Search/list devices
|
|
225
|
+
*/
|
|
226
|
+
search(params: DeviceSearchParams): Promise<DeviceListResponse>;
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Update last seen timestamp
|
|
230
|
+
*/
|
|
231
|
+
updateLastSeen(id: string, ip?: string): Promise<void>;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Regenerate token for a device (returns new token hash and prefix)
|
|
235
|
+
*/
|
|
236
|
+
updateToken(id: string, tokenHash: string, tokenPrefix: string, expiresAt: Date): Promise<boolean>;
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Cleanup expired tokens
|
|
240
|
+
*/
|
|
241
|
+
cleanupExpired(): Promise<number>;
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Shutdown the store
|
|
245
|
+
*/
|
|
246
|
+
shutdown(): Promise<void>;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
250
|
+
// Configuration Types
|
|
251
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* PostgreSQL device store configuration
|
|
255
|
+
*/
|
|
256
|
+
export interface PostgresDeviceStoreConfig {
|
|
257
|
+
/** PostgreSQL pool instance or a function that returns one (for lazy initialization) */
|
|
258
|
+
pool: unknown | (() => unknown);
|
|
259
|
+
/** Devices table name (default: 'devices') */
|
|
260
|
+
tableName?: string;
|
|
261
|
+
/** Schema name (default: 'public') */
|
|
262
|
+
schema?: string;
|
|
263
|
+
/** Auto-create tables on init (default: true) */
|
|
264
|
+
autoCreateTables?: boolean;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* API configuration
|
|
269
|
+
*/
|
|
270
|
+
export interface DevicesApiConfig {
|
|
271
|
+
/** API route prefix (default: '/devices') */
|
|
272
|
+
prefix?: string;
|
|
273
|
+
/** Enable CRUD endpoints */
|
|
274
|
+
crud?: boolean;
|
|
275
|
+
/** Enable token verification endpoint */
|
|
276
|
+
verify?: boolean;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Devices plugin configuration
|
|
281
|
+
*/
|
|
282
|
+
export interface DevicesPluginConfig {
|
|
283
|
+
/** Device storage backend */
|
|
284
|
+
store: DeviceStore;
|
|
285
|
+
/** Device adapter (defines device type) */
|
|
286
|
+
adapter: DeviceAdapter;
|
|
287
|
+
/** Default token validity in days (default: 90) */
|
|
288
|
+
defaultTokenValidityDays?: number;
|
|
289
|
+
/** API configuration */
|
|
290
|
+
api?: DevicesApiConfig;
|
|
291
|
+
/** Enable debug logging */
|
|
292
|
+
debug?: boolean;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
296
|
+
// Adapter-specific Metadata Types
|
|
297
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Compute device metadata (QwickForge - laptops, containers)
|
|
301
|
+
*/
|
|
302
|
+
export interface ComputeDeviceMetadata {
|
|
303
|
+
/** Hostname of the device */
|
|
304
|
+
hostname?: string;
|
|
305
|
+
/** Operating system (darwin, linux, win32) */
|
|
306
|
+
os?: string;
|
|
307
|
+
/** OS version */
|
|
308
|
+
os_version?: string;
|
|
309
|
+
/** CPU architecture (x64, arm64) */
|
|
310
|
+
arch?: string;
|
|
311
|
+
/** CLI capabilities */
|
|
312
|
+
cli_capabilities?: string[];
|
|
313
|
+
/** Container ID if running in container */
|
|
314
|
+
container_id?: string;
|
|
315
|
+
/** Node.js version */
|
|
316
|
+
node_version?: string;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Mobile device metadata (QwickBot - phones, tablets)
|
|
321
|
+
*/
|
|
322
|
+
export interface MobileDeviceMetadata {
|
|
323
|
+
/** Device model (iPhone 15 Pro, Pixel 8) */
|
|
324
|
+
device_model?: string;
|
|
325
|
+
/** OS name (iOS, Android) */
|
|
326
|
+
os_name?: string;
|
|
327
|
+
/** OS version */
|
|
328
|
+
os_version?: string;
|
|
329
|
+
/** App version */
|
|
330
|
+
app_version?: string;
|
|
331
|
+
/** Push notification token (FCM/APNs) */
|
|
332
|
+
push_token?: string;
|
|
333
|
+
/** Screen width */
|
|
334
|
+
screen_width?: number;
|
|
335
|
+
/** Screen height */
|
|
336
|
+
screen_height?: number;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* IoT device metadata (future - robots, sensors)
|
|
341
|
+
*/
|
|
342
|
+
export interface IoTDeviceMetadata {
|
|
343
|
+
/** Firmware version */
|
|
344
|
+
firmware_version?: string;
|
|
345
|
+
/** Available sensors */
|
|
346
|
+
sensors?: string[];
|
|
347
|
+
/** Device capabilities */
|
|
348
|
+
capabilities?: string[];
|
|
349
|
+
/** MAC address */
|
|
350
|
+
mac_address?: string;
|
|
351
|
+
}
|
package/src/plugins/index.ts
CHANGED
|
@@ -66,6 +66,8 @@ export {
|
|
|
66
66
|
getUserStore,
|
|
67
67
|
getUserById,
|
|
68
68
|
getUserByEmail,
|
|
69
|
+
getUserByIdentifier,
|
|
70
|
+
linkUserIdentifiers,
|
|
69
71
|
findOrCreateUser,
|
|
70
72
|
postgresUserStore,
|
|
71
73
|
} from './users/index.js';
|
|
@@ -81,6 +83,8 @@ export type {
|
|
|
81
83
|
UserSyncConfig,
|
|
82
84
|
UsersApiConfig,
|
|
83
85
|
UsersUiConfig,
|
|
86
|
+
UserIdentifiers,
|
|
87
|
+
StoredIdentifiers,
|
|
84
88
|
} from './users/index.js';
|
|
85
89
|
|
|
86
90
|
// Bans plugin (separate from Users, depends on Users)
|
|
@@ -205,3 +209,217 @@ export type {
|
|
|
205
209
|
CleanupJob,
|
|
206
210
|
CleanupJobConfig,
|
|
207
211
|
} from './rate-limit/index.js';
|
|
212
|
+
|
|
213
|
+
// Devices plugin
|
|
214
|
+
export {
|
|
215
|
+
createDevicesPlugin,
|
|
216
|
+
getDeviceStore,
|
|
217
|
+
getDeviceAdapter,
|
|
218
|
+
registerDevice,
|
|
219
|
+
verifyDeviceToken,
|
|
220
|
+
getDeviceById,
|
|
221
|
+
updateDevice,
|
|
222
|
+
deleteDevice,
|
|
223
|
+
regenerateToken,
|
|
224
|
+
listUserDevices,
|
|
225
|
+
listOrgDevices,
|
|
226
|
+
deactivateDevice,
|
|
227
|
+
activateDevice,
|
|
228
|
+
cleanupExpiredTokens,
|
|
229
|
+
postgresDeviceStore,
|
|
230
|
+
computeDeviceAdapter,
|
|
231
|
+
mobileDeviceAdapter,
|
|
232
|
+
generateDeviceToken,
|
|
233
|
+
generatePairingCode,
|
|
234
|
+
hashToken,
|
|
235
|
+
verifyToken,
|
|
236
|
+
isValidTokenFormat,
|
|
237
|
+
isTokenExpired,
|
|
238
|
+
getTokenExpiration,
|
|
239
|
+
DeviceTokens,
|
|
240
|
+
} from './devices/index.js';
|
|
241
|
+
export type {
|
|
242
|
+
Device,
|
|
243
|
+
DeviceWithToken,
|
|
244
|
+
CreateDeviceInput,
|
|
245
|
+
UpdateDeviceInput,
|
|
246
|
+
DeviceSearchParams,
|
|
247
|
+
DeviceListResponse,
|
|
248
|
+
TokenVerificationResult,
|
|
249
|
+
DeviceAdapter,
|
|
250
|
+
ValidationResult as DeviceValidationResult,
|
|
251
|
+
DeviceStore,
|
|
252
|
+
DevicesPluginConfig,
|
|
253
|
+
DevicesApiConfig,
|
|
254
|
+
PostgresDeviceStoreConfig,
|
|
255
|
+
ComputeDeviceMetadata,
|
|
256
|
+
MobileDeviceMetadata,
|
|
257
|
+
IoTDeviceMetadata,
|
|
258
|
+
ComputeAdapterConfig,
|
|
259
|
+
MobileAdapterConfig,
|
|
260
|
+
DeviceTokenPair,
|
|
261
|
+
} from './devices/index.js';
|
|
262
|
+
|
|
263
|
+
// Profiles plugin
|
|
264
|
+
export {
|
|
265
|
+
createProfilesPlugin,
|
|
266
|
+
getProfileStore,
|
|
267
|
+
createProfile,
|
|
268
|
+
getProfileById,
|
|
269
|
+
updateProfile,
|
|
270
|
+
deleteProfile,
|
|
271
|
+
listUserProfiles,
|
|
272
|
+
getDefaultProfile,
|
|
273
|
+
setDefaultProfile,
|
|
274
|
+
getProfilesByAgeGroup,
|
|
275
|
+
getChildProfiles,
|
|
276
|
+
getProfileAge,
|
|
277
|
+
checkTimeRestrictions,
|
|
278
|
+
getContentFilterLevel,
|
|
279
|
+
canAccessContent,
|
|
280
|
+
postgresProfileStore,
|
|
281
|
+
} from './profiles/index.js';
|
|
282
|
+
export type {
|
|
283
|
+
Profile,
|
|
284
|
+
CreateProfileInput,
|
|
285
|
+
UpdateProfileInput,
|
|
286
|
+
ProfileSearchParams,
|
|
287
|
+
ProfileListResponse,
|
|
288
|
+
TimeRestrictionResult,
|
|
289
|
+
ContentFilterLevel,
|
|
290
|
+
AgeGroup,
|
|
291
|
+
ProfileStore,
|
|
292
|
+
ProfilesPluginConfig,
|
|
293
|
+
ProfilesApiConfig,
|
|
294
|
+
PostgresProfileStoreConfig,
|
|
295
|
+
AgeThresholds,
|
|
296
|
+
QwickBotProfileMetadata,
|
|
297
|
+
GamingProfileMetadata,
|
|
298
|
+
} from './profiles/index.js';
|
|
299
|
+
|
|
300
|
+
// Subscriptions plugin
|
|
301
|
+
export {
|
|
302
|
+
createSubscriptionsPlugin,
|
|
303
|
+
getSubscriptionsStore,
|
|
304
|
+
createTier,
|
|
305
|
+
getTierBySlug,
|
|
306
|
+
getTierById,
|
|
307
|
+
listTiers,
|
|
308
|
+
getTierEntitlements,
|
|
309
|
+
setTierEntitlements,
|
|
310
|
+
getUserSubscription,
|
|
311
|
+
createUserSubscription,
|
|
312
|
+
updateUserSubscription,
|
|
313
|
+
cancelSubscription,
|
|
314
|
+
getUserTierSlug,
|
|
315
|
+
getFeatureLimit,
|
|
316
|
+
hasFeature,
|
|
317
|
+
checkFeatureLimit,
|
|
318
|
+
ensureUserSubscription,
|
|
319
|
+
postgresSubscriptionsStore,
|
|
320
|
+
} from './subscriptions/index.js';
|
|
321
|
+
export type {
|
|
322
|
+
SubscriptionTier,
|
|
323
|
+
SubscriptionEntitlement,
|
|
324
|
+
UserSubscription,
|
|
325
|
+
UserSubscriptionWithTier,
|
|
326
|
+
SubscriptionStatus,
|
|
327
|
+
FeatureLimitResult,
|
|
328
|
+
CreateTierInput,
|
|
329
|
+
UpdateTierInput,
|
|
330
|
+
CreateEntitlementInput,
|
|
331
|
+
CreateUserSubscriptionInput,
|
|
332
|
+
UpdateUserSubscriptionInput,
|
|
333
|
+
SubscriptionsStore,
|
|
334
|
+
SubscriptionsPluginConfig,
|
|
335
|
+
SubscriptionsApiConfig,
|
|
336
|
+
PostgresSubscriptionsStoreConfig,
|
|
337
|
+
} from './subscriptions/index.js';
|
|
338
|
+
|
|
339
|
+
// Usage plugin
|
|
340
|
+
export {
|
|
341
|
+
createUsagePlugin,
|
|
342
|
+
getUsageStore,
|
|
343
|
+
getDailyUsage,
|
|
344
|
+
incrementUsage,
|
|
345
|
+
checkUsageLimit,
|
|
346
|
+
getFeatureUsageStatus,
|
|
347
|
+
getDailyUsageSummary,
|
|
348
|
+
resetUsage,
|
|
349
|
+
getRemainingQuota,
|
|
350
|
+
canUseFeature,
|
|
351
|
+
postgresUsageStore,
|
|
352
|
+
} from './usage/index.js';
|
|
353
|
+
export type {
|
|
354
|
+
DailyUsage,
|
|
355
|
+
MonthlyUsage,
|
|
356
|
+
UsageIncrementResult,
|
|
357
|
+
UsageStatus,
|
|
358
|
+
UsageSummary,
|
|
359
|
+
UsageStore,
|
|
360
|
+
UsagePluginConfig,
|
|
361
|
+
UsageApiConfig,
|
|
362
|
+
UsageCleanupConfig,
|
|
363
|
+
PostgresUsageStoreConfig,
|
|
364
|
+
} from './usage/index.js';
|
|
365
|
+
|
|
366
|
+
// Parental plugin
|
|
367
|
+
export {
|
|
368
|
+
createParentalPlugin,
|
|
369
|
+
getParentalStore,
|
|
370
|
+
getParentalAdapter,
|
|
371
|
+
getGuardianSettings,
|
|
372
|
+
createGuardianSettings,
|
|
373
|
+
updateGuardianSettings,
|
|
374
|
+
setPin,
|
|
375
|
+
verifyPin,
|
|
376
|
+
incrementFailedPinAttempts,
|
|
377
|
+
resetFailedPinAttempts,
|
|
378
|
+
getRestrictions,
|
|
379
|
+
createRestriction,
|
|
380
|
+
updateRestriction,
|
|
381
|
+
deleteRestriction,
|
|
382
|
+
pauseProfile,
|
|
383
|
+
resumeProfile,
|
|
384
|
+
checkProfileAccess,
|
|
385
|
+
logActivity,
|
|
386
|
+
getActivityLog,
|
|
387
|
+
postgresParentalStore,
|
|
388
|
+
kidsAdapter,
|
|
389
|
+
} from './parental/index.js';
|
|
390
|
+
export type {
|
|
391
|
+
GuardianSettings,
|
|
392
|
+
ProfileRestriction,
|
|
393
|
+
ActivityLog,
|
|
394
|
+
AccessCheckResult,
|
|
395
|
+
CreateGuardianSettingsInput,
|
|
396
|
+
UpdateGuardianSettingsInput,
|
|
397
|
+
CreateRestrictionInput,
|
|
398
|
+
LogActivityInput,
|
|
399
|
+
ParentalAdapter,
|
|
400
|
+
ParentalStore,
|
|
401
|
+
ParentalPluginConfig,
|
|
402
|
+
ParentalApiConfig,
|
|
403
|
+
PostgresParentalStoreConfig,
|
|
404
|
+
KidsAdapterConfig,
|
|
405
|
+
} from './parental/index.js';
|
|
406
|
+
|
|
407
|
+
// Notifications plugin
|
|
408
|
+
export {
|
|
409
|
+
createNotificationsPlugin,
|
|
410
|
+
NotificationsManager,
|
|
411
|
+
getNotificationsManager,
|
|
412
|
+
hasNotificationsManager,
|
|
413
|
+
broadcastToDevice,
|
|
414
|
+
broadcastToUser,
|
|
415
|
+
broadcastToAll,
|
|
416
|
+
} from './notifications/index.js';
|
|
417
|
+
export type {
|
|
418
|
+
NotificationsPluginConfig,
|
|
419
|
+
SSEClient,
|
|
420
|
+
NotifyPayload,
|
|
421
|
+
SSEEvent,
|
|
422
|
+
NotificationsStats,
|
|
423
|
+
ConnectionHealth,
|
|
424
|
+
NotificationsManagerInterface,
|
|
425
|
+
} from './notifications/index.js';
|