@vue-skuilder/express 0.1.13-8 → 0.1.13

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/.env.development CHANGED
@@ -9,3 +9,7 @@ COUCHDB_PASSWORD=password
9
9
  NODE_ENV=platform
10
10
 
11
11
  VERSION=localdev
12
+
13
+ # Shared secret for payment webhook authorization (Stripe → /express/permissions)
14
+ # Must match PERMISSIONS_SECRET in business backend .env
15
+ PERMISSIONS_SECRET=dev-permissions-secret-12345
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AA2BA,QAAA,MAAM,MAAM,4CAAmB,CAAC;AAwQhC,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AA2BA,QAAA,MAAM,MAAM,4CAAmB,CAAC;AAobhC,eAAe,MAAM,CAAC"}
@@ -133,6 +133,7 @@ router.get('/status', (req, res) => {
133
133
  username: userDoc.name,
134
134
  status: userDoc.status || 'pending_verification', // Default to pending if not explicitly set
135
135
  email: userDoc.email || null,
136
+ entitlements: userDoc.entitlements || {},
136
137
  });
137
138
  }
138
139
  catch (error) {
@@ -229,5 +230,152 @@ router.post('/reset-password', (req, res) => {
229
230
  }
230
231
  })();
231
232
  });
233
+ /**
234
+ * POST /auth/initialize-trial
235
+ * Initialize trial entitlement for newly created user
236
+ * Called by frontend immediately after CouchDB account creation
237
+ *
238
+ * Body params:
239
+ * - username: string (required) - CouchDB username
240
+ * - origin: string (optional) - Frontend origin URL (e.g., 'letterspractice.com') for courseId inference
241
+ * - courseId: string (optional) - Explicit courseId, if not provided inferred from origin
242
+ */
243
+ router.post('/initialize-trial', (req, res) => {
244
+ void (async () => {
245
+ try {
246
+ const { username, origin, courseId: explicitCourseId } = req.body;
247
+ if (!username) {
248
+ return res.status(400).json({ ok: false, error: 'Username required' });
249
+ }
250
+ // Infer courseId from origin if not explicitly provided
251
+ let courseId = explicitCourseId;
252
+ if (!courseId && origin) {
253
+ // Generic origin-to-courseId conversion (e.g., 'example.com' → 'example-com')
254
+ // Consuming apps can override by passing explicit courseId
255
+ courseId = origin.replace(/\./g, '-').replace(/:/g, '-').toLowerCase();
256
+ }
257
+ // Require courseId to be provided via explicit param or origin
258
+ if (!courseId) {
259
+ return res.status(400).json({
260
+ ok: false,
261
+ error: 'courseId or origin required to initialize trial'
262
+ });
263
+ }
264
+ // Find user in _users db (should exist since just created via CouchDB)
265
+ const userDoc = await findUserByUsername(username);
266
+ if (!userDoc) {
267
+ return res.status(404).json({ ok: false, error: 'User not found' });
268
+ }
269
+ // Initialize entitlements if not present
270
+ if (!userDoc.entitlements) {
271
+ userDoc.entitlements = {};
272
+ }
273
+ // Don't overwrite if entitlement already exists (idempotent)
274
+ if (userDoc.entitlements[courseId]) {
275
+ logger.info(`Trial already initialized for ${username} on ${courseId} - skipping`);
276
+ return res.json({
277
+ ok: true,
278
+ message: 'Trial already initialized',
279
+ entitlement: userDoc.entitlements[courseId]
280
+ });
281
+ }
282
+ // Calculate expiration: 30 days from now
283
+ const now = new Date();
284
+ const expiresDate = new Date(now);
285
+ expiresDate.setDate(expiresDate.getDate() + 30);
286
+ // Create trial entitlement
287
+ userDoc.entitlements[courseId] = {
288
+ status: 'trial',
289
+ registrationDate: now.toISOString(),
290
+ purchaseDate: "not-yet",
291
+ expires: expiresDate.toISOString(),
292
+ };
293
+ await updateUserDoc(userDoc);
294
+ logger.info(`Trial initialized for ${username} on ${courseId} - expires ${expiresDate.toISOString()}`);
295
+ res.json({
296
+ ok: true,
297
+ entitlement: userDoc.entitlements[courseId]
298
+ });
299
+ }
300
+ catch (error) {
301
+ logger.error('Error initializing trial:', error);
302
+ res.status(500).json({
303
+ ok: false,
304
+ error: 'Failed to initialize trial',
305
+ });
306
+ }
307
+ })();
308
+ });
309
+ /**
310
+ * POST /auth/permissions
311
+ * Grant or update course permissions for a user (called by payment webhooks)
312
+ *
313
+ * Body params:
314
+ * - userId: string (required) - CouchDB username
315
+ * - courseId: string (required) - Course identifier
316
+ * - action: 'grant_access' (required)
317
+ * - provider: string (optional) - 'stripe', 'manual', etc.
318
+ * - metadata: object (optional) - Additional payment metadata
319
+ */
320
+ router.post('/permissions', (req, res) => {
321
+ void (async () => {
322
+ try {
323
+ // Verify authorization
324
+ const authHeader = req.headers.authorization;
325
+ const expectedAuth = `Bearer ${process.env.PERMISSIONS_SECRET}`;
326
+ if (!authHeader || authHeader !== expectedAuth) {
327
+ logger.warn('Unauthorized permissions request');
328
+ return res.status(401).json({ ok: false, error: 'Unauthorized' });
329
+ }
330
+ const { userId, courseId, action, provider } = req.body;
331
+ // Validate required fields
332
+ if (!userId || !courseId || !action) {
333
+ return res.status(400).json({
334
+ ok: false,
335
+ error: 'Missing required fields: userId, courseId, action'
336
+ });
337
+ }
338
+ if (action !== 'grant_access') {
339
+ return res.status(400).json({
340
+ ok: false,
341
+ error: 'Invalid action. Only "grant_access" is supported.'
342
+ });
343
+ }
344
+ // Find user in _users db
345
+ const userDoc = await findUserByUsername(userId);
346
+ if (!userDoc) {
347
+ logger.error(`Permissions request for non-existent user: ${userId}`);
348
+ return res.status(404).json({ ok: false, error: 'User not found' });
349
+ }
350
+ // Initialize entitlements if not present
351
+ if (!userDoc.entitlements) {
352
+ userDoc.entitlements = {};
353
+ }
354
+ // Get existing entitlement (preserve registrationDate if exists)
355
+ const existingEntitlement = userDoc.entitlements[courseId];
356
+ // Update to paid status
357
+ userDoc.entitlements[courseId] = {
358
+ status: 'paid',
359
+ registrationDate: existingEntitlement?.registrationDate || new Date().toISOString(),
360
+ purchaseDate: new Date().toISOString(),
361
+ // No expires field for paid users
362
+ };
363
+ // Save to _users db
364
+ await updateUserDoc(userDoc);
365
+ logger.info(`Granted ${courseId} access to user ${userId} via ${provider || 'unknown'}`);
366
+ res.json({
367
+ ok: true,
368
+ message: `Access granted to ${courseId} for user ${userId}`
369
+ });
370
+ }
371
+ catch (error) {
372
+ logger.error('Error granting permissions:', error);
373
+ res.status(500).json({
374
+ ok: false,
375
+ error: 'Failed to grant permissions',
376
+ });
377
+ }
378
+ })();
379
+ });
232
380
  export default router;
