@panguard-ai/panguard-auth 0.1.0

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 (101) hide show
  1. package/dist/auth.d.ts +32 -0
  2. package/dist/auth.d.ts.map +1 -0
  3. package/dist/auth.js +68 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/crypto.d.ts +21 -0
  6. package/dist/crypto.d.ts.map +1 -0
  7. package/dist/crypto.js +60 -0
  8. package/dist/crypto.js.map +1 -0
  9. package/dist/database.d.ts +266 -0
  10. package/dist/database.d.ts.map +1 -0
  11. package/dist/database.js +936 -0
  12. package/dist/database.js.map +1 -0
  13. package/dist/email-verify.d.ts +31 -0
  14. package/dist/email-verify.d.ts.map +1 -0
  15. package/dist/email-verify.js +506 -0
  16. package/dist/email-verify.js.map +1 -0
  17. package/dist/error-tracker.d.ts +24 -0
  18. package/dist/error-tracker.d.ts.map +1 -0
  19. package/dist/error-tracker.js +80 -0
  20. package/dist/error-tracker.js.map +1 -0
  21. package/dist/google-oauth.d.ts +40 -0
  22. package/dist/google-oauth.d.ts.map +1 -0
  23. package/dist/google-oauth.js +77 -0
  24. package/dist/google-oauth.js.map +1 -0
  25. package/dist/google-sheets.d.ts +35 -0
  26. package/dist/google-sheets.d.ts.map +1 -0
  27. package/dist/google-sheets.js +128 -0
  28. package/dist/google-sheets.js.map +1 -0
  29. package/dist/index.d.ts +27 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +18 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/lemonsqueezy.d.ts +61 -0
  34. package/dist/lemonsqueezy.d.ts.map +1 -0
  35. package/dist/lemonsqueezy.js +254 -0
  36. package/dist/lemonsqueezy.js.map +1 -0
  37. package/dist/middleware.d.ts +22 -0
  38. package/dist/middleware.d.ts.map +1 -0
  39. package/dist/middleware.js +40 -0
  40. package/dist/middleware.js.map +1 -0
  41. package/dist/openapi.d.ts +17 -0
  42. package/dist/openapi.d.ts.map +1 -0
  43. package/dist/openapi.js +683 -0
  44. package/dist/openapi.js.map +1 -0
  45. package/dist/rate-limiter.d.ts +46 -0
  46. package/dist/rate-limiter.d.ts.map +1 -0
  47. package/dist/rate-limiter.js +64 -0
  48. package/dist/rate-limiter.js.map +1 -0
  49. package/dist/routes/admin.d.ts +30 -0
  50. package/dist/routes/admin.d.ts.map +1 -0
  51. package/dist/routes/admin.js +490 -0
  52. package/dist/routes/admin.js.map +1 -0
  53. package/dist/routes/auth.d.ts +18 -0
  54. package/dist/routes/auth.d.ts.map +1 -0
  55. package/dist/routes/auth.js +426 -0
  56. package/dist/routes/auth.js.map +1 -0
  57. package/dist/routes/billing.d.ts +14 -0
  58. package/dist/routes/billing.d.ts.map +1 -0
  59. package/dist/routes/billing.js +176 -0
  60. package/dist/routes/billing.js.map +1 -0
  61. package/dist/routes/index.d.ts +60 -0
  62. package/dist/routes/index.d.ts.map +1 -0
  63. package/dist/routes/index.js +133 -0
  64. package/dist/routes/index.js.map +1 -0
  65. package/dist/routes/oauth.d.ts +15 -0
  66. package/dist/routes/oauth.d.ts.map +1 -0
  67. package/dist/routes/oauth.js +215 -0
  68. package/dist/routes/oauth.js.map +1 -0
  69. package/dist/routes/shared.d.ts +71 -0
  70. package/dist/routes/shared.d.ts.map +1 -0
  71. package/dist/routes/shared.js +100 -0
  72. package/dist/routes/shared.js.map +1 -0
  73. package/dist/routes/totp.d.ts +14 -0
  74. package/dist/routes/totp.d.ts.map +1 -0
  75. package/dist/routes/totp.js +166 -0
  76. package/dist/routes/totp.js.map +1 -0
  77. package/dist/routes/usage.d.ts +14 -0
  78. package/dist/routes/usage.d.ts.map +1 -0
  79. package/dist/routes/usage.js +127 -0
  80. package/dist/routes/usage.js.map +1 -0
  81. package/dist/routes/waitlist.d.ts +16 -0
  82. package/dist/routes/waitlist.d.ts.map +1 -0
  83. package/dist/routes/waitlist.js +171 -0
  84. package/dist/routes/waitlist.js.map +1 -0
  85. package/dist/routes.d.ts +72 -0
  86. package/dist/routes.d.ts.map +1 -0
  87. package/dist/routes.js +1806 -0
  88. package/dist/routes.js.map +1 -0
  89. package/dist/totp.d.ts +41 -0
  90. package/dist/totp.d.ts.map +1 -0
  91. package/dist/totp.js +129 -0
  92. package/dist/totp.js.map +1 -0
  93. package/dist/types.d.ts +155 -0
  94. package/dist/types.d.ts.map +1 -0
  95. package/dist/types.js +6 -0
  96. package/dist/types.js.map +1 -0
  97. package/dist/usage-meter.d.ts +49 -0
  98. package/dist/usage-meter.d.ts.map +1 -0
  99. package/dist/usage-meter.js +123 -0
  100. package/dist/usage-meter.js.map +1 -0
  101. package/package.json +33 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * In-memory sliding-window rate limiter
3
+ * 記憶體內滑動視窗速率限制器
4
+ *
5
+ * Zero external dependencies. Uses a Map with automatic cleanup.
6
+ *
7
+ * @module @panguard-ai/panguard-auth/rate-limiter
8
+ */
9
+ /** Rate limiter configuration */
10
+ export interface RateLimitConfig {
11
+ /** Time window in milliseconds */
12
+ readonly windowMs: number;
13
+ /** Maximum requests allowed within the window */
14
+ readonly maxRequests: number;
15
+ }
16
+ /** Result of a rate limit check */
17
+ export interface RateLimitResult {
18
+ readonly allowed: boolean;
19
+ /** Milliseconds until the window resets (0 if allowed) */
20
+ readonly retryAfterMs: number;
21
+ /** Remaining requests in the current window */
22
+ readonly remaining: number;
23
+ }
24
+ /**
25
+ * Sliding-window rate limiter backed by an in-memory Map.
26
+ *
27
+ * Automatically cleans up expired buckets every 5 minutes.
28
+ * Call `destroy()` when the limiter is no longer needed.
29
+ */
30
+ export declare class RateLimiter {
31
+ private readonly config;
32
+ private readonly buckets;
33
+ private readonly cleanupTimer;
34
+ constructor(config: RateLimitConfig);
35
+ /**
36
+ * Check whether a request from `key` is allowed.
37
+ *
38
+ * @param key - Identifier (typically IP address or IP+email)
39
+ */
40
+ check(key: string): RateLimitResult;
41
+ /** Remove expired buckets to prevent memory growth */
42
+ private cleanup;
43
+ /** Stop the cleanup timer */
44
+ destroy(): void;
45
+ }
46
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAOD;;;;;GAKG;AACH,qBAAa,WAAW;IAIV,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;gBAEjC,MAAM,EAAE,eAAe;IAKpD;;;;OAIG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IAwBnC,sDAAsD;IACtD,OAAO,CAAC,OAAO;IAOf,6BAA6B;IAC7B,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * In-memory sliding-window rate limiter
3
+ * 記憶體內滑動視窗速率限制器
4
+ *
5
+ * Zero external dependencies. Uses a Map with automatic cleanup.
6
+ *
7
+ * @module @panguard-ai/panguard-auth/rate-limiter
8
+ */
9
+ /**
10
+ * Sliding-window rate limiter backed by an in-memory Map.
11
+ *
12
+ * Automatically cleans up expired buckets every 5 minutes.
13
+ * Call `destroy()` when the limiter is no longer needed.
14
+ */
15
+ export class RateLimiter {
16
+ config;
17
+ buckets = new Map();
18
+ cleanupTimer;
19
+ constructor(config) {
20
+ this.config = config;
21
+ this.cleanupTimer = setInterval(() => this.cleanup(), 5 * 60 * 1000);
22
+ if (this.cleanupTimer.unref)
23
+ this.cleanupTimer.unref();
24
+ }
25
+ /**
26
+ * Check whether a request from `key` is allowed.
27
+ *
28
+ * @param key - Identifier (typically IP address or IP+email)
29
+ */
30
+ check(key) {
31
+ const now = Date.now();
32
+ const bucket = this.buckets.get(key);
33
+ // New bucket or expired window
34
+ if (!bucket || now >= bucket.resetAt) {
35
+ this.buckets.set(key, { count: 1, resetAt: now + this.config.windowMs });
36
+ return { allowed: true, retryAfterMs: 0, remaining: this.config.maxRequests - 1 };
37
+ }
38
+ // Within window but under limit
39
+ if (bucket.count < this.config.maxRequests) {
40
+ bucket.count++;
41
+ return { allowed: true, retryAfterMs: 0, remaining: this.config.maxRequests - bucket.count };
42
+ }
43
+ // Over limit
44
+ return {
45
+ allowed: false,
46
+ retryAfterMs: bucket.resetAt - now,
47
+ remaining: 0,
48
+ };
49
+ }
50
+ /** Remove expired buckets to prevent memory growth */
51
+ cleanup() {
52
+ const now = Date.now();
53
+ for (const [key, bucket] of this.buckets) {
54
+ if (now >= bucket.resetAt)
55
+ this.buckets.delete(key);
56
+ }
57
+ }
58
+ /** Stop the cleanup timer */
59
+ destroy() {
60
+ clearInterval(this.cleanupTimer);
61
+ this.buckets.clear();
62
+ }
63
+ }
64
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAwBH;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IAIO;IAHZ,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpC,YAAY,CAAiC;IAE9D,YAA6B,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;QAClD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK;YAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,GAAW;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAErC,+BAA+B;QAC/B,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QACpF,CAAC;QAED,gCAAgC;QAChC,IAAI,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/F,CAAC;QAED,aAAa;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,MAAM,CAAC,OAAO,GAAG,GAAG;YAClC,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;IAED,sDAAsD;IAC9C,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,OAAO;QACL,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Admin route handlers:
3
+ * handleAdminUsers, handleAdminUpdateTier, handleAdminUpdateRole, handleAdminStats,
4
+ * handleAdminDashboard, handleAdminUsersSearch, handleAdminSessions,
5
+ * handleAdminSessionRevoke, handleAdminActivity, handleAdminAuditLog,
6
+ * handleAdminAuditActions, handleAdminUsageOverview, handleAdminUsageUser,
7
+ * handleAdminUserDetail, handleAdminUserSuspend, handleAdminBulkAction.
8
+ * @module @panguard-ai/panguard-auth/routes/admin
9
+ */
10
+ import type { IncomingMessage, ServerResponse } from 'node:http';
11
+ import type { RouteContext } from './shared.js';
12
+ export declare function createAdminRoutes(ctx: RouteContext): {
13
+ handleAdminUsers: (req: IncomingMessage, res: ServerResponse) => void;
14
+ handleAdminUpdateTier: (req: IncomingMessage, res: ServerResponse, userId: string) => Promise<void>;
15
+ handleAdminUpdateRole: (req: IncomingMessage, res: ServerResponse, userId: string) => Promise<void>;
16
+ handleAdminStats: (req: IncomingMessage, res: ServerResponse) => void;
17
+ handleAdminDashboard: (req: IncomingMessage, res: ServerResponse) => void;
18
+ handleAdminUsersSearch: (req: IncomingMessage, res: ServerResponse) => void;
19
+ handleAdminSessions: (req: IncomingMessage, res: ServerResponse) => void;
20
+ handleAdminSessionRevoke: (req: IncomingMessage, res: ServerResponse, sessionId: string) => void;
21
+ handleAdminActivity: (req: IncomingMessage, res: ServerResponse) => void;
22
+ handleAdminAuditLog: (req: IncomingMessage, res: ServerResponse) => void;
23
+ handleAdminAuditActions: (req: IncomingMessage, res: ServerResponse) => void;
24
+ handleAdminUsageOverview: (req: IncomingMessage, res: ServerResponse) => void;
25
+ handleAdminUsageUser: (req: IncomingMessage, res: ServerResponse, userId: string) => void;
26
+ handleAdminUserDetail: (req: IncomingMessage, res: ServerResponse, userId: string) => void;
27
+ handleAdminUserSuspend: (req: IncomingMessage, res: ServerResponse, userId: string) => Promise<void>;
28
+ handleAdminBulkAction: (req: IncomingMessage, res: ServerResponse) => Promise<void>;
29
+ };
30
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/routes/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY;4BAGlB,eAAe,OAAO,cAAc,KAAG,IAAI;iCAiBnE,eAAe,OACf,cAAc,UACX,MAAM,KACb,OAAO,CAAC,IAAI,CAAC;iCAuDT,eAAe,OACf,cAAc,UACX,MAAM,KACb,OAAO,CAAC,IAAI,CAAC;4BA+Ce,eAAe,OAAO,cAAc,KAAG,IAAI;gCAiBvC,eAAe,OAAO,cAAc,KAAG,IAAI;kCAczC,eAAe,OAAO,cAAc,KAAG,IAAI;+BAgB9C,eAAe,OAAO,cAAc,KAAG,IAAI;oCAetE,eAAe,OACf,cAAc,aACR,MAAM,KAChB,IAAI;+BAkB2B,eAAe,OAAO,cAAc,KAAG,IAAI;+BAgB3C,eAAe,OAAO,cAAc,KAAG,IAAI;mCA+BvC,eAAe,OAAO,cAAc,KAAG,IAAI;oCAa1C,eAAe,OAAO,cAAc,KAAG,IAAI;gCA2E/C,eAAe,OAAO,cAAc,UAAU,MAAM,KAAG,IAAI;iCAmC1D,eAAe,OAAO,cAAc,UAAU,MAAM,KAAG,IAAI;kCA4CxF,eAAe,OACf,cAAc,UACX,MAAM,KACb,OAAO,CAAC,IAAI,CAAC;iCAyC0B,eAAe,OAAO,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC;EA4G/F"}
@@ -0,0 +1,490 @@
1
+ /**
2
+ * Admin route handlers:
3
+ * handleAdminUsers, handleAdminUpdateTier, handleAdminUpdateRole, handleAdminStats,
4
+ * handleAdminDashboard, handleAdminUsersSearch, handleAdminSessions,
5
+ * handleAdminSessionRevoke, handleAdminActivity, handleAdminAuditLog,
6
+ * handleAdminAuditActions, handleAdminUsageOverview, handleAdminUsageUser,
7
+ * handleAdminUserDetail, handleAdminUserSuspend, handleAdminBulkAction.
8
+ * @module @panguard-ai/panguard-auth/routes/admin
9
+ */
10
+ import { authenticateRequest, requireAdmin } from '../middleware.js';
11
+ import { logAuditEvent } from '@panguard-ai/security-hardening';
12
+ import { getUsageSummary, getQuotaLimits, currentPeriod } from '../usage-meter.js';
13
+ import { readBody, json, toPublicUser } from './shared.js';
14
+ export function createAdminRoutes(ctx) {
15
+ const { db } = ctx;
16
+ function handleAdminUsers(req, res) {
17
+ if (req.method !== 'GET') {
18
+ json(res, 405, { ok: false, error: 'Method not allowed' });
19
+ return;
20
+ }
21
+ const user = authenticateRequest(req, db);
22
+ if (!requireAdmin(user)) {
23
+ json(res, 403, { ok: false, error: 'Admin access required' });
24
+ return;
25
+ }
26
+ const users = db.getAllUsersAdmin();
27
+ json(res, 200, { ok: true, data: users });
28
+ }
29
+ async function handleAdminUpdateTier(req, res, userId) {
30
+ if (req.method !== 'PATCH') {
31
+ json(res, 405, { ok: false, error: 'Method not allowed' });
32
+ return;
33
+ }
34
+ const user = authenticateRequest(req, db);
35
+ if (!requireAdmin(user)) {
36
+ json(res, 403, { ok: false, error: 'Admin access required' });
37
+ return;
38
+ }
39
+ const result = await readBody(req);
40
+ if (!result.ok) {
41
+ json(res, result.status, { ok: false, error: 'Invalid JSON body' });
42
+ return;
43
+ }
44
+ const { tier } = result.data;
45
+ const validTiers = ['community', 'solo', 'pro', 'business', 'enterprise'];
46
+ if (typeof tier !== 'string' || !validTiers.includes(tier)) {
47
+ json(res, 400, {
48
+ ok: false,
49
+ error: `Invalid tier. Must be one of: ${validTiers.join(', ')}`,
50
+ });
51
+ return;
52
+ }
53
+ const target = db.getUserById(Number(userId));
54
+ if (!target) {
55
+ json(res, 404, { ok: false, error: 'User not found' });
56
+ return;
57
+ }
58
+ const oldTier = target.tier;
59
+ db.updateUserTier(target.id, tier);
60
+ // Audit log
61
+ db.addAuditLog('tier_change', user.id, target.id, JSON.stringify({ from: oldTier, to: tier }));
62
+ logAuditEvent({
63
+ level: 'info',
64
+ action: 'policy_check',
65
+ target: `user:${target.id}`,
66
+ result: 'success',
67
+ context: { details: `Tier changed: ${oldTier} -> ${tier}` },
68
+ });
69
+ // Invalidate all sessions for this user so they pick up the new tier
70
+ db.deleteSessionsByUserId(target.id);
71
+ const updated = db.getUserById(target.id);
72
+ json(res, 200, { ok: true, data: toPublicUser(updated) });
73
+ }
74
+ async function handleAdminUpdateRole(req, res, userId) {
75
+ if (req.method !== 'PATCH') {
76
+ json(res, 405, { ok: false, error: 'Method not allowed' });
77
+ return;
78
+ }
79
+ const user = authenticateRequest(req, db);
80
+ if (!requireAdmin(user)) {
81
+ json(res, 403, { ok: false, error: 'Admin access required' });
82
+ return;
83
+ }
84
+ const result = await readBody(req);
85
+ if (!result.ok) {
86
+ json(res, result.status, { ok: false, error: 'Invalid JSON body' });
87
+ return;
88
+ }
89
+ const { role } = result.data;
90
+ if (typeof role !== 'string' || !['user', 'admin'].includes(role)) {
91
+ json(res, 400, { ok: false, error: 'Invalid role. Must be "user" or "admin"' });
92
+ return;
93
+ }
94
+ const target = db.getUserById(Number(userId));
95
+ if (!target) {
96
+ json(res, 404, { ok: false, error: 'User not found' });
97
+ return;
98
+ }
99
+ const oldRole = target.role;
100
+ db.updateUserRole(target.id, role);
101
+ // Audit log
102
+ db.addAuditLog('role_change', user.id, target.id, JSON.stringify({ from: oldRole, to: role }));
103
+ logAuditEvent({
104
+ level: 'info',
105
+ action: 'policy_check',
106
+ target: `user:${target.id}`,
107
+ result: 'success',
108
+ context: { details: `Role changed: ${oldRole} -> ${role}` },
109
+ });
110
+ const updated = db.getUserById(target.id);
111
+ json(res, 200, { ok: true, data: toPublicUser(updated) });
112
+ }
113
+ function handleAdminStats(req, res) {
114
+ if (req.method !== 'GET') {
115
+ json(res, 405, { ok: false, error: 'Method not allowed' });
116
+ return;
117
+ }
118
+ const user = authenticateRequest(req, db);
119
+ if (!requireAdmin(user)) {
120
+ json(res, 403, { ok: false, error: 'Admin access required' });
121
+ return;
122
+ }
123
+ const userStats = db.getUserStats();
124
+ const waitlistStats = db.getWaitlistStats();
125
+ json(res, 200, { ok: true, data: { users: userStats, waitlist: waitlistStats } });
126
+ }
127
+ function handleAdminDashboard(req, res) {
128
+ if (req.method !== 'GET') {
129
+ json(res, 405, { ok: false, error: 'Method not allowed' });
130
+ return;
131
+ }
132
+ const user = authenticateRequest(req, db);
133
+ if (!requireAdmin(user)) {
134
+ json(res, 403, { ok: false, error: 'Admin access required' });
135
+ return;
136
+ }
137
+ const stats = db.getAdminDashboardStats();
138
+ json(res, 200, { ok: true, data: stats });
139
+ }
140
+ function handleAdminUsersSearch(req, res) {
141
+ if (req.method !== 'GET') {
142
+ json(res, 405, { ok: false, error: 'Method not allowed' });
143
+ return;
144
+ }
145
+ const user = authenticateRequest(req, db);
146
+ if (!requireAdmin(user)) {
147
+ json(res, 403, { ok: false, error: 'Admin access required' });
148
+ return;
149
+ }
150
+ const urlObj = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
151
+ const q = urlObj.searchParams.get('q') ?? '';
152
+ const users = q ? db.searchUsers(q) : db.getAllUsersAdmin();
153
+ json(res, 200, { ok: true, data: users });
154
+ }
155
+ function handleAdminSessions(req, res) {
156
+ if (req.method !== 'GET') {
157
+ json(res, 405, { ok: false, error: 'Method not allowed' });
158
+ return;
159
+ }
160
+ const user = authenticateRequest(req, db);
161
+ if (!requireAdmin(user)) {
162
+ json(res, 403, { ok: false, error: 'Admin access required' });
163
+ return;
164
+ }
165
+ const sessions = db.getActiveSessions();
166
+ json(res, 200, { ok: true, data: sessions });
167
+ }
168
+ function handleAdminSessionRevoke(req, res, sessionId) {
169
+ if (req.method !== 'DELETE') {
170
+ json(res, 405, { ok: false, error: 'Method not allowed' });
171
+ return;
172
+ }
173
+ const user = authenticateRequest(req, db);
174
+ if (!requireAdmin(user)) {
175
+ json(res, 403, { ok: false, error: 'Admin access required' });
176
+ return;
177
+ }
178
+ const deleted = db.deleteSessionById(Number(sessionId));
179
+ if (!deleted) {
180
+ json(res, 404, { ok: false, error: 'Session not found' });
181
+ return;
182
+ }
183
+ json(res, 200, { ok: true, data: { revoked: true } });
184
+ }
185
+ function handleAdminActivity(req, res) {
186
+ if (req.method !== 'GET') {
187
+ json(res, 405, { ok: false, error: 'Method not allowed' });
188
+ return;
189
+ }
190
+ const user = authenticateRequest(req, db);
191
+ if (!requireAdmin(user)) {
192
+ json(res, 403, { ok: false, error: 'Admin access required' });
193
+ return;
194
+ }
195
+ const urlObj = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
196
+ const limit = Math.min(parseInt(urlObj.searchParams.get('limit') ?? '20', 10) || 20, 50);
197
+ const activity = db.getRecentActivity(limit);
198
+ json(res, 200, { ok: true, data: activity });
199
+ }
200
+ function handleAdminAuditLog(req, res) {
201
+ if (req.method !== 'GET') {
202
+ json(res, 405, { ok: false, error: 'Method not allowed' });
203
+ return;
204
+ }
205
+ const user = authenticateRequest(req, db);
206
+ if (!requireAdmin(user)) {
207
+ json(res, 403, { ok: false, error: 'Admin access required' });
208
+ return;
209
+ }
210
+ const urlObj = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
211
+ const filter = {
212
+ action: urlObj.searchParams.get('action') || undefined,
213
+ actorId: urlObj.searchParams.has('actorId')
214
+ ? parseInt(urlObj.searchParams.get('actorId'), 10)
215
+ : undefined,
216
+ dateFrom: urlObj.searchParams.get('dateFrom') || undefined,
217
+ dateTo: urlObj.searchParams.get('dateTo') || undefined,
218
+ page: parseInt(urlObj.searchParams.get('page') ?? '1', 10) || 1,
219
+ perPage: parseInt(urlObj.searchParams.get('perPage') ?? '50', 10) || 50,
220
+ };
221
+ const result = db.getAuditLogFiltered(filter);
222
+ const actions = db.getDistinctAuditActions();
223
+ json(res, 200, {
224
+ ok: true,
225
+ data: { ...result, page: filter.page, perPage: filter.perPage, actions },
226
+ });
227
+ }
228
+ function handleAdminAuditActions(req, res) {
229
+ if (req.method !== 'GET') {
230
+ json(res, 405, { ok: false, error: 'Method not allowed' });
231
+ return;
232
+ }
233
+ const user = authenticateRequest(req, db);
234
+ if (!requireAdmin(user)) {
235
+ json(res, 403, { ok: false, error: 'Admin access required' });
236
+ return;
237
+ }
238
+ json(res, 200, { ok: true, data: db.getDistinctAuditActions() });
239
+ }
240
+ function handleAdminUsageOverview(req, res) {
241
+ if (req.method !== 'GET') {
242
+ json(res, 405, { ok: false, error: 'Method not allowed' });
243
+ return;
244
+ }
245
+ const user = authenticateRequest(req, db);
246
+ if (!requireAdmin(user)) {
247
+ json(res, 403, { ok: false, error: 'Admin access required' });
248
+ return;
249
+ }
250
+ const allUsers = db.getAllUsersAdmin();
251
+ const period = currentPeriod();
252
+ const byUser = [];
253
+ const nearQuota = [];
254
+ for (const u of allUsers) {
255
+ const summary = getUsageSummary(db, u.id, u.tier);
256
+ byUser.push({
257
+ userId: u.id,
258
+ email: u.email,
259
+ name: u.name,
260
+ tier: u.tier,
261
+ suspended: u.suspended,
262
+ usage: summary,
263
+ });
264
+ for (const s of summary) {
265
+ if (s.limit > 0 && s.percentage >= 80) {
266
+ nearQuota.push({
267
+ userId: u.id,
268
+ email: u.email,
269
+ tier: u.tier,
270
+ resource: s.resource,
271
+ current: s.current,
272
+ limit: s.limit,
273
+ percentage: s.percentage,
274
+ });
275
+ }
276
+ }
277
+ }
278
+ // Aggregate by tier
279
+ const byTier = {};
280
+ for (const u of byUser) {
281
+ if (!byTier[u.tier]) {
282
+ byTier[u.tier] = { userCount: 0, resources: {} };
283
+ }
284
+ const tierEntry = byTier[u.tier];
285
+ tierEntry.userCount++;
286
+ for (const s of u.usage) {
287
+ tierEntry.resources[s.resource] = (tierEntry.resources[s.resource] ?? 0) + s.current;
288
+ }
289
+ }
290
+ json(res, 200, {
291
+ ok: true,
292
+ data: { byUser, nearQuota, byTier, period },
293
+ });
294
+ }
295
+ function handleAdminUsageUser(req, res, userId) {
296
+ if (req.method !== 'GET') {
297
+ json(res, 405, { ok: false, error: 'Method not allowed' });
298
+ return;
299
+ }
300
+ const admin = authenticateRequest(req, db);
301
+ if (!requireAdmin(admin)) {
302
+ json(res, 403, { ok: false, error: 'Admin access required' });
303
+ return;
304
+ }
305
+ const targetUser = db.getUserById(parseInt(userId, 10));
306
+ if (!targetUser) {
307
+ json(res, 404, { ok: false, error: 'User not found' });
308
+ return;
309
+ }
310
+ const summary = getUsageSummary(db, targetUser.id, targetUser.tier);
311
+ const history = db.getUserUsage(targetUser.id);
312
+ json(res, 200, {
313
+ ok: true,
314
+ data: {
315
+ user: {
316
+ id: targetUser.id,
317
+ email: targetUser.email,
318
+ name: targetUser.name,
319
+ tier: targetUser.tier,
320
+ },
321
+ usage: summary,
322
+ history,
323
+ },
324
+ });
325
+ }
326
+ function handleAdminUserDetail(req, res, userId) {
327
+ if (req.method !== 'GET') {
328
+ json(res, 405, { ok: false, error: 'Method not allowed' });
329
+ return;
330
+ }
331
+ const admin = authenticateRequest(req, db);
332
+ if (!requireAdmin(admin)) {
333
+ json(res, 403, { ok: false, error: 'Admin access required' });
334
+ return;
335
+ }
336
+ const detail = db.getUserDetailById(parseInt(userId, 10));
337
+ if (!detail) {
338
+ json(res, 404, { ok: false, error: 'User not found' });
339
+ return;
340
+ }
341
+ // Enrich usage with quota limits
342
+ const limits = getQuotaLimits(detail.user.tier);
343
+ const usage = detail.usage.map((u) => {
344
+ const limit = limits[u.resource] ?? -1;
345
+ const current = u.count;
346
+ return {
347
+ resource: u.resource,
348
+ current,
349
+ limit,
350
+ percentage: limit > 0 ? Math.round((current / limit) * 100) : 0,
351
+ };
352
+ });
353
+ json(res, 200, {
354
+ ok: true,
355
+ data: {
356
+ user: detail.user,
357
+ subscription: detail.subscription,
358
+ usage,
359
+ sessions: detail.sessions,
360
+ recentAudit: detail.recentAudit,
361
+ twoFactor: { enabled: detail.totpEnabled },
362
+ },
363
+ });
364
+ }
365
+ async function handleAdminUserSuspend(req, res, userId) {
366
+ if (req.method !== 'PATCH') {
367
+ json(res, 405, { ok: false, error: 'Method not allowed' });
368
+ return;
369
+ }
370
+ const admin = authenticateRequest(req, db);
371
+ if (!requireAdmin(admin)) {
372
+ json(res, 403, { ok: false, error: 'Admin access required' });
373
+ return;
374
+ }
375
+ const body = await readBody(req);
376
+ if (!body.ok) {
377
+ json(res, body.status, { ok: false, error: 'Invalid JSON body' });
378
+ return;
379
+ }
380
+ const targetId = parseInt(userId, 10);
381
+ if (targetId === admin.id) {
382
+ json(res, 400, { ok: false, error: 'Cannot suspend your own account' });
383
+ return;
384
+ }
385
+ const suspended = body.data['suspended'] === true;
386
+ if (suspended) {
387
+ db.suspendUser(targetId);
388
+ }
389
+ else {
390
+ db.unsuspendUser(targetId);
391
+ }
392
+ db.addAuditLog(suspended ? 'user_suspended' : 'user_unsuspended', admin.id, targetId, JSON.stringify({ suspended }));
393
+ json(res, 200, { ok: true, data: { id: targetId, suspended } });
394
+ }
395
+ async function handleAdminBulkAction(req, res) {
396
+ if (req.method !== 'POST') {
397
+ json(res, 405, { ok: false, error: 'Method not allowed' });
398
+ return;
399
+ }
400
+ const admin = authenticateRequest(req, db);
401
+ if (!requireAdmin(admin)) {
402
+ json(res, 403, { ok: false, error: 'Admin access required' });
403
+ return;
404
+ }
405
+ const body = await readBody(req);
406
+ if (!body.ok) {
407
+ json(res, body.status, { ok: false, error: 'Invalid JSON body' });
408
+ return;
409
+ }
410
+ const { userIds, action, value } = body.data;
411
+ if (!Array.isArray(userIds) || userIds.length === 0) {
412
+ json(res, 400, { ok: false, error: 'userIds array is required' });
413
+ return;
414
+ }
415
+ if (userIds.length > 100) {
416
+ json(res, 400, { ok: false, error: 'Maximum 100 users per bulk action' });
417
+ return;
418
+ }
419
+ const validActions = ['change_tier', 'change_role', 'suspend', 'unsuspend'];
420
+ if (!action || !validActions.includes(action)) {
421
+ json(res, 400, { ok: false, error: `action must be one of: ${validActions.join(', ')}` });
422
+ return;
423
+ }
424
+ const validTiers = ['community', 'solo', 'pro', 'business', 'enterprise'];
425
+ const validRoles = ['user', 'admin'];
426
+ if (action === 'change_tier' && (!value || !validTiers.includes(value))) {
427
+ json(res, 400, { ok: false, error: `value must be one of: ${validTiers.join(', ')}` });
428
+ return;
429
+ }
430
+ if (action === 'change_role' && (!value || !validRoles.includes(value))) {
431
+ json(res, 400, { ok: false, error: `value must be one of: ${validRoles.join(', ')}` });
432
+ return;
433
+ }
434
+ const results = [];
435
+ let processed = 0;
436
+ let failed = 0;
437
+ for (const uid of userIds) {
438
+ try {
439
+ if (uid === admin.id && (action === 'suspend' || action === 'change_role')) {
440
+ results.push({ userId: uid, success: false, error: 'Cannot modify own account' });
441
+ failed++;
442
+ continue;
443
+ }
444
+ switch (action) {
445
+ case 'change_tier':
446
+ db.updateUserTier(uid, value);
447
+ db.deleteSessionsByUserId(uid);
448
+ break;
449
+ case 'change_role':
450
+ db.updateUserRole(uid, value);
451
+ break;
452
+ case 'suspend':
453
+ db.suspendUser(uid);
454
+ break;
455
+ case 'unsuspend':
456
+ db.unsuspendUser(uid);
457
+ break;
458
+ }
459
+ db.addAuditLog(`bulk_${action}`, admin.id, uid, JSON.stringify({ action, value }));
460
+ results.push({ userId: uid, success: true });
461
+ processed++;
462
+ }
463
+ catch (err) {
464
+ const msg = err instanceof Error ? err.message : String(err);
465
+ results.push({ userId: uid, success: false, error: msg });
466
+ failed++;
467
+ }
468
+ }
469
+ json(res, 200, { ok: true, data: { processed, failed, results } });
470
+ }
471
+ return {
472
+ handleAdminUsers,
473
+ handleAdminUpdateTier,
474
+ handleAdminUpdateRole,
475
+ handleAdminStats,
476
+ handleAdminDashboard,
477
+ handleAdminUsersSearch,
478
+ handleAdminSessions,
479
+ handleAdminSessionRevoke,
480
+ handleAdminActivity,
481
+ handleAdminAuditLog,
482
+ handleAdminAuditActions,
483
+ handleAdminUsageOverview,
484
+ handleAdminUsageUser,
485
+ handleAdminUserDetail,
486
+ handleAdminUserSuspend,
487
+ handleAdminBulkAction,
488
+ };
489
+ }
490
+ //# sourceMappingURL=admin.js.map