@sonicjs-cms/core 2.0.0-alpha.6 → 2.0.0-alpha.8

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 (41) hide show
  1. package/dist/{chunk-CXZDAR6S.js → chunk-7N3HK7ZK.js} +3 -3
  2. package/dist/{chunk-CXZDAR6S.js.map → chunk-7N3HK7ZK.js.map} +1 -1
  3. package/dist/{chunk-NRSL6BQI.js → chunk-BITQ4MFX.js} +3 -3
  4. package/dist/{chunk-NRSL6BQI.js.map → chunk-BITQ4MFX.js.map} +1 -1
  5. package/dist/{chunk-24PWAFUT.cjs → chunk-BUKT6HP5.cjs} +13 -13
  6. package/dist/{chunk-24PWAFUT.cjs.map → chunk-BUKT6HP5.cjs.map} +1 -1
  7. package/dist/{chunk-KWFUNPSQ.cjs → chunk-E57DCHKC.cjs} +8792 -3806
  8. package/dist/chunk-E57DCHKC.cjs.map +1 -0
  9. package/dist/{chunk-L3NXO7Y4.cjs → chunk-FVMV5DKA.cjs} +49 -49
  10. package/dist/{chunk-L3NXO7Y4.cjs.map → chunk-FVMV5DKA.cjs.map} +1 -1
  11. package/dist/{chunk-EMMSS5I5.cjs → chunk-IGJUBJBW.cjs} +8 -2
  12. package/dist/{chunk-EMMSS5I5.cjs.map → chunk-IGJUBJBW.cjs.map} +1 -1
  13. package/dist/{chunk-WJ7QYVR2.cjs → chunk-RNR4HA23.cjs} +4 -4
  14. package/dist/{chunk-WJ7QYVR2.cjs.map → chunk-RNR4HA23.cjs.map} +1 -1
  15. package/dist/{chunk-5RDID2QZ.js → chunk-RWLPYK7R.js} +8768 -3784
  16. package/dist/chunk-RWLPYK7R.js.map +1 -0
  17. package/dist/{chunk-G3PMV62Z.js → chunk-V4OQ3NZ2.js} +7 -3
  18. package/dist/{chunk-G3PMV62Z.js.map → chunk-V4OQ3NZ2.js.map} +1 -1
  19. package/dist/{chunk-PTQZ5FEI.js → chunk-WESS2U3K.js} +3 -3
  20. package/dist/{chunk-PTQZ5FEI.js.map → chunk-WESS2U3K.js.map} +1 -1
  21. package/dist/index.cjs +95 -93
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.js +9 -7
  24. package/dist/index.js.map +1 -1
  25. package/dist/middleware.cjs +23 -23
  26. package/dist/middleware.js +3 -3
  27. package/dist/plugins.cjs +8 -8
  28. package/dist/plugins.js +2 -2
  29. package/dist/routes.cjs +20 -12
  30. package/dist/routes.js +4 -4
  31. package/dist/services.cjs +18 -18
  32. package/dist/services.js +2 -2
  33. package/dist/templates.cjs +1 -1
  34. package/dist/templates.js +1 -1
  35. package/dist/types.cjs +1 -1
  36. package/dist/types.js +1 -1
  37. package/dist/utils.cjs +1 -1
  38. package/dist/utils.js +1 -1
  39. package/package.json +1 -1
  40. package/dist/chunk-5RDID2QZ.js.map +0 -1
  41. package/dist/chunk-KWFUNPSQ.cjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkWJ7QYVR2_cjs = require('./chunk-WJ7QYVR2.cjs');
3
+ var chunkRNR4HA23_cjs = require('./chunk-RNR4HA23.cjs');
4
4
  var jwt = require('hono/jwt');
5
5
  var cookie = require('hono/cookie');
6
6
  var compress = require('hono/compress');