233
381
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.1.13-8",
6
+ "version": "0.1.13",
7
7
  "description": "an API",
8
8
  "main": "dist/index.js",
9
9
  "type": "module",
@@ -33,8 +33,8 @@
33
33
  "author": "Colin Kennedy",
34
34
  "license": "GPL-3.0-or-later",
35
35
  "dependencies": {
36
- "@vue-skuilder/common": "^0.1.13-8",
37
- "@vue-skuilder/db": "^0.1.13-8",
36
+ "@vue-skuilder/common": "^0.1.13",
37
+ "@vue-skuilder/db": "^0.1.13",
38
38
  "axios": "^1.7.4",
39
39
  "cookie-parser": "^1.4.7",
40
40
  "cors": "^2.8.5",
@@ -82,5 +82,5 @@
82
82
  "typescript": "^5.7.2",
83
83
  "typescript-eslint": "^8.25.0"
84
84
  },
85
- "stableVersion": "0.1.11"
85
+ "stableVersion": "0.1.13"
86
86
  }
@@ -175,6 +175,7 @@ router.get('/status', (req: Request, res: Response) => {
175
175
  username: userDoc.name,
176
176
  status: userDoc.status || 'pending_verification', // Default to pending if not explicitly set
177
177
  email: userDoc.email || null,
178
+ entitlements: userDoc.entitlements || {},
178
179
  });
179
180
  } catch (error) {
180
181
  logger.error('Error fetching user status:', error);
@@ -289,4 +290,175 @@ router.post('/reset-password', (req: Request, res: Response) => {
289
290
  })();
290
291
  });
291
292
 
293
+ /**
294
+ * POST /auth/initialize-trial
295
+ * Initialize trial entitlement for newly created user
296
+ * Called by frontend immediately after CouchDB account creation
297
+ *
298
+ * Body params:
299
+ * - username: string (required) - CouchDB username
300
+ * - origin: string (optional) - Frontend origin URL (e.g., 'letterspractice.com') for courseId inference
301
+ * - courseId: string (optional) - Explicit courseId, if not provided inferred from origin
302
+ */
303
+ router.post('/initialize-trial', (req: Request, res: Response) => {
304
+ void (async () => {
305
+ try {
306
+ const { username, origin, courseId: explicitCourseId } = req.body;
307
+
308
+ if (!username) {
309
+ return res.status(400).json({ ok: false, error: 'Username required' });
310
+ }
311
+
312
+ // Infer courseId from origin if not explicitly provided
313
+ let courseId = explicitCourseId;
314
+ if (!courseId && origin) {
315
+ // Generic origin-to-courseId conversion (e.g., 'example.com' → 'example-com')
316
+ // Consuming apps can override by passing explicit courseId
317
+ courseId = origin.replace(/\./g, '-').replace(/:/g, '-').toLowerCase();
318
+ }
319
+
320
+ // Require courseId to be provided via explicit param or origin
321
+ if (!courseId) {
322
+ return res.status(400).json({
323
+ ok: false,
324
+ error: 'courseId or origin required to initialize trial'
325
+ });
326
+ }
327
+
328
+ // Find user in _users db (should exist since just created via CouchDB)
329
+ const userDoc = await findUserByUsername(username);
330
+ if (!userDoc) {
331
+ return res.status(404).json({ ok: false, error: 'User not found' });
332
+ }
333
+
334
+ // Initialize entitlements if not present
335
+ if (!userDoc.entitlements) {
336
+ userDoc.entitlements = {};
337
+ }
338
+
339
+ // Don't overwrite if entitlement already exists (idempotent)
340
+ if (userDoc.entitlements[courseId]) {
341
+ logger.info(`Trial already initialized for ${username} on ${courseId} - skipping`);
342
+ return res.json({
343
+ ok: true,
344
+ message: 'Trial already initialized',
345
+ entitlement: userDoc.entitlements[courseId]
346
+ });
347
+ }
348
+
349
+ // Calculate expiration: 30 days from now
350
+ const now = new Date();
351
+ const expiresDate = new Date(now);
352
+ expiresDate.setDate(expiresDate.getDate() + 30);
353
+
354
+ // Create trial entitlement
355
+ userDoc.entitlements[courseId] = {
356
+ status: 'trial',
357
+ registrationDate: now.toISOString(),
358
+ purchaseDate: "not-yet",
359
+ expires: expiresDate.toISOString(),
360
+ };
361
+
362
+ await updateUserDoc(userDoc);
363
+
364
+ logger.info(`Trial initialized for ${username} on ${courseId} - expires ${expiresDate.toISOString()}`);
365
+
366
+ res.json({
367
+ ok: true,
368
+ entitlement: userDoc.entitlements[courseId]
369
+ });
370
+
371
+ } catch (error) {
372
+ logger.error('Error initializing trial:', error);
373
+ res.status(500).json({
374
+ ok: false,
375
+ error: 'Failed to initialize trial',
376
+ });
377
+ }
378
+ })();
379
+ });
380
+
381
+ /**
382
+ * POST /auth/permissions
383
+ * Grant or update course permissions for a user (called by payment webhooks)
384
+ *
385
+ * Body params:
386
+ * - userId: string (required) - CouchDB username
387
+ * - courseId: string (required) - Course identifier
388
+ * - action: 'grant_access' (required)
389
+ * - provider: string (optional) - 'stripe', 'manual', etc.
390
+ * - metadata: object (optional) - Additional payment metadata
391
+ */
392
+ router.post('/permissions', (req: Request, res: Response) => {
393
+ void (async () => {
394
+ try {
395
+ // Verify authorization
396
+ const authHeader = req.headers.authorization;
397
+ const expectedAuth = `Bearer ${process.env.PERMISSIONS_SECRET}`;
398
+
399
+ if (!authHeader || authHeader !== expectedAuth) {
400
+ logger.warn('Unauthorized permissions request');
401
+ return res.status(401).json({ ok: false, error: 'Unauthorized' });
402
+ }
403
+
404
+ const { userId, courseId, action, provider } = req.body;
405
+
406
+ // Validate required fields
407
+ if (!userId || !courseId || !action) {
408
+ return res.status(400).json({
409
+ ok: false,
410
+ error: 'Missing required fields: userId, courseId, action'
411
+ });
412
+ }
413
+
414
+ if (action !== 'grant_access') {
415
+ return res.status(400).json({
416
+ ok: false,
417
+ error: 'Invalid action. Only "grant_access" is supported.'
418
+ });
419
+ }
420
+
421
+ // Find user in _users db
422
+ const userDoc = await findUserByUsername(userId);
423
+ if (!userDoc) {
424
+ logger.error(`Permissions request for non-existent user: ${userId}`);
425
+ return res.status(404).json({ ok: false, error: 'User not found' });
426
+ }
427
+
428
+ // Initialize entitlements if not present
429
+ if (!userDoc.entitlements) {
430
+ userDoc.entitlements = {};
431
+ }
432
+
433
+ // Get existing entitlement (preserve registrationDate if exists)
434
+ const existingEntitlement = userDoc.entitlements[courseId];
435
+
436
+ // Update to paid status
437
+ userDoc.entitlements[courseId] = {
438
+ status: 'paid',
439
+ registrationDate: existingEntitlement?.registrationDate || new Date().toISOString(),
440
+ purchaseDate: new Date().toISOString(),
441
+ // No expires field for paid users
442
+ };
443
+
444
+ // Save to _users db
445
+ await updateUserDoc(userDoc);
446
+
447
+ logger.info(`Granted ${courseId} access to user ${userId} via ${provider || 'unknown'}`);
448
+
449
+ res.json({
450
+ ok: true,
451
+ message: `Access granted to ${courseId} for user ${userId}`
452
+ });
453
+
454
+ } catch (error) {
455
+ logger.error('Error granting permissions:', error);
456
+ res.status(500).json({
457
+ ok: false,
458
+ error: 'Failed to grant permissions',
459
+ });
460
+ }
461
+ })();
462
+ });
463
+
292
464
  export default router;