@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,359 @@
1
+ /**
2
+ * PostgreSQL Subscriptions Store
3
+ *
4
+ * Subscriptions storage implementation using PostgreSQL.
5
+ * Manages tiers, entitlements, and user subscriptions.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ /**
10
+ * Create a PostgreSQL subscriptions store
11
+ */
12
+ export function postgresSubscriptionsStore(config) {
13
+ const { pool: poolOrFn, tiersTable = 'subscription_tiers', entitlementsTable = 'subscription_entitlements', userSubscriptionsTable = 'user_subscriptions', schema = 'public', autoCreateTables = true, } = config;
14
+ // Helper to get pool (supports lazy initialization via function)
15
+ const getPool = () => {
16
+ const pool = typeof poolOrFn === 'function' ? poolOrFn() : poolOrFn;
17
+ return pool;
18
+ };
19
+ const tiersTableFull = `"${schema}"."${tiersTable}"`;
20
+ const entitlementsTableFull = `"${schema}"."${entitlementsTable}"`;
21
+ const userSubsTableFull = `"${schema}"."${userSubscriptionsTable}"`;
22
+ return {
23
+ name: 'postgres',
24
+ async initialize() {
25
+ if (!autoCreateTables)
26
+ return;
27
+ // Create subscription_tiers table
28
+ await getPool().query(`
29
+ CREATE TABLE IF NOT EXISTS ${tiersTableFull} (
30
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
31
+ slug VARCHAR(50) UNIQUE NOT NULL,
32
+ name VARCHAR(100) NOT NULL,
33
+ description TEXT,
34
+ price_monthly_cents INTEGER,
35
+ price_yearly_cents INTEGER,
36
+ stripe_price_id_monthly VARCHAR(100),
37
+ stripe_price_id_yearly VARCHAR(100),
38
+ is_active BOOLEAN DEFAULT true,
39
+ sort_order INTEGER DEFAULT 0,
40
+ metadata JSONB DEFAULT '{}',
41
+ created_at TIMESTAMPTZ DEFAULT NOW(),
42
+ updated_at TIMESTAMPTZ DEFAULT NOW()
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_${tiersTable}_slug ON ${tiersTableFull}(slug);
46
+ CREATE INDEX IF NOT EXISTS idx_${tiersTable}_active ON ${tiersTableFull}(is_active);
47
+ `);
48
+ // Create subscription_entitlements table
49
+ await getPool().query(`
50
+ CREATE TABLE IF NOT EXISTS ${entitlementsTableFull} (
51
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
52
+ tier_id UUID NOT NULL REFERENCES ${tiersTableFull}(id) ON DELETE CASCADE,
53
+ feature_code VARCHAR(100) NOT NULL,
54
+ limit_value INTEGER,
55
+ metadata JSONB DEFAULT '{}',
56
+ UNIQUE(tier_id, feature_code)
57
+ );
58
+
59
+ CREATE INDEX IF NOT EXISTS idx_${entitlementsTable}_tier ON ${entitlementsTableFull}(tier_id);
60
+ CREATE INDEX IF NOT EXISTS idx_${entitlementsTable}_feature ON ${entitlementsTableFull}(feature_code);
61
+ `);
62
+ // Create user_subscriptions table
63
+ await getPool().query(`
64
+ CREATE TABLE IF NOT EXISTS ${userSubsTableFull} (
65
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
66
+ user_id UUID NOT NULL,
67
+ tier_id UUID NOT NULL REFERENCES ${tiersTableFull}(id),
68
+ stripe_customer_id VARCHAR(100),
69
+ stripe_subscription_id VARCHAR(100),
70
+ status VARCHAR(20) DEFAULT 'active'
71
+ CHECK (status IN ('active', 'canceled', 'past_due', 'trialing', 'inactive')),
72
+ current_period_start TIMESTAMPTZ,
73
+ current_period_end TIMESTAMPTZ,
74
+ cancel_at_period_end BOOLEAN DEFAULT false,
75
+ metadata JSONB DEFAULT '{}',
76
+ created_at TIMESTAMPTZ DEFAULT NOW(),
77
+ updated_at TIMESTAMPTZ DEFAULT NOW()
78
+ );
79
+
80
+ CREATE INDEX IF NOT EXISTS idx_${userSubscriptionsTable}_user ON ${userSubsTableFull}(user_id);
81
+ CREATE INDEX IF NOT EXISTS idx_${userSubscriptionsTable}_stripe ON ${userSubsTableFull}(stripe_customer_id);
82
+ CREATE INDEX IF NOT EXISTS idx_${userSubscriptionsTable}_stripe_sub ON ${userSubsTableFull}(stripe_subscription_id);
83
+ CREATE INDEX IF NOT EXISTS idx_${userSubscriptionsTable}_status ON ${userSubsTableFull}(status);
84
+ `);
85
+ },
86
+ // ═══════════════════════════════════════════════════════════════════════
87
+ // Tiers
88
+ // ═══════════════════════════════════════════════════════════════════════
89
+ async createTier(input) {
90
+ const result = await getPool().query(`INSERT INTO ${tiersTableFull}
91
+ (slug, name, description, price_monthly_cents, price_yearly_cents,
92
+ stripe_price_id_monthly, stripe_price_id_yearly, is_active, sort_order, metadata)
93
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
94
+ RETURNING *`, [
95
+ input.slug,
96
+ input.name,
97
+ input.description || null,
98
+ input.price_monthly_cents || null,
99
+ input.price_yearly_cents || null,
100
+ input.stripe_price_id_monthly || null,
101
+ input.stripe_price_id_yearly || null,
102
+ input.is_active !== false,
103
+ input.sort_order || 0,
104
+ JSON.stringify(input.metadata || {}),
105
+ ]);
106
+ return result.rows[0];
107
+ },
108
+ async getTierById(id) {
109
+ const result = await getPool().query(`SELECT * FROM ${tiersTableFull} WHERE id = $1`, [id]);
110
+ return result.rows[0] || null;
111
+ },
112
+ async getTierBySlug(slug) {
113
+ const result = await getPool().query(`SELECT * FROM ${tiersTableFull} WHERE slug = $1`, [slug]);
114
+ return result.rows[0] || null;
115
+ },
116
+ async listTiers(activeOnly = true) {
117
+ let query = `SELECT * FROM ${tiersTableFull}`;
118
+ if (activeOnly) {
119
+ query += ` WHERE is_active = true`;
120
+ }
121
+ query += ` ORDER BY sort_order ASC, name ASC`;
122
+ const result = await getPool().query(query);
123
+ return result.rows;
124
+ },
125
+ async updateTier(id, input) {
126
+ const updates = [];
127
+ const values = [];
128
+ let paramIndex = 1;
129
+ if (input.name !== undefined) {
130
+ updates.push(`name = $${paramIndex++}`);
131
+ values.push(input.name);
132
+ }
133
+ if (input.description !== undefined) {
134
+ updates.push(`description = $${paramIndex++}`);
135
+ values.push(input.description);
136
+ }
137
+ if (input.price_monthly_cents !== undefined) {
138
+ updates.push(`price_monthly_cents = $${paramIndex++}`);
139
+ values.push(input.price_monthly_cents);
140
+ }
141
+ if (input.price_yearly_cents !== undefined) {
142
+ updates.push(`price_yearly_cents = $${paramIndex++}`);
143
+ values.push(input.price_yearly_cents);
144
+ }
145
+ if (input.stripe_price_id_monthly !== undefined) {
146
+ updates.push(`stripe_price_id_monthly = $${paramIndex++}`);
147
+ values.push(input.stripe_price_id_monthly);
148
+ }
149
+ if (input.stripe_price_id_yearly !== undefined) {
150
+ updates.push(`stripe_price_id_yearly = $${paramIndex++}`);
151
+ values.push(input.stripe_price_id_yearly);
152
+ }
153
+ if (input.is_active !== undefined) {
154
+ updates.push(`is_active = $${paramIndex++}`);
155
+ values.push(input.is_active);
156
+ }
157
+ if (input.sort_order !== undefined) {
158
+ updates.push(`sort_order = $${paramIndex++}`);
159
+ values.push(input.sort_order);
160
+ }
161
+ if (input.metadata !== undefined) {
162
+ updates.push(`metadata = $${paramIndex++}`);
163
+ values.push(JSON.stringify(input.metadata));
164
+ }
165
+ if (updates.length === 0) {
166
+ return this.getTierById(id);
167
+ }
168
+ updates.push(`updated_at = NOW()`);
169
+ values.push(id);
170
+ const result = await getPool().query(`UPDATE ${tiersTableFull} SET ${updates.join(', ')} WHERE id = $${paramIndex} RETURNING *`, values);
171
+ return result.rows[0] || null;
172
+ },
173
+ async deleteTier(id) {
174
+ // Soft delete by setting is_active = false
175
+ const result = await getPool().query(`UPDATE ${tiersTableFull} SET is_active = false, updated_at = NOW() WHERE id = $1`, [id]);
176
+ return (result.rowCount ?? 0) > 0;
177
+ },
178
+ // ═══════════════════════════════════════════════════════════════════════
179
+ // Entitlements
180
+ // ═══════════════════════════════════════════════════════════════════════
181
+ async createEntitlement(input) {
182
+ const result = await getPool().query(`INSERT INTO ${entitlementsTableFull} (tier_id, feature_code, limit_value, metadata)
183
+ VALUES ($1, $2, $3, $4)
184
+ ON CONFLICT (tier_id, feature_code) DO UPDATE SET
185
+ limit_value = EXCLUDED.limit_value,
186
+ metadata = EXCLUDED.metadata
187
+ RETURNING *`, [
188
+ input.tier_id,
189
+ input.feature_code,
190
+ input.limit_value ?? null,
191
+ JSON.stringify(input.metadata || {}),
192
+ ]);
193
+ return result.rows[0];
194
+ },
195
+ async getEntitlementsByTier(tierId) {
196
+ const result = await getPool().query(`SELECT * FROM ${entitlementsTableFull} WHERE tier_id = $1 ORDER BY feature_code`, [tierId]);
197
+ return result.rows;
198
+ },
199
+ async updateEntitlement(id, limitValue) {
200
+ const result = await getPool().query(`UPDATE ${entitlementsTableFull} SET limit_value = $1 WHERE id = $2 RETURNING *`, [limitValue, id]);
201
+ return result.rows[0] || null;
202
+ },
203
+ async deleteEntitlement(id) {
204
+ const result = await getPool().query(`DELETE FROM ${entitlementsTableFull} WHERE id = $1`, [id]);
205
+ return (result.rowCount ?? 0) > 0;
206
+ },
207
+ async setTierEntitlements(tierId, entitlements) {
208
+ // Delete existing entitlements
209
+ await getPool().query(`DELETE FROM ${entitlementsTableFull} WHERE tier_id = $1`, [tierId]);
210
+ // Insert new entitlements
211
+ for (const ent of entitlements) {
212
+ await this.createEntitlement({
213
+ tier_id: tierId,
214
+ feature_code: ent.feature_code,
215
+ limit_value: ent.limit_value,
216
+ });
217
+ }
218
+ },
219
+ // ═══════════════════════════════════════════════════════════════════════
220
+ // User Subscriptions
221
+ // ═══════════════════════════════════════════════════════════════════════
222
+ async createUserSubscription(input) {
223
+ const result = await getPool().query(`INSERT INTO ${userSubsTableFull}
224
+ (user_id, tier_id, stripe_customer_id, stripe_subscription_id, status,
225
+ current_period_start, current_period_end, metadata)
226
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
227
+ RETURNING *`, [
228
+ input.user_id,
229
+ input.tier_id,
230
+ input.stripe_customer_id || null,
231
+ input.stripe_subscription_id || null,
232
+ input.status || 'active',
233
+ input.current_period_start || null,
234
+ input.current_period_end || null,
235
+ JSON.stringify(input.metadata || {}),
236
+ ]);
237
+ return result.rows[0];
238
+ },
239
+ async getUserSubscriptionById(id) {
240
+ const result = await getPool().query(`SELECT * FROM ${userSubsTableFull} WHERE id = $1`, [id]);
241
+ return result.rows[0] || null;
242
+ },
243
+ async getActiveSubscription(userId) {
244
+ const result = await getPool().query(`SELECT us.*, t.slug as tier_slug, t.name as tier_name, t.description as tier_description,
245
+ t.price_monthly_cents, t.price_yearly_cents, t.metadata as tier_metadata
246
+ FROM ${userSubsTableFull} us
247
+ JOIN ${tiersTableFull} t ON us.tier_id = t.id
248
+ WHERE us.user_id = $1 AND us.status = 'active'
249
+ ORDER BY us.created_at DESC
250
+ LIMIT 1`, [userId]);
251
+ if (result.rows.length === 0) {
252
+ return null;
253
+ }
254
+ const row = result.rows[0];
255
+ return {
256
+ id: row.id,
257
+ user_id: row.user_id,
258
+ tier_id: row.tier_id,
259
+ stripe_customer_id: row.stripe_customer_id,
260
+ stripe_subscription_id: row.stripe_subscription_id,
261
+ status: row.status,
262
+ current_period_start: row.current_period_start,
263
+ current_period_end: row.current_period_end,
264
+ cancel_at_period_end: row.cancel_at_period_end,
265
+ metadata: row.metadata,
266
+ created_at: row.created_at,
267
+ updated_at: row.updated_at,
268
+ tier: {
269
+ id: row.tier_id,
270
+ slug: row.tier_slug,
271
+ name: row.tier_name,
272
+ description: row.tier_description,
273
+ price_monthly_cents: row.price_monthly_cents,
274
+ price_yearly_cents: row.price_yearly_cents,
275
+ is_active: true,
276
+ sort_order: 0,
277
+ metadata: row.tier_metadata,
278
+ created_at: row.created_at,
279
+ updated_at: row.updated_at,
280
+ },
281
+ };
282
+ },
283
+ async getByStripeSubscriptionId(stripeSubId) {
284
+ const result = await getPool().query(`SELECT * FROM ${userSubsTableFull} WHERE stripe_subscription_id = $1`, [stripeSubId]);
285
+ return result.rows[0] || null;
286
+ },
287
+ async updateUserSubscription(id, input) {
288
+ const updates = [];
289
+ const values = [];
290
+ let paramIndex = 1;
291
+ if (input.tier_id !== undefined) {
292
+ updates.push(`tier_id = $${paramIndex++}`);
293
+ values.push(input.tier_id);
294
+ }
295
+ if (input.stripe_customer_id !== undefined) {
296
+ updates.push(`stripe_customer_id = $${paramIndex++}`);
297
+ values.push(input.stripe_customer_id);
298
+ }
299
+ if (input.stripe_subscription_id !== undefined) {
300
+ updates.push(`stripe_subscription_id = $${paramIndex++}`);
301
+ values.push(input.stripe_subscription_id);
302
+ }
303
+ if (input.status !== undefined) {
304
+ updates.push(`status = $${paramIndex++}`);
305
+ values.push(input.status);
306
+ }
307
+ if (input.current_period_start !== undefined) {
308
+ updates.push(`current_period_start = $${paramIndex++}`);
309
+ values.push(input.current_period_start);
310
+ }
311
+ if (input.current_period_end !== undefined) {
312
+ updates.push(`current_period_end = $${paramIndex++}`);
313
+ values.push(input.current_period_end);
314
+ }
315
+ if (input.cancel_at_period_end !== undefined) {
316
+ updates.push(`cancel_at_period_end = $${paramIndex++}`);
317
+ values.push(input.cancel_at_period_end);
318
+ }
319
+ if (input.metadata !== undefined) {
320
+ updates.push(`metadata = $${paramIndex++}`);
321
+ values.push(JSON.stringify(input.metadata));
322
+ }
323
+ if (updates.length === 0) {
324
+ return this.getUserSubscriptionById(id);
325
+ }
326
+ updates.push(`updated_at = NOW()`);
327
+ values.push(id);
328
+ const result = await getPool().query(`UPDATE ${userSubsTableFull} SET ${updates.join(', ')} WHERE id = $${paramIndex} RETURNING *`, values);
329
+ return result.rows[0] || null;
330
+ },
331
+ async cancelSubscription(id) {
332
+ const result = await getPool().query(`UPDATE ${userSubsTableFull}
333
+ SET cancel_at_period_end = true, updated_at = NOW()
334
+ WHERE id = $1`, [id]);
335
+ return (result.rowCount ?? 0) > 0;
336
+ },
337
+ async getFeatureLimit(userId, featureCode) {
338
+ const result = await getPool().query(`SELECT se.limit_value
339
+ FROM ${userSubsTableFull} us
340
+ JOIN ${entitlementsTableFull} se ON us.tier_id = se.tier_id
341
+ WHERE us.user_id = $1 AND us.status = 'active' AND se.feature_code = $2
342
+ ORDER BY us.created_at DESC
343
+ LIMIT 1`, [userId, featureCode]);
344
+ if (result.rows.length === 0) {
345
+ return null; // No subscription or feature not found
346
+ }
347
+ return result.rows[0].limit_value;
348
+ },
349
+ async hasFeature(userId, featureCode) {
350
+ const limit = await this.getFeatureLimit(userId, featureCode);
351
+ // Has feature if limit is not null and not 0 (0 means disabled)
352
+ return limit !== null && limit !== 0;
353
+ },
354
+ async shutdown() {
355
+ // Pool is managed externally, nothing to do here
356
+ },
357
+ };
358
+ }
359
+ //# sourceMappingURL=postgres-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-store.js","sourceRoot":"","sources":["../../../../src/plugins/subscriptions/stores/postgres-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Subscriptions Plugin
3
+ *
4
+ * Subscription tier and entitlement management plugin for @qwickapps/server.
5
+ * Supports Stripe integration for paid subscriptions.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ import type { Plugin } from '../../core/plugin-registry.js';
10
+ import type { SubscriptionsPluginConfig, SubscriptionsStore, SubscriptionTier, SubscriptionEntitlement, UserSubscription, UserSubscriptionWithTier, CreateTierInput, CreateUserSubscriptionInput, UpdateUserSubscriptionInput, FeatureLimitResult } from './types.js';
11
+ /**
12
+ * Create the Subscriptions plugin
13
+ */
14
+ export declare function createSubscriptionsPlugin(config: SubscriptionsPluginConfig): Plugin;
15
+ /**
16
+ * Get the current subscriptions store instance
17
+ */
18
+ export declare function getSubscriptionsStore(): SubscriptionsStore | null;
19
+ /**
20
+ * Create a subscription tier
21
+ */
22
+ export declare function createTier(input: CreateTierInput): Promise<SubscriptionTier>;
23
+ /**
24
+ * Get tier by slug
25
+ */
26
+ export declare function getTierBySlug(slug: string): Promise<SubscriptionTier | null>;
27
+ /**
28
+ * Get tier by ID
29
+ */
30
+ export declare function getTierById(id: string): Promise<SubscriptionTier | null>;
31
+ /**
32
+ * List all tiers
33
+ */
34
+ export declare function listTiers(activeOnly?: boolean): Promise<SubscriptionTier[]>;
35
+ /**
36
+ * Get entitlements for a tier
37
+ */
38
+ export declare function getTierEntitlements(tierId: string): Promise<SubscriptionEntitlement[]>;
39
+ /**
40
+ * Set entitlements for a tier
41
+ */
42
+ export declare function setTierEntitlements(tierId: string, entitlements: Array<{
43
+ feature_code: string;
44
+ limit_value?: number;
45
+ }>): Promise<void>;
46
+ /**
47
+ * Get user's active subscription
48
+ */
49
+ export declare function getUserSubscription(userId: string): Promise<UserSubscriptionWithTier | null>;
50
+ /**
51
+ * Create a user subscription
52
+ */
53
+ export declare function createUserSubscription(input: CreateUserSubscriptionInput): Promise<UserSubscription>;
54
+ /**
55
+ * Update a user subscription
56
+ */
57
+ export declare function updateUserSubscription(id: string, input: UpdateUserSubscriptionInput): Promise<UserSubscription | null>;
58
+ /**
59
+ * Cancel a subscription
60
+ */
61
+ export declare function cancelSubscription(id: string): Promise<boolean>;
62
+ /**
63
+ * Get user's tier slug
64
+ */
65
+ export declare function getUserTierSlug(userId: string): Promise<string | null>;
66
+ /**
67
+ * Get feature limit for a user
68
+ */
69
+ export declare function getFeatureLimit(userId: string, featureCode: string): Promise<number | null>;
70
+ /**
71
+ * Check if user has a feature
72
+ */
73
+ export declare function hasFeature(userId: string, featureCode: string): Promise<boolean>;
74
+ /**
75
+ * Check feature limit and availability
76
+ */
77
+ export declare function checkFeatureLimit(userId: string, featureCode: string): Promise<FeatureLimitResult>;
78
+ /**
79
+ * Ensure user has a subscription (create default if not)
80
+ */
81
+ export declare function ensureUserSubscription(userId: string): Promise<UserSubscriptionWithTier>;
82
+ //# sourceMappingURL=subscriptions-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions-plugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/subscriptions/subscriptions-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,+BAA+B,CAAC;AAC1F,OAAO,KAAK,EACV,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,EAGf,2BAA2B,EAC3B,2BAA2B,EAC3B,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM,CAmSnF;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAKlF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAKlF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAK9E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,UAAU,UAAO,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAK9E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAK5F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,KAAK,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAClE,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAKlG;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAK1G;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAKlC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKrE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG5E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKjG;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKtF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsBxG;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA4B9F"}