@@ -141,7 +141,7 @@ function loggingMiddleware() {
141
141
  c.set("requestId", requestId);
142
142
  c.set("startTime", startTime);
143
143
  try {
144
- const logger = chunkWJ7QYVR2_cjs.getLogger(c.env.DB);
144
+ const logger = chunkRNR4HA23_cjs.getLogger(c.env.DB);
145
145
  const user = c.get("user");
146
146
  const method = c.req.method;
147
147
  const url = c.req.url;
@@ -184,7 +184,7 @@ function loggingMiddleware() {
184
184
  } catch (error) {
185
185
  const duration = Date.now() - startTime;
186
186
  try {
187
- const logger = chunkWJ7QYVR2_cjs.getLogger(c.env.DB);
187
+ const logger = chunkRNR4HA23_cjs.getLogger(c.env.DB);
188
188
  const user = c.get("user");
189
189
  await logger.error("api", `Unhandled error in ${c.req.method} ${c.req.url}`, error, {
190
190
  userId: user?.userId,
@@ -212,7 +212,7 @@ function detailedLoggingMiddleware() {
212
212
  c.set("requestId", requestId);
213
213
  c.set("startTime", startTime);
214
214
  try {
215
- const logger = chunkWJ7QYVR2_cjs.getLogger(c.env.DB);
215
+ const logger = chunkRNR4HA23_cjs.getLogger(c.env.DB);
216
216
  const user = c.get("user");
217
217
  const method = c.req.method;
218
218
  const url = c.req.url;
@@ -263,7 +263,7 @@ function detailedLoggingMiddleware() {
263
263
  } catch (error) {
264
264
  const duration = Date.now() - startTime;
265
265
  try {
266
- const logger = chunkWJ7QYVR2_cjs.getLogger(c.env.DB);
266
+ const logger = chunkRNR4HA23_cjs.getLogger(c.env.DB);
267
267
  const user = c.get("user");
268
268
  await logger.error("api", `Request failed: ${c.req.method} ${c.req.url}`, error, {
269
269
  userId: user?.userId,
@@ -289,7 +289,7 @@ function securityLoggingMiddleware() {
289
289
  const startTime = Date.now();
290
290
  const requestId = c.get("requestId") || crypto.randomUUID();
291
291
  try {
292
- const logger = chunkWJ7QYVR2_cjs.getLogger(c.env.DB);
292
+ const logger = chunkRNR4HA23_cjs.getLogger(c.env.DB);
293
293
  const user = c.get("user");
294
294
  const method = c.req.method;
295
295
  const url = c.req.url;
@@ -352,7 +352,7 @@ function securityLoggingMiddleware() {
352
352
  }
353
353
  } catch (error) {
354
354
  try {
355
- const logger = chunkWJ7QYVR2_cjs.getLogger(c.env.DB);
355
+ const logger = chunkRNR4HA23_cjs.getLogger(c.env.DB);
356
356
  await logger.error("security", "Security middleware error", error, {
357
357
  requestId,
358
358
  source: "security-middleware"
@@ -372,7 +372,7 @@ function performanceLoggingMiddleware(slowThreshold = 1e3) {
372
372
  const duration = Date.now() - startTime;
373
373
  if (duration > slowThreshold) {
374
374
  try {
375
- const logger = chunkWJ7QYVR2_cjs.getLogger(c.env.DB);
375
+ const logger = chunkRNR4HA23_cjs.getLogger(c.env.DB);
376
376
  const user = c.get("user");
377
377
  await logger.warn("system", `Slow request detected: ${c.req.method} ${c.req.url} took ${duration}ms`, {
378
378
  method: c.req.method,
@@ -729,16 +729,16 @@ function bootstrapMiddleware() {
729
729
  try {
730
730
  console.log("[Bootstrap] Starting system initialization...");
731
731
  console.log("[Bootstrap] Running database migrations...");
732
- const migrationService = new chunkWJ7QYVR2_cjs.MigrationService(c.env.DB);
732
+ const migrationService = new chunkRNR4HA23_cjs.MigrationService(c.env.DB);
733
733
  await migrationService.runPendingMigrations();
734
734
  console.log("[Bootstrap] Syncing collection configurations...");
735
735
  try {
736
- await chunkWJ7QYVR2_cjs.syncCollections(c.env.DB);
736
+ await chunkRNR4HA23_cjs.syncCollections(c.env.DB);
737
737
  } catch (error) {
738
738
  console.error("[Bootstrap] Error syncing collections:", error);
739
739
  }
740
740
  console.log("[Bootstrap] Bootstrapping core plugins...");
741
- const bootstrapService = new chunkWJ7QYVR2_cjs.PluginBootstrapService(c.env.DB);
741
+ const bootstrapService = new chunkRNR4HA23_cjs.PluginBootstrapService(c.env.DB);
742
742
  const needsBootstrap = await bootstrapService.isBootstrapNeeded();
743
743
  if (needsBootstrap) {
744
744
  await bootstrapService.bootstrapCorePlugins();
@@ -772,5 +772,5 @@ exports.requirePermission = requirePermission;
772
772
  exports.requireRole = requireRole;
773
773
  exports.securityHeaders = securityHeaders;
774
774
  exports.securityLoggingMiddleware = securityLoggingMiddleware;
775
- //# sourceMappingURL=chunk-24PWAFUT.cjs.map
776
- //# sourceMappingURL=chunk-24PWAFUT.cjs.map
775
+ //# sourceMappingURL=chunk-BUKT6HP5.cjs.map
776
+ //# sourceMappingURL=chunk-BUKT6HP5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/middleware/auth.ts","../src/middleware/logging.ts","../src/middleware/performance.ts","../src/middleware/permissions.ts","../src/middleware/plugin-middleware.ts","../src/middleware/bootstrap.ts"],"names":["sign","verify","getCookie","getLogger","compress","MigrationService","syncCollections","PluginBootstrapService"],"mappings":"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","file":"chunk-24PWAFUT.cjs","sourcesContent":["import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// JWT secret - in production this should come from environment variables\nconst JWT_SECRET = 'your-super-secret-jwt-key-change-in-production'\n\nexport class AuthManager {\n static async generateToken(userId: string, email: string, role: string): Promise<string> {\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: Math.floor(Date.now() / 1000) + (60 * 60 * 24), // 24 hours\n iat: Math.floor(Date.now() / 1000)\n }\n \n return await sign(payload, JWT_SECRET)\n }\n\n static async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const payload = await verify(token, JWT_SECRET) as JWTPayload\n \n // Check if token is expired\n if (payload.exp < Math.floor(Date.now() / 1000)) {\n return null\n }\n \n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n static async hashPassword(password: string): Promise<string> {\n // In Cloudflare Workers, we'll use Web Crypto API\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, hash: string): Promise<boolean> {\n const passwordHash = await this.hashPassword(password)\n return passwordHash === hash\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n payload = await AuthManager.verifyToken(token)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const payload = await AuthManager.verifyToken(token)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}","import { Context, Next } from 'hono'\nimport { getLogger } from '../services/logger'\n\ntype Bindings = {\n DB: D1Database\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n}\n\n/**\n * Logging middleware that captures HTTP requests and responses\n */\nexport function loggingMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const startTime = Date.now()\n const requestId = crypto.randomUUID()\n\n // Set request context\n c.set('requestId', requestId)\n c.set('startTime', startTime)\n\n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n\n // Extract request information\n const method = c.req.method\n const url = c.req.url\n const userAgent = c.req.header('user-agent') || ''\n const ipAddress = c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n c.req.header('x-real-ip') ||\n 'unknown'\n\n // Continue with request processing\n await next()\n\n const duration = Date.now() - startTime\n const status = c.res.status\n\n // Skip logging for high-frequency endpoints to reduce noise\n const skipLogging = url.includes('/admin/api/metrics')\n\n // Log the request\n if (!skipLogging) {\n await logger.logRequest(method, url, status, duration, {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n source: 'http-middleware'\n })\n }\n\n // Log errors if status >= 400\n if (status >= 400) {\n await logger.warn('api', `HTTP ${status} error for ${method} ${url}`, {\n method,\n url,\n status,\n duration,\n userAgent,\n userId: user?.userId\n }, {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n statusCode: status,\n duration,\n source: 'http-middleware',\n tags: ['http-error', `status-${status}`]\n })\n }\n\n } catch (error) {\n const duration = Date.now() - startTime\n \n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n \n await logger.error('api', `Unhandled error in ${c.req.method} ${c.req.url}`, error, {\n userId: user?.userId,\n requestId,\n ipAddress: c.req.header('cf-connecting-ip') || 'unknown',\n userAgent: c.req.header('user-agent') || '',\n method: c.req.method,\n url: c.req.url,\n duration,\n source: 'http-middleware',\n tags: ['unhandled-error']\n })\n } catch (logError) {\n // Fallback to console if logging fails\n console.error('Failed to log error:', logError)\n console.error('Original error:', error)\n }\n \n throw error\n }\n }\n}\n\n/**\n * Enhanced logging middleware with more detailed request/response logging\n */\nexport function detailedLoggingMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const startTime = Date.now()\n const requestId = crypto.randomUUID()\n \n c.set('requestId', requestId)\n c.set('startTime', startTime)\n\n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n \n const method = c.req.method\n const url = c.req.url\n const userAgent = c.req.header('user-agent') || ''\n const ipAddress = c.req.header('cf-connecting-ip') || \n c.req.header('x-forwarded-for') || \n c.req.header('x-real-ip') || \n 'unknown'\n const contentType = c.req.header('content-type') || ''\n const contentLength = c.req.header('content-length') || ''\n\n // Log request start\n await logger.debug('api', `Starting ${method} ${url}`, {\n method,\n url,\n userAgent,\n contentType,\n contentLength,\n headers: Object.fromEntries(c.req.raw.headers.entries())\n }, {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n source: 'detailed-middleware',\n tags: ['request-start']\n })\n\n await next()\n \n const duration = Date.now() - startTime\n const status = c.res.status\n const responseHeaders = Object.fromEntries(c.res.headers.entries())\n\n // Log request completion\n await logger.info('api', `Completed ${method} ${url} - ${status} (${duration}ms)`, {\n method,\n url,\n status,\n duration,\n responseHeaders,\n responseSize: c.res.headers.get('content-length')\n }, {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n statusCode: status,\n duration,\n source: 'detailed-middleware',\n tags: ['request-complete', `status-${Math.floor(status / 100)}xx`]\n })\n\n } catch (error) {\n const duration = Date.now() - startTime\n \n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n \n await logger.error('api', `Request failed: ${c.req.method} ${c.req.url}`, error, {\n userId: user?.userId,\n requestId,\n ipAddress: c.req.header('cf-connecting-ip') || 'unknown',\n userAgent: c.req.header('user-agent') || '',\n method: c.req.method,\n url: c.req.url,\n duration,\n source: 'detailed-middleware',\n tags: ['request-error']\n })\n } catch (logError) {\n console.error('Failed to log detailed error:', logError)\n console.error('Original error:', error)\n }\n \n throw error\n }\n }\n}\n\n/**\n * Security logging middleware for sensitive operations\n */\nexport function securityLoggingMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const startTime = Date.now()\n const requestId = c.get('requestId') || crypto.randomUUID()\n \n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n const method = c.req.method\n const url = c.req.url\n const ipAddress = c.req.header('cf-connecting-ip') || 'unknown'\n const userAgent = c.req.header('user-agent') || ''\n\n // Check for suspicious patterns\n const suspiciousPatterns = [\n /script[^>]*>/i,\n /javascript:/i,\n /on\\w+\\s*=/i,\n /\\.\\.\\/\\.\\.\\//,\n /\\/etc\\/passwd/i,\n /union\\s+select/i,\n /drop\\s+table/i\n ]\n\n const isSuspicious = suspiciousPatterns.some(pattern => \n pattern.test(url) || pattern.test(userAgent)\n )\n\n if (isSuspicious) {\n await logger.logSecurity('Suspicious request pattern detected', 'medium', {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n source: 'security-middleware',\n tags: ['suspicious-pattern']\n })\n }\n\n await next()\n\n const duration = Date.now() - startTime\n const status = c.res.status\n\n // Log authentication failures\n if (url.includes('/auth/') && status === 401) {\n await logger.logSecurity('Authentication failure', 'low', {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n statusCode: status,\n duration,\n source: 'security-middleware',\n tags: ['auth-failure']\n })\n }\n\n // Log admin access (skip high-frequency endpoints)\n if (url.includes('/admin/') && status < 400 && !url.includes('/admin/api/metrics')) {\n await logger.logSecurity('Admin area access', 'low', {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n statusCode: status,\n duration,\n source: 'security-middleware',\n tags: ['admin-access']\n })\n }\n\n } catch (error) {\n try {\n const logger = getLogger(c.env.DB)\n await logger.error('security', 'Security middleware error', error, {\n requestId,\n source: 'security-middleware'\n })\n } catch (logError) {\n console.error('Failed to log security error:', logError)\n }\n \n throw error\n }\n }\n}\n\n/**\n * Performance logging middleware for slow requests\n */\nexport function performanceLoggingMiddleware(slowThreshold: number = 1000) {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const startTime = Date.now()\n const requestId = c.get('requestId') || crypto.randomUUID()\n \n await next()\n \n const duration = Date.now() - startTime\n \n if (duration > slowThreshold) {\n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n \n await logger.warn('system', `Slow request detected: ${c.req.method} ${c.req.url} took ${duration}ms`, {\n method: c.req.method,\n url: c.req.url,\n duration,\n threshold: slowThreshold\n }, {\n userId: user?.userId,\n requestId,\n method: c.req.method,\n url: c.req.url,\n duration,\n source: 'performance-middleware',\n tags: ['slow-request', 'performance']\n })\n } catch (error) {\n console.error('Failed to log slow request:', error)\n }\n }\n }\n}","import { Context, Next } from 'hono'\nimport { compress } from 'hono/compress'\n\n/**\n * Add cache headers for static admin pages\n * Only caches authenticated pages with short TTL\n */\nexport const cacheHeaders = (maxAge: number = 60) => {\n return async (c: Context, next: Next) => {\n await next()\n\n // Only cache successful HTML responses\n if (c.res.status === 200 && c.res.headers.get('Content-Type')?.includes('text/html')) {\n c.res.headers.set('Cache-Control', `private, max-age=${maxAge}`)\n }\n }\n}\n\n/**\n * Compression middleware - only compress if client supports it\n */\nexport const compressionMiddleware = compress()\n\n/**\n * Set security headers\n */\nexport const securityHeaders = () => {\n return async (c: Context, next: Next) => {\n await next()\n\n // Add security headers\n c.res.headers.set('X-Content-Type-Options', 'nosniff')\n c.res.headers.set('X-Frame-Options', 'SAMEORIGIN')\n c.res.headers.set('X-XSS-Protection', '1; mode=block')\n }\n}\n","import { Context, Next } from 'hono'\n\nexport interface Permission {\n id: string\n name: string\n description: string\n category: string\n}\n\nexport interface UserPermissions {\n userId: string\n role: string\n permissions: string[]\n teamPermissions?: Record<string, string[]>\n}\n\nexport class PermissionManager {\n private static permissionCache = new Map<string, UserPermissions>()\n private static cacheExpiry = new Map<string, number>()\n private static CACHE_TTL = 5 * 60 * 1000 // 5 minutes\n\n /**\n * Get user permissions from database with caching\n */\n static async getUserPermissions(db: D1Database, userId: string): Promise<UserPermissions> {\n const cacheKey = `permissions:${userId}`\n const now = Date.now()\n \n // Check cache\n if (this.permissionCache.has(cacheKey)) {\n const expiry = this.cacheExpiry.get(cacheKey) || 0\n if (now < expiry) {\n return this.permissionCache.get(cacheKey)!\n }\n }\n\n // Get user and role\n const userStmt = db.prepare('SELECT id, role FROM users WHERE id = ? AND is_active = 1')\n const user = await userStmt.bind(userId).first() as any\n\n if (!user) {\n throw new Error('User not found')\n }\n\n // Get role permissions\n const rolePermStmt = db.prepare(`\n SELECT p.name \n FROM role_permissions rp\n JOIN permissions p ON rp.permission_id = p.id\n WHERE rp.role = ?\n `)\n const { results: rolePermissions } = await rolePermStmt.bind(user.role).all()\n \n // Get individual user permissions\n // For now, we only use role-based permissions\n // User-specific permissions table doesn't exist yet\n const rolePerms = (rolePermissions || []).map((row: any) => row.name)\n const permissions = [...rolePerms]\n\n // Get team permissions (if user is in teams)\n const teamPermStmt = db.prepare(`\n SELECT tm.team_id, tm.role, tm.permissions\n FROM team_memberships tm\n WHERE tm.user_id = ?\n `)\n const { results: teamMemberships } = await teamPermStmt.bind(userId).all()\n \n const teamPermissions: Record<string, string[]> = {}\n for (const membership of (teamMemberships || [])) {\n const teamRole = (membership as any).role\n const customPerms = (membership as any).permissions ? JSON.parse((membership as any).permissions) : []\n \n // Get team role permissions\n const teamRolePerms = await rolePermStmt.bind(teamRole).all()\n const teamRolePermissions = (teamRolePerms.results || []).map((row: any) => row.name)\n \n teamPermissions[(membership as any).team_id] = [...teamRolePermissions, ...customPerms]\n }\n\n const userPermissions: UserPermissions = {\n userId,\n role: user.role,\n permissions,\n teamPermissions\n }\n\n // Cache the result\n this.permissionCache.set(cacheKey, userPermissions)\n this.cacheExpiry.set(cacheKey, now + this.CACHE_TTL)\n\n return userPermissions\n }\n\n /**\n * Check if user has a specific permission\n */\n static async hasPermission(db: D1Database, userId: string, permission: string, teamId?: string): Promise<boolean> {\n try {\n console.log('hasPermission called with:', { userId, permission, teamId })\n const userPerms = await this.getUserPermissions(db, userId)\n console.log('User permissions result:', userPerms)\n \n // Check global permissions\n if (userPerms.permissions.includes(permission)) {\n console.log('Permission found in global permissions')\n return true\n }\n\n // Check team-specific permissions\n if (teamId && userPerms.teamPermissions && userPerms.teamPermissions[teamId]) {\n const hasTeamPermission = userPerms.teamPermissions[teamId].includes(permission)\n console.log('Team permission check:', hasTeamPermission)\n return hasTeamPermission\n }\n\n console.log('Permission not found')\n return false\n } catch (error) {\n console.error('Permission check error:', error)\n // For user-specific errors (like \"User not found\"), return false\n // For database connection errors, we should re-throw to let middleware handle them\n if (error instanceof Error && error.message === 'User not found') {\n return false\n }\n // Re-throw other errors (like database connection issues)\n throw error\n }\n }\n\n /**\n * Clear permission cache for a user\n */\n static clearUserCache(userId: string) {\n const cacheKey = `permissions:${userId}`\n this.permissionCache.delete(cacheKey)\n this.cacheExpiry.delete(cacheKey)\n }\n\n /**\n * Clear all permission cache\n */\n static clearAllCache() {\n this.permissionCache.clear()\n this.cacheExpiry.clear()\n }\n\n /**\n * Clear all permission cache (alias for clearAllCache)\n */\n static clearCache() {\n this.clearAllCache()\n }\n\n /**\n * Check multiple permissions at once\n */\n static async checkMultiplePermissions(\n db: D1Database, \n userId: string, \n permissions: string[], \n teamId?: string\n ): Promise<Record<string, boolean>> {\n const result: Record<string, boolean> = {}\n \n for (const permission of permissions) {\n result[permission] = await this.hasPermission(db, userId, permission, teamId)\n }\n \n return result\n }\n\n /**\n * Middleware factory to require specific permissions\n */\n static requirePermissions(permissions: string[], teamIdParam?: string) {\n return async (c: Context, next: Next) => {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const teamId = teamIdParam ? c.req.param(teamIdParam) : undefined\n\n try {\n for (const permission of permissions) {\n const hasPermission = await PermissionManager.hasPermission(db, user.userId, permission, teamId)\n if (!hasPermission) {\n return c.json({ error: `Permission denied: ${permission}` }, 403)\n }\n }\n\n return await next()\n } catch (error) {\n console.error('Permission check error:', error)\n return c.json({ error: 'Permission check failed' }, 500)\n }\n }\n }\n\n /**\n * Get all available permissions from database\n */\n static async getAllPermissions(db: D1Database): Promise<Permission[]> {\n const stmt = db.prepare('SELECT * FROM permissions ORDER BY category, name')\n const { results } = await stmt.all()\n \n return (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n description: row.description,\n category: row.category\n }))\n }\n}\n\n/**\n * Middleware to require specific permission\n */\nexport function requirePermission(permission: string, teamIdParam?: string) {\n return async (c: Context, next: Next) => {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const teamId = teamIdParam ? c.req.param(teamIdParam) : undefined\n\n try {\n const hasPermission = await PermissionManager.hasPermission(db, user.userId, permission, teamId)\n \n if (!hasPermission) {\n return c.json({ error: `Permission denied: ${permission}` }, 403)\n }\n\n return await next()\n } catch (error) {\n console.error('Permission check error:', error)\n return c.json({ error: 'Permission check failed' }, 500)\n }\n }\n}\n\n/**\n * Middleware to require any of the specified permissions\n */\nexport function requireAnyPermission(permissions: string[], teamIdParam?: string) {\n return async (c: Context, next: Next) => {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const teamId = teamIdParam ? c.req.param(teamIdParam) : undefined\n\n try {\n for (const permission of permissions) {\n const hasPermission = await PermissionManager.hasPermission(db, user.userId, permission, teamId)\n if (hasPermission) {\n await next()\n return\n }\n }\n\n return c.json({ error: `Permission denied. Required one of: ${permissions.join(', ')}` }, 403)\n } catch (error) {\n console.error('Permission check error:', error)\n return c.json({ error: 'Permission check failed' }, 500)\n }\n }\n}\n\n/**\n * Helper to log user activity\n */\nexport async function logActivity(\n db: D1Database,\n userId: string,\n action: string,\n resourceType?: string,\n resourceId?: string,\n details?: any,\n ipAddress?: string,\n userAgent?: string\n) {\n try {\n const logStmt = db.prepare(`\n INSERT INTO activity_logs (id, user_id, action, resource_type, resource_id, details, ip_address, user_agent, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await logStmt.bind(\n crypto.randomUUID(),\n userId,\n action,\n resourceType || null,\n resourceId || null,\n details ? JSON.stringify(details) : null,\n ipAddress || null,\n userAgent || null,\n Date.now()\n ).run()\n } catch (error) {\n console.error('Failed to log activity:', error)\n // Don't throw - activity logging failure shouldn't break the main operation\n }\n}","import { Context, Next } from 'hono'\nimport { D1Database } from '@cloudflare/workers-types'\n\ntype Bindings = {\n DB: D1Database\n}\n\n/**\n * Middleware to check if a plugin is active before allowing access to its routes\n */\nexport function requireActivePlugin(pluginName: string) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n try {\n const db = c.env.DB\n \n // Check if plugin exists and is active\n const plugin = await db.prepare(\n 'SELECT status FROM plugins WHERE name = ? AND status = ?'\n ).bind(pluginName, 'active').first()\n\n if (!plugin) {\n // Plugin is not active, return 404 or redirect\n return c.html(`\n <div class=\"min-h-screen flex items-center justify-center bg-gray-900\">\n <div class=\"text-center\">\n <h1 class=\"text-4xl font-bold text-white mb-4\">Feature Not Available</h1>\n <p class=\"text-gray-300 mb-6\">The ${pluginName} plugin is not currently active.</p>\n <a href=\"/admin\" class=\"bg-blue-600 hover:bg-blue-700 text-white px-6 py-3 rounded-lg font-medium\">\n Return to Admin Dashboard\n </a>\n </div>\n </div>\n `, 404)\n }\n\n // Plugin is active, continue to the route\n return await next()\n } catch (error) {\n console.error(`Error checking plugin status for ${pluginName}:`, error)\n // On error, allow access (fail open for stability)\n return await next()\n }\n }\n}\n\n/**\n * Check if multiple plugins are active\n */\nexport function requireActivePlugins(pluginNames: string[]) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n try {\n const db = c.env.DB\n \n // Check if all required plugins are active\n for (const pluginName of pluginNames) {\n const plugin = await db.prepare(\n 'SELECT status FROM plugins WHERE name = ? AND status = ?'\n ).bind(pluginName, 'active').first()\n\n if (!plugin) {\n return c.html(`\n <div class=\"min-h-screen flex items-center justify-center bg-gray-900\">\n <div class=\"text-center\">\n <h1 class=\"text-4xl font-bold text-white mb-4\">Feature Not Available</h1>\n <p class=\"text-gray-300 mb-6\">Required plugin \"${pluginName}\" is not currently active.</p>\n <a href=\"/admin\" class=\"bg-blue-600 hover:bg-blue-700 text-white px-6 py-3 rounded-lg font-medium\">\n Return to Admin Dashboard\n </a>\n </div>\n </div>\n `, 404)\n }\n }\n\n return await next()\n } catch (error) {\n console.error(`Error checking plugin status for plugins:`, pluginNames, error)\n // On error, allow access (fail open for stability)\n return await next()\n }\n }\n}\n\n/**\n * Get list of active plugins for menu generation\n */\nexport async function getActivePlugins(db: D1Database): Promise<Array<{\n name: string\n display_name: string\n icon?: string\n settings?: any\n}>> {\n try {\n const result = await db.prepare(\n 'SELECT name, display_name, icon, settings FROM plugins WHERE status = ? ORDER BY display_name'\n ).bind('active').all()\n\n return result.results?.map((row: any) => ({\n name: row.name,\n display_name: row.display_name,\n icon: row.icon,\n settings: row.settings ? JSON.parse(row.settings) : null\n })) || []\n } catch (error) {\n console.error('Error fetching active plugins:', error)\n return []\n }\n}\n\n/**\n * Check if a specific plugin is active\n */\nexport async function isPluginActive(db: D1Database, pluginName: string): Promise<boolean> {\n try {\n const result = await db.prepare(\n 'SELECT id FROM plugins WHERE name = ? AND status = ?'\n ).bind(pluginName, 'active').first()\n \n return !!result\n } catch (error) {\n console.error(`Error checking if plugin ${pluginName} is active:`, error)\n return false\n }\n}","import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware() {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 3. Bootstrap core plugins\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n"]}
1
+ {"version":3,"sources":["../src/middleware/auth.ts","../src/middleware/logging.ts","../src/middleware/performance.ts","../src/middleware/permissions.ts","../src/middleware/plugin-middleware.ts","../src/middleware/bootstrap.ts"],"names":["sign","verify","getCookie","getLogger","compress","MigrationService","syncCollections","PluginBootstrapService"],"mappings":"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","file":"chunk-BUKT6HP5.cjs","sourcesContent":["import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// JWT secret - in production this should come from environment variables\nconst JWT_SECRET = 'your-super-secret-jwt-key-change-in-production'\n\nexport class AuthManager {\n static async generateToken(userId: string, email: string, role: string): Promise<string> {\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: Math.floor(Date.now() / 1000) + (60 * 60 * 24), // 24 hours\n iat: Math.floor(Date.now() / 1000)\n }\n \n return await sign(payload, JWT_SECRET)\n }\n\n static async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const payload = await verify(token, JWT_SECRET) as JWTPayload\n \n // Check if token is expired\n if (payload.exp < Math.floor(Date.now() / 1000)) {\n return null\n }\n \n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n static async hashPassword(password: string): Promise<string> {\n // In Cloudflare Workers, we'll use Web Crypto API\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, hash: string): Promise<boolean> {\n const passwordHash = await this.hashPassword(password)\n return passwordHash === hash\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n payload = await AuthManager.verifyToken(token)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const payload = await AuthManager.verifyToken(token)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}","import { Context, Next } from 'hono'\nimport { getLogger } from '../services/logger'\n\ntype Bindings = {\n DB: D1Database\n}\n\ntype Variables = {\n user?: {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n }\n requestId?: string\n startTime?: number\n}\n\n/**\n * Logging middleware that captures HTTP requests and responses\n */\nexport function loggingMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const startTime = Date.now()\n const requestId = crypto.randomUUID()\n\n // Set request context\n c.set('requestId', requestId)\n c.set('startTime', startTime)\n\n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n\n // Extract request information\n const method = c.req.method\n const url = c.req.url\n const userAgent = c.req.header('user-agent') || ''\n const ipAddress = c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n c.req.header('x-real-ip') ||\n 'unknown'\n\n // Continue with request processing\n await next()\n\n const duration = Date.now() - startTime\n const status = c.res.status\n\n // Skip logging for high-frequency endpoints to reduce noise\n const skipLogging = url.includes('/admin/api/metrics')\n\n // Log the request\n if (!skipLogging) {\n await logger.logRequest(method, url, status, duration, {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n source: 'http-middleware'\n })\n }\n\n // Log errors if status >= 400\n if (status >= 400) {\n await logger.warn('api', `HTTP ${status} error for ${method} ${url}`, {\n method,\n url,\n status,\n duration,\n userAgent,\n userId: user?.userId\n }, {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n statusCode: status,\n duration,\n source: 'http-middleware',\n tags: ['http-error', `status-${status}`]\n })\n }\n\n } catch (error) {\n const duration = Date.now() - startTime\n \n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n \n await logger.error('api', `Unhandled error in ${c.req.method} ${c.req.url}`, error, {\n userId: user?.userId,\n requestId,\n ipAddress: c.req.header('cf-connecting-ip') || 'unknown',\n userAgent: c.req.header('user-agent') || '',\n method: c.req.method,\n url: c.req.url,\n duration,\n source: 'http-middleware',\n tags: ['unhandled-error']\n })\n } catch (logError) {\n // Fallback to console if logging fails\n console.error('Failed to log error:', logError)\n console.error('Original error:', error)\n }\n \n throw error\n }\n }\n}\n\n/**\n * Enhanced logging middleware with more detailed request/response logging\n */\nexport function detailedLoggingMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const startTime = Date.now()\n const requestId = crypto.randomUUID()\n \n c.set('requestId', requestId)\n c.set('startTime', startTime)\n\n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n \n const method = c.req.method\n const url = c.req.url\n const userAgent = c.req.header('user-agent') || ''\n const ipAddress = c.req.header('cf-connecting-ip') || \n c.req.header('x-forwarded-for') || \n c.req.header('x-real-ip') || \n 'unknown'\n const contentType = c.req.header('content-type') || ''\n const contentLength = c.req.header('content-length') || ''\n\n // Log request start\n await logger.debug('api', `Starting ${method} ${url}`, {\n method,\n url,\n userAgent,\n contentType,\n contentLength,\n headers: Object.fromEntries(c.req.raw.headers.entries())\n }, {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n source: 'detailed-middleware',\n tags: ['request-start']\n })\n\n await next()\n \n const duration = Date.now() - startTime\n const status = c.res.status\n const responseHeaders = Object.fromEntries(c.res.headers.entries())\n\n // Log request completion\n await logger.info('api', `Completed ${method} ${url} - ${status} (${duration}ms)`, {\n method,\n url,\n status,\n duration,\n responseHeaders,\n responseSize: c.res.headers.get('content-length')\n }, {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n statusCode: status,\n duration,\n source: 'detailed-middleware',\n tags: ['request-complete', `status-${Math.floor(status / 100)}xx`]\n })\n\n } catch (error) {\n const duration = Date.now() - startTime\n \n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n \n await logger.error('api', `Request failed: ${c.req.method} ${c.req.url}`, error, {\n userId: user?.userId,\n requestId,\n ipAddress: c.req.header('cf-connecting-ip') || 'unknown',\n userAgent: c.req.header('user-agent') || '',\n method: c.req.method,\n url: c.req.url,\n duration,\n source: 'detailed-middleware',\n tags: ['request-error']\n })\n } catch (logError) {\n console.error('Failed to log detailed error:', logError)\n console.error('Original error:', error)\n }\n \n throw error\n }\n }\n}\n\n/**\n * Security logging middleware for sensitive operations\n */\nexport function securityLoggingMiddleware() {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const startTime = Date.now()\n const requestId = c.get('requestId') || crypto.randomUUID()\n \n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n const method = c.req.method\n const url = c.req.url\n const ipAddress = c.req.header('cf-connecting-ip') || 'unknown'\n const userAgent = c.req.header('user-agent') || ''\n\n // Check for suspicious patterns\n const suspiciousPatterns = [\n /script[^>]*>/i,\n /javascript:/i,\n /on\\w+\\s*=/i,\n /\\.\\.\\/\\.\\.\\//,\n /\\/etc\\/passwd/i,\n /union\\s+select/i,\n /drop\\s+table/i\n ]\n\n const isSuspicious = suspiciousPatterns.some(pattern => \n pattern.test(url) || pattern.test(userAgent)\n )\n\n if (isSuspicious) {\n await logger.logSecurity('Suspicious request pattern detected', 'medium', {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n source: 'security-middleware',\n tags: ['suspicious-pattern']\n })\n }\n\n await next()\n\n const duration = Date.now() - startTime\n const status = c.res.status\n\n // Log authentication failures\n if (url.includes('/auth/') && status === 401) {\n await logger.logSecurity('Authentication failure', 'low', {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n statusCode: status,\n duration,\n source: 'security-middleware',\n tags: ['auth-failure']\n })\n }\n\n // Log admin access (skip high-frequency endpoints)\n if (url.includes('/admin/') && status < 400 && !url.includes('/admin/api/metrics')) {\n await logger.logSecurity('Admin area access', 'low', {\n userId: user?.userId,\n requestId,\n ipAddress,\n userAgent,\n method,\n url,\n statusCode: status,\n duration,\n source: 'security-middleware',\n tags: ['admin-access']\n })\n }\n\n } catch (error) {\n try {\n const logger = getLogger(c.env.DB)\n await logger.error('security', 'Security middleware error', error, {\n requestId,\n source: 'security-middleware'\n })\n } catch (logError) {\n console.error('Failed to log security error:', logError)\n }\n \n throw error\n }\n }\n}\n\n/**\n * Performance logging middleware for slow requests\n */\nexport function performanceLoggingMiddleware(slowThreshold: number = 1000) {\n return async (c: Context<{ Bindings: Bindings; Variables: Variables }>, next: Next) => {\n const startTime = Date.now()\n const requestId = c.get('requestId') || crypto.randomUUID()\n \n await next()\n \n const duration = Date.now() - startTime\n \n if (duration > slowThreshold) {\n try {\n const logger = getLogger(c.env.DB)\n const user = c.get('user')\n \n await logger.warn('system', `Slow request detected: ${c.req.method} ${c.req.url} took ${duration}ms`, {\n method: c.req.method,\n url: c.req.url,\n duration,\n threshold: slowThreshold\n }, {\n userId: user?.userId,\n requestId,\n method: c.req.method,\n url: c.req.url,\n duration,\n source: 'performance-middleware',\n tags: ['slow-request', 'performance']\n })\n } catch (error) {\n console.error('Failed to log slow request:', error)\n }\n }\n }\n}","import { Context, Next } from 'hono'\nimport { compress } from 'hono/compress'\n\n/**\n * Add cache headers for static admin pages\n * Only caches authenticated pages with short TTL\n */\nexport const cacheHeaders = (maxAge: number = 60) => {\n return async (c: Context, next: Next) => {\n await next()\n\n // Only cache successful HTML responses\n if (c.res.status === 200 && c.res.headers.get('Content-Type')?.includes('text/html')) {\n c.res.headers.set('Cache-Control', `private, max-age=${maxAge}`)\n }\n }\n}\n\n/**\n * Compression middleware - only compress if client supports it\n */\nexport const compressionMiddleware = compress()\n\n/**\n * Set security headers\n */\nexport const securityHeaders = () => {\n return async (c: Context, next: Next) => {\n await next()\n\n // Add security headers\n c.res.headers.set('X-Content-Type-Options', 'nosniff')\n c.res.headers.set('X-Frame-Options', 'SAMEORIGIN')\n c.res.headers.set('X-XSS-Protection', '1; mode=block')\n }\n}\n","import { Context, Next } from 'hono'\n\nexport interface Permission {\n id: string\n name: string\n description: string\n category: string\n}\n\nexport interface UserPermissions {\n userId: string\n role: string\n permissions: string[]\n teamPermissions?: Record<string, string[]>\n}\n\nexport class PermissionManager {\n private static permissionCache = new Map<string, UserPermissions>()\n private static cacheExpiry = new Map<string, number>()\n private static CACHE_TTL = 5 * 60 * 1000 // 5 minutes\n\n /**\n * Get user permissions from database with caching\n */\n static async getUserPermissions(db: D1Database, userId: string): Promise<UserPermissions> {\n const cacheKey = `permissions:${userId}`\n const now = Date.now()\n \n // Check cache\n if (this.permissionCache.has(cacheKey)) {\n const expiry = this.cacheExpiry.get(cacheKey) || 0\n if (now < expiry) {\n return this.permissionCache.get(cacheKey)!\n }\n }\n\n // Get user and role\n const userStmt = db.prepare('SELECT id, role FROM users WHERE id = ? AND is_active = 1')\n const user = await userStmt.bind(userId).first() as any\n\n if (!user) {\n throw new Error('User not found')\n }\n\n // Get role permissions\n const rolePermStmt = db.prepare(`\n SELECT p.name \n FROM role_permissions rp\n JOIN permissions p ON rp.permission_id = p.id\n WHERE rp.role = ?\n `)\n const { results: rolePermissions } = await rolePermStmt.bind(user.role).all()\n \n // Get individual user permissions\n // For now, we only use role-based permissions\n // User-specific permissions table doesn't exist yet\n const rolePerms = (rolePermissions || []).map((row: any) => row.name)\n const permissions = [...rolePerms]\n\n // Get team permissions (if user is in teams)\n const teamPermStmt = db.prepare(`\n SELECT tm.team_id, tm.role, tm.permissions\n FROM team_memberships tm\n WHERE tm.user_id = ?\n `)\n const { results: teamMemberships } = await teamPermStmt.bind(userId).all()\n \n const teamPermissions: Record<string, string[]> = {}\n for (const membership of (teamMemberships || [])) {\n const teamRole = (membership as any).role\n const customPerms = (membership as any).permissions ? JSON.parse((membership as any).permissions) : []\n \n // Get team role permissions\n const teamRolePerms = await rolePermStmt.bind(teamRole).all()\n const teamRolePermissions = (teamRolePerms.results || []).map((row: any) => row.name)\n \n teamPermissions[(membership as any).team_id] = [...teamRolePermissions, ...customPerms]\n }\n\n const userPermissions: UserPermissions = {\n userId,\n role: user.role,\n permissions,\n teamPermissions\n }\n\n // Cache the result\n this.permissionCache.set(cacheKey, userPermissions)\n this.cacheExpiry.set(cacheKey, now + this.CACHE_TTL)\n\n return userPermissions\n }\n\n /**\n * Check if user has a specific permission\n */\n static async hasPermission(db: D1Database, userId: string, permission: string, teamId?: string): Promise<boolean> {\n try {\n console.log('hasPermission called with:', { userId, permission, teamId })\n const userPerms = await this.getUserPermissions(db, userId)\n console.log('User permissions result:', userPerms)\n \n // Check global permissions\n if (userPerms.permissions.includes(permission)) {\n console.log('Permission found in global permissions')\n return true\n }\n\n // Check team-specific permissions\n if (teamId && userPerms.teamPermissions && userPerms.teamPermissions[teamId]) {\n const hasTeamPermission = userPerms.teamPermissions[teamId].includes(permission)\n console.log('Team permission check:', hasTeamPermission)\n return hasTeamPermission\n }\n\n console.log('Permission not found')\n return false\n } catch (error) {\n console.error('Permission check error:', error)\n // For user-specific errors (like \"User not found\"), return false\n // For database connection errors, we should re-throw to let middleware handle them\n if (error instanceof Error && error.message === 'User not found') {\n return false\n }\n // Re-throw other errors (like database connection issues)\n throw error\n }\n }\n\n /**\n * Clear permission cache for a user\n */\n static clearUserCache(userId: string) {\n const cacheKey = `permissions:${userId}`\n this.permissionCache.delete(cacheKey)\n this.cacheExpiry.delete(cacheKey)\n }\n\n /**\n * Clear all permission cache\n */\n static clearAllCache() {\n this.permissionCache.clear()\n this.cacheExpiry.clear()\n }\n\n /**\n * Clear all permission cache (alias for clearAllCache)\n */\n static clearCache() {\n this.clearAllCache()\n }\n\n /**\n * Check multiple permissions at once\n */\n static async checkMultiplePermissions(\n db: D1Database, \n userId: string, \n permissions: string[], \n teamId?: string\n ): Promise<Record<string, boolean>> {\n const result: Record<string, boolean> = {}\n \n for (const permission of permissions) {\n result[permission] = await this.hasPermission(db, userId, permission, teamId)\n }\n \n return result\n }\n\n /**\n * Middleware factory to require specific permissions\n */\n static requirePermissions(permissions: string[], teamIdParam?: string) {\n return async (c: Context, next: Next) => {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const teamId = teamIdParam ? c.req.param(teamIdParam) : undefined\n\n try {\n for (const permission of permissions) {\n const hasPermission = await PermissionManager.hasPermission(db, user.userId, permission, teamId)\n if (!hasPermission) {\n return c.json({ error: `Permission denied: ${permission}` }, 403)\n }\n }\n\n return await next()\n } catch (error) {\n console.error('Permission check error:', error)\n return c.json({ error: 'Permission check failed' }, 500)\n }\n }\n }\n\n /**\n * Get all available permissions from database\n */\n static async getAllPermissions(db: D1Database): Promise<Permission[]> {\n const stmt = db.prepare('SELECT * FROM permissions ORDER BY category, name')\n const { results } = await stmt.all()\n \n return (results || []).map((row: any) => ({\n id: row.id,\n name: row.name,\n description: row.description,\n category: row.category\n }))\n }\n}\n\n/**\n * Middleware to require specific permission\n */\nexport function requirePermission(permission: string, teamIdParam?: string) {\n return async (c: Context, next: Next) => {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const teamId = teamIdParam ? c.req.param(teamIdParam) : undefined\n\n try {\n const hasPermission = await PermissionManager.hasPermission(db, user.userId, permission, teamId)\n \n if (!hasPermission) {\n return c.json({ error: `Permission denied: ${permission}` }, 403)\n }\n\n return await next()\n } catch (error) {\n console.error('Permission check error:', error)\n return c.json({ error: 'Permission check failed' }, 500)\n }\n }\n}\n\n/**\n * Middleware to require any of the specified permissions\n */\nexport function requireAnyPermission(permissions: string[], teamIdParam?: string) {\n return async (c: Context, next: Next) => {\n const user = c.get('user')\n if (!user) {\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n const db = c.env.DB\n const teamId = teamIdParam ? c.req.param(teamIdParam) : undefined\n\n try {\n for (const permission of permissions) {\n const hasPermission = await PermissionManager.hasPermission(db, user.userId, permission, teamId)\n if (hasPermission) {\n await next()\n return\n }\n }\n\n return c.json({ error: `Permission denied. Required one of: ${permissions.join(', ')}` }, 403)\n } catch (error) {\n console.error('Permission check error:', error)\n return c.json({ error: 'Permission check failed' }, 500)\n }\n }\n}\n\n/**\n * Helper to log user activity\n */\nexport async function logActivity(\n db: D1Database,\n userId: string,\n action: string,\n resourceType?: string,\n resourceId?: string,\n details?: any,\n ipAddress?: string,\n userAgent?: string\n) {\n try {\n const logStmt = db.prepare(`\n INSERT INTO activity_logs (id, user_id, action, resource_type, resource_id, details, ip_address, user_agent, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)\n\n await logStmt.bind(\n crypto.randomUUID(),\n userId,\n action,\n resourceType || null,\n resourceId || null,\n details ? JSON.stringify(details) : null,\n ipAddress || null,\n userAgent || null,\n Date.now()\n ).run()\n } catch (error) {\n console.error('Failed to log activity:', error)\n // Don't throw - activity logging failure shouldn't break the main operation\n }\n}","import { Context, Next } from 'hono'\nimport { D1Database } from '@cloudflare/workers-types'\n\ntype Bindings = {\n DB: D1Database\n}\n\n/**\n * Middleware to check if a plugin is active before allowing access to its routes\n */\nexport function requireActivePlugin(pluginName: string) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n try {\n const db = c.env.DB\n \n // Check if plugin exists and is active\n const plugin = await db.prepare(\n 'SELECT status FROM plugins WHERE name = ? AND status = ?'\n ).bind(pluginName, 'active').first()\n\n if (!plugin) {\n // Plugin is not active, return 404 or redirect\n return c.html(`\n <div class=\"min-h-screen flex items-center justify-center bg-gray-900\">\n <div class=\"text-center\">\n <h1 class=\"text-4xl font-bold text-white mb-4\">Feature Not Available</h1>\n <p class=\"text-gray-300 mb-6\">The ${pluginName} plugin is not currently active.</p>\n <a href=\"/admin\" class=\"bg-blue-600 hover:bg-blue-700 text-white px-6 py-3 rounded-lg font-medium\">\n Return to Admin Dashboard\n </a>\n </div>\n </div>\n `, 404)\n }\n\n // Plugin is active, continue to the route\n return await next()\n } catch (error) {\n console.error(`Error checking plugin status for ${pluginName}:`, error)\n // On error, allow access (fail open for stability)\n return await next()\n }\n }\n}\n\n/**\n * Check if multiple plugins are active\n */\nexport function requireActivePlugins(pluginNames: string[]) {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n try {\n const db = c.env.DB\n \n // Check if all required plugins are active\n for (const pluginName of pluginNames) {\n const plugin = await db.prepare(\n 'SELECT status FROM plugins WHERE name = ? AND status = ?'\n ).bind(pluginName, 'active').first()\n\n if (!plugin) {\n return c.html(`\n <div class=\"min-h-screen flex items-center justify-center bg-gray-900\">\n <div class=\"text-center\">\n <h1 class=\"text-4xl font-bold text-white mb-4\">Feature Not Available</h1>\n <p class=\"text-gray-300 mb-6\">Required plugin \"${pluginName}\" is not currently active.</p>\n <a href=\"/admin\" class=\"bg-blue-600 hover:bg-blue-700 text-white px-6 py-3 rounded-lg font-medium\">\n Return to Admin Dashboard\n </a>\n </div>\n </div>\n `, 404)\n }\n }\n\n return await next()\n } catch (error) {\n console.error(`Error checking plugin status for plugins:`, pluginNames, error)\n // On error, allow access (fail open for stability)\n return await next()\n }\n }\n}\n\n/**\n * Get list of active plugins for menu generation\n */\nexport async function getActivePlugins(db: D1Database): Promise<Array<{\n name: string\n display_name: string\n icon?: string\n settings?: any\n}>> {\n try {\n const result = await db.prepare(\n 'SELECT name, display_name, icon, settings FROM plugins WHERE status = ? ORDER BY display_name'\n ).bind('active').all()\n\n return result.results?.map((row: any) => ({\n name: row.name,\n display_name: row.display_name,\n icon: row.icon,\n settings: row.settings ? JSON.parse(row.settings) : null\n })) || []\n } catch (error) {\n console.error('Error fetching active plugins:', error)\n return []\n }\n}\n\n/**\n * Check if a specific plugin is active\n */\nexport async function isPluginActive(db: D1Database, pluginName: string): Promise<boolean> {\n try {\n const result = await db.prepare(\n 'SELECT id FROM plugins WHERE name = ? AND status = ?'\n ).bind(pluginName, 'active').first()\n \n return !!result\n } catch (error) {\n console.error(`Error checking if plugin ${pluginName} is active:`, error)\n return false\n }\n}","import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware() {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 3. Bootstrap core plugins\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n"]}