@kyro-cms/core 0.9.5 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-handler-graphql.cjs +10 -10
- package/dist/api-handler-graphql.js +6 -6
- package/dist/api-handler-trpc.cjs +8 -8
- package/dist/api-handler-trpc.js +6 -6
- package/dist/api-handler.cjs +9 -9
- package/dist/api-handler.js +6 -6
- package/dist/{chunk-YFAVQQTU.js → chunk-AX2TZRQJ.js} +3 -3
- package/dist/{chunk-YFAVQQTU.js.map → chunk-AX2TZRQJ.js.map} +1 -1
- package/dist/{chunk-5H3MWQJS.js → chunk-CMXVTUYV.js} +12 -12
- package/dist/chunk-CMXVTUYV.js.map +1 -0
- package/dist/{chunk-E2763JUP.cjs → chunk-DRVOUQMT.cjs} +27 -27
- package/dist/chunk-DRVOUQMT.cjs.map +1 -0
- package/dist/{chunk-4M7X5HAB.cjs → chunk-FKKQUMXR.cjs} +109 -3
- package/dist/chunk-FKKQUMXR.cjs.map +1 -0
- package/dist/{chunk-PV2I2KMI.cjs → chunk-HVCUIII2.cjs} +21 -75
- package/dist/chunk-HVCUIII2.cjs.map +1 -0
- package/dist/{chunk-CJONKRHJ.js → chunk-NZEUU7QB.js} +108 -3
- package/dist/chunk-NZEUU7QB.js.map +1 -0
- package/dist/{chunk-NWUEVLQT.cjs → chunk-OZ3CCTTA.cjs} +5 -5
- package/dist/{chunk-NWUEVLQT.cjs.map → chunk-OZ3CCTTA.cjs.map} +1 -1
- package/dist/chunk-PONTBXR5.js +842 -0
- package/dist/chunk-PONTBXR5.js.map +1 -0
- package/dist/{chunk-CNKT4PME.cjs → chunk-QVJNSAQL.cjs} +71 -149
- package/dist/chunk-QVJNSAQL.cjs.map +1 -0
- package/dist/{chunk-OHC6UHFY.js → chunk-QX3WNQ7V.js} +18 -72
- package/dist/chunk-QX3WNQ7V.js.map +1 -0
- package/dist/chunk-RRKCIAPU.cjs +848 -0
- package/dist/chunk-RRKCIAPU.cjs.map +1 -0
- package/dist/{chunk-IPTZM3VE.js → chunk-VLK5SJRI.js} +56 -134
- package/dist/chunk-VLK5SJRI.js.map +1 -0
- package/dist/graphql/index.cjs +8 -4
- package/dist/graphql/index.d.cts +4 -1
- package/dist/graphql/index.d.ts +4 -1
- package/dist/graphql/index.js +2 -2
- package/dist/index.cjs +57 -57
- package/dist/index.js +6 -6
- package/dist/rest/index.cjs +4 -4
- package/dist/rest/index.js +2 -2
- package/dist/trpc/index.cjs +11 -11
- package/dist/trpc/index.js +2 -2
- package/package.json +2 -2
- package/dist/chunk-3HR772HI.cjs +0 -555
- package/dist/chunk-3HR772HI.cjs.map +0 -1
- package/dist/chunk-4M7X5HAB.cjs.map +0 -1
- package/dist/chunk-5H3MWQJS.js.map +0 -1
- package/dist/chunk-CJONKRHJ.js.map +0 -1
- package/dist/chunk-CNKT4PME.cjs.map +0 -1
- package/dist/chunk-E2763JUP.cjs.map +0 -1
- package/dist/chunk-IPTZM3VE.js.map +0 -1
- package/dist/chunk-L5UKKZQN.js +0 -552
- package/dist/chunk-L5UKKZQN.js.map +0 -1
- package/dist/chunk-OHC6UHFY.js.map +0 -1
- package/dist/chunk-PV2I2KMI.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/secret.ts","../src/api/rest/auth-session.ts","../src/api/rest/auth-middleware.ts","../src/api/rest/hono-app.ts","../src/auth/security/in-memory-rate-limit.ts","../src/auth/security/audit-log-types.ts","../src/auth/security/audit-log.ts","../src/auth/security/in-memory-audit-log.ts","../src/api/rest/auth-routes.ts","../src/storage/local.ts","../src/storage/imgix.ts","../src/storage/bunny.ts","../src/storage/registry.ts","../src/storage/s3.ts","../src/storage/cloudinary.ts","../src/storage/ftp.ts","../src/storage/index.ts","../src/storage/processor.ts","../src/storage/MediaService.ts"],"names":["crypto","__esm","__export","createStorage","fsDriver","extractApiKeyFromRequest","validateApiKey","createApiKeyContext","randomBytes","createAuditContext","PasswordPolicy","__toCommonJS","join","process","existsSync","mkdir","extname","createHash","writeFile","basename","unlink","rename","readdir","stat","path","getUrlPrefix","S3Client","NodeHttpHandler","getUrl","PutObjectCommand","HeadObjectCommand","DeleteObjectCommand","CopyObjectCommand","ListObjectsV2Command","DeleteObjectsCommand","Client","Readable","sharp","storage","genId","ConfigService","row","totalDocs","WEBHOOK_EVENTS","evaluateAccess","hasApiKeyPermission","hasPermission","DrizzleAdapter","PostgresAuthAdapter","MongoDBAdapter","MongoDBAuthAdapter","resolve","SQLiteAuthAdapter","Hono","user","EmailTransport","collections","usersCollection","result","readFileSync","zodToJsonSchema","db","registry","API_KEY_COLLECTION","generateApiKey","generateApiKeyPrefix","computeDiff"],"mappings":"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","file":"chunk-CNKT4PME.cjs","sourcesContent":["// ============================================================================\n// Secret Management Utility\n// Reads secrets from DB (system global) with env fallback\n// ============================================================================\n\nimport crypto from 'crypto';\n\nlet dbAdapter: any = null;\nlet cachedSecrets: {\n appSecret: string | null;\n encryptionKey: string | null;\n sessionConfig: {\n maxAge: number;\n maxSessionsPerUser: number;\n } | null;\n} | null = null;\n\nexport function setDbAdapter(adapter: any) {\n dbAdapter = adapter;\n}\n\nfunction generateEncryptionKey(): string {\n return crypto.randomBytes(32).toString('hex');\n}\n\nexport async function loadSecrets(): Promise<void> {\n // Try to load from DB first\n if (dbAdapter) {\n try {\n const result = await dbAdapter.findOne({\n collection: '_globals_system',\n where: {},\n });\n\n if (result) {\n cachedSecrets = {\n appSecret: result.appSecret || null,\n encryptionKey: result.encryptionKey || null,\n sessionConfig: result.sessionMaxAge || result.maxSessionsPerUser\n ? {\n maxAge: (result.sessionMaxAge || 7) * 24 * 60 * 60 * 1000,\n maxSessionsPerUser: result.maxSessionsPerUser || 3,\n }\n : null,\n };\n console.log('🔐 Loaded secrets from database');\n return;\n }\n } catch (e) {\n console.log('⚠️ Could not load system settings from DB, using env fallback');\n }\n }\n\n // Fall back to environment\n cachedSecrets = {\n appSecret: process.env.APP_SECRET || 'development-secret-key',\n encryptionKey: null, // Will be generated\n sessionConfig: null, // Will use defaults\n };\n}\n\nexport function getAppSecret(): string {\n if (cachedSecrets?.appSecret) {\n return cachedSecrets.appSecret;\n }\n return process.env.APP_SECRET || 'development-secret-key';\n}\n\nexport function getEncryptionKey(): string {\n if (cachedSecrets?.encryptionKey) {\n return cachedSecrets.encryptionKey;\n }\n // Derive from app secret if not in DB\n const secret = getAppSecret();\n return crypto.createHash('sha256').update(secret).digest('hex');\n}\n\nexport function getSessionConfig() {\n if (cachedSecrets?.sessionConfig) {\n return cachedSecrets.sessionConfig;\n }\n // Return defaults\n return {\n maxAge: 7 * 24 * 60 * 60 * 1000,\n maxSessionsPerUser: 3,\n };\n}\n\nexport function getDerivedEncryptionKey(secret?: string): string {\n const appSecret = secret || getAppSecret();\n return crypto.createHash('sha256').update(appSecret).digest('hex');\n}","import crypto from \"crypto\";\nimport { getSessionConfig } from \"../../lib/secret.js\";\nimport { createStorage } from \"unstorage\";\nimport fsDriver from \"unstorage/drivers/fs\";\n\n// Get session config from DB or defaults\nconst sessionConfig = getSessionConfig();\n\nexport const SESSION_CONFIG = {\n absoluteMaxAge: sessionConfig.maxAge,\n maxSessionsPerUser: sessionConfig.maxSessionsPerUser,\n refreshThreshold: 5 * 60 * 1000,\n activityDebounce: 30 * 1000,\n pollInterval: 30 * 1000,\n};\n\nconst SESSION_COOKIE_NAME = \"kyro-session\";\n\nexport interface SessionData {\n id: string;\n userId: string;\n email: string;\n role: string;\n tenantId?: string;\n permissions?: string[];\n createdAt: number;\n expiresAt: number;\n lastActivityAt: number;\n deviceInfo?: {\n userAgent?: string;\n ip?: string;\n platform?: string;\n browser?: string;\n device?: string;\n };\n sessionName?: string;\n}\n\nexport interface UserSessionInfo {\n id: string;\n sessionName: string;\n deviceInfo?: {\n userAgent?: string;\n ip?: string;\n platform?: string;\n browser?: string;\n device?: string;\n };\n createdAt: number;\n lastActivityAt: number;\n currentSession: boolean;\n}\n\nlet storage: any = null;\n\nasync function getStorage() {\n if (storage) return storage;\n\n storage = createStorage({\n driver: fsDriver({ base: \".astro/sessions\" }),\n });\n\n return storage;\n}\n\nfunction generateSessionId(): string {\n return crypto.randomUUID();\n}\n\nfunction parseUserAgent(userAgent: string): {\n browser: string;\n device: string;\n platform: string;\n} {\n let browser = \"Unknown\";\n let device = \"Unknown\";\n let platform = \"Unknown\";\n\n if (userAgent.includes(\"Firefox\")) {\n browser = \"Firefox\";\n } else if (userAgent.includes(\"Edg/\")) {\n browser = \"Edge\";\n } else if (userAgent.includes(\"Chrome\")) {\n browser = \"Chrome\";\n } else if (userAgent.includes(\"Safari\") && !userAgent.includes(\"Chrome\")) {\n browser = \"Safari\";\n }\n\n if (userAgent.includes(\"iPhone\")) {\n device = \"iPhone\";\n platform = \"iOS\";\n } else if (userAgent.includes(\"iPad\")) {\n device = \"iPad\";\n platform = \"iOS\";\n } else if (userAgent.includes(\"Mac\")) {\n device = \"MacBook\";\n platform = \"macOS\";\n } else if (userAgent.includes(\"Windows\")) {\n device = \"Windows PC\";\n platform = \"Windows\";\n } else if (userAgent.includes(\"Linux\")) {\n device = \"Linux PC\";\n platform = \"Linux\";\n } else if (userAgent.includes(\"Android\")) {\n device = \"Android Phone\";\n platform = \"Android\";\n }\n\n return { browser, device, platform };\n}\n\nfunction generateSessionName(deviceInfo?: SessionData[\"deviceInfo\"]): string {\n if (!deviceInfo?.userAgent) {\n return \"Session\";\n }\n\n const { browser, device } = parseUserAgent(deviceInfo.userAgent);\n return `${device} - ${browser}`;\n}\n\nexport function getSessionIdFromRequest(request: Request): string | null {\n const cookieHeader = request.headers.get(\"Cookie\");\n if (!cookieHeader) return null;\n\n const cookies = Object.fromEntries(\n cookieHeader.split(\"; \").map((c) => c.split(\"=\")),\n );\n\n return cookies[SESSION_COOKIE_NAME] || null;\n}\n\nexport function getClientIp(request: Request): string {\n const forwarded = request.headers.get(\"x-forwarded-for\");\n if (forwarded) {\n return forwarded.split(\",\")[0].trim();\n }\n return request.headers.get(\"x-real-ip\") || \"unknown\";\n}\n\nexport function setSessionCookie(\n response: Response,\n sessionId: string,\n): Response {\n const headers = new Headers(response.headers);\n headers.append(\n \"Set-Cookie\",\n `${SESSION_COOKIE_NAME}=${sessionId}; HttpOnly; Path=/; Max-Age=${SESSION_CONFIG.absoluteMaxAge / 1000}; SameSite=Strict`,\n );\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nexport function clearSessionCookie(response: Response): Response {\n const headers = new Headers(response.headers);\n headers.append(\n \"Set-Cookie\",\n `${SESSION_COOKIE_NAME}=; HttpOnly; Path=/; Max-Age=0; SameSite=Strict`,\n );\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nasync function getUserSessionList(userId: string): Promise<string[]> {\n const store = await getStorage();\n const sessions = await store.getItem(`user:${userId}`);\n return sessions || [];\n}\n\nasync function setUserSessionList(\n userId: string,\n sessionIds: string[],\n): Promise<void> {\n const store = await getStorage();\n if (sessionIds.length > 0) {\n await store.setItem(`user:${userId}`, sessionIds);\n } else {\n await store.removeItem(`user:${userId}`);\n }\n}\n\nexport async function createSession(\n user: {\n id: string;\n email: string;\n role: string;\n tenantId?: string;\n permissions?: string[];\n },\n request?: Request,\n): Promise<string> {\n const store = await getStorage();\n\n // Get existing sessions for user\n const existingSessions = await getUserSessionList(user.id);\n\n // Enforce max sessions - remove oldest if at limit\n while (existingSessions.length >= SESSION_CONFIG.maxSessionsPerUser) {\n const oldestSessionId = existingSessions.shift();\n if (oldestSessionId) {\n await store.removeItem(`session:${oldestSessionId}`);\n }\n }\n\n const sessionId = generateSessionId();\n const now = Date.now();\n\n const userAgent = request?.headers.get(\"user-agent\");\n const clientIp = request ? getClientIp(request) : \"unknown\";\n\n const deviceInfo = userAgent\n ? {\n userAgent,\n ip: clientIp,\n ...parseUserAgent(userAgent),\n }\n : { ip: clientIp };\n\n const sessionData: SessionData = {\n id: sessionId,\n userId: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n permissions: user.permissions,\n createdAt: now,\n expiresAt: now + SESSION_CONFIG.absoluteMaxAge,\n lastActivityAt: now,\n deviceInfo,\n sessionName: generateSessionName(deviceInfo),\n };\n\n await store.setItem(\n `session:${sessionId}`,\n sessionData,\n { ttl: Math.floor(SESSION_CONFIG.absoluteMaxAge / 1000) },\n );\n\n // Add to user's session list\n existingSessions.push(sessionId);\n await setUserSessionList(user.id, existingSessions);\n\n return sessionId;\n}\n\nexport async function getSession(\n sessionId: string,\n): Promise<SessionData | null> {\n const store = await getStorage();\n const session = await store.getItem(`session:${sessionId}`);\n return session || null;\n}\n\nexport async function validateSession(\n sessionId: string,\n): Promise<{ valid: boolean; reason?: string }> {\n const session = await getSession(sessionId);\n\n if (!session) {\n return { valid: false, reason: \"Session not found\" };\n }\n\n // Check absolute expiration\n if (session.expiresAt < Date.now()) {\n await deleteSession(sessionId);\n return { valid: false, reason: \"Session expired\" };\n }\n\n return { valid: true };\n}\n\nexport async function refreshSession(\n sessionId: string,\n request?: Request,\n): Promise<SessionData | null> {\n const store = await getStorage();\n const session = await getSession(sessionId);\n\n if (!session) return null;\n\n // Update last activity and extend TTL if needed\n const now = Date.now();\n const timeRemaining = session.expiresAt - now;\n\n // Update device info if IP changed\n let deviceInfo = session.deviceInfo;\n if (request) {\n const newIp = getClientIp(request);\n if (newIp !== session.deviceInfo?.ip) {\n deviceInfo = { ...session.deviceInfo, ip: newIp };\n }\n }\n\n const updatedSession: SessionData = {\n ...session,\n lastActivityAt: now,\n expiresAt:\n timeRemaining < SESSION_CONFIG.refreshThreshold\n ? now + SESSION_CONFIG.absoluteMaxAge\n : session.expiresAt,\n deviceInfo,\n };\n\n const ttl =\n timeRemaining < SESSION_CONFIG.refreshThreshold\n ? SESSION_CONFIG.absoluteMaxAge\n : undefined;\n\n await store.setItem(\n `session:${sessionId}`,\n updatedSession,\n ttl ? { ttl: Math.floor(ttl / 1000) } : undefined,\n );\n\n return updatedSession;\n}\n\nexport async function trackActivity(sessionId: string): Promise<void> {\n const session = await getSession(sessionId);\n if (!session) return;\n\n const store = await getStorage();\n await store.setItem(`activity:${sessionId}`, Date.now());\n}\n\nexport async function deleteSession(sessionId: string): Promise<void> {\n const store = await getStorage();\n const session = await getSession(sessionId);\n\n if (session) {\n // Remove from user's session list\n const sessions = await getUserSessionList(session.userId);\n const updatedSessions = sessions.filter((id) => id !== sessionId);\n await setUserSessionList(session.userId, updatedSessions);\n }\n\n await store.removeItem(`session:${sessionId}`);\n await store.removeItem(`activity:${sessionId}`);\n}\n\nexport async function invalidateAllUserSessions(userId: string): Promise<void> {\n const sessions = await getUserSessionList(userId);\n const store = await getStorage();\n\n for (const sessionId of sessions) {\n await store.removeItem(`session:${sessionId}`);\n await store.removeItem(`activity:${sessionId}`);\n }\n\n await setUserSessionList(userId, []);\n}\n\nexport async function getUserSessions(\n userId: string,\n currentSessionId?: string,\n): Promise<UserSessionInfo[]> {\n const sessionIds = await getUserSessionList(userId);\n const sessions: UserSessionInfo[] = [];\n\n for (const sessionId of sessionIds) {\n const session = await getSession(sessionId);\n if (session) {\n sessions.push({\n id: session.id,\n sessionName: session.sessionName || \"Session\",\n deviceInfo: session.deviceInfo,\n createdAt: session.createdAt,\n lastActivityAt: session.lastActivityAt,\n currentSession: session.id === currentSessionId,\n });\n }\n }\n\n // Sort by last activity (most recent first)\n sessions.sort((a, b) => b.lastActivityAt - a.lastActivityAt);\n\n return sessions;\n}\n\nexport async function updateSessionName(\n sessionId: string,\n name: string,\n): Promise<boolean> {\n const session = await getSession(sessionId);\n if (!session) return false;\n\n const store = await getStorage();\n await store.setItem(`session:${sessionId}`, { ...session, sessionName: name });\n\n return true;\n}\n\nexport async function getCurrentUser(\n request: Request,\n): Promise<SessionData | null> {\n const sessionId = getSessionIdFromRequest(request);\n if (!sessionId) return null;\n\n const validation = await validateSession(sessionId);\n if (!validation.valid) return null;\n\n const session = await getSession(sessionId);\n if (!session) return null;\n\n // Update activity on each request\n await refreshSession(sessionId, request);\n\n return session;\n}\n\n\n","import type { AuthUser, JWTPayload } from \"../../auth/types.js\";\nimport type { TenantContext } from \"../../auth/rls/tenant.js\";\nimport type { BaseAdapter } from \"../../registry/types.js\";\nimport {\n validateApiKey,\n extractApiKeyFromRequest,\n createApiKeyContext,\n hasApiKeyPermission,\n} from \"../../auth/api-key.js\";\nimport { \n getCurrentUser, \n getSessionIdFromRequest, \n validateSession,\n SESSION_CONFIG \n} from \"./auth-session.js\";\n\nexport interface AuthMiddlewareConfig {\n secret: string;\n issuer?: string;\n audience?: string;\n db?: BaseAdapter;\n userLookup?: (userId: string) => Promise<Partial<AuthUser> | null>;\n checkSession?: (userId: string, token: string, req?: Request, payload?: JWTPayload) => Promise<boolean>;\n}\n\nexport interface AuthenticatedContext {\n user?: AuthUser;\n token?: string;\n tenantContext?: TenantContext;\n apiKeyContext?: ReturnType<typeof createApiKeyContext>;\n}\n\nexport interface AuthMiddlewareResult {\n user?: Partial<AuthUser>;\n token?: string;\n tenantContext?: TenantContext;\n apiKeyContext?: ReturnType<typeof createApiKeyContext>;\n error?: string;\n status: number;\n authType?: \"session\" | \"apikey\";\n}\n\nexport function createAuthMiddleware(config: AuthMiddlewareConfig) {\n const {\n secret,\n db,\n userLookup,\n } = config;\n\n return async function authMiddleware(\n req: Request,\n ): Promise<AuthMiddlewareResult> {\n // Check API Key first (keep for headless CMS)\n const apiKeyRaw = extractApiKeyFromRequest(req);\n\n if (apiKeyRaw && db) {\n const result = await validateApiKey(apiKeyRaw, db, userLookup);\n if (result.valid && result.user) {\n return {\n user: result.user,\n tenantContext: createTenantContextFromUser(result.user),\n apiKeyContext: createApiKeyContext(result),\n status: 200,\n authType: \"apikey\",\n };\n }\n if (result.error) {\n return {\n status: 401,\n error: result.error,\n };\n }\n }\n\n // Check session (Astro sessions with Keyv)\n const sessionId = getSessionIdFromRequest(req);\n if (sessionId) {\n try {\n // Validate session\n const validation = await validateSession(sessionId);\n \n if (!validation.valid) {\n return {\n status: 401,\n error: validation.reason || \"Session invalid\",\n };\n }\n \n const session = await getCurrentUser(req);\n if (session) {\n // Get user from database using session userId\n const user = userLookup \n ? await userLookup(session.userId)\n : null;\n \n if (user) {\n return {\n user: user as AuthUser,\n tenantContext: createTenantContextFromUser(user),\n status: 200,\n authType: \"session\",\n };\n }\n }\n } catch (e) {\n console.error(\"Session validation error:\", e);\n }\n }\n\n // No valid authentication found\n return {\n status: 401,\n error: \"Authentication required\",\n };\n };\n}\n\nexport { hasApiKeyPermission };\n\nexport function createTenantContextFromUser(\n user: Partial<AuthUser>,\n): TenantContext {\n return {\n tenantId: user.tenantId || \"default\",\n userId: user.id || \"anonymous\",\n role: user.role || \"guest\",\n roles: [user.role || \"guest\"],\n permissions: [],\n isSuperAdmin: user.role === \"super_admin\",\n };\n}\n\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n const jwt = require(\"jsonwebtoken\");\n return jwt.decode(token) as JWTPayload;\n } catch {\n return null;\n }\n}","import crypto from \"crypto\";\nimport { Hono } from \"hono\";\nimport { resolve, join } from \"path\";\nimport { existsSync, readFileSync } from \"fs\";\nimport sharp from \"sharp\";\nimport type {\n BaseAdapter,\n CollectionConfig,\n GlobalConfig,\n} from \"../../registry/types.js\";\nimport { Registry } from \"../../registry/index.js\";\nimport { evaluateAccess } from \"../../access/types.js\";\nimport type { User, Request as KyroRequest } from \"../../hooks/types.js\";\nimport {\n createAuthMiddleware,\n type AuthMiddlewareResult,\n hasApiKeyPermission,\n} from \"./auth-middleware.js\";\nimport {\n createWebhookService,\n WEBHOOK_EVENTS,\n type WebhookEvent,\n} from \"../../webhooks/index.js\";\nimport { getSessionIdFromRequest, refreshSession, getUserSessions, updateSessionName, deleteSession } from \"../../api/rest/auth-session.js\";\nimport { loadSecrets } from \"../../lib/secret.js\";\nimport { EmailTransport } from \"../../auth/nodemailer-transport.js\";\nimport { InMemoryRateLimiter } from \"../../auth/security/in-memory-rate-limit.js\";\nimport { AuthRoutes } from \"./auth-routes.js\";\nimport { SQLiteAuthAdapter } from \"../../auth/sqlite-adapter.js\";\nimport { DrizzleAdapter } from \"../../database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"../../database/drizzle/postgres-auth-adapter.js\";\nimport { MongoDBAdapter } from \"../../database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"../../database/mongodb/mongo-auth-adapter.js\";\nimport { MediaService } from \"../../storage/MediaService.js\";\nimport { hasPermission } from \"../../auth/rbac/checker.js\";\nimport { JWTPayload } from \"../../auth/types.js\";\nimport { generateApiKey, generateApiKeyPrefix, API_KEY_COLLECTION } from \"../../auth/api-key.js\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { usersCollection as defaultUsersCollection } from \"../../templates/auth.js\";\n\nfunction formatZodErrors(errors: any[]): string {\n return errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n}\n\nfunction normalizeEmptyStrings(data: any, fields: any[]): void {\n if (!data || typeof data !== 'object') return;\n for (const field of fields) {\n if (!field.name || !(field.name in data)) continue;\n const val = data[field.name];\n if (val === \"\") {\n const isTextual = field.type === 'text' || field.type === 'textarea' || field.type === 'code' || field.type === 'markdown' || field.type === 'email' || field.type === 'password' || field.type === 'color';\n if (!isTextual) data[field.name] = null;\n }\n if (field.type === 'tabs' && field.name && Array.isArray(field.tabs) && data[field.name] && typeof data[field.name] === 'object') {\n for (const tab of field.tabs) {\n if (Array.isArray(tab.fields)) normalizeEmptyStrings(data[field.name], tab.fields);\n }\n } else if ((field.type === 'group' || field.type === 'collapsible') && field.name && Array.isArray(field.fields) && data[field.name] && typeof data[field.name] === 'object') {\n normalizeEmptyStrings(data[field.name], field.fields);\n } else if (field.type === 'array' && field.name && Array.isArray(field.fields) && Array.isArray(data[field.name])) {\n for (const item of data[field.name]) {\n if (item && typeof item === 'object') normalizeEmptyStrings(item, field.fields);\n }\n } else if (field.type === 'blocks' && field.name && Array.isArray(field.blocks) && Array.isArray(data[field.name])) {\n for (const item of data[field.name]) {\n if (!item || typeof item !== 'object') continue;\n const blockTypeStr = item.type || item.blockType;\n if (!blockTypeStr) continue;\n const blockDef = field.blocks.find((b: any) => b.slug === blockTypeStr);\n if (!blockDef || !Array.isArray(blockDef.fields)) continue;\n const target = item.data && typeof item.data === 'object' ? item.data : item;\n normalizeEmptyStrings(target, blockDef.fields);\n }\n }\n }\n}\n\nfunction convertRichtextFields(fields: any[], data: any): void {\n if (!data || typeof data !== 'object') return;\n for (const field of fields) {\n if (field.type === 'richtext' && field.name) {\n const val = data[field.name];\n if (typeof val === 'string') {\n data[field.name] = [{ type: \"paragraph\", children: [{ text: val }] }];\n } else if (val && typeof val === 'object' && !Array.isArray(val) && val.type === 'doc' && Array.isArray(val.content)) {\n data[field.name] = val.content;\n }\n }\n if (field.type === 'tabs' && field.name && Array.isArray(field.tabs) && data[field.name] && typeof data[field.name] === 'object') {\n for (const tab of field.tabs) {\n if (Array.isArray(tab.fields)) convertRichtextFields(tab.fields, data[field.name]);\n }\n } else if ((field.type === 'group' || field.type === 'collapsible') && field.name && Array.isArray(field.fields) && data[field.name] && typeof data[field.name] === 'object') {\n convertRichtextFields(field.fields, data[field.name]);\n } else if (field.type === 'array' && field.name && Array.isArray(field.fields) && Array.isArray(data[field.name])) {\n for (const item of data[field.name]) {\n if (item && typeof item === 'object') convertRichtextFields(field.fields, item);\n }\n } else if (field.type === 'blocks' && field.name && Array.isArray(field.blocks) && Array.isArray(data[field.name])) {\n for (const item of data[field.name]) {\n if (!item || typeof item !== 'object') continue;\n const blockTypeStr = item.type || item.blockType;\n if (!blockTypeStr) continue;\n const blockDef = field.blocks.find((b: any) => b.slug === blockTypeStr);\n if (!blockDef || !Array.isArray(blockDef.fields)) continue;\n const target = item.data && typeof item.data === 'object' ? item.data : item;\n convertRichtextFields(blockDef.fields, target);\n }\n }\n }\n}\n\n// ============================================================================\n// REST API Factory\n// ============================================================================\n\nexport interface HonoAppOptions {\n registry: Registry;\n db: BaseAdapter;\n authSecret?: string;\n authAdapter?: any; // NEW\n checkSession?: boolean; // NEW - default true\n user?: User;\n req?: any;\n tenantID?: string;\n cors?: {\n origins?: string[];\n credentials?: boolean;\n };\n webhookService?: ReturnType<typeof createWebhookService>;\n settings?: {\n access?: {\n enablePublicAccess?: boolean;\n defaultCollectionAccess?: string;\n apiAccess?: {\n restEnabled?: boolean;\n graphqlEnabled?: boolean;\n trpcEnabled?: boolean;\n websocketEnabled?: boolean;\n requireAuth?: boolean;\n cors?: {\n allowedOrigins?: string[] | string;\n };\n };\n rateLimiting?: {\n enabled?: boolean;\n maxRequests?: number;\n windowMs?: number;\n };\n };\n };\n}\n\nconst COLLECTION_EVENT_MAP: Record<\n string,\n { create: WebhookEvent; update: WebhookEvent; delete: WebhookEvent }\n> = {\n _media: {\n create: WEBHOOK_EVENTS.MEDIA_UPLOAD,\n update: WEBHOOK_EVENTS.MEDIA_UPLOAD,\n delete: WEBHOOK_EVENTS.MEDIA_DELETE,\n },\n};\n\nfunction getWebhookEvent(\n collection: string,\n operation: \"create\" | \"update\" | \"delete\",\n): WebhookEvent {\n const mapped = COLLECTION_EVENT_MAP[collection];\n if (mapped) return mapped[operation];\n return `collection.${operation}` as WebhookEvent;\n}\n\n// ============================================================================\n// Access Check Helper\n// ============================================================================\n\ninterface AccessCheckResult {\n allowed: boolean;\n error?: string;\n status?: number;\n}\n\nfunction extractIp(req: Request): string {\n const forwarded = req.headers.get(\"x-forwarded-for\");\n if (forwarded) return forwarded.split(\",\")[0].trim();\n return req.headers.get(\"x-real-ip\") || \"unknown\";\n}\n\nfunction auditApiKeyUsage(\n sessionAuthAdapter: any,\n apiKeyContext: any,\n endpoint: string,\n method: string,\n req: Request,\n) {\n if (apiKeyContext?.apiKeyId && sessionAuthAdapter) {\n sessionAuthAdapter.createAuditLog({\n action: \"api_request\",\n userId: apiKeyContext.userId || \"\",\n resource: \"api_key\",\n resourceId: apiKeyContext.apiKeyId,\n success: true,\n metadata: {\n endpoint,\n method,\n ip: extractIp(req),\n },\n });\n }\n}\n\nfunction readBaseUpdatedAt(body: Record<string, any>): string | null | undefined {\n return body.baseUpdatedAt ?? body._baseUpdatedAt;\n}\n\nfunction omitRevisionFields<T extends Record<string, any>>(body: T): T {\n const { baseUpdatedAt, _baseUpdatedAt, ...rest } = body;\n return rest as T;\n}\n\nfunction buildConflictResponse(\n expectedUpdatedAt: string | null | undefined,\n currentDoc: Record<string, any>,\n) {\n return {\n error: \"Document has changed since you started editing\",\n code: \"REVISION_CONFLICT\",\n conflict: {\n expectedUpdatedAt: expectedUpdatedAt ?? null,\n actualUpdatedAt: currentDoc.updatedAt ?? null,\n current: currentDoc,\n },\n };\n}\n\nasync function checkCollectionAccess(\n collection: CollectionConfig,\n operation: \"read\" | \"create\" | \"update\" | \"delete\",\n req: any,\n ctxUser?: User,\n ctxTenantID?: string,\n apiKeyContext?: any,\n enablePublicAccess: boolean = true,\n defaultCollectionAccess: string = \"none\",\n): Promise<AccessCheckResult> {\n const accessRule = collection.access?.[operation];\n\n const accessLevels: Record<string, boolean> = {\n none: false,\n read: operation === \"read\",\n create: operation === \"read\" || operation === \"create\",\n update:\n operation === \"read\" || operation === \"create\" || operation === \"update\",\n delete:\n operation === \"read\" ||\n operation === \"create\" ||\n operation === \"update\" ||\n operation === \"delete\",\n admin: true,\n };\n const isDefaultAllowed = accessLevels[defaultCollectionAccess] || false;\n\n if (accessRule) {\n const allowed = await evaluateAccess(accessRule, {\n req,\n user: ctxUser,\n tenantID: ctxTenantID,\n });\n if (allowed === false) {\n return { allowed: false, error: \"Access denied\", status: 403 };\n }\n } else if (!ctxUser) {\n const allowed = enablePublicAccess && isDefaultAllowed;\n if (!allowed) {\n return {\n allowed: false,\n error: \"Authentication required\",\n status: 401,\n };\n }\n }\n\n if (apiKeyContext?.permissions?.length > 0) {\n const resource = collection.slug;\n const action =\n operation === \"read\"\n ? \"read\"\n : operation === \"create\"\n ? \"create\"\n : \"update\";\n const permission = `${resource}:${action}`;\n\n if (\n !hasApiKeyPermission(apiKeyContext.permissions, permission) &&\n !hasApiKeyPermission(apiKeyContext.permissions, `${resource}:admin`)\n ) {\n return {\n allowed: false,\n error: `Missing permission: ${permission}`,\n status: 403,\n };\n }\n }\n\n if (ctxUser && !(apiKeyContext?.permissions?.length > 0)) {\n const resource = collection.slug;\n const action =\n operation === \"read\"\n ? \"read\"\n : operation === \"create\"\n ? \"create\"\n : operation === \"update\"\n ? \"update\"\n : \"delete\";\n const permission = `${resource}:${action}`;\n\n let rbacAllowed = false;\n if (ctxUser.role) {\n const userHasPermission = hasPermission(\n { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role } as any,\n permission,\n );\n\n if (userHasPermission) {\n rbacAllowed = true;\n } else {\n const adminPermission = hasPermission(\n { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role } as any,\n `${resource}:admin`,\n );\n if (adminPermission) rbacAllowed = true;\n }\n }\n\n if (!rbacAllowed && !isDefaultAllowed && !accessRule) {\n return {\n allowed: false,\n error: `Missing RBAC permission: ${permission}`,\n status: 403,\n };\n }\n }\n\n return { allowed: true };\n}\n\nasync function checkGlobalAccess(\n global: GlobalConfig,\n operation: \"read\" | \"update\",\n req: any,\n ctxUser?: User,\n ctxTenantID?: string,\n enablePublicAccess: boolean = true,\n): Promise<AccessCheckResult> {\n const accessRule = global.access?.[operation];\n\n if (accessRule) {\n const allowed = await evaluateAccess(accessRule, {\n req,\n user: ctxUser,\n tenantID: ctxTenantID,\n });\n if (allowed === false) {\n return { allowed: false, error: \"Access denied\", status: 403 };\n }\n } else if (!ctxUser) {\n const accessLevels: Record<string, boolean> = {\n none: false,\n read: operation === \"read\",\n update: operation === \"read\" || operation === \"update\",\n };\n const allowed =\n enablePublicAccess &&\n accessLevels[operation === \"read\" ? \"read\" : \"admin\"];\n if (!allowed) {\n return {\n allowed: false,\n error: \"Authentication required\",\n status: 401,\n };\n }\n }\n\n return { allowed: true };\n}\n\n// ============================================================================\n// Auth Context Resolution\n// ============================================================================\n\nasync function resolveAuthContext(\n req: globalThis.Request,\n authMw: ReturnType<typeof createAuthMiddleware> | null,\n staticUser?: User,\n staticTenantID?: string,\n): Promise<{\n user: User | undefined;\n tenantID: string | undefined;\n apiKeyContext: any;\n authType?: string;\n}> {\n if (staticUser) {\n return {\n user: staticUser,\n tenantID: staticTenantID,\n apiKeyContext: undefined,\n authType: \"static\",\n };\n }\n\n if (authMw) {\n const res = await authMw(req);\n if (res.status === 200 && res.user) {\n return {\n user: res.user as any,\n tenantID: res.tenantContext?.tenantId,\n apiKeyContext: res.apiKeyContext,\n authType: res.authType,\n };\n }\n }\n\n return {\n user: undefined,\n tenantID: undefined,\n apiKeyContext: undefined,\n authType: undefined,\n };\n}\n\n// ============================================================================\n// Auth Adapter Factory (auto-detect dialect)\n// ============================================================================\n\nfunction createDefaultAuthAdapter(\n db: BaseAdapter,\n rootDir: string,\n): any {\n if (db instanceof DrizzleAdapter && db.dialect === \"postgres\") {\n return new PostgresAuthAdapter({ db: db.client });\n }\n if (db instanceof MongoDBAdapter) {\n return new MongoDBAuthAdapter({ db: db.db });\n }\n const defaultAuthDbPath = resolve(rootDir, \"data\", \"kyro.db\");\n return new SQLiteAuthAdapter({\n path: process.env.KYRO_AUTH_DB_PATH || defaultAuthDbPath,\n });\n}\n\n// ============================================================================\n// Hono App Factory\n// ============================================================================\n\nexport function createHonoApp(options: HonoAppOptions): Hono {\n const {\n registry,\n db,\n authSecret,\n authAdapter,\n checkSession,\n user,\n tenantID,\n cors,\n webhookService,\n settings,\n } = options;\n const app = new Hono();\n\n // Check if REST API is disabled in settings\n const apiAccess = settings?.access?.apiAccess;\n if (apiAccess?.restEnabled === false) {\n app.all(\"/api/*\", (c) => {\n return c.json({ error: \"REST API is disabled\" }, 503);\n });\n return app;\n }\n\n const enablePublicAccess = settings?.access?.enablePublicAccess ?? false;\n const defaultCollectionAccess =\n settings?.access?.defaultCollectionAccess ?? \"none\";\n\n const requireAuth = apiAccess?.requireAuth;\n\n // Resolve the true project root dynamically\n const cwd = process.cwd();\n const rootDir = cwd.endsWith(\"admin\") ? resolve(cwd, \"..\") : cwd;\n\n // Create auth adapter early for session checking\n const sessionAuthAdapter = authAdapter || createDefaultAuthAdapter(db, rootDir);\n\n // Always create auth middleware if authSecret is provided\n // This enables auth-based access for collection routes\n // checkSession defaults to true unless explicitly set to false\n const shouldCheckSession = checkSession !== false;\n // Use sessionAuthAdapter for session checking (created below)\n const sessionChecker = sessionAuthAdapter;\n const authMw = authSecret\n ? createAuthMiddleware({\n secret: authSecret,\n db,\n userLookup: async (userId: string) => {\n const user = await sessionAuthAdapter.findUserById(userId);\n return user || null;\n },\n checkSession: shouldCheckSession\n ? async (\n userId: string,\n token: string,\n req?: Request,\n payload?: JWTPayload,\n ) => {\n // Check session if sessionAuthAdapter exists\n if (!sessionChecker) return true;\n try {\n const sessionToken = payload?.sid || token;\n\n let session =\n await sessionChecker.findSessionByToken(sessionToken);\n\n if (!session && req) {\n const cookieHeader = req.headers.get(\"Cookie\") || \"\";\n const match = cookieHeader.match(/refresh_token=([^;]+)/);\n if (match) {\n session = await sessionChecker.findSessionByRefreshToken(\n match[1],\n );\n }\n }\n\n return !!session;\n } catch {\n return false;\n }\n }\n : undefined,\n })\n : null;\n\n // CORS middleware\n const settingsCorsRaw = apiAccess?.cors?.allowedOrigins;\n const optionsCors = cors?.origins;\n const settingsCors = Array.isArray(settingsCorsRaw)\n ? settingsCorsRaw\n : typeof settingsCorsRaw === \"string\" && settingsCorsRaw\n ? settingsCorsRaw\n .split(\"\\n\")\n .map((s: string) => s.trim())\n .filter(Boolean)\n : [];\n const allowedOrigins: string[] =\n settingsCors.length > 0 ? settingsCors : optionsCors || [];\n const corsEnabled = allowedOrigins.length > 0 || !!cors;\n\n if (corsEnabled) {\n app.use(\"*\", async (c, next) => {\n const origin = c.req.header(\"Origin\") || \"*\";\n\n if (allowedOrigins.length > 0 && !allowedOrigins.includes(origin)) {\n return c.json({ error: \"Origin not allowed\" }, 403);\n }\n\n const allowOrigin = allowedOrigins.length > 0 ? origin : \"*\";\n c.header(\"Access-Control-Allow-Origin\", allowOrigin);\n c.header(\n \"Access-Control-Allow-Methods\",\n \"GET, POST, PATCH, DELETE, OPTIONS\",\n );\n c.header(\n \"Access-Control-Allow-Headers\",\n \"Content-Type, Authorization, X-API-Key\",\n );\n if (cors?.credentials) {\n c.header(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (c.req.method === \"OPTIONS\") {\n return c.text(\"\");\n }\n await next();\n });\n }\n\n // Rate limiting middleware\n const rateLimiting = settings?.access?.rateLimiting;\n let rateLimiter: InMemoryRateLimiter | undefined;\n\n if (rateLimiting?.enabled) {\n const maxRequests = rateLimiting.maxRequests || 100;\n const windowMs = rateLimiting.windowMs || 60000;\n\n rateLimiter = new InMemoryRateLimiter({\n \"api:general\": { window: windowMs, max: maxRequests },\n });\n\n app.use(\"/api/*\", async (c, next) => {\n if (!rateLimiter) {\n return next();\n }\n\n const ip =\n c.req.header(\"CF-Connecting-IP\") ||\n c.req.header(\"X-Forwarded-For\")?.split(\",\")[0]?.trim() ||\n c.req.header(\"X-Real-IP\") ||\n \"unknown\";\n\n const result = await rateLimiter.check(\"api:general\", ip);\n\n c.header(\"X-RateLimit-Limit\", String(maxRequests));\n c.header(\"X-RateLimit-Remaining\", String(result.remaining));\n c.header(\"X-RateLimit-Reset\", String(result.resetAt));\n\n if (!result.allowed) {\n return c.json(\n {\n error: \"Too many requests\",\n retryAfter: result.retryAfter,\n },\n 429,\n );\n }\n\n await next();\n });\n }\n\n // ============================================================================\n // Auth & Media Routes\n // ============================================================================\n\n // Auth Routes - uses single DB with absolute path\n // Lazy initialization handled in auth-routes to avoid top-level await issues\n // sessionAuthAdapter already created above for session checking\n\n const authRoutes = new AuthRoutes({\n redis: sessionAuthAdapter as any, // Using redis property for AuthAdapter\n jwtSecret: authSecret || \"change-me\",\n baseUrl: process.env.KYRO_BASE_URL || \"http://localhost:4321\",\n rateLimiter,\n });\n\n EmailTransport.fromConfig(db).then((transport) => {\n if (transport) {\n (authRoutes as any).email = transport;\n }\n }).catch((err) => {\n console.error(\"[Email] Failed to initialize transport from config:\", err);\n });\n\n app.post(\"/api/auth/login\", async (c) => authRoutes.login(c.req.raw));\n app.post(\"/api/auth/register\", async (c) => authRoutes.register(c.req.raw));\n app.post(\"/api/auth/logout\", async (c) => authRoutes.logout(c.req.raw));\n app.post(\"/api/auth/refresh\", async (c) => authRoutes.refresh(c.req.raw));\n app.get(\"/api/auth/me\", async (c) => authRoutes.me(c.req.raw));\n\n // Session management\n app.get(\"/api/auth/sessions\", async (c) => authRoutes.listSessions(c.req.raw));\n app.post(\"/api/auth/sessions/refresh\", async (c) => authRoutes.refreshSession(c.req.raw));\n app.delete(\"/api/auth/sessions\", async (c) => authRoutes.revokeOtherSessions(c.req.raw));\n app.delete(\"/api/auth/sessions/:id\", async (c) => authRoutes.revokeSession(c.req.raw, c.req.param(\"id\")));\napp.put(\"/api/auth/sessions/:id/name\", async (c) => authRoutes.renameSession(c.req.raw, c.req.param(\"id\")));\n\n app.get(\"/api/auth/access\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n if (!ctxUser) {\n return c.json({ error: \"Not authenticated\" }, 401);\n }\n\n const collections: Record<string, any> = {};\n const globals: Record<string, any> = {};\n\n for (const col of registry.getCollections()) {\n const permissions = {\n read: (\n await checkCollectionAccess(\n col,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n )\n ).allowed,\n create: (\n await checkCollectionAccess(\n col,\n \"create\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n )\n ).allowed,\n update: (\n await checkCollectionAccess(\n col,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n )\n ).allowed,\n delete: (\n await checkCollectionAccess(\n col,\n \"delete\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n )\n ).allowed,\n };\n collections[col.slug] = permissions;\n }\n\n for (const globalConfig of registry.getGlobals()) {\n const permissions = {\n read: (\n await checkGlobalAccess(\n globalConfig,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n )\n ).allowed,\n update: (\n await checkGlobalAccess(\n globalConfig,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n )\n ).allowed,\n };\n globals[globalConfig.slug] = permissions;\n }\n\n return c.json({ collections, globals });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Dedicated Users Routes (backed by auth adapter, not main DB)\n const usersCollection = (typeof registry.hasCollection === \"function\" && registry.hasCollection(\"users\"))\n ? registry.getCollection(\"users\")\n : (() => {\n try {\n return registry.getCollection(\"users\");\n } catch {\n return defaultUsersCollection;\n }\n })();\n\n app.get(\"/api/users\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const access = await checkCollectionAccess(\n usersCollection!,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const page = parseInt(c.req.query(\"page\") || \"1\");\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"10\"), 100);\n const search = c.req.query(\"search\") || undefined;\n\n const result = await sessionAuthAdapter.findUsers({\n page,\n limit,\n search,\n });\n\n return c.json({\n docs: result.users,\n totalDocs: result.total,\n limit,\n totalPages: Math.ceil(result.total / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(result.total / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(result.total / limit) ? page + 1 : null,\n });\n } catch (error: any) {\n console.error(\"[API] Error listing users:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/users/:id\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const id = c.req.param(\"id\");\n const found = await sessionAuthAdapter.findUserById(id);\n if (!found) {\n return c.json({ error: \"User not found\" }, 404);\n }\n\n return c.json({ data: found });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/users\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const access = await checkCollectionAccess(\n usersCollection!,\n \"create\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const body = await c.req.json();\n if (!body.email || !body.password) {\n return c.json({ error: \"Email and password are required\" }, 400);\n }\n\n const existing = await sessionAuthAdapter.findUserByEmail(body.email);\n if (existing) {\n return c.json({ error: \"Email already in use\" }, 400);\n }\n\n const created = await sessionAuthAdapter.createUser({\n email: body.email,\n password: body.password,\n name: body.name,\n role: body.role || \"customer\",\n avatar: body.avatar,\n tenantId: body.tenantId,\n });\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"user_create\",\n userId: ctxUser.id,\n resource: \"users\",\n resourceId: created.id,\n success: true,\n });\n }\n\n return c.json(\n { data: created, message: \"User created successfully\" },\n 201,\n );\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.patch(\"/api/users/:id\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const access = await checkCollectionAccess(\n usersCollection!,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n\n const existing = await sessionAuthAdapter.findUserById(id);\n if (!existing) {\n return c.json({ error: \"User not found\" }, 404);\n }\n\n const updateData: Record<string, unknown> = {};\n if (body.name !== undefined) updateData.name = body.name;\n if (body.email !== undefined) updateData.email = body.email;\n if (body.role !== undefined) updateData.role = body.role;\n if (body.avatar !== undefined) {\n updateData.avatar = typeof body.avatar === \"object\" && body.avatar !== null\n ? (body.avatar.id || String(body.avatar))\n : body.avatar;\n }\n if (body.tenantId !== undefined) updateData.tenantId = body.tenantId;\n if (body.emailVerified !== undefined)\n updateData.emailVerified = body.emailVerified;\n if (body.locked !== undefined) updateData.locked = body.locked;\n if (body.failedLoginAttempts !== undefined)\n updateData.failedLoginAttempts = body.failedLoginAttempts;\n if (body.lastLogin !== undefined) updateData.lastLogin = body.lastLogin;\n\n const updated = await sessionAuthAdapter.updateUser(id, updateData);\n if (!updated) {\n return c.json({ error: \"User update failed\" }, 500);\n }\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"user_update\",\n userId: ctxUser.id,\n resource: \"users\",\n resourceId: id,\n success: true,\n });\n if (body.role && existing.role !== body.role) {\n sessionAuthAdapter?.createAuditLog({\n action: \"role_change\",\n userId: ctxUser.id,\n resource: \"users\",\n resourceId: id,\n success: true,\n metadata: { oldRole: existing.role, newRole: body.role }\n });\n }\n }\n\n return c.json({ data: updated, message: \"User updated successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(\"/api/users/:id\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const access = await checkCollectionAccess(\n usersCollection!,\n \"delete\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n\n if (ctxUser && ctxUser.id === id) {\n return c.json({ error: \"You cannot delete your own account\" }, 403);\n }\n\n const existing = await sessionAuthAdapter.findUserById(id);\n if (!existing) {\n return c.json({ error: \"User not found\" }, 404);\n }\n\n const deleted = await sessionAuthAdapter.deleteUser(id);\n if (!deleted) {\n return c.json({ error: \"User deletion failed\" }, 500);\n }\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"user_delete\",\n userId: ctxUser.id,\n resource: \"users\",\n resourceId: id,\n success: true,\n });\n }\n\n return c.json({ data: existing, message: \"User deleted successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Audit Logs Route (backed by auth adapter)\n app.get(\"/api/auth/audit-logs\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const auditLogsCollection = registry.getCollection(\"audit_logs\");\n if (auditLogsCollection) {\n const access = await checkCollectionAccess(\n auditLogsCollection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n } else if (!ctxUser) {\n return c.json({ error: \"Authentication required\" }, 401);\n }\n\n const page = parseInt(c.req.query(\"page\") || \"1\");\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"50\"), 100);\n const action = c.req.query(\"action\") || undefined;\n const userId = c.req.query(\"userId\") || undefined;\n const resource = c.req.query(\"resource\") || undefined;\n\n const result = await sessionAuthAdapter.findAuditLogs({\n action,\n userId,\n resource,\n limit,\n offset: (page - 1) * limit,\n });\n\n return c.json({\n docs: result.logs,\n totalDocs: result.total,\n limit,\n totalPages: Math.ceil(result.total / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(result.total / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(result.total / limit) ? page + 1 : null,\n });\n } catch (error: any) {\n console.error(\"[API] Error listing audit logs:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Media Routes\n // Note: MediaService.init is async, so we'll lazy-load or assume it's ready.\n // In a real production app, we'd handle the async init better.\n let mediaService: MediaService | null = null;\n let mediaServiceInitError: any = null;\n\n const getMedia = async () => {\n if (mediaServiceInitError) {\n throw mediaServiceInitError;\n }\n if (!mediaService) {\n try {\n const dialect = db instanceof DrizzleAdapter ? db.dialect : \"sqlite\";\n const mediaDb = dialect === \"postgres\" && db instanceof DrizzleAdapter ? db.client : db;\n mediaService = await MediaService.init(mediaDb, { dialect });\n } catch (error: any) {\n console.error(\"[getMedia] Init error:\", error);\n mediaServiceInitError = error;\n throw error;\n }\n }\n return mediaService;\n };\n\n // ============================================================================\n // Media Routes (authenticated)\n // ============================================================================\n\n app.get(\"/api/media\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const page = parseInt(c.req.query(\"page\") || \"1\");\n const limit = parseInt(c.req.query(\"limit\") || \"30\");\n const search = c.req.query(\"search\") || \"\";\n const type = c.req.query(\"type\") || \"\";\n const folder = c.req.query(\"folder\") || \"\";\n\n const result = await service.find({ page, limit, search, type, folder });\n return c.json(result);\n } catch (error: any) {\n console.error(\"[Media] find error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/media/upload\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const contentType = c.req.header(\"content-type\") || \"\";\n\n if (contentType.includes(\"multipart/form-data\")) {\n const formData = await c.req.formData();\n const file = formData.get(\"file\") as File;\n const folder = (formData.get(\"folder\") as string) || \"\";\n\n if (!file) return c.json({ error: \"No file uploaded\" }, 400);\n\n const result = await service.upload(file, folder);\n return c.json(result);\n }\n\n const { url } = await c.req.json();\n if (!url) return c.json({ error: \"No URL provided\" }, 400);\n const result = await service.uploadFromUrl(url);\n return c.json(result);\n } catch (error: any) {\n console.error(\"[Media] upload error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/media/folders\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const folders = await service.listFolders();\n return c.json(folders);\n } catch (error: any) {\n console.error(\"[Media] folders error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/media/folders\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const body = await c.req.json();\n const { name, parentPath } = body;\n if (!name) {\n return c.json({ error: \"Folder name is required\" }, 400);\n }\n await service.createFolder(name, parentPath || \"\");\n return c.json({\n message: \"Folder created\",\n path: parentPath ? `${parentPath}/${name}` : name,\n });\n } catch (error: any) {\n console.error(\"[Media] create folder error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(\"/api/media/folders\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const path = c.req.query(\"path\");\n if (!path) {\n return c.json({ error: \"Path is required\" }, 400);\n }\n await service.deleteFolder(path);\n return c.json({ message: \"Folder deleted\" });\n } catch (error: any) {\n console.error(\"[Media] delete folder error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(\"/api/media/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const id = c.req.param(\"id\");\n await service.delete(id);\n return c.json({ success: true });\n } catch (error: any) {\n console.error(\"[Media] delete error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/media/resize\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const url = c.req.query(\"url\");\n const w = parseInt(c.req.query(\"w\") || \"0\");\n const h = parseInt(c.req.query(\"h\") || \"0\");\n const fit = (c.req.query(\"fit\") || \"cover\") as any;\n\n if (!url) return c.json({ error: \"URL is required\" }, 400);\n\n const service = await getMedia();\n const storage: any = (service as any).storage;\n\n if (storage.name !== \"local\") {\n return c.redirect(url);\n }\n\n const uploadDir = storage.config?.uploadDir || join(process.cwd(), \"public\", \"uploads\");\n const baseUrl = storage.config?.baseUrl || \"/uploads\";\n\n if (!url.startsWith(baseUrl)) {\n return c.redirect(url);\n }\n\n const relativePath = url.replace(baseUrl, \"\");\n const physicalPath = join(uploadDir, relativePath);\n\n if (!existsSync(physicalPath)) {\n return c.json({ error: \"File not found\" }, 404);\n }\n\n const imageBuffer = readFileSync(physicalPath);\n let transform = sharp(imageBuffer);\n\n if (w > 0 || h > 0) {\n transform = transform.resize({\n width: w > 0 ? w : undefined,\n height: h > 0 ? h : undefined,\n fit: fit\n });\n }\n\n const outputBuffer = await transform.toBuffer();\n const metadata = await sharp(imageBuffer).metadata();\n\n c.header(\"Content-Type\", `image/${metadata.format || \"webp\"}`);\n c.header(\"Cache-Control\", \"public, max-age=31536000, immutable\");\n return c.body(outputBuffer as any);\n } catch (error: any) {\n console.error(\"[Media] resize error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/media/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const id = c.req.param(\"id\");\n const doc = await service.findById(id);\n if (!doc) return c.json({ error: \"Media not found\" }, 404);\n return c.json(doc);\n } catch (error: any) {\n console.error(\"[Media] get error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.patch(\"/api/media/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n if (body.folder !== undefined) {\n const updated = await service.update(id, { folder: body.folder });\n return c.json({ doc: updated });\n }\n return c.json({ error: \"No valid fields to update\" }, 400);\n } catch (error: any) {\n console.error(\"[Media] update error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/media/test - Test media service initialization (authenticated)\n app.get(\"/api/media/test\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const service = await getMedia();\n return c.json({\n status: service ? \"initialized\" : \"failed\",\n serviceType: service?.constructor?.name,\n });\n } catch (error: any) {\n console.error(\"[test] Error:\", error);\n return c.json(\n {\n error: error.message,\n type: error.constructor?.name,\n stack: error.stack,\n },\n 500,\n );\n }\n });\n\n // GET /api/storage-status - Storage status info (authenticated)\n app.get(\"/api/storage-status\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n let configured = false;\n let provider = \"local\";\n\n if (db) {\n try {\n const row = (db as any)\n .prepare(`SELECT provider FROM \"_globals_storage-settings\" LIMIT 1`)\n .get() as any;\n if (row && row.provider) {\n configured = true;\n provider = row.provider === \"aws\" ? \"s3\" : row.provider;\n }\n } catch {\n try {\n const result = await (db as any).findOne({\n collection: \"_globals_storage-settings\",\n where: {},\n });\n if (result && result.provider) {\n configured = true;\n provider = result.provider === \"aws\" ? \"s3\" : result.provider;\n }\n } catch { }\n }\n }\n\n return c.json({\n provider,\n configured,\n usage: 0,\n limit: \"unlimited\",\n });\n } catch (error: any) {\n console.error(\"[Storage] status error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/plugins — list all registered plugins with enabled state\n app.get(\"/api/plugins\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n\n const plugins = registry.getPlugins();\n const storageRegistry = registry.storageProviders;\n\n const pluginList = await Promise.all(\n plugins.map(async (p) => {\n let enabled = true;\n const pluginName = p.name;\n\n // Try to read enabled state from settings table\n let states: Record<string, boolean> = {};\n try {\n const doc = await db.findOne({\n collection: \"_globals_plugin-settings\",\n where: {},\n });\n if (doc && doc.states) states = doc.states;\n } catch {}\n\n if (states[pluginName] !== undefined) {\n enabled = states[pluginName];\n }\n\n // Also sync registry\n storageRegistry.setPluginEnabled(pluginName, enabled);\n\n return {\n id: pluginName,\n name: pluginName,\n version: p.version || \"1.0.0\",\n description: p.description || \"\",\n enabled,\n status: enabled ? \"active\" : \"disabled\",\n };\n }),\n );\n\n return c.json(pluginList);\n } catch (error: any) {\n console.error(\"[Plugins] list error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // PUT /api/plugins/:name/toggle — toggle plugin enabled state\n app.put(\"/api/plugins/:name/toggle\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n\n const pluginName = c.req.param(\"name\");\n const storageRegistry = registry.storageProviders;\n const currentEnabled = storageRegistry.isPluginEnabled(pluginName);\n const newEnabled = !currentEnabled;\n\n // Determine which storage providers would be affected\n const affectedProviders: string[] = [];\n if (!newEnabled) {\n for (const p of storageRegistry.getAll()) {\n if (p.pluginName === pluginName) {\n affectedProviders.push(p.type);\n }\n }\n }\n\n // If disabling and not forced, check if any affected provider is currently active\n const force = c.req.query(\"force\") === \"1\";\n if (!force && !newEnabled && affectedProviders.length > 0) {\n let activeProvider = \"local\";\n try {\n const row = (db as any)\n ?.prepare?.(`SELECT provider FROM \"_globals_storage-settings\" LIMIT 1`)\n ?.get() as any;\n if (row?.provider) activeProvider = row.provider;\n } catch {\n try {\n const result = await (db as any)?.findOne?.({\n collection: \"_globals_storage-settings\",\n where: {},\n });\n if (result?.provider) activeProvider = result.provider;\n } catch {}\n }\n\n if (affectedProviders.includes(activeProvider)) {\n return c.json({\n error: `Cannot disable \"${pluginName}\" — storage provider \"${activeProvider}\" is currently active. Switch to Local storage first.`,\n requiresAction: true,\n activeProvider,\n }, 409);\n }\n }\n\n // Persist to settings table\n try {\n let states: Record<string, boolean> = {};\n let docId = \"global\";\n\n const doc = await db.findOne({\n collection: \"_globals_plugin-settings\",\n where: {},\n });\n if (doc) {\n states = doc.states || {};\n docId = doc.id;\n }\n\n states[pluginName] = newEnabled;\n\n if (doc) {\n await db.update({\n collection: \"_globals_plugin-settings\",\n id: docId,\n data: { states },\n });\n } else {\n await db.create({\n collection: \"_globals_plugin-settings\",\n data: { states, id: \"global\" },\n });\n }\n } catch (e) {\n console.warn(`[Plugins] Could not persist state for \"${pluginName}\":`, e);\n }\n\n storageRegistry.setPluginEnabled(pluginName, newEnabled);\n\n return c.json({ name: pluginName, enabled: newEnabled });\n } catch (error: any) {\n console.error(\"[Plugins] toggle error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Health check (public)\n app.get(\"/api/health\", (c) => {\n return c.json({\n status: \"ok\",\n version: \"0.1.0\",\n collections: registry.getCollectionSlugs(),\n timestamp: new Date().toISOString(),\n });\n });\n\n // Kyro schema — exposes field metadata + JSON Schema for codegen\n app.get(\"/api/kyro/schema\", async (c) => {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n\n const extractFields = (fields: any[]): any[] =>\n fields.map((f: any) => {\n const meta: any = {\n name: f.name,\n type: f.type,\n label: f.label,\n required: f.required ?? false,\n unique: f.unique ?? false,\n indexed: f.indexed ?? false,\n defaultValue: f.defaultValue,\n admin: f.admin ? { ...f.admin } : undefined,\n };\n if (f.minLength !== undefined) meta.minLength = f.minLength;\n if (f.maxLength !== undefined) meta.maxLength = f.maxLength;\n if (f.pattern !== undefined) meta.pattern = f.pattern;\n if (f.variant !== undefined) meta.variant = f.variant;\n if (f.hasMany !== undefined) meta.hasMany = f.hasMany;\n if (f.min !== undefined) meta.min = f.min;\n if (f.max !== undefined) meta.max = f.max;\n if (f.step !== undefined) meta.step = f.step;\n if (f.integer !== undefined) meta.integer = f.integer;\n if (f.options) meta.options = f.options;\n if (f.relationTo) meta.relationTo = f.relationTo;\n if (f.maxDepth !== undefined) meta.maxDepth = f.maxDepth;\n if (f.minRows !== undefined) meta.minRows = f.minRows;\n if (f.maxRows !== undefined) meta.maxRows = f.maxRows;\n if (f.localized !== undefined) meta.localized = f.localized;\n if (f.language) meta.language = f.language;\n if (f.format) meta.format = f.format;\n if (f.allowedTypes) meta.allowedTypes = f.allowedTypes;\n if (f.maxSize) meta.maxSize = f.maxSize;\n\n if (f.type === \"group\" || f.type === \"row\" || f.type === \"collapsible\" && f.fields) {\n meta.fields = extractFields(f.fields);\n }\n if (f.type === \"array\" && f.fields) {\n meta.fields = extractFields(f.fields);\n }\n if (f.type === \"blocks\" && f.blocks) {\n meta.blocks = f.blocks.map((b: any) => ({\n slug: b.slug,\n label: b.label,\n fields: extractFields(b.fields),\n }));\n }\n if (f.type === \"tabs\" && f.tabs) {\n meta.tabs = f.tabs.map((t: any) => ({\n label: t.label,\n name: t.name,\n fields: extractFields(t.fields),\n }));\n }\n return meta;\n });\n\n const data: any = { collections: {}, globals: {} };\n\n for (const col of registry.getCollections()) {\n const slug = col.slug;\n try {\n data.collections[slug] = {\n slug,\n label: col.label || slug,\n fields: extractFields(col.fields),\n jsonSchema: zodToJsonSchema(registry.getZodSchema(slug), { target: \"openApi3\" }),\n createSchema: zodToJsonSchema(registry.getCreateZodSchema(slug), { target: \"openApi3\" }),\n updateSchema: zodToJsonSchema(registry.getUpdateZodSchema(slug), { target: \"openApi3\" }),\n procedures: {\n find: { collection: slug, where: \"Record<string,any>\", sort: \"string\", limit: \"number\", page: \"number\", depth: \"number\", select: \"string[]\", draft: \"boolean\" },\n findByID: { collection: slug, id: \"string\", depth: \"number\", select: \"string[]\", draft: \"boolean\" },\n create: { collection: slug, data: \"Record<string,any>\", depth: \"number\", select: \"string[]\" },\n update: { collection: slug, id: \"string\", data: \"Record<string,any>\", depth: \"number\", select: \"string[]\", baseUpdatedAt: \"string\" },\n delete: { collection: slug, id: \"string\" },\n count: { collection: slug, where: \"Record<string,any>\" },\n },\n };\n } catch { /* skip collections without schemas */ }\n }\n\n for (const global of registry.getGlobals()) {\n const slug = global.slug;\n try {\n data.globals[slug] = {\n slug,\n label: global.label || slug,\n fields: extractFields(global.fields),\n jsonSchema: zodToJsonSchema(registry.getZodSchema(slug), { target: \"openApi3\" }),\n procedures: {\n get: {},\n update: { data: \"Record<string,any>\" },\n },\n };\n } catch { /* skip globals without schemas */ }\n }\n\n return c.json(data);\n });\n\n // List collections (authenticated)\n app.get(\"/api/collections\", async (c) => {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser) return c.json({ error: \"Authentication required\" }, 401);\n const collections = registry.getCollections().map((col) => ({\n slug: col.slug,\n label: col.label || col.slug,\n fields: col.fields\n .filter((f) => f.name)\n .map((f) => ({\n name: f.name,\n type: f.type,\n required: f.required,\n label: f.label,\n })),\n }));\n return c.json(collections);\n });\n\n function resolveDocField(fields: any[], doc: any, fieldName: string): any {\n if (fieldName in doc) return doc[fieldName];\n for (const field of fields) {\n if (!field.name) continue;\n if (field.type === \"tabs\" && field.tabs) {\n const data = doc[field.name];\n if (data && typeof data === \"object\" && fieldName in data) return data[fieldName];\n }\n if ((field.type === \"group\" || field.type === \"collapsible\") && field.fields) {\n const data = doc[field.name];\n if (data && typeof data === \"object\") {\n if (fieldName in data) return data[fieldName];\n const nested = resolveDocField(field.fields, data, fieldName);\n if (nested !== undefined) return nested;\n }\n }\n }\n return undefined;\n }\n\n function flattenRelationshipFields(fields: any[]): any[] {\n const relFields: any[] = [];\n for (const field of fields) {\n if (field.type === \"relationship\") {\n relFields.push(field);\n } else if (field.type === \"tabs\" && field.tabs) {\n for (const tab of field.tabs) {\n relFields.push(...flattenRelationshipFields(tab.fields || []));\n }\n } else if ((field.type === \"group\" || field.type === \"collapsible\") && field.fields) {\n relFields.push(...flattenRelationshipFields(field.fields || []));\n }\n }\n return relFields;\n }\n\n function extractRelValue(value: any): string[] {\n if (!value) return [];\n if (typeof value === \"string\") return [value];\n if (Array.isArray(value)) return value.map((v: any) => (typeof v === \"object\" ? v.value ?? v : v));\n if (typeof value === \"object\") {\n const v = value.value ?? value;\n return typeof v === \"string\" ? [v] : Array.isArray(v) ? v : [];\n }\n return [];\n }\n\n async function populateRelationships(\n docs: any[],\n collection: CollectionConfig,\n db: BaseAdapter,\n registry: Registry,\n ): Promise<void> {\n if (docs.length === 0) return;\n const relFields = flattenRelationshipFields(collection.fields);\n if (relFields.length === 0) return;\n\n for (const relField of relFields) {\n const targetSlugs: string[] = Array.isArray(relField.relationTo) ? relField.relationTo : [relField.relationTo];\n const idsBySlug: Record<string, Set<string>> = {};\n\n for (const slug of targetSlugs) {\n idsBySlug[slug] = new Set<string>();\n }\n\n for (const doc of docs) {\n const raw = resolveDocField(collection.fields, doc, relField.name);\n const ids = extractRelValue(raw);\n for (const id of ids) {\n if (!id) continue;\n if (targetSlugs.length === 1) {\n idsBySlug[targetSlugs[0]].add(id);\n } else {\n for (const slug of targetSlugs) {\n idsBySlug[slug].add(id);\n }\n }\n }\n }\n\n for (const [targetSlug, idSet] of Object.entries(idsBySlug)) {\n if (idSet.size === 0) continue;\n const targetCollection = registry.getCollection(targetSlug);\n if (!targetCollection) continue;\n const titleField = targetCollection.admin?.useAsTitle || \"title\";\n\n const idArr = Array.from(idSet);\n const relatedDocs: any[] = [];\n for (const id of idArr) {\n try {\n const relDoc = await db.findByID({ collection: targetSlug, id, draft: true });\n if (relDoc) {\n const title = resolveDocField(targetCollection.fields, relDoc as any, titleField) ?? id;\n relatedDocs.push({ id, title: String(title) });\n }\n } catch {\n relatedDocs.push({ id, title: id });\n }\n }\n\n const titleMap = new Map(relatedDocs.map((d) => [d.id, d.title]));\n\n for (const doc of docs) {\n const raw = resolveDocField(collection.fields, doc, relField.name);\n if (!raw) continue;\n\n const setValue = (val: any) => {\n if (relField.name in doc) {\n doc[relField.name] = val;\n } else {\n for (const f of collection.fields) {\n if (f.type === \"tabs\" && (f as any).tabs) {\n for (const tab of (f as any).tabs) {\n if (tab.fields?.some((tf: any) => tf.name === relField.name)) {\n const tabData = doc[f.name!];\n if (tabData && typeof tabData === \"object\") {\n tabData[relField.name] = val;\n }\n }\n }\n }\n }\n }\n };\n\n if (typeof raw === \"string\") {\n setValue({ id: raw, title: titleMap.get(raw) || raw });\n } else if (Array.isArray(raw)) {\n setValue(raw.map((v: any) => {\n const id = typeof v === \"object\" ? (v.value ?? v.id) : v;\n return { id: id, title: titleMap.get(id) || id };\n }));\n } else if (typeof raw === \"object\") {\n const id = raw.value ?? raw.id;\n setValue({ id, title: titleMap.get(id) || id });\n }\n }\n }\n }\n }\n\n // Global search - searches across all collections, media, and system content\n app.get(\"/api/search\", async (c) => {\n try {\n const query = c.req.query(\"q\") || \"\";\n const collectionsParam = c.req.query(\"collections\") || \"\";\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"10\"), 50);\n\n if (!query || query.length < 2) {\n return c.json({ results: [], message: \"Query too short\" });\n }\n\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const targetCollections = collectionsParam\n ? collectionsParam.split(\",\").filter(Boolean)\n : registry.getCollectionSlugs();\n\n const results: Array<{\n collection: string;\n label: string;\n id: string;\n title: string;\n doc: any;\n }> = [];\n\n const regex = new RegExp(\n query.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"),\n \"i\",\n );\n\n for (const collection of registry.getCollections()) {\n if (!targetCollections.includes(collection.slug)) continue;\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) continue;\n\n const searchableFields = collection.fields\n .filter(\n (f) =>\n f.name &&\n f.name !== \"id\" &&\n (f.type === \"text\" ||\n f.type === \"email\" ||\n f.type === \"textarea\" ||\n f.type === \"richtext\" ||\n f.indexed) &&\n !f.admin?.hidden,\n )\n .map((f) => f.name!);\n\n if (searchableFields.length === 0) continue;\n\n try {\n const orConditions: Record<string, any>[] = searchableFields.map(\n (field) => {\n const condition: Record<string, any> = {};\n condition[field] = { like: `%${query}%` };\n return condition;\n },\n );\n\n const searchResult = await db.find({\n collection: collection.slug,\n where: { OR: orConditions },\n limit,\n tenantID: ctxTenantID,\n });\n\n await populateRelationships(searchResult.docs as any[], collection, db as BaseAdapter, registry);\n\n for (const doc of searchResult.docs as any[]) {\n const titleField =\n collection.admin?.useAsTitle ||\n searchableFields.find(\n (f) =>\n f === \"title\" ||\n f === \"name\" ||\n f === \"heading\" ||\n f === \"slug\",\n );\n const title = titleField ? (resolveDocField(collection.fields, doc, titleField) ?? doc.id) : doc.id;\n\n results.push({\n collection: collection.slug,\n label: collection.label || collection.slug,\n id: doc.id,\n title: String(title || \"Untitled\"),\n doc,\n });\n }\n } catch (err) {\n console.error(`Search error for ${collection.slug}:`, err);\n }\n }\n\n results.sort((a, b) => a.label.localeCompare(b.label));\n\n return c.json({ results });\n } catch (error: any) {\n return c.json({ error: error.message, results: [] }, 500);\n }\n });\n\n // API Key management — requires users:admin permission\n app.get(\"/api/keys\", async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:read\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n const page = parseInt(c.req.query(\"page\") || \"1\");\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"50\"), 100);\n const result = await db.find({ collection: API_KEY_COLLECTION, where: {}, page, limit, tenantID: ctxTenantID });\n const docs = (result.docs || []).map((doc: any) => ({\n id: doc.id,\n name: doc.name,\n keyPrefix: doc.keyPrefix,\n permissions: doc.permissions || [],\n lastUsed: doc.lastUsedAt,\n createdAt: doc.createdAt,\n }));\n return c.json({ docs, totalDocs: result.totalDocs || docs.length, totalPages: result.totalPages || 1 });\n } catch (error: any) {\n console.error(\"[ApiKeys] GET error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/keys\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n const body = await c.req.json();\n if (!body.name || typeof body.name !== \"string\") {\n return c.json({ error: \"name is required\" }, 400);\n }\n const rawKey = generateApiKey();\n const doc = await db.create({\n collection: API_KEY_COLLECTION,\n data: {\n userId: ctxUser.id,\n name: body.name,\n key: rawKey,\n keyPrefix: generateApiKeyPrefix(rawKey),\n permissions: Array.isArray(body.permissions) ? body.permissions : [\"*\"],\n expiresAt: body.expiresAt || null,\n createdAt: new Date().toISOString(),\n },\n });\n await sessionAuthAdapter?.createAuditLog({\n action: \"api_key_create\",\n userId: ctxUser.id,\n resource: \"api_key\",\n resourceId: (doc as any).id,\n success: true,\n metadata: { keyName: body.name },\n });\n return c.json({\n ...(doc as any),\n key: rawKey,\n permissions: Array.isArray(body.permissions) ? body.permissions : [\"*\"],\n }, 201);\n } catch (error: any) {\n console.error(\"[ApiKeys] POST error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(\"/api/keys/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n const id = c.req.param(\"id\");\n const existing = await db.findByID({ collection: API_KEY_COLLECTION, id });\n if (!existing) return c.json({ error: \"API key not found\" }, 404);\n await db.delete({ collection: API_KEY_COLLECTION, id });\n await sessionAuthAdapter?.createAuditLog({\n action: \"api_key_delete\",\n userId: ctxUser.id,\n resource: \"api_key\",\n resourceId: id,\n success: true,\n metadata: { keyName: (existing as any).name },\n });\n return c.json({ message: \"API key deleted\" });\n } catch (error: any) {\n console.error(\"[ApiKeys] DELETE error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // PATCH /api/keys/:id — update name / permissions / expires\n app.patch(\"/api/keys/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n const existing = await db.findByID({ collection: API_KEY_COLLECTION, id });\n if (!existing) return c.json({ error: \"API key not found\" }, 404);\n const updateData: Record<string, unknown> = {};\n if (typeof body.name === \"string\" && body.name.trim()) updateData.name = body.name.trim();\n if (Array.isArray(body.permissions)) updateData.permissions = body.permissions;\n if (body.expiresAt !== undefined) updateData.expiresAt = body.expiresAt || null;\n if (Object.keys(updateData).length === 0) return c.json({ error: \"Nothing to update\" }, 400);\n const updated = await db.update({ collection: API_KEY_COLLECTION, id, data: updateData });\n return c.json({ ...(updated as any), keyPrefix: (existing as any).keyPrefix });\n } catch (error: any) {\n console.error(\"[ApiKeys] PATCH error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/keys/:id/rotate — regenerate key, keep name/metadata\n app.post(\"/api/keys/:id/rotate\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n const id = c.req.param(\"id\");\n const existing = await db.findByID({ collection: API_KEY_COLLECTION, id });\n if (!existing) return c.json({ error: \"API key not found\" }, 404);\n const rawKey = generateApiKey();\n const updated = await db.update({\n collection: API_KEY_COLLECTION,\n id,\n data: {\n key: rawKey,\n keyPrefix: generateApiKeyPrefix(rawKey),\n lastUsedAt: null,\n },\n });\n await sessionAuthAdapter?.createAuditLog({\n action: \"api_key_rotate\",\n userId: ctxUser.id,\n resource: \"api_key\",\n resourceId: id,\n success: true,\n metadata: { keyName: (existing as any).name },\n });\n return c.json({\n ...(updated as any),\n key: rawKey,\n permissions: (existing as any).permissions,\n expiresAt: (existing as any).expiresAt,\n });\n } catch (error: any) {\n console.error(\"[ApiKeys] rotate error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Webhook management — requires users:admin permission\n app.get(\"/api/webhooks\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:read\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n \n const webhooks = await webhookService.getWebhooks();\n return c.json({ docs: webhooks });\n } catch (error: any) {\n console.error(\"[Webhooks] GET error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/webhooks\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const body = await c.req.json();\n const webhook = await webhookService.createWebhook(body);\n \n await sessionAuthAdapter?.createAuditLog({\n action: \"webhook_create\",\n userId: ctxUser.id,\n resource: \"webhook\",\n resourceId: webhook.id,\n success: true,\n metadata: { name: webhook.name, url: webhook.url },\n });\n \n return c.json(webhook, 201);\n } catch (error: any) {\n console.error(\"[Webhooks] POST error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/webhooks/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:read\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const id = c.req.param(\"id\");\n const webhook = await webhookService.getWebhookById(id);\n if (!webhook) return c.json({ error: \"Webhook not found\" }, 404);\n \n return c.json(webhook);\n } catch (error: any) {\n console.error(\"[Webhooks] GET :id error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.patch(\"/api/webhooks/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n const updated = await webhookService.updateWebhook(id, body);\n if (!updated) return c.json({ error: \"Webhook not found\" }, 404);\n \n await sessionAuthAdapter?.createAuditLog({\n action: \"webhook_update\",\n userId: ctxUser.id,\n resource: \"webhook\",\n resourceId: id,\n success: true,\n metadata: { name: updated.name },\n });\n \n return c.json(updated);\n } catch (error: any) {\n console.error(\"[Webhooks] PATCH error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(\"/api/webhooks/:id\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const id = c.req.param(\"id\");\n const existing = await webhookService.getWebhookById(id);\n if (!existing) return c.json({ error: \"Webhook not found\" }, 404);\n \n await webhookService.deleteWebhook(id);\n \n await sessionAuthAdapter?.createAuditLog({\n action: \"webhook_delete\",\n userId: ctxUser.id,\n resource: \"webhook\",\n resourceId: id,\n success: true,\n metadata: { name: existing.name },\n });\n \n return c.json({ message: \"Webhook deleted\" });\n } catch (error: any) {\n console.error(\"[Webhooks] DELETE error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.post(\"/api/webhooks/:id/test\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:admin\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const id = c.req.param(\"id\");\n const result = await webhookService.testWebhook(id);\n if (!result) return c.json({ error: \"Webhook not found\" }, 404);\n \n return c.json(result);\n } catch (error: any) {\n console.error(\"[Webhooks] test error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.get(\"/api/webhooks/:id/history\", async (c) => {\n try {\n const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n if (!ctxUser || !hasPermission(ctxUser as any, \"users:read\")) {\n return c.json({ error: \"Forbidden\" }, 403);\n }\n if (!webhookService) return c.json({ error: \"Webhook service not available\" }, 503);\n\n const id = c.req.param(\"id\");\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"50\"), 100);\n const history = await webhookService.getDeliveryHistory(id, limit);\n \n return c.json({ docs: history });\n } catch (error: any) {\n console.error(\"[Webhooks] history error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Dynamic collection routes\n const collections = registry.getCollections();\n\n for (const collection of collections) {\n const slug = collection.slug;\n\n if (slug === \"users\" || slug === \"audit_logs\") continue;\n\n const basePath = `/api/${slug}`;\n\n // GET /api/:collection - List\n app.get(basePath, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n if (ctxTenantID) {\n db.setTenantContext({ tenantId: ctxTenantID, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n const url = new URL(c.req.url);\n const page = parseInt(url.searchParams.get(\"page\") || \"1\");\n const limit = Math.min(parseInt(url.searchParams.get(\"limit\") || \"10\"), 100);\n const sort = url.searchParams.get(\"sort\") || undefined;\n const depth = parseInt(url.searchParams.get(\"depth\") || \"0\");\n const select = url.searchParams.get(\"select\")?.split(\",\") || undefined;\n const isDraftRequest = !!ctxUser;\n\n const result = await db.find({\n collection: slug,\n where: {},\n sort,\n limit,\n page,\n depth,\n tenantID: ctxTenantID,\n select,\n draft: isDraftRequest,\n });\n\n await populateRelationships(result.docs as any[], collection, db as BaseAdapter, registry);\n\n return c.json(result);\n } catch (error: any) {\n console.error(\"[API] list error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/:collection/:id/versions - List/compare versions\n app.get(`${basePath}/:id/versions`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n if (!id) {\n return c.json({ error: \"Missing document ID\" }, 400);\n }\n const url = new URL(c.req.url);\n const compareA = url.searchParams.get(\"compareA\");\n const compareB = url.searchParams.get(\"compareB\");\n\n auditApiKeyUsage(sessionAuthAdapter, apiKeyContext, `${basePath}/${id}/versions`, \"GET\", c.req.raw);\n\n // Compare two versions\n if (compareA && compareB) {\n const [versionA, versionB] = await Promise.all([\n db.findVersionByID({ collection: slug, versionId: compareA, tenantID: ctxTenantID }),\n db.findVersionByID({ collection: slug, versionId: compareB, tenantID: ctxTenantID }),\n ]);\n if (!versionA || !versionB) {\n return c.json({ error: \"Version not found\" }, 404);\n }\n const diffs = computeDiff(versionA.data, versionB.data);\n return c.json({ diffs });\n }\n\n const page = parseInt(url.searchParams.get(\"page\") || \"1\");\n const limit = Math.min(parseInt(url.searchParams.get(\"limit\") || \"10\"), 100);\n\n const result = await db.findVersions({\n collection: slug,\n documentId: id,\n page,\n limit,\n tenantID: ctxTenantID,\n });\n\n return c.json(result);\n } catch (error: any) {\n console.error(\"[API] versions error:\", error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.put(`${basePath}/:id/draft`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n const baseUpdatedAt = readBaseUpdatedAt(body);\n\n const originalDoc = await db.findByID<Record<string, any>>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n let finalData;\n if (body.delta) {\n finalData = { ...originalDoc, ...body.delta };\n } else {\n finalData = body.data ?? omitRevisionFields(body);\n }\n\n const version = await db.updateLatestVersion({\n collection: slug,\n documentId: id,\n data: finalData,\n status: 'draft',\n tenantID: ctxTenantID,\n });\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"document_update\",\n userId: ctxUser.id,\n resource: slug,\n resourceId: id,\n success: true,\n metadata: { type: \"draft_save\" }\n });\n }\n return c.json({ data: version, message: \"Draft saved successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n app.delete(`${basePath}/:id/draft`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"document_update\",\n userId: ctxUser.id,\n resource: slug,\n resourceId: c.req.param(\"id\"),\n success: true,\n metadata: { type: \"draft_discard\" }\n });\n }\n return c.json({ message: \"Draft discarded successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n function computeDiff(a: Record<string, any>, b: Record<string, any>): { field: string; oldValue: any; newValue: any }[] {\n const diffs: { field: string; oldValue: any; newValue: any }[] = [];\n const allKeys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const key of allKeys) {\n if (key === \"id\" || key === \"createdAt\" || key === \"updatedAt\") continue;\n if (JSON.stringify(a[key]) !== JSON.stringify(b[key])) {\n diffs.push({ field: key, oldValue: key in a ? a[key] : undefined, newValue: key in b ? b[key] : undefined });\n }\n }\n return diffs;\n }\n\n // GET /api/:collection/:id - Find by ID\n app.get(`${basePath}/:id`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const url = new URL(c.req.url);\n const depth = parseInt(url.searchParams.get(\"depth\") || \"0\");\n const select = url.searchParams.get(\"select\")?.split(\",\") || undefined;\n // Admin always sees the current doc state regardless of publish status\n const isDraftRequest = !!ctxUser;\n\n let doc = await db.findByID({\n collection: slug,\n id,\n depth,\n tenantID: ctxTenantID,\n select,\n draft: isDraftRequest,\n });\n\n // Fallback to slug lookup if ID lookup fails and collection has a slug field\n if (!doc && collection.fields.some((f: any) => f.name === \"slug\")) {\n doc = await db.findOne({\n collection: slug,\n where: { slug: id },\n tenantID: ctxTenantID,\n draft: isDraftRequest,\n });\n }\n\n if (!doc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n await populateRelationships([doc as any], collection, db as BaseAdapter, registry);\n\n return c.json({ data: doc });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/:collection - Create\n app.post(basePath, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"create\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n if (ctxTenantID) {\n db.setTenantContext({ tenantId: ctxTenantID, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n auditApiKeyUsage(sessionAuthAdapter, apiKeyContext, basePath, \"POST\", c.req.raw);\n\n const body = await c.req.json();\n let validated = body;\n\n // Convert empty strings to null for non-textual field types (recursive)\n normalizeEmptyStrings(validated, collection.fields);\n\n // Convert legacy string values to richtext format; unwrap TipTap doc objects\n convertRichtextFields(collection.fields, validated);\n\n const hookReq = c.req.raw as unknown as KyroRequest;\n\n if (collection.hooks?.beforeValidate) {\n for (const hook of collection.hooks.beforeValidate) {\n const hookResult = await hook({\n collection: slug,\n data: validated,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"create\",\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n const schema = registry.getCreateZodSchema(slug);\n try {\n validated = schema.parse(validated);\n } catch (zodErr: any) {\n return c.json({ error: `Validation failed: ${formatZodErrors(zodErr.errors)}`, details: zodErr.errors }, 400);\n }\n\n if (collection.tenantScoped && ctxTenantID) {\n validated.tenantID = ctxTenantID;\n }\n\n const isDraftEnabled = collection.versions?.drafts === true;\n validated.status = isDraftEnabled ? 'draft' : 'published';\n\n if (collection.hooks?.beforeChange) {\n for (const hook of collection.hooks.beforeChange) {\n const hookResult = await hook({\n collection: slug,\n data: validated,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"create\",\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n const doc = await db.create({\n collection: slug,\n data: validated,\n tenantID: ctxTenantID,\n });\n\n // Create initial version if drafts enabled\n if (isDraftEnabled) {\n await db.createVersion({\n collection: slug,\n documentId: (doc as any).id,\n data: validated,\n status: 'draft',\n createdBy: ctxUser?.id,\n changeDescription: 'Created',\n tenantID: ctxTenantID,\n });\n }\n\n if (collection.hooks?.afterChange) {\n for (const hook of collection.hooks.afterChange) {\n await hook({\n collection: slug,\n doc,\n data: validated,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"create\",\n });\n }\n }\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"create\"), {\n collection: slug,\n operation: \"create\",\n data: doc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"document_create\",\n userId: ctxUser.id,\n resource: slug,\n resourceId: (doc as any).id,\n success: true,\n });\n }\n return c.json({ data: doc, message: \"Created successfully\" }, 201);\n } catch (error: any) {\n if (error.name === \"ZodError\") {\n return c.json(\n { error: `Validation failed: ${formatZodErrors(error.errors)}`, details: error.errors },\n 400,\n );\n }\n return c.json({ error: error.message }, 500);\n }\n });\n\n // PATCH /api/:collection/:id - Update\n app.patch(`${basePath}/:id`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n const baseUpdatedAt = readBaseUpdatedAt(body);\n\n\n const originalDoc = await db.findByID<Record<string, any>>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n if (baseUpdatedAt && originalDoc.updatedAt && baseUpdatedAt !== originalDoc.updatedAt) {\n return c.json(buildConflictResponse(baseUpdatedAt, originalDoc), 409);\n }\n\n let validated = Object.fromEntries(\n Object.entries(omitRevisionFields(body)).filter(\n ([_, v]) => v !== \"null\" && v !== undefined,\n ),\n );\n\n // Convert empty strings to null for non-textual field types (recursive)\n normalizeEmptyStrings(validated, collection.fields);\n\n // Convert legacy string values to richtext format; unwrap TipTap doc objects\n convertRichtextFields(collection.fields, validated);\n\n const hookReq = c.req.raw as unknown as KyroRequest;\n\n if (collection.hooks?.beforeValidate) {\n for (const hook of collection.hooks.beforeValidate) {\n const hookResult = await hook({\n collection: slug,\n data: validated,\n originalDoc,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"update\",\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n const schema = registry.getUpdateZodSchema(slug);\n validated = schema.parse(validated);\n\n if (collection.hooks?.beforeChange) {\n for (const hook of collection.hooks.beforeChange) {\n const hookResult = await hook({\n collection: slug,\n data: validated,\n originalDoc,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"update\",\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n const isDraft = c.req.header(\"X-Draft\") === \"true\";\n const isDraftEnabled = collection.versions?.drafts === true;\n const isAutosave = c.req.query(\"autosave\") === \"true\";\n\n let doc;\n if (isDraftEnabled && isDraft) {\n // Draft save: versions table only, don't touch main doc\n // Autosave reuses a single version slot; manual draft creates a new version\n await db.createVersion({\n collection: slug,\n documentId: id,\n data: validated,\n status: 'draft',\n autosave: isAutosave,\n createdBy: ctxUser?.id,\n changeDescription: isAutosave ? 'Autosave' : 'Draft saved',\n tenantID: ctxTenantID,\n });\n } else if (isDraftEnabled) {\n // Publish: main doc + versions table\n await db.update({\n collection: slug,\n id,\n data: { ...validated, status: 'published' },\n tenantID: ctxTenantID,\n });\n await db.createVersion({\n collection: slug,\n documentId: id,\n data: validated,\n status: 'published',\n createdBy: ctxUser?.id,\n changeDescription: 'Published',\n tenantID: ctxTenantID,\n });\n } else {\n // No versions: direct update\n await db.update({\n collection: slug,\n id,\n data: validated,\n tenantID: ctxTenantID,\n });\n }\n\n // Refetch with draft: true to ensure we return the latest merged data\n doc = await db.findByID({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (collection.hooks?.afterChange) {\n for (const hook of collection.hooks.afterChange) {\n await hook({\n collection: slug,\n doc,\n data: validated,\n originalDoc,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"update\",\n });\n }\n }\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"update\"), {\n collection: slug,\n operation: \"update\",\n data: doc,\n previousData: originalDoc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n auditApiKeyUsage(sessionAuthAdapter, apiKeyContext, `${basePath}/${id}`, \"PATCH\", c.req.raw);\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"document_update\",\n userId: ctxUser.id,\n resource: slug,\n resourceId: id,\n success: true,\n });\n }\n return c.json({ data: doc, message: isDraftEnabled ? \"Draft saved\" : \"Updated successfully\" });\n } catch (error: any) {\n if (error.name === \"ZodError\") {\n console.error(`[PATCH ${basePath}/:id] Validation failed:`, error.errors);\n return c.json(\n { error: `Validation failed: ${formatZodErrors(error.errors)}`, details: error.errors },\n 400,\n );\n }\n console.error(`[PATCH ${basePath}/:id] ERROR:`, error.message, `CAUSE:`, error.cause?.message || error.cause, `QUERY:`, error.query);\n return c.json({ error: error.message }, 500);\n }\n });\n\n// DELETE /api/:collection/:id - Delete\napp.delete(`${basePath}/:id`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"delete\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n if (ctxTenantID) {\n db.setTenantContext({ tenantId: ctxTenantID, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n const id = c.req.param(\"id\");\n\n\n const hookReq = c.req.raw as unknown as KyroRequest;\n\n const originalDoc = await db.findByID({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n if (collection.hooks?.beforeDelete) {\n for (const hook of collection.hooks.beforeDelete) {\n await hook({\n collection: slug,\n doc: originalDoc,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"delete\",\n });\n }\n }\n\n const doc = await db.delete({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n });\n\n if (collection.hooks?.afterDelete) {\n for (const hook of collection.hooks.afterDelete) {\n await hook({\n collection: slug,\n doc,\n originalDoc,\n req: hookReq,\n user: ctxUser,\n tenantID: ctxTenantID,\n operation: \"delete\",\n });\n }\n }\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"delete\"), {\n collection: slug,\n operation: \"delete\",\n data: doc,\n previousData: originalDoc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n auditApiKeyUsage(sessionAuthAdapter, apiKeyContext, `${basePath}/${id}`, \"DELETE\", c.req.raw);\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"document_delete\",\n userId: ctxUser.id,\n resource: slug,\n resourceId: id,\n success: true,\n });\n }\n return c.json({ data: doc, message: \"Deleted successfully\" });\n } catch (error: any) {\n console.error(`[DELETE] Error deleting ${slug}:`, error);\n return c.json({ error: error.message || String(error) }, 500);\n }\n});\n\n// POST /api/:collection/:id/duplicate - Duplicate document\napp.post(`${basePath}/:id/duplicate`, async (c) => {\n try {\n\n\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"create\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n\n\n // Get the original document\n const originalDoc = await db.findByID<any>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) {\n\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n\n // Create a copy with new ID and modified slug\n const { id: _oldId, createdAt: _oldCreated, updatedAt: _oldUpdated, ...docData } = originalDoc as any;\n\n // Generate new slug - ensure it's unique\n const timestamp = Date.now().toString(36);\n const newSlug = `${originalDoc.slug || \"document\"}-copy-${timestamp}`;\n\n\n // Create the duplicate\n const newDoc = await db.create({\n collection: slug,\n data: {\n ...docData,\n slug: newSlug,\n status: \"draft\",\n },\n tenantID: ctxTenantID,\n });\n\n\n return c.json({ data: newDoc, message: \"Document duplicated successfully\" });\n } catch (error: any) {\n console.error(\"[Duplicate] Error:\", error);\n return c.json({ error: error.message || String(error) }, 500);\n }\n});\n\n// POST /api/:collection/:id/versions/:versionId/restore - Restore version (RESTful)\napp.post(`${basePath}/:id/versions/:versionId/restore`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const versionId = c.req.param(\"versionId\");\n\n const version = await db.findVersionByID({\n collection: slug,\n versionId,\n tenantID: ctxTenantID,\n });\n\n if (!version) {\n return c.json({ error: \"Version not found\" }, 404);\n }\n\n const doc = await db.update({\n collection: slug,\n id,\n data: { ...version.data, status: 'draft' },\n tenantID: ctxTenantID,\n });\n\n return c.json({\n data: doc,\n message: \"Version restored successfully\",\n });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n});\n\n// POST /api/:collection/:id/versions - Restore version (Legacy)\napp.post(`${basePath}/:id/versions`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const body = await c.req.json();\n const { versionId, action } = body;\n\n if (action === \"restore\" && versionId) {\n const version = await db.findVersionByID({\n collection: slug,\n versionId,\n tenantID: ctxTenantID,\n });\n\n if (!version) {\n return c.json({ error: \"Version not found\" }, 404);\n }\n\n const doc = await db.update({\n collection: slug,\n id: c.req.param(\"id\"),\n data: { ...version.data, status: 'draft' },\n tenantID: ctxTenantID,\n });\n\n return c.json({\n data: doc,\n message: \"Version restored successfully\",\n });\n }\n\n return c.json({ error: \"Invalid action\" }, 400);\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n});\n\n// POST /api/:collection/:id/publish - Publish document\napp.post(`${basePath}/:id/publish`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n if (ctxTenantID) {\n db.setTenantContext({ tenantId: ctxTenantID, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n const id = c.req.param(\"id\");\n const body = await c.req.json().catch(() => ({}));\n const baseUpdatedAt = readBaseUpdatedAt(body);\n\n // Fetch the current doc regardless of status (bypass public filter)\n const originalDoc = await db.findByID<Record<string, any>>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n if (baseUpdatedAt && originalDoc.updatedAt && baseUpdatedAt !== originalDoc.updatedAt) {\n return c.json(buildConflictResponse(baseUpdatedAt, originalDoc), 409);\n }\n\n // Determine what data to publish — merge latest version data if available\n let publishData: Record<string, any> = { status: 'published' };\n let finalContent = originalDoc;\n\n // If drafts enabled, merge latest draft version into the published content\n if (collection.versions?.drafts) {\n const versions = await db.findVersions({\n collection: slug,\n documentId: id,\n limit: 1,\n sort: '-createdAt',\n tenantID: ctxTenantID,\n });\n if (versions.docs.length > 0) {\n const latestVersion = versions.docs[0];\n finalContent = { ...originalDoc, ...latestVersion.data };\n publishData = { ...latestVersion.data, ...publishData };\n }\n }\n\n // Update main doc\n const doc = await db.update({\n collection: slug,\n id,\n data: publishData,\n tenantID: ctxTenantID,\n });\n\n // Create a formal 'published' version record\n if (collection.versions?.drafts) {\n await db.createVersion({\n collection: slug,\n documentId: id,\n data: { ...finalContent, status: 'published' },\n status: 'published',\n createdBy: ctxUser?.id,\n changeDescription: 'Published',\n tenantID: ctxTenantID,\n });\n }\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"update\"), {\n collection: slug,\n operation: \"update\",\n data: doc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n return c.json({ data: doc, message: \"Published successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n});\n\n// POST /api/:collection/:id/unpublish - Unpublish document\napp.post(`${basePath}/:id/unpublish`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n // Fetch current doc bypassing status filter\n const currentDoc = await db.findByID<Record<string, any>>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true,\n });\n if (!currentDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n const doc = await db.update({\n collection: slug,\n id,\n data: { status: 'draft' },\n tenantID: ctxTenantID,\n });\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"update\"), {\n collection: slug,\n operation: \"update\",\n data: doc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n return c.json({ data: doc, message: \"Unpublished successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n});\n }\n\n// Dynamic global routes\nfor (const globalConfig of registry.getGlobals()) {\n const slug = globalConfig.slug;\n const basePath = `/api/globals/${slug}`;\n\n // GET /api/globals/:slug\n app.get(basePath, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(\n globalConfig,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const isDraftRequest = !!ctxUser;\n\n let doc = await db.findOne({\n collection: `_globals_${slug}`,\n where: {},\n tenantID: ctxTenantID,\n draft: isDraftRequest,\n });\n\n if (slug === \"system\") {\n const newSecret = crypto.randomBytes(32).toString(\"hex\");\n if (!doc) {\n doc = await db.create({\n collection: `_globals_${slug}`,\n data: { id: slug, appSecret: newSecret },\n tenantID: ctxTenantID,\n });\n } else if (!doc.appSecret) {\n await db.update({\n collection: `_globals_${slug}`,\n id: slug,\n data: { appSecret: newSecret },\n tenantID: ctxTenantID,\n });\n doc.appSecret = newSecret;\n }\n }\n\n return c.json({ data: doc || {} });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST & PATCH /api/globals/:slug - Update\n const upsertGlobal = async (c: any) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(\n globalConfig,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const body = omitRevisionFields(await c.req.json());\n const cleaned = Object.fromEntries(\n Object.entries(body).filter(([_, v]) => v !== null && v !== \"null\" && v !== undefined),\n );\n\n // Convert empty strings to null for non-textual field types (recursive)\n normalizeEmptyStrings(cleaned, globalConfig.fields);\n\n // Convert legacy string values to richtext format; unwrap TipTap doc objects\n convertRichtextFields(globalConfig.fields, cleaned);\n\n const schema = registry.getUpdateZodSchema(slug);\n\n let validated;\n try {\n validated = schema.parse(cleaned);\n } catch (zodErr: any) {\n return c.json({ error: `Validation failed: ${formatZodErrors(zodErr.errors)}`, details: zodErr.errors }, 400);\n }\n\n // Strip system-managed fields — they are auto-set by the database\n const SYSTEM_FIELDS = new Set([\"id\", \"createdAt\", \"updatedAt\", \"status\", \"baseUpdatedAt\", \"_baseUpdatedAt\"]);\n const userData = Object.fromEntries(\n Object.entries(validated).filter(([k]) => !SYSTEM_FIELDS.has(k)),\n );\n\n const collectionSlug = `_globals_${slug}`;\n const originalDoc = await db.findOne({\n collection: collectionSlug,\n where: {},\n tenantID: ctxTenantID,\n draft: true,\n });\n\n const isDraft = c.req.header(\"X-Draft\") === \"true\";\n const isDraftEnabled = globalConfig.versions?.drafts === true;\n const isAutosave = c.req.query(\"autosave\") === \"true\";\n\n let doc: any;\n if (isDraftEnabled && isDraft) {\n // Draft save: versions only (matches collection behavior)\n await db.createVersion({\n collection: collectionSlug,\n documentId: slug,\n data: userData,\n status: 'draft',\n autosave: isAutosave,\n createdBy: ctxUser?.id,\n changeDescription: isAutosave ? 'Autosave' : 'Manual save',\n tenantID: ctxTenantID,\n });\n\n if (!originalDoc) {\n doc = await db.create({\n collection: collectionSlug,\n data: { ...userData, id: slug, status: 'draft' },\n tenantID: ctxTenantID,\n });\n } else {\n doc = originalDoc;\n }\n } else if (isDraftEnabled && !isDraft) {\n // Publish: update main doc + create published version\n const publishStatus = 'published';\n if (originalDoc) {\n doc = await db.update({\n collection: collectionSlug,\n id: slug,\n data: { ...userData, status: publishStatus },\n tenantID: ctxTenantID,\n });\n } else {\n doc = await db.create({\n collection: collectionSlug,\n data: { ...userData, id: slug, status: publishStatus },\n tenantID: ctxTenantID,\n });\n }\n await db.createVersion({\n collection: collectionSlug,\n documentId: slug,\n data: userData,\n status: publishStatus,\n autosave: false,\n createdBy: ctxUser?.id,\n changeDescription: 'Published',\n tenantID: ctxTenantID,\n });\n } else {\n // No versions: direct update/create\n if (originalDoc) {\n doc = await db.update({\n collection: collectionSlug,\n id: slug,\n data: userData,\n tenantID: ctxTenantID,\n });\n } else {\n doc = await db.create({\n collection: collectionSlug,\n data: { ...userData, id: slug },\n tenantID: ctxTenantID,\n });\n }\n }\n\n if (slug === \"storage-settings\") {\n mediaService = null;\n mediaServiceInitError = null;\n }\n if (slug === \"email-settings\") {\n const newEmailTransport = await EmailTransport.fromConfig(db);\n (authRoutes as any).email = newEmailTransport || undefined;\n }\n if (slug === \"system\") {\n await loadSecrets();\n }\n\n if (ctxUser) {\n sessionAuthAdapter?.createAuditLog({\n action: \"settings_change\",\n userId: ctxUser.id,\n resource: `global:${slug}`,\n resourceId: slug,\n success: true,\n });\n }\n return c.json({ data: doc, message: \"Updated successfully\" });\n } catch (error: any) {\n console.error(`[API] Save global \"${slug}\" failed:`, error);\n return c.json({\n error: error.message || \"Save failed\",\n stack: process.env.NODE_ENV === 'development' ? error.stack : undefined\n }, 500);\n }\n };\n\n app.post(basePath, upsertGlobal);\n app.patch(basePath, upsertGlobal);\n\n // POST /api/globals/:slug/publish\n app.post(`${basePath}/publish`, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(globalConfig, \"update\", c.req.raw, ctxUser, ctxTenantID, enablePublicAccess);\n if (!access.allowed) return c.json({ error: access.error }, 403);\n\n const collectionSlug = `_globals_${slug}`;\n const originalDoc = await db.findOne({\n collection: collectionSlug,\n where: {},\n tenantID: ctxTenantID,\n draft: true,\n });\n\n if (!originalDoc) return c.json({ error: \"Global not found\" }, 404);\n\n let publishData: Record<string, any> = { status: 'published' };\n let finalContent = originalDoc;\n\n if (globalConfig.versions?.drafts) {\n const versions = await db.findVersions({\n collection: collectionSlug,\n documentId: slug,\n limit: 1,\n sort: '-createdAt',\n tenantID: ctxTenantID,\n });\n if (versions.docs.length > 0) {\n finalContent = { ...originalDoc, ...versions.docs[0].data };\n publishData = { ...versions.docs[0].data, ...publishData };\n }\n }\n\n const doc = await db.update({\n collection: collectionSlug,\n id: slug,\n data: publishData,\n tenantID: ctxTenantID,\n });\n\n if (globalConfig.versions?.drafts) {\n await db.createVersion({\n collection: collectionSlug,\n documentId: slug,\n data: { ...finalContent, status: 'published' },\n status: 'published',\n createdBy: ctxUser?.id,\n changeDescription: 'Published',\n tenantID: ctxTenantID,\n });\n }\n\n return c.json({ data: doc, message: \"Published successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/globals/:slug/unpublish\n app.post(`${basePath}/unpublish`, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(globalConfig, \"update\", c.req.raw, ctxUser, ctxTenantID, enablePublicAccess);\n if (!access.allowed) return c.json({ error: access.error }, 403);\n\n const doc = await db.update({\n collection: `_globals_${slug}`,\n id: slug,\n data: { status: 'draft' },\n tenantID: ctxTenantID,\n });\n\n return c.json({ data: doc, message: \"Unpublished successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/globals/:slug/versions\n app.get(`${basePath}/versions`, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(globalConfig, \"read\", c.req.raw, ctxUser, ctxTenantID, enablePublicAccess);\n if (!access.allowed) return c.json({ error: access.error }, 403);\n\n const limit = parseInt(c.req.query(\"limit\") || \"10\");\n const page = parseInt(c.req.query(\"page\") || \"1\");\n\n const versions = await db.findVersions({\n collection: `_globals_${slug}`,\n documentId: slug,\n limit,\n page,\n tenantID: ctxTenantID,\n });\n\n return c.json(versions);\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/globals/:slug/versions/:id\n app.get(`${basePath}/versions/:versionId`, async (c) => {\n try {\n const versionId = c.req.param(\"versionId\");\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(globalConfig, \"read\", c.req.raw, ctxUser, ctxTenantID, enablePublicAccess);\n if (!access.allowed) return c.json({ error: access.error }, 403);\n\n const version = await db.findVersionByID({\n collection: `_globals_${slug}`,\n versionId,\n tenantID: ctxTenantID,\n });\n\n if (!version) return c.json({ error: \"Version not found\" }, 404);\n return c.json({ data: version });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/globals/:slug/versions/:id/restore\n app.post(`${basePath}/versions/:versionId/restore`, async (c) => {\n try {\n const versionId = c.req.param(\"versionId\");\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(globalConfig, \"update\", c.req.raw, ctxUser, ctxTenantID, enablePublicAccess);\n if (!access.allowed) return c.json({ error: access.error }, 403);\n\n const collectionSlug = `_globals_${slug}`;\n const version = await db.findVersionByID({\n collection: collectionSlug,\n versionId,\n tenantID: ctxTenantID,\n });\n\n if (!version) return c.json({ error: \"Version not found\" }, 404);\n\n const doc = await db.update({\n collection: collectionSlug,\n id: slug,\n data: { ...version.data, status: 'draft' },\n tenantID: ctxTenantID,\n });\n\n return c.json({\n data: doc,\n message: \"Version restored successfully\",\n });\n\n return c.json({ data: doc, message: \"Restored successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Special handler for email settings test\n if (slug === \"email-settings\") {\n app.post(`${basePath}/test`, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(\n globalConfig,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n );\n if (!access.allowed) {\n return c.json(\n { error: access.error },\n (access.status || 403) as any,\n );\n }\n\n const body = await c.req.json();\n\n // Map the raw body to the EmailConfig structure\n // AutoForm sends the same structure as defined in email.ts\n const transportConfig: any = {\n provider: body.provider,\n from: body.fromEmail || body.from,\n fromName: body.fromName,\n replyTo: body.replyTo,\n smtp: body.smtp\n ? {\n host: body.smtp.host,\n port: body.smtp.port,\n secure: body.smtp.secure,\n auth: {\n user: body.smtp.username || body.smtp.user,\n pass: body.smtp.password || body.smtp.pass,\n },\n }\n : undefined,\n resend: body.resend,\n sendgrid: body.sendgrid,\n mailgun: body.mailgun,\n ses: body.ses,\n };\n\n const transport = new EmailTransport(transportConfig);\n\n // Attempt to send a test email\n // The recipient is taken from the form body (testEmailSection.testEmail or testEmail)\n const recipient =\n body.testEmail ||\n (body.testEmailSection && body.testEmailSection.testEmail);\n\n if (!recipient) {\n return c.json({ error: \"No test recipient email provided\" }, 400);\n }\n\n await transport.send({\n to: recipient,\n subject: \"Kyro CMS - Test Email\",\n html: `\n <div style=\"font-family: sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #e2e8f0; border-radius: 8px;\">\n <h1 style=\"color: #0b1222; margin-bottom: 16px;\">Success! 🚀</h1>\n <p style=\"font-size: 16px; color: #334155; line-height: 1.6;\">\n Your email settings in <b>Kyro CMS</b> are working correctly.\n </p>\n <div style=\"background: #f8fafc; padding: 16px; border-radius: 6px; margin: 24px 0;\">\n <p style=\"margin: 0; font-size: 14px; color: #64748b;\">\n <b>Provider:</b> ${body.provider.toUpperCase()}\n </p>\n <p style=\"margin: 8px 0 0; font-size: 14px; color: #64748b;\">\n <b>Sent at:</b> ${new Date().toLocaleString()}\n </p>\n </div>\n <p style=\"font-size: 12px; color: #94a3b8; margin-top: 32px; border-top: 1px solid #f1f5f9; padding-top: 16px;\">\n This is a test email sent from the Kyro CMS Admin Panel.\n </p>\n </div>\n `,\n text: `Success! Your email settings in Kyro CMS are working correctly.\\n\\nProvider: ${body.provider}\\nSent at: ${new Date().toLocaleString()}`,\n });\n\n return c.json({ message: \"Test email sent successfully!\" });\n } catch (error: any) {\n console.error(\"[Email Test] Failed:\", error);\n return c.json(\n { error: error.message || \"Failed to send test email\" },\n 500,\n );\n }\n });\n }\n}\n\nreturn app;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createRESTAPI(\n registry: Registry,\n db: BaseAdapter,\n options?: {\n authSecret?: string;\n user?: User;\n req?: Request;\n tenantID?: string;\n cors?: {\n origins?: string[];\n credentials?: boolean;\n };\n webhookService?: ReturnType<typeof createWebhookService>;\n },\n): Hono {\n return createHonoApp({\n registry,\n db,\n authSecret: options?.authSecret,\n user: options?.user,\n req: options?.req,\n tenantID: options?.tenantID,\n cors: options?.cors,\n webhookService: options?.webhookService,\n });\n}\n","import type { RateLimitConfig, RateLimitResult } from \"./rate-limit.js\";\n\nexport class InMemoryRateLimiter {\n private storage: Map<string, { timestamp: number; count: number }[]> =\n new Map();\n private userStorage: Map<\n string,\n Map<string, { timestamp: number; count: number }[]>\n > = new Map();\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n ) {\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${type}:${identifier}`;\n }\n\n private getUserKey(type: string, userId: string, identifier: string): string {\n return `user:${type}:${userId}:${identifier}`;\n }\n\n private cleanupOldEntries(\n entries: { timestamp: number; count: number }[],\n window: number,\n ): void {\n const now = Date.now();\n const windowStart = now - window;\n\n // Remove entries older than the window\n while (entries.length > 0 && entries[0].timestamp < windowStart) {\n entries.shift();\n }\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n let entries = this.storage.get(key);\n if (!entries) {\n entries = [];\n this.storage.set(key, entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n // Add current request\n entries.push({ timestamp: now, count: 1 });\n\n if (count >= config.max) {\n // Find the oldest entry in window to calculate reset time\n const oldestEntry = entries.reduce(\n (oldest, current) =>\n oldest.timestamp < current.timestamp ? oldest : current,\n entries[0],\n );\n\n const resetAt = oldestEntry.timestamp + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const userMap = this.userStorage.get(userId);\n let entries: { timestamp: number; count: number }[] = [];\n\n if (userMap) {\n entries = userMap.get(this.getKey(type, identifier)) || [];\n } else {\n // Initialize user storage if not exists\n if (!this.userStorage.has(userId)) {\n this.userStorage.set(userId, new Map());\n }\n this.userStorage.get(userId)!.set(this.getKey(type, identifier), entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n // Add current request\n entries.push({ timestamp: now, count: 1 });\n\n if (count >= config.max) {\n // Find the oldest entry in window to calculate reset time\n const oldestEntry = entries.reduce(\n (oldest, current) =>\n oldest.timestamp < current.timestamp ? oldest : current,\n entries[0],\n );\n\n const resetAt = oldestEntry.timestamp + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n this.storage.delete(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const userMap = this.userStorage.get(userId);\n if (userMap) {\n const key = this.getKey(type, identifier);\n userMap.delete(key);\n }\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n let entries = this.storage.get(key);\n if (!entries) {\n entries = [];\n this.storage.set(key, entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createInMemoryRateLimiter(\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n) {\n return new InMemoryRateLimiter(limits, userLimits);\n}\n\nconst DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n","export type AuditAction =\n | \"login\"\n | \"logout\"\n | \"login_failed\"\n | \"register\"\n | \"verify_email\"\n | \"password_change\"\n | \"password_reset\"\n | \"password_reset_request\"\n | \"role_change\"\n | \"permission_change\"\n | \"document_create\"\n | \"document_update\"\n | \"document_delete\"\n | \"settings_change\"\n | \"user_lockout\"\n | \"user_unlock\"\n | \"user_create\"\n | \"user_update\"\n | \"user_delete\"\n | \"api_request\"\n | \"api_key_create\"\n | \"api_key_update\"\n | \"api_key_rotate\"\n | \"api_key_delete\"\n | \"tenant_create\"\n | \"tenant_delete\";\n\nexport interface AuditLog {\n id: string;\n timestamp: Date;\n action: AuditAction;\n userId?: string;\n userEmail?: string;\n role?: string;\n resource: string;\n resourceId?: string;\n changes?: { field: string; old: any; new: any }[];\n ipAddress?: string;\n userAgent?: string;\n success: boolean;\n error?: string;\n metadata?: Record<string, any>;\n}\n\nexport interface AuditLogFilter {\n userId?: string;\n action?: AuditAction | AuditAction[];\n resource?: string;\n resourceId?: string;\n success?: boolean;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n}\n\nexport interface AuditRetentionConfig {\n retentionDays: number;\n cleanupIntervalHours: number;\n}\n\nexport const DEFAULT_RETENTION_CONFIG: AuditRetentionConfig = {\n retentionDays: 30,\n cleanupIntervalHours: 24,\n};\n","import type {\n AuditAction,\n AuditLog,\n AuditLogFilter,\n AuditRetentionConfig,\n} from \"./audit-log-types.js\";\nimport type { Redis } from \"ioredis\";\nimport { randomBytes } from \"crypto\";\n\nexport {\n type AuditAction,\n type AuditLog,\n type AuditLogFilter,\n type AuditRetentionConfig,\n DEFAULT_RETENTION_CONFIG,\n} from \"./audit-log-types.js\";\n\nexport class AuditLogger {\n private redis: Redis;\n private prefix: string;\n private retentionDays: number;\n\n constructor(\n redis: Redis,\n retentionDays: number = 30,\n prefix: string = \"kyro:audit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.retentionDays = retentionDays;\n }\n\n async log(data: Omit<AuditLog, \"id\" | \"timestamp\">): Promise<string> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n\n const log: AuditLog = {\n ...data,\n id,\n timestamp,\n };\n\n const key = this.getKeyForDate(timestamp);\n const hashKey = `${this.prefix}log:${id}`;\n\n await this.redis.hset(hashKey, this.serializeLog(log));\n await this.redis.expire(hashKey, this.retentionDays * 24 * 60 * 60 + 3600);\n\n await this.redis.zadd(key, timestamp.getTime(), id);\n await this.redis.expire(key, this.retentionDays * 24 * 60 * 60 + 3600);\n\n const userIndex = data.userId ? `${this.prefix}user:${data.userId}` : null;\n if (userIndex) {\n await this.redis.zadd(userIndex, timestamp.getTime(), id);\n await this.redis.expire(\n userIndex,\n this.retentionDays * 24 * 60 * 60 + 3600,\n );\n }\n\n return id;\n }\n\n async get(id: string): Promise<AuditLog | null> {\n const hashKey = `${this.prefix}log:${id}`;\n const data = await this.redis.hgetall(hashKey);\n\n if (!data || Object.keys(data).length === 0) {\n return null;\n }\n\n return this.deserializeLog(data);\n }\n\n async query(filter: AuditLogFilter = {}): Promise<{\n logs: AuditLog[];\n total: number;\n }> {\n const { limit = 50, offset = 0 } = filter;\n\n let keys: string[] = [];\n\n if (filter.userId) {\n keys.push(`${this.prefix}user:${filter.userId}`);\n } else if (filter.startDate || filter.endDate) {\n keys = this.getKeysForDateRange(filter.startDate, filter.endDate);\n } else {\n const now = new Date();\n keys = this.getKeysForDateRange(\n new Date(now.getTime() - this.retentionDays * 24 * 60 * 60 * 1000),\n now,\n );\n }\n\n let idScores: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n idScores.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n idScores.sort((a, b) => b[1] - a[1]);\n\n const total = idScores.length;\n idScores = idScores.slice(offset, offset + limit);\n\n const logs: AuditLog[] = [];\n for (const [id] of idScores) {\n const log = await this.get(id);\n if (log) {\n if (this.matchesFilter(log, filter)) {\n logs.push(log);\n }\n }\n }\n\n return { logs, total };\n }\n\n async getRecent(limit: number = 50): Promise<AuditLog[]> {\n const logs: AuditLog[] = [];\n const now = new Date();\n const keys = this.getKeysForDateRange(\n new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000),\n now,\n );\n\n let allIds: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n allIds.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n allIds.sort((a, b) => b[1] - a[1]);\n\n for (const [id] of allIds.slice(0, limit)) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getUserActivity(\n userId: string,\n limit: number = 50,\n ): Promise<AuditLog[]> {\n const key = `${this.prefix}user:${userId}`;\n const ids = await this.redis.zrange(key, 0, limit - 1);\n\n const logs: AuditLog[] = [];\n for (const id of ids) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getStats(\n startDate?: Date,\n endDate?: Date,\n ): Promise<{\n totalEvents: number;\n byAction: Record<string, number>;\n successRate: number;\n failedLogins: number;\n uniqueUsers: Set<string>;\n }> {\n const keys = this.getKeysForDateRange(\n startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n endDate || new Date(),\n );\n\n const byAction: Record<string, number> = {};\n let totalEvents = 0;\n let failedLogins = 0;\n let successCount = 0;\n const uniqueUsers = new Set<string>();\n\n for (const key of keys) {\n const ids = await this.redis.zrange(key, 0, -1);\n\n for (const id of ids) {\n const log = await this.get(id);\n if (log) {\n totalEvents++;\n\n byAction[log.action] = (byAction[log.action] || 0) + 1;\n\n if (log.success) {\n successCount++;\n }\n\n if (log.action === \"login_failed\") {\n failedLogins++;\n }\n\n if (log.userId) {\n uniqueUsers.add(log.userId);\n }\n }\n }\n }\n\n return {\n totalEvents,\n byAction,\n successRate: totalEvents > 0 ? successCount / totalEvents : 1,\n failedLogins,\n uniqueUsers,\n };\n }\n\n async cleanup(): Promise<number> {\n const cutoff = Date.now() - this.retentionDays * 24 * 60 * 60 * 1000;\n\n const keys = await this.redis.keys(`${this.prefix}date:*`);\n let deleted = 0;\n\n for (const key of keys) {\n const timestamp = await this.redis.zrangebyscore(key, 0, cutoff);\n\n for (const id of timestamp) {\n await this.redis.del(`${this.prefix}log:${id}`);\n deleted++;\n }\n\n await this.redis.zremrangebyscore(key, 0, cutoff);\n }\n\n return deleted;\n }\n\n private getKeyForDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${this.prefix}date:${year}-${month}-${day}`;\n }\n\n private getKeysForDateRange(start?: Date, end?: Date): string[] {\n const keys: string[] = [];\n const startDate =\n start || new Date(Date.now() - this.retentionDays * 24 * 60 * 60 * 1000);\n const endDate = end || new Date();\n\n const current = new Date(startDate);\n while (current <= endDate) {\n keys.push(this.getKeyForDate(current));\n current.setDate(current.getDate() + 1);\n }\n\n return keys;\n }\n\n private matchesFilter(log: AuditLog, filter: AuditLogFilter): boolean {\n if (filter.action) {\n const actions = Array.isArray(filter.action)\n ? filter.action\n : [filter.action];\n if (!actions.includes(log.action)) return false;\n }\n\n if (filter.resource && log.resource !== filter.resource) return false;\n\n if (filter.resourceId && log.resourceId !== filter.resourceId) return false;\n\n if (filter.success !== undefined && log.success !== filter.success)\n return false;\n\n return true;\n }\n\n private serializeLog(log: AuditLog): Record<string, string> {\n const result: Record<string, string> = {\n id: log.id,\n timestamp: new Date(log.timestamp).toISOString(),\n action: log.action,\n resource: log.resource,\n success: log.success ? \"1\" : \"0\",\n };\n\n if (log.userId) result.userId = log.userId;\n if (log.userEmail) result.userEmail = log.userEmail;\n if (log.role) result.role = log.role;\n if (log.resourceId) result.resourceId = log.resourceId;\n if (log.ipAddress) result.ipAddress = log.ipAddress;\n if (log.userAgent) result.userAgent = log.userAgent;\n if (log.error) result.error = log.error;\n if (log.changes) result.changes = JSON.stringify(log.changes);\n if (log.metadata) result.metadata = JSON.stringify(log.metadata);\n\n return result;\n }\n\n private deserializeLog(data: Record<string, string>): AuditLog {\n return {\n id: data.id,\n timestamp: new Date(data.timestamp),\n action: data.action as AuditAction,\n userId: data.userId,\n userEmail: data.userEmail,\n role: data.role,\n resource: data.resource,\n resourceId: data.resourceId,\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n success: data.success === \"1\",\n error: data.error,\n changes: data.changes ? JSON.parse(data.changes) : undefined,\n metadata: data.metadata ? JSON.parse(data.metadata) : undefined,\n };\n }\n}\n\nexport function createAuditContext(req: Request): {\n ipAddress: string;\n userAgent: string;\n} {\n return {\n ipAddress:\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ||\n req.headers.get(\"x-real-ip\") ||\n \"unknown\",\n userAgent: req.headers.get(\"user-agent\") || \"unknown\",\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuditLog, AuditAction, AuditLogFilter } from \"./audit-log.js\";\nimport { DEFAULT_RETENTION_CONFIG } from \"./audit-log.js\";\n\nexport class InMemoryAuditLogger {\n private logs: AuditLog[] = [];\n private retentionDays: number;\n\n constructor(retentionDays: number = DEFAULT_RETENTION_CONFIG.retentionDays) {\n this.retentionDays = retentionDays;\n }\n\n async log(data: Omit<AuditLog, \"id\" | \"timestamp\">): Promise<string> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n\n const log: AuditLog = {\n ...data,\n id,\n timestamp,\n };\n\n this.logs.push(log);\n this.cleanupOldLogs();\n\n return id;\n }\n\n async get(id: string): Promise<AuditLog | null> {\n return this.logs.find((log) => log.id === id) || null;\n }\n\n async query(filter: AuditLogFilter = {}): Promise<{\n logs: AuditLog[];\n total: number;\n }> {\n const { limit = 50, offset = 0 } = filter;\n\n let filteredLogs = [...this.logs]; // Create a copy to avoid modifying original\n\n if (filter.userId) {\n filteredLogs = filteredLogs.filter((log) => log.userId === filter.userId);\n }\n\n if (filter.action) {\n const actions = Array.isArray(filter.action)\n ? filter.action\n : [filter.action];\n filteredLogs = filteredLogs.filter((log) => actions.includes(log.action));\n }\n\n if (filter.resource) {\n filteredLogs = filteredLogs.filter(\n (log) => log.resource === filter.resource,\n );\n }\n\n if (filter.resourceId) {\n filteredLogs = filteredLogs.filter(\n (log) => log.resourceId === filter.resourceId,\n );\n }\n\n if (filter.success !== undefined) {\n filteredLogs = filteredLogs.filter(\n (log) => log.success === filter.success,\n );\n }\n\n const startDate = filter.startDate;\n const endDate = filter.endDate;\n\n if (startDate !== undefined) {\n filteredLogs = filteredLogs.filter((log) => log.timestamp >= startDate);\n }\n\n if (endDate !== undefined) {\n filteredLogs = filteredLogs.filter((log) => log.timestamp <= endDate);\n }\n\n // Sort by timestamp descending (newest first)\n filteredLogs.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n\n const total = filteredLogs.length;\n const paginatedLogs = filteredLogs.slice(offset, offset + limit);\n\n return { logs: paginatedLogs, total };\n }\n\n async getRecent(limit: number = 50): Promise<AuditLog[]> {\n const cutoffDate = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); // Last 7 days\n\n const recentLogs = this.logs\n .filter((log) => log.timestamp >= cutoffDate)\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, limit);\n\n return recentLogs;\n }\n\n async getUserActivity(\n userId: string,\n limit: number = 50,\n ): Promise<AuditLog[]> {\n const userLogs = this.logs\n .filter((log) => log.userId === userId)\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, limit);\n\n return userLogs;\n }\n\n async getStats(\n startDate?: Date,\n endDate?: Date,\n ): Promise<{\n totalEvents: number;\n byAction: Record<string, number>;\n successRate: number;\n failedLogins: number;\n uniqueUsers: Set<string>;\n }> {\n const start = startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // Last 30 days\n const end = endDate || new Date();\n\n const filteredLogs = this.logs.filter(\n (log) => log.timestamp >= start && log.timestamp <= end,\n );\n\n const byAction: Record<string, number> = {};\n let totalEvents = 0;\n let failedLogins = 0;\n let successCount = 0;\n const uniqueUsers = new Set<string>();\n\n for (const log of filteredLogs) {\n totalEvents++;\n\n const action = log.action;\n byAction[action] = (byAction[action] || 0) + 1;\n\n if (log.success) {\n successCount++;\n }\n\n if (log.action === \"login_failed\") {\n failedLogins++;\n }\n\n if (log.userId) {\n uniqueUsers.add(log.userId);\n }\n }\n\n return {\n totalEvents,\n byAction,\n successRate: totalEvents > 0 ? successCount / totalEvents : 1,\n failedLogins,\n uniqueUsers,\n };\n }\n\n async cleanup(): Promise<number> {\n const cutoffDate = new Date(\n Date.now() - this.retentionDays * 24 * 60 * 60 * 1000,\n );\n const initialCount = this.logs.length;\n\n this.logs = this.logs.filter((log) => log.timestamp >= cutoffDate);\n\n return initialCount - this.logs.length;\n }\n\n private cleanupOldLogs(): void {\n // This is called automatically after each log entry\n // In a production system, you might want to run this less frequently\n const cutoffDate = new Date(\n Date.now() - this.retentionDays * 24 * 60 * 60 * 1000,\n );\n const initialCount = this.logs.length;\n\n this.logs = this.logs.filter((log) => log.timestamp >= cutoffDate);\n }\n}\n\nexport function createInMemoryAuditLogger(\n retentionDays: number = DEFAULT_RETENTION_CONFIG.retentionDays,\n) {\n return new InMemoryAuditLogger(retentionDays);\n}\n\nimport { createAuditContext } from \"./context.js\";\nexport { createAuditContext };\n","import { randomBytes } from \"crypto\";\nimport type { AuthAdapter } from \"../../auth/types.js\";\nimport { EmailTransport } from \"../../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../../auth/security/password-policy.js\";\nimport { InMemoryAccountLockout } from \"../../auth/security/in-memory-lockout.js\";\nimport { InMemoryRateLimiter } from \"../../auth/security/in-memory-rate-limit.js\";\nimport {\n InMemoryAuditLogger,\n createAuditContext,\n} from \"../../auth/security/in-memory-audit-log.js\";\nimport type { AuditAction } from \"../../auth/security/audit-log.js\";\nimport {\n createSession,\n deleteSession,\n getCurrentUser,\n setSessionCookie,\n clearSessionCookie,\n getSessionIdFromRequest,\n refreshSession,\n getUserSessions,\n updateSessionName,\n invalidateAllUserSessions,\n} from \"./auth-session.js\";\nimport type {\n AuthUser,\n LoginCredentials,\n RegisterData,\n} from \"../../auth/types.js\";\n\nexport interface AuthRoutesConfig {\n redis: AuthAdapter;\n jwtSecret?: string;\n jwtExpiresIn?: string;\n jwtIssuer?: string;\n jwtAudience?: string;\n email?: EmailTransport;\n passwordPolicy?: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n baseUrl?: string;\n emailVerificationRequired?: boolean;\n}\n\nexport class AuthRoutes {\n private authAdapter: AuthAdapter;\n private email?: EmailTransport;\n private passwordPolicy: PasswordPolicy;\n private lockout?: InMemoryAccountLockout;\n private rateLimiter?: InMemoryRateLimiter;\n private auditLogger?: InMemoryAuditLogger;\n private baseUrl: string;\n private emailVerificationRequired: boolean;\n\n constructor(config: AuthRoutesConfig) {\n this.authAdapter = config.redis;\n this.email = config.email;\n this.passwordPolicy = config.passwordPolicy || new PasswordPolicy();\n this.lockout = config.lockout;\n this.rateLimiter = config.rateLimiter;\n this.auditLogger = config.auditLogger;\n this.baseUrl = config.baseUrl || \"http://localhost:3000\";\n this.emailVerificationRequired = config.emailVerificationRequired ?? true;\n }\n\n async register(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:register\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as RegisterData & {\n confirmPassword?: string;\n };\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n if (body.password !== body.confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(body.password);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const existingUser = await this.authAdapter.findUserByEmail(body.email);\n if (existingUser) {\n return this.errorResponse(\"Email already registered\", 400);\n }\n\n const user = await this.authAdapter.createUser({\n email: body.email,\n password: body.password,\n role: body.role || \"customer\",\n tenantId: body.tenantId,\n });\n\n if (this.emailVerificationRequired && this.email) {\n const verificationToken = randomBytes(32).toString(\"hex\");\n const verificationUrl = `${this.baseUrl}/api/auth/verify?token=${verificationToken}`;\n\n await this.authAdapter.createSession(user.id, { ipAddress, userAgent });\n const template = this.email\n .getTemplates()\n .verifyEmail(verificationUrl, body.email);\n await this.email.send({ to: body.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"register\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse(\n {\n success: true,\n message: \"Registration successful\",\n user: this.sanitizeUser(user),\n requiresVerification: this.emailVerificationRequired && !!this.email,\n },\n 201,\n );\n } catch (error) {\n console.error(\"[AuthRoutes.register] Registration error:\", error);\n return this.errorResponse(\"Registration failed\", 500);\n }\n }\n\n async login(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:login\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as LoginCredentials;\n\nif (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n const user = await this.authAdapter.findUserByEmail(body.email);\n if (!user) {\n await this.recordFailedLogin(ipAddress, userAgent);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (user.locked) {\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Account locked\",\n });\n }\n return this.errorResponse(\n \"Account locked. Contact an administrator.\",\n 403,\n );\n }\n\n if (this.lockout) {\n const lockoutStatus = await this.lockout.checkLockout(user.id);\n if (lockoutStatus.locked) {\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Account locked\",\n });\n }\n return this.errorResponse(\n `Account locked. Try again in ${Math.ceil((lockoutStatus.lockedUntil!.getTime() - Date.now()) / 60000)} minutes`,\n 423,\n );\n }\n }\n\n const verifiedUser = await this.authAdapter.verifyPassword(\n body.email,\n body.password,\n );\n if (!verifiedUser) {\n await this.recordFailedLogin(ipAddress, userAgent, user.id, user.email);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n await this.lockout.resetAttempts(user.id);\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login\",\n userId: user.id,\n userEmail: user.email,\n role: user.role,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n await this.authAdapter.updateUser(user.id, {\n lastLogin: new Date().toISOString(),\n });\n\n const sessionId = await createSession({\n id: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n });\n\n const responseData = {\n success: true,\n user: this.sanitizeUser(user),\n };\n\n const response = this.jsonResponse(responseData);\n return setSessionCookie(response, sessionId);\n } catch (error) {\n console.error(\"[Auth] Login error:\", error);\n return this.errorResponse(\"Login failed\", 500);\n }\n }\n\n async logout(req: Request): Promise<Response> {\n const sessionId = getSessionIdFromRequest(req);\n if (!sessionId) {\n return this.errorResponse(\"No session to logout\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const session = await getCurrentUser(req);\n if (session) {\n await deleteSession(sessionId);\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"logout\",\n userId: session.userId,\n userEmail: session.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n }\n\n const response = this.jsonResponse({\n success: true,\n message: \"Logged out successfully\",\n });\n\n return clearSessionCookie(response);\n } catch (error) {\n return this.errorResponse(\"Logout failed\", 500);\n }\n }\n\n async refresh(req: Request): Promise<Response> {\n try {\n const sessionId = getSessionIdFromRequest(req);\n if (!sessionId) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n const updatedSession = await refreshSession(sessionId, req);\n if (!updatedSession) {\n return this.errorResponse(\"Session not found\", 404);\n }\n\n return this.jsonResponse({\n success: true,\n expiresAt: updatedSession.expiresAt,\n });\n } catch (error) {\n console.error(\"[Auth] Session refresh error:\", error);\n return this.errorResponse(\"Session refresh failed\", 500);\n }\n }\n\n async me(req: Request): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n return this.jsonResponse({\n success: true,\n user: {\n id: session.userId,\n email: session.email,\n role: session.role,\n tenantId: session.tenantId,\n },\n });\n }\n\n\n\n async changePassword(req: Request): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const body = (await req.json()) as {\n currentPassword?: string;\n newPassword?: string;\n confirmPassword?: string;\n };\n const { currentPassword, newPassword, confirmPassword } = body;\n\n if (!currentPassword || !newPassword) {\n return this.errorResponse(\"Current and new password required\", 400);\n }\n\n if (newPassword !== confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(newPassword);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const user = await this.authAdapter.findUserById(session.userId);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n const validPassword = user.passwordHash\n ? await this.authAdapter.verifyPassword(\n currentPassword,\n user.passwordHash,\n )\n : false;\n if (!validPassword) {\n return this.errorResponse(\"Current password is incorrect\", 401);\n }\n\n const passwordHistory = await this.authAdapter.getPasswordHistory?.(\n user.id,\n 5,\n );\n const isReused = await this.authAdapter.isPasswordInHistory?.(\n newPassword,\n user.id,\n 5,\n );\n if (isReused) {\n return this.errorResponse(\n \"Password was recently used. Please choose a different password\",\n 400,\n );\n }\n\n const newPasswordHash = await this.authAdapter.hashPassword(newPassword);\n if (user.passwordHash) {\n await this.authAdapter.addPasswordToHistory?.(\n user.id,\n user.passwordHash,\n );\n }\n await this.authAdapter.updateUser(user.id, {\n passwordHash: newPasswordHash,\n });\n\n await this.authAdapter.deleteUserSessions(user.id);\n\n if (this.email && this.email.getTemplates) {\n const template = this.email.getTemplates().passwordChanged(user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_change\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Password changed successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Password change failed\", 500);\n }\n }\n\n async forgotPassword(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:forgot\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as { email?: string };\n const { email } = body;\n\n if (!email) {\n return this.errorResponse(\"Email required\", 400);\n }\n\n const user = await this.authAdapter.findUserByEmail(email);\n if (!user) {\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n }\n\n if (this.email) {\n const resetToken = randomBytes(32).toString(\"hex\");\n const resetUrl = `${this.baseUrl}/api/auth/reset-password?token=${resetToken}`;\n const template = this.email\n .getTemplates()\n .resetPassword(resetUrl, user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_reset\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n } catch (error) {\n return this.errorResponse(\"Password reset request failed\", 500);\n }\n }\n\n async verifyEmail(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const token = url.searchParams.get(\"token\");\n\n if (!token) {\n return this.errorResponse(\"Verification token required\", 400);\n }\n\n try {\n return this.jsonResponse({ success: true, message: \"Email verified\" });\n } catch (error) {\n return this.errorResponse(\"Email verification failed\", 500);\n }\n }\n\n private async recordFailedLogin(\n ipAddress: string,\n userAgent: string,\n userId?: string,\n userEmail?: string,\n ): Promise<void> {\n if (this.lockout) {\n await this.lockout.recordFailedAttempt(userId || ipAddress);\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId,\n userEmail,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Invalid credentials\",\n });\n }\n }\n\n private sanitizeUser(user: AuthUser): Partial<AuthUser> {\n const { passwordHash, ...sanitized } = user;\n return sanitized;\n }\n\n private jsonResponse(data: any, status: number = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n async listSessions(req: Request): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const sessions = await getUserSessions(session.userId, getSessionIdFromRequest(req) ?? undefined);\n return this.jsonResponse({ sessions });\n } catch (error) {\n console.error(\"[AuthRoutes.listSessions] Error:\", error);\n return this.errorResponse(\"Failed to list sessions\", 500);\n }\n }\n\n async revokeSession(req: Request, sessionId: string): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const allSessions = await getUserSessions(session.userId);\n const targetSession = allSessions.find(s => s.id === sessionId);\n \n if (!targetSession) {\n return this.errorResponse(\"Session not found\", 404);\n }\n\n if (targetSession.currentSession) {\n return this.errorResponse(\"Cannot revoke current session\", 400);\n }\n\n await deleteSession(sessionId);\n \n return this.jsonResponse({ \n success: true, \n message: \"Session revoked\" \n });\n } catch (error) {\n console.error(\"[AuthRoutes.revokeSession] Error:\", error);\n return this.errorResponse(\"Failed to revoke session\", 500);\n }\n }\n\n async revokeOtherSessions(req: Request): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const allSessions = await getUserSessions(session.userId);\n const currentSessionId = getSessionIdFromRequest(req);\n \n for (const s of allSessions) {\n if (!s.currentSession) {\n await deleteSession(s.id);\n }\n }\n \n return this.jsonResponse({ \n success: true, \n message: \"Other sessions revoked\" \n });\n } catch (error) {\n console.error(\"[AuthRoutes.revokeOtherSessions] Error:\", error);\n return this.errorResponse(\"Failed to revoke sessions\", 500);\n }\n }\n\n async renameSession(req: Request, sessionId: string): Promise<Response> {\n const session = await getCurrentUser(req);\n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const allSessions = await getUserSessions(session.userId);\n const targetSession = allSessions.find(s => s.id === sessionId);\n \n if (!targetSession) {\n return this.errorResponse(\"Session not found\", 404);\n }\n\n const body = await req.json() as any;\n const { name } = body;\n \n if (!name || typeof name !== 'string' || name.trim().length === 0) {\n return this.errorResponse(\"Invalid session name\", 400);\n }\n\n await updateSessionName(sessionId, name.trim());\n \n return this.jsonResponse({ \n success: true, \n message: \"Session renamed\" \n });\n } catch (error) {\n console.error(\"[AuthRoutes.renameSession] Error:\", error);\n return this.errorResponse(\"Failed to rename session\", 500);\n }\n }\n\n async refreshSession(req: Request): Promise<Response> {\n const sessionId = getSessionIdFromRequest(req);\n if (!sessionId) {\n return this.errorResponse(\"No session\", 401);\n }\n\n try {\n const updatedSession = await require('./auth-session.js').refreshSession(sessionId, req);\n if (!updatedSession) {\n return this.errorResponse(\"Session not found\", 404);\n }\n\n return this.jsonResponse({ \n success: true, \n expiresAt: updatedSession.expiresAt \n });\n } catch (error) {\n console.error(\"[AuthRoutes.refreshSession] Error:\", error);\n return this.errorResponse(\"Failed to refresh session\", 500);\n }\n }\n\n private errorResponse(message: string, status: number): Response {\n return new Response(JSON.stringify({ success: false, error: message }), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private async rateLimitResponse(limit: { retryAfter?: number }): Promise<Response> {\n return new Response(\n JSON.stringify({\n success: false,\n error: \"Too many requests\",\n retryAfter: limit.retryAfter,\n }),\n {\n status: 429,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": String(limit.retryAfter || 60),\n },\n },\n );\n }\n}\n","import { writeFile, mkdir, unlink, readdir, stat, rename } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { join, extname, basename } from \"path\";\nimport process from \"process\";\nimport { createHash } from \"crypto\";\nimport type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport interface LocalStorageConfig {\n uploadDir: string;\n baseUrl?: string;\n}\n\nexport function createLocalStorage(\n config: LocalStorageConfig,\n): StorageProvider {\n const { uploadDir = join(process.cwd(), \"public\", \"uploads\"), baseUrl = \"/uploads\" } = config;\n\n async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n }\n\n function getMimeType(filename: string): string {\n const ext = extname(filename).toLowerCase();\n const mimeTypes: Record<string, string> = {\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".png\": \"image/png\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".avif\": \"image/avif\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".avi\": \"video/x-msvideo\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".ogg\": \"audio/ogg\",\n \".pdf\": \"application/pdf\",\n \".doc\": \"application/msword\",\n \".docx\":\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\":\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".zip\": \"application/zip\",\n \".tar\": \"application/x-tar\",\n \".gz\": \"application/gzip\",\n \".rar\": \"application/vnd.rar\",\n \".7z\": \"application/x-7z-compressed\",\n };\n return mimeTypes[ext] || \"application/octet-stream\";\n }\n\n async function getImageDimensions(\n buffer: Buffer,\n ): Promise<{ width?: number; height?: number }> {\n try {\n const header = buffer.toString(\"hex\", 0, 8);\n if (header.startsWith(\"89504e47\")) {\n const width = buffer.readUInt32BE(16);\n const height = buffer.readUInt32BE(20);\n return { width, height };\n }\n if (header.startsWith(\"ffd8\")) {\n let offset = 2;\n while (offset < buffer.length) {\n if (buffer[offset] !== 0xff) break;\n const marker = buffer[offset + 1];\n if (marker === 0xc0 || marker === 0xc2) {\n const height = buffer.readUInt16BE(offset + 5);\n const width = buffer.readUInt16BE(offset + 7);\n return { width, height };\n }\n offset += 2 + buffer.readUInt16BE(offset + 2);\n }\n }\n } catch {\n // Ignore errors\n }\n return {};\n }\n\n return {\n name: \"local\",\n displayName: \"Local Storage\",\n supportsDynamicResize: true,\n\n async upload(file: File, options?: UploadOptions): Promise<UploadedFile> {\n await ensureDir(uploadDir);\n\n const buffer = Buffer.from(await file.arrayBuffer());\n const hash = createHash(\"md5\").update(buffer).digest(\"hex\");\n const ext = extname(file.name);\n const filename = options?.filename || `${hash}${ext}`;\n const folder = options?.folder || \"\";\n const targetDir = folder ? join(uploadDir, folder) : uploadDir;\n\n await ensureDir(targetDir);\n\n const filepath = join(targetDir, filename);\n await writeFile(filepath, buffer);\n\n const dimensions = file.type.startsWith(\"image/\")\n ? await getImageDimensions(buffer)\n : {};\n\n const normalizedBaseUrl = baseUrl || \"/uploads\";\n const urlPath = folder ? `/${folder}/${filename}` : `/${filename}`;\n const url = normalizedBaseUrl + urlPath;\n\n return {\n id: hash,\n filename,\n originalName: file.name,\n mimeType: file.type || getMimeType(file.name),\n size: buffer.length,\n url,\n thumbnailUrl: file.type.startsWith(\"image/\") ? url : undefined,\n folder: folder || undefined,\n provider: \"local\",\n metadata: {\n ...dimensions,\n ...options?.metadata,\n },\n createdAt: new Date().toISOString(),\n };\n },\n\n async uploadFromUrl(\n url: string,\n options?: UploadOptions,\n ): Promise<UploadedFile> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.statusText}`);\n }\n\n const blob = await response.blob();\n const contentDisposition = response.headers.get(\"content-disposition\");\n let filename = options?.filename;\n\n if (!filename && contentDisposition) {\n const match = contentDisposition.match(\n /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/,\n );\n if (match) {\n filename = match[1].replace(/['\"]/g, \"\");\n }\n }\n\n if (!filename) {\n filename = basename(new URL(url).pathname);\n }\n\n const file = new File([blob], filename, {\n type: blob.type || getMimeType(filename),\n });\n return this.upload!(file, options);\n },\n\n async delete(url: string): Promise<void> {\n const filepath = join(uploadDir, url.replace(baseUrl + \"/\", \"\"));\n try {\n await unlink(filepath);\n } catch {\n // Ignore if file doesn't exist\n }\n },\n\n async rename(oldUrl: string, newFilename: string): Promise<string> {\n const oldPath = join(uploadDir, oldUrl.replace(baseUrl + \"/\", \"\"));\n const newPath = join(uploadDir, newFilename);\n await rename(oldPath, newPath);\n return `${baseUrl}/${newFilename}`;\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n if (!transforms || Object.keys(transforms).length === 0) return url;\n\n const params = new URLSearchParams({ url });\n if (transforms.width) params.set(\"w\", String(transforms.width));\n if (transforms.height) params.set(\"h\", String(transforms.height));\n if (transforms.quality) params.set(\"q\", String(transforms.quality));\n if (transforms.format) params.set(\"f\", transforms.format);\n\n return `/api/media/resize?${params.toString()}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n if (!file.mimeType.startsWith(\"image/\")) return \"\";\n return this.getImageUrl(file.url, { width: 400, height: 400 });\n },\n\n async list(prefix?: string): Promise<UploadedFile[]> {\n const dir = prefix ? join(uploadDir, prefix) : uploadDir;\n if (!existsSync(dir)) return [];\n\n const files: UploadedFile[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile()) {\n const filepath = join(dir, entry.name);\n const stats = await stat(filepath);\n const url = `${baseUrl}${prefix ? `/${prefix}` : \"\"}/${entry.name}`;\n\n files.push({\n id: createHash(\"md5\").update(entry.name).digest(\"hex\"),\n filename: entry.name,\n originalName: entry.name,\n mimeType: getMimeType(entry.name),\n size: stats.size,\n url,\n provider: \"local\",\n createdAt: stats.birthtime.toISOString(),\n });\n }\n }\n\n return files;\n },\n\n async exists(url: string): Promise<boolean> {\n const filepath = join(uploadDir, url.replace(baseUrl + \"/\", \"\"));\n return existsSync(filepath);\n },\n\n async createFolder(folder: string): Promise<void> {\n const dir = join(uploadDir, folder);\n await mkdir(dir, { recursive: true });\n },\n\n async deleteFolder(folder: string): Promise<void> {\n const dir = join(uploadDir, folder);\n if (existsSync(dir)) {\n const { rm } = await import(\"fs/promises\");\n await rm(dir, { recursive: true, force: true });\n }\n },\n };\n}\n\nfunction getMimeType(filename: string): string {\n const ext = extname(filename).toLowerCase();\n const mimeTypes: Record<string, string> = {\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".png\": \"image/png\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".pdf\": \"application/pdf\",\n };\n return mimeTypes[ext] || \"application/octet-stream\";\n}\n","import type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport interface ImgixConfig {\n domain: string;\n signKey?: string;\n defaultParameters?: Record<string, string>;\n}\n\nexport function createImgixStorage(config: ImgixConfig): StorageProvider {\n const signUrl = (path: string, params: URLSearchParams): string => {\n if (!config.signKey) return path;\n\n const signer = new TextEncoder();\n const key = signer.encode(config.signKey);\n const data = signer.encode(path + params.toString());\n\n let hash = 0;\n const combined = new Uint8Array(key.length + data.length);\n combined.set(key);\n combined.set(data, key.length);\n\n for (let i = 0; i < combined.length; i++) {\n hash = ((hash << 5) - hash + combined[i]) | 0;\n }\n\n params.set(\"s\", Math.abs(hash).toString(16));\n return path;\n };\n\n return {\n name: \"imgix\",\n displayName: \"Imgix\",\n supportsDynamicResize: true,\n\n async upload(_file: File, _options?: UploadOptions): Promise<UploadedFile> {\n throw new Error(\n \"Imgix is a transformation service. Use another provider for uploads.\",\n );\n },\n\n async uploadFromUrl(\n url: string,\n options?: UploadOptions,\n ): Promise<UploadedFile> {\n const filename = options?.filename || url.split(\"/\").pop() || \"file\";\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch: ${response.statusText}`);\n }\n const blob = await response.blob();\n const file = new File([blob], filename, { type: blob.type });\n\n return {\n id: Buffer.from(url).toString(\"base64\").slice(0, 20),\n filename,\n originalName: filename,\n mimeType: blob.type,\n size: blob.size,\n url: this.getImageUrl(url),\n thumbnailUrl: this.getImageUrl(url, {\n width: 200,\n height: 200,\n fit: \"crop\",\n }),\n provider: \"imgix\",\n createdAt: new Date().toISOString(),\n };\n },\n\n async delete(_url: string): Promise<void> {\n // Imgix doesn't delete - it's a proxy/transformation service\n },\n\n async rename(_oldUrl: string, newKey: string): Promise<string> {\n // Imgix is a proxy service, not a storage provider\n // Return new URL derived from newKey\n return `https://${config.domain}/${newKey}`;\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n const parsed = new URL(url);\n const params = new URLSearchParams(parsed.search);\n\n // Apply default parameters\n if (config.defaultParameters) {\n Object.entries(config.defaultParameters).forEach(([key, value]) => {\n if (!params.has(key)) {\n params.set(key, value);\n }\n });\n }\n\n // Apply transformations\n if (transforms) {\n if (transforms.width) params.set(\"w\", String(transforms.width));\n if (transforms.height) params.set(\"h\", String(transforms.height));\n if (transforms.quality) params.set(\"q\", String(transforms.quality));\n if (transforms.format) params.set(\"fm\", transforms.format);\n if (transforms.fit) params.set(\"fit\", transforms.fit);\n if (transforms.blur) params.set(\"blur\", String(transforms.blur));\n if (transforms.sharpen) params.set(\"sharp\", String(transforms.sharpen));\n }\n\n // Ensure secure URLs\n params.set(\"auto\", \"compress,format\");\n\n // Sign the URL if needed\n let path = parsed.pathname + \"?\" + params.toString();\n if (config.signKey) {\n path = signUrl(parsed.pathname + params.toString(), params);\n }\n\n return `https://${config.domain}${parsed.pathname}${params.toString() ? \"?\" + params.toString() : \"\"}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n return this.getImageUrl(file.url, {\n width: 200,\n height: 200,\n fit: \"crop\",\n });\n },\n\n async list(): Promise<UploadedFile[]> {\n return [];\n },\n\n async exists(url: string): Promise<boolean> {\n try {\n const response = await fetch(url, { method: \"HEAD\" });\n return response.ok;\n } catch {\n return false;\n }\n },\n\n async createFolder(): Promise<void> {},\n async deleteFolder(): Promise<void> {},\n };\n}\n","import type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport interface BunnyStorageConfig {\n storageZone: string;\n apiKey: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nfunction getUrl(key: string, config: BunnyStorageConfig): string {\n if (config.cdnUrl) {\n return `${config.cdnUrl.replace(/\\/$/, \"\")}/${key}`;\n }\n return `https://${config.storageZone}.b-cdn.net/${key}`;\n}\n\nfunction getUrlPrefix(config: BunnyStorageConfig): string {\n if (config.cdnUrl) {\n return config.cdnUrl.replace(/\\/$/, \"\") + \"/\";\n }\n return `https://${config.storageZone}.b-cdn.net/`;\n}\n\nexport function createBunnyStorage(\n config: BunnyStorageConfig,\n): StorageProvider {\n const baseUrl = `https://storage.bunnycdn.com/${config.storageZone}`;\n\n const getKey = (path: string) => {\n const prefix = config.prefix ? `${config.prefix}/` : \"\";\n return `${prefix}${path}`.replace(/\\/+/g, \"/\");\n };\n\n return {\n name: \"bunny\",\n displayName: \"Bunny.net Storage\",\n supportsDynamicResize: true,\n\n async upload(file: File, options?: UploadOptions): Promise<UploadedFile> {\n const key = getKey(\n `${options?.folder ? `${options.folder}/` : \"\"}${options?.filename || file.name}`,\n );\n\n const buffer = Buffer.from(await file.arrayBuffer());\n\n const response = await fetch(`${baseUrl}/${key}`, {\n method: \"PUT\",\n headers: {\n AccessKey: config.apiKey,\n \"Content-Type\": file.type,\n },\n body: buffer,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Bunny.net upload failed: ${response.status} ${errorText}`,\n );\n }\n\n return {\n id: Buffer.from(key).toString(\"base64url\"),\n filename: options?.filename || file.name,\n originalName: file.name,\n mimeType: file.type,\n size: buffer.length,\n url: getUrl(key, config),\n thumbnailUrl: file.type.startsWith(\"image/\")\n ? getUrl(key, config)\n : undefined,\n folder: options?.folder,\n provider: \"bunny\",\n metadata: options?.metadata,\n createdAt: new Date().toISOString(),\n };\n },\n\n async uploadFromUrl(url: string): Promise<UploadedFile> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch: ${response.statusText}`);\n }\n const blob = await response.blob();\n const filename = url.split(\"/\").pop() || \"file\";\n const file = new File([blob], filename, { type: blob.type });\n return this.upload!(file);\n },\n\n async delete(url: string): Promise<void> {\n const key = url.replace(getUrlPrefix(config), \"\");\n\n const response = await fetch(`${baseUrl}/${key}`, {\n method: \"DELETE\",\n headers: {\n AccessKey: config.apiKey,\n },\n });\n\n if (!response.ok && response.status !== 404) {\n const errorText = await response.text();\n throw new Error(\n `Bunny.net delete failed: ${response.status} ${errorText}`,\n );\n }\n },\n\n async rename(oldUrl: string, newKey: string): Promise<string> {\n const oldKey = oldUrl.replace(getUrlPrefix(config), \"\");\n const fullPath = config.prefix ? `${config.prefix}/${newKey}` : newKey;\n\n const response = await fetch(`${baseUrl}/${oldKey}`, {\n method: \"GET\",\n headers: {\n AccessKey: config.apiKey,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Bunny.net rename failed: could not read old file`);\n }\n\n const content = await response.arrayBuffer();\n\n await fetch(`${baseUrl}/${fullPath}`, {\n method: \"PUT\",\n headers: {\n AccessKey: config.apiKey,\n \"Content-Type\":\n response.headers.get(\"Content-Type\") || \"application/octet-stream\",\n },\n body: content,\n });\n\n await this.delete(oldUrl);\n\n return getUrl(fullPath, config);\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n if (!transforms || Object.keys(transforms).length === 0) return url;\n\n const params = new URLSearchParams({ url });\n if (transforms.width) params.set(\"w\", String(transforms.width));\n if (transforms.height) params.set(\"h\", String(transforms.height));\n if (transforms.quality) params.set(\"q\", String(transforms.quality));\n if (transforms.format) params.set(\"f\", transforms.format);\n\n return `/api/media/resize?${params.toString()}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n return this.getImageUrl(file.url, { width: 400, height: 400 });\n },\n\n async list(prefix?: string): Promise<UploadedFile[]> {\n const key = getKey(prefix || \"\");\n\n const response = await fetch(`${baseUrl}/${key}`, {\n method: \"GET\",\n headers: {\n AccessKey: config.apiKey,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Bunny.net list failed: ${response.status} ${errorText}`,\n );\n }\n\n const items = (await response.json()) as Array<{\n ObjectName?: string;\n Length?: number;\n LastChanged?: string;\n }>;\n\n return items.map((item) => ({\n id: Buffer.from(item.ObjectName || \"\").toString(\"base64url\"),\n filename: item.ObjectName?.split(\"/\").pop() || \"\",\n originalName: item.ObjectName?.split(\"/\").pop() || \"\",\n mimeType: \"application/octet-stream\",\n size: item.Length || 0,\n url: getUrl(item.ObjectName || \"\", config),\n provider: \"bunny\",\n createdAt: item.LastChanged || new Date().toISOString(),\n }));\n },\n\n async exists(url: string): Promise<boolean> {\n const key = url.replace(getUrlPrefix(config), \"\");\n\n const response = await fetch(`${baseUrl}/${key}`, {\n method: \"HEAD\",\n headers: {\n AccessKey: config.apiKey,\n },\n });\n\n return response.ok;\n },\n\n async createFolder(folder: string): Promise<void> {\n const key = getKey(`${folder}/`);\n await fetch(`${baseUrl}/${key}`, {\n method: \"PUT\",\n headers: {\n AccessKey: config.apiKey,\n \"Content-Length\": \"0\",\n },\n body: \"\",\n });\n },\n\n async deleteFolder(folder: string): Promise<void> {\n const key = getKey(`${folder}/`);\n await fetch(`${baseUrl}/${key}`, {\n method: \"DELETE\",\n headers: {\n AccessKey: config.apiKey,\n },\n });\n },\n };\n}\n","import type { Field } from \"../fields/types.js\";\nimport type { StorageProvider } from \"./index.js\";\nimport type { StorageConfig } from \"../config/ConfigService.js\";\nimport { createLocalStorage } from \"./local.js\";\nimport { createImgixStorage } from \"./imgix.js\";\nimport { createBunnyStorage } from \"./bunny.js\";\nimport path from \"path\";\n\nexport interface StorageProviderRegistration {\n type: string;\n displayName: string;\n pluginName?: string;\n configFields: Field[];\n configKey?: string;\n extractConfig: (storageConfig: StorageConfig, configKey: string) => any;\n extractRawConfig: (config: any) => any;\n factory: (config: any) => StorageProvider;\n}\n\nexport class StorageProviderRegistry {\n private providers = new Map<string, StorageProviderRegistration>();\n private providerToPlugin = new Map<string, string>();\n private disabledPlugins = new Set<string>();\n\n constructor() {\n this.registerLocal();\n this.registerImgix();\n this.registerBunny();\n }\n\n private registerLocal(): void {\n this.register({\n type: \"local\",\n displayName: \"Local Server\",\n configKey: \"local\",\n configFields: [\n {\n name: \"uploadDir\",\n type: \"text\",\n label: \"Upload Directory\",\n defaultValue: \"./public/uploads\",\n },\n {\n name: \"baseUrl\",\n type: \"text\",\n label: \"Base URL\",\n defaultValue: \"/uploads\",\n },\n ],\n extractConfig: (sc, key) => (sc as any)[key] || {},\n extractRawConfig: (c) => {\n const localConfig = c?.local || c;\n const savedUploadDir = (localConfig?.uploadDir || \"\").trim();\n let uploadDir: string;\n if (savedUploadDir) {\n if (path.isAbsolute(savedUploadDir)) {\n uploadDir = savedUploadDir;\n } else if (\n savedUploadDir.includes(\"/\") ||\n savedUploadDir.includes(\"\\\\\")\n ) {\n uploadDir = path.resolve(process.cwd(), savedUploadDir);\n } else {\n uploadDir = path.join(process.cwd(), \"public\", savedUploadDir);\n }\n } else {\n uploadDir = path.join(process.cwd(), \"public\", \"uploads\");\n }\n const savedBaseUrl = (localConfig?.baseUrl || \"\").trim();\n let baseUrl: string;\n if (savedBaseUrl) {\n baseUrl = savedBaseUrl.startsWith(\"/\")\n ? savedBaseUrl\n : `/${savedBaseUrl}`;\n } else {\n baseUrl = \"/uploads\";\n }\n return { uploadDir, baseUrl };\n },\n factory: (c) => createLocalStorage(c),\n });\n }\n\n private registerImgix(): void {\n this.register({\n type: \"imgix\",\n displayName: \"Imgix\",\n configKey: \"imgix\",\n configFields: [\n { name: \"domain\", type: \"text\", label: \"Domain\", required: true },\n { name: \"signKey\", type: \"password\", label: \"Sign Key\" },\n ],\n extractConfig: (sc, key) => (sc as any)[key] || {},\n extractRawConfig: (c) => c?.imgix || c,\n factory: (c) => createImgixStorage(c),\n });\n }\n\n private registerBunny(): void {\n this.register({\n type: \"bunny\",\n displayName: \"Bunny.net\",\n configKey: \"bunny\",\n configFields: [\n {\n name: \"storageZone\",\n type: \"text\",\n label: \"Storage Zone\",\n required: true,\n },\n { name: \"apiKey\", type: \"password\", label: \"API Key\", required: true },\n { name: \"cdnUrl\", type: \"text\", label: \"CDN URL\" },\n { name: \"prefix\", type: \"text\", label: \"Path Prefix\" },\n ],\n extractConfig: (sc, key) => (sc as any)[key] || {},\n extractRawConfig: (c) => c?.bunny || c,\n factory: (c) => createBunnyStorage(c),\n });\n }\n\n register(registration: StorageProviderRegistration): void {\n if (this.providers.has(registration.type)) {\n console.warn(\n `[StorageRegistry] Provider \"${registration.type}\" already registered, skipping`,\n );\n return;\n }\n if (registration.pluginName) {\n this.providerToPlugin.set(registration.type, registration.pluginName);\n }\n this.providers.set(registration.type, registration);\n }\n\n unregister(type: string): void {\n this.providers.delete(type);\n this.providerToPlugin.delete(type);\n }\n\n get(type: string): StorageProviderRegistration | undefined {\n return this.providers.get(type);\n }\n\n getAll(): StorageProviderRegistration[] {\n return Array.from(this.providers.values());\n }\n\n getAllAvailable(isPluginEnabled?: (name: string) => boolean): StorageProviderRegistration[] {\n const all = this.getAll();\n if (!isPluginEnabled) return all;\n return all.filter((p) => {\n if (!p.pluginName) return true;\n return isPluginEnabled(p.pluginName);\n });\n }\n\n has(type: string): boolean {\n return this.providers.has(type);\n }\n\n async resolve(\n type: string,\n storageConfig: StorageConfig,\n ): Promise<StorageProvider> {\n const reg = this.providers.get(type);\n if (!reg) {\n throw new Error(\n `Unknown storage provider type: \"${type}\". Is the plugin that provides it enabled?`,\n );\n }\n if (reg.pluginName && this.disabledPlugins.has(reg.pluginName)) {\n throw new Error(\n `Storage provider \"${type}\" is not available (plugin \"${reg.pluginName}\" is disabled)`,\n );\n }\n const configKey = reg.configKey || type;\n const config = reg.extractConfig(storageConfig, configKey);\n return reg.factory(config);\n }\n\n async resolveWithConfig(type: string, config: any): Promise<StorageProvider> {\n const reg = this.providers.get(type);\n if (!reg) {\n throw new Error(\n `Unknown storage provider type: \"${type}\". Is the plugin that provides it enabled?`,\n );\n }\n if (reg.pluginName && this.disabledPlugins.has(reg.pluginName)) {\n throw new Error(\n `Storage provider \"${type}\" is not available (plugin \"${reg.pluginName}\" is disabled)`,\n );\n }\n const providerConfig = reg.extractRawConfig(config);\n return reg.factory(providerConfig);\n }\n\n getProviderPluginName(type: string): string | undefined {\n return this.providerToPlugin.get(type);\n }\n\n getAllPluginNames(): string[] {\n return Array.from(new Set(this.providerToPlugin.values()));\n }\n\n setPluginEnabled(name: string, enabled: boolean): void {\n if (enabled) {\n this.disabledPlugins.delete(name);\n } else {\n this.disabledPlugins.add(name);\n }\n }\n\n isPluginEnabled(name: string): boolean {\n return !this.disabledPlugins.has(name);\n }\n}\n\nlet instance: StorageProviderRegistry | null = null;\n\nexport function getDefaultRegistry(): StorageProviderRegistry {\n if (!instance) {\n instance = new StorageProviderRegistry();\n }\n return instance;\n}\n\nexport function resetStorageProviderRegistry(): void {\n instance = null;\n}\n","import {\n S3Client,\n PutObjectCommand,\n DeleteObjectCommand,\n DeleteObjectsCommand,\n CopyObjectCommand,\n ListObjectsV2Command,\n HeadObjectCommand,\n} from \"@aws-sdk/client-s3\";\nimport { NodeHttpHandler } from \"@smithy/node-http-handler\";\nimport type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport type S3ProviderType =\n | \"aws\"\n | \"r2\"\n | \"gcs\"\n | \"digitalocean\"\n | \"backblaze\"\n | \"wasabi\";\n\n/**\n * Extract the Public Dev URL ID from either a full URL or just the ID.\n * Handles formats like:\n * - https://bucket.pub-xxx.r2.dev -> pub-xxx\n * - pub-xxx -> pub-xxx\n * - empty/undefined -> \"\"\n */\nfunction extractPublicDevUrlId(url?: string): string {\n if (!url) return \"\";\n if (url.startsWith(\"pub-\")) return url;\n const match = url.match(/pub-[a-zA-Z0-9]+/i);\n return match ? match[0] : \"\";\n}\n\nexport interface S3StorageConfig {\n provider: S3ProviderType;\n bucket: string;\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n endpoint?: string;\n cdnUrl?: string;\n prefix?: string;\n accountId?: string;\n publicDevUrl?: string;\n}\n\nfunction getPublicUrl(key: string, config: S3StorageConfig): string {\n // Ensure key has proper path format\n const normalizedKey = key.startsWith(\"/\") ? key.slice(1) : key;\n\n if (config.cdnUrl) {\n const cdn = config.cdnUrl.replace(/\\/$/, \"\");\n return `${cdn}/${normalizedKey}`;\n }\n\n switch (config.provider) {\n case \"r2\": {\n // Handle both ID and full URL for publicDevUrl\n const pubId = extractPublicDevUrlId(config.publicDevUrl);\n if (pubId) {\n return `https://${pubId}.r2.dev/${normalizedKey}`;\n }\n return `https://${config.bucket}.${config.accountId}.r2.cloudflarestorage.com/${normalizedKey}`;\n }\n case \"gcs\":\n return `https://storage.googleapis.com/${config.bucket}/${normalizedKey}`;\n case \"digitalocean\":\n return `https://${config.bucket}.${config.region}.cdn.digitaloceanspaces.com/${normalizedKey}`;\n case \"backblaze\":\n return `https://${config.bucket}.s3.backblazeb2.com/${normalizedKey}`;\n case \"wasabi\":\n return `https://${config.bucket}.s3.wasabisys.com/${normalizedKey}`;\n case \"aws\":\n default:\n return `https://${config.bucket}.s3.${config.region}.amazonaws.com/${normalizedKey}`;\n }\n}\n\nfunction getUrlPrefix(config: S3StorageConfig): string {\n if (config.cdnUrl) {\n return config.cdnUrl.replace(/\\/$/, \"\") + \"/\";\n }\n\n switch (config.provider) {\n case \"r2\": {\n const pubId = extractPublicDevUrlId(config.publicDevUrl);\n if (pubId) {\n return `https://${pubId}.r2.dev/`;\n }\n return `https://${config.bucket}.${config.accountId}.r2.cloudflarestorage.com/`;\n }\n case \"gcs\":\n return `https://storage.googleapis.com/${config.bucket}/`;\n case \"digitalocean\":\n return `https://${config.bucket}.${config.region}.cdn.digitaloceanspaces.com/`;\n case \"backblaze\":\n return `https://${config.bucket}.s3.backblazeb2.com/`;\n case \"wasabi\":\n return `https://${config.bucket}.s3.wasabisys.com/`;\n case \"aws\":\n default:\n return `https://${config.bucket}.s3.${config.region}.amazonaws.com/`;\n }\n}\n\nfunction getDisplayName(provider: S3ProviderType): string {\n switch (provider) {\n case \"r2\":\n return \"Cloudflare R2\";\n case \"gcs\":\n return \"Google Cloud Storage\";\n case \"digitalocean\":\n return \"DigitalOcean Spaces\";\n case \"backblaze\":\n return \"Backblaze B2\";\n case \"wasabi\":\n return \"Wasabi\";\n case \"aws\":\n default:\n return \"AWS S3\";\n }\n}\n\nexport function createS3Storage(config: S3StorageConfig): StorageProvider {\n console.log(\"[createS3Storage] Creating provider:\", config.provider);\n console.log(\"[createS3Storage] Credentials:\", {\n accessKeyId: config.accessKeyId ? \"SET\" : \"UNDEFINED\",\n secretAccessKey: config.secretAccessKey ? \"SET\" : \"UNDEFINED\",\n bucket: config.bucket,\n accountId: config.accountId,\n endpoint: config.endpoint,\n });\n\n // For R2 and other S3-compatible providers, use custom HTTP client with proper TLS\n const client = new S3Client({\n region: config.region || \"auto\",\n endpoint: config.endpoint,\n credentials: {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n },\n forcePathStyle: true,\n tls: true,\n // R2 requires specific SSL configuration\n ...(config.provider === \"r2\" && {\n requestHandler:\n new NodeHttpHandler({\n connectionTimeout: 10000,\n socketTimeout: 10000,\n }),\n }),\n });\n\n const getKey = (path: string) => {\n const prefix = config.prefix ? `${config.prefix}/` : \"\";\n return `${prefix}${path}`.replace(/\\/+/g, \"/\");\n };\n\n const getUrl = (key: string) => getPublicUrl(key, config);\n\n return {\n name: config.provider,\n displayName: getDisplayName(config.provider),\n supportsDynamicResize: true,\n\n async upload(file: File, options?: UploadOptions): Promise<UploadedFile> {\n const key = getKey(\n `${options?.folder ? `${options.folder}/` : \"\"}${options?.filename || file.name}`,\n );\n\n const buffer = Buffer.from(await file.arrayBuffer());\n\n await client.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: key,\n Body: buffer,\n ContentType: file.type,\n Metadata: options?.metadata as Record<string, string>,\n }),\n );\n\n const head = await client.send(\n new HeadObjectCommand({\n Bucket: config.bucket,\n Key: key,\n }),\n );\n\n return {\n id: Buffer.from(key).toString(\"base64url\"),\n filename: options?.filename || file.name,\n originalName: file.name,\n mimeType: file.type,\n size: buffer.length,\n url: getUrl(key),\n thumbnailUrl: file.type.startsWith(\"image/\") ? getUrl(key) : undefined,\n folder: options?.folder,\n provider: config.provider,\n metadata: {\n ...options?.metadata,\n etag: head.ETag,\n },\n createdAt: new Date().toISOString(),\n };\n },\n\n async uploadFromUrl(url: string): Promise<UploadedFile> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch: ${response.statusText}`);\n }\n const blob = await response.blob();\n const filename = url.split(\"/\").pop() || \"file\";\n const file = new File([blob], filename, { type: blob.type });\n return this.upload!(file);\n },\n\n async delete(url: string): Promise<void> {\n const key = url.replace(getUrlPrefix(config), \"\");\n await client.send(\n new DeleteObjectCommand({\n Bucket: config.bucket,\n Key: key,\n }),\n );\n },\n\n async rename(oldUrl: string, newKey: string): Promise<string> {\n const oldKey = oldUrl.replace(getUrlPrefix(config), \"\");\n const newKeyWithPrefix = config.prefix\n ? `${config.prefix}/${newKey}`\n : newKey;\n\n await client.send(\n new CopyObjectCommand({\n Bucket: config.bucket,\n CopySource: `${config.bucket}/${oldKey}`,\n Key: newKeyWithPrefix,\n }),\n );\n\n await client.send(\n new DeleteObjectCommand({\n Bucket: config.bucket,\n Key: oldKey,\n }),\n );\n\n return getUrl(newKeyWithPrefix);\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n if (!transforms || Object.keys(transforms).length === 0) return url;\n\n const params = new URLSearchParams({ url });\n if (transforms.width) params.set(\"w\", String(transforms.width));\n if (transforms.height) params.set(\"h\", String(transforms.height));\n if (transforms.quality) params.set(\"q\", String(transforms.quality));\n if (transforms.format) params.set(\"f\", transforms.format);\n\n return `/api/media/resize?${params.toString()}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n return this.getImageUrl(file.url, { width: 400, height: 400 });\n },\n\n async list(prefix?: string): Promise<UploadedFile[]> {\n const key = getKey(prefix || \"\");\n const response = await client.send(\n new ListObjectsV2Command({\n Bucket: config.bucket,\n Prefix: key,\n }),\n );\n\n return (response.Contents || []).map((item) => ({\n id: Buffer.from(item.Key || \"\").toString(\"base64url\"),\n filename: item.Key?.split(\"/\").pop() || \"\",\n originalName: item.Key?.split(\"/\").pop() || \"\",\n mimeType: \"application/octet-stream\",\n size: item.Size || 0,\n url: getUrl(item.Key || \"\"),\n provider: config.provider,\n createdAt: item.LastModified?.toISOString() || new Date().toISOString(),\n }));\n },\n\n async exists(url: string): Promise<boolean> {\n try {\n const key = url.replace(getUrlPrefix(config), \"\");\n await client.send(\n new HeadObjectCommand({\n Bucket: config.bucket,\n Key: key,\n }),\n );\n return true;\n } catch {\n return false;\n }\n },\n\n async createFolder(folder: string): Promise<void> {\n const key = getKey(`${folder}/`);\n await client.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: key,\n Body: \"\",\n }),\n );\n },\n\n async deleteFolder(folder: string): Promise<void> {\n const prefix = getKey(`${folder}/`);\n let continuationToken: string | undefined;\n do {\n const listResponse = await client.send(\n new ListObjectsV2Command({\n Bucket: config.bucket,\n Prefix: prefix,\n ContinuationToken: continuationToken,\n }),\n );\n if (listResponse.Contents?.length) {\n const objects = listResponse.Contents.map((item) => ({\n Key: item.Key,\n }));\n await client.send(\n new DeleteObjectsCommand({\n Bucket: config.bucket,\n Delete: { Objects: objects },\n }),\n );\n }\n continuationToken = listResponse.IsTruncated\n ? listResponse.NextContinuationToken\n : undefined;\n } while (continuationToken);\n await client.send(\n new DeleteObjectCommand({\n Bucket: config.bucket,\n Key: prefix,\n }),\n );\n },\n };\n}\n","import type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport interface CloudinaryConfig {\n cloudName: string;\n apiKey: string;\n apiSecret: string;\n folder?: string;\n uploadPreset?: string;\n}\n\nexport function createCloudinaryStorage(\n config: CloudinaryConfig,\n): StorageProvider {\n const getBaseUrl = () =>\n `https://api.cloudinary.com/v1_1/${config.cloudName}/upload`;\n\n // Generate signature for signed uploads\n const generateSignature = async (\n params: Record<string, string>,\n ): Promise<string> => {\n const crypto = await import(\"crypto\");\n\n // Cloudinary signs all parameters EXCEPT 'file', 'resource_type', and 'api_key'\n // Sort keys alphabetically\n const sortedParams = Object.keys(params)\n .sort()\n .map((key) => `${key}=${params[key]}`)\n .join(\"&\");\n\n // Sign with api_secret\n return crypto\n .createHash(\"sha256\")\n .update(sortedParams + config.apiSecret)\n .digest(\"hex\");\n };\n\n return {\n name: \"cloudinary\",\n displayName: \"Cloudinary\",\n supportsDynamicResize: true,\n\n async upload(file: File, options?: UploadOptions): Promise<UploadedFile> {\n const formData = new FormData();\n formData.append(\"file\", file);\n\n // Use upload preset if provided, otherwise try signed upload\n if (config.uploadPreset) {\n formData.append(\"upload_preset\", config.uploadPreset);\n } else {\n // Use signed upload with timestamp\n const timestamp = Math.round(Date.now() / 1000);\n\n // Build params for signature (excluding file and api_key)\n const signatureParams: Record<string, string> = {\n timestamp: String(timestamp),\n };\n if (options?.folder || config.folder) {\n signatureParams.folder = options?.folder || config.folder || \"\";\n }\n\n // Generate signature\n const signature = await generateSignature(signatureParams);\n\n formData.append(\"timestamp\", String(timestamp));\n formData.append(\"signature\", signature);\n formData.append(\"api_key\", config.apiKey);\n }\n\n if (options?.folder || config.folder) {\n formData.append(\"folder\", options?.folder || config.folder || \"\");\n }\n\n const response = await fetch(getBaseUrl(), {\n method: \"POST\",\n body: formData,\n });\n\n if (!response.ok) {\n const error = (await response.json()) as {\n error?: { message?: string };\n };\n throw new Error(\n `Cloudinary upload failed: ${error.error?.message || response.statusText}`,\n );\n }\n\n const data = (await response.json()) as {\n public_id: string;\n format: string;\n original_filename?: string;\n bytes: number;\n secure_url: string;\n width: number;\n height: number;\n };\n\n return {\n id: data.public_id,\n filename: `${data.public_id}.${data.format}`,\n originalName: data.original_filename || file.name,\n mimeType: file.type || `image/${data.format}`,\n size: data.bytes,\n url: data.secure_url,\n thumbnailUrl: this.getImageUrl(data.secure_url, {\n width: 200,\n height: 200,\n fit: \"crop\",\n }),\n width: data.width,\n height: data.height,\n folder: options?.folder || config.folder,\n provider: \"cloudinary\",\n createdAt: new Date().toISOString(),\n };\n },\n\n async uploadFromUrl(\n url: string,\n options?: UploadOptions,\n ): Promise<UploadedFile> {\n const formData = new FormData();\n formData.append(\"file\", url);\n formData.append(\"upload_preset\", \"ml_default\");\n if (options?.folder || config.folder) {\n formData.append(\"folder\", options?.folder || config.folder || \"\");\n }\n\n const response = await fetch(getBaseUrl(), {\n method: \"POST\",\n body: formData,\n });\n\n if (!response.ok) throw new Error(\"Cloudinary upload failed\");\n const data = (await response.json()) as {\n public_id: string;\n format: string;\n original_filename?: string;\n bytes: number;\n secure_url: string;\n width: number;\n height: number;\n };\n\n return {\n id: data.public_id,\n filename: `${data.public_id}.${data.format}`,\n originalName: data.original_filename || url.split(\"/\").pop() || \"file\",\n mimeType: `image/${data.format}`,\n size: data.bytes,\n url: data.secure_url,\n thumbnailUrl: this.getImageUrl(data.secure_url, {\n width: 200,\n height: 200,\n fit: \"crop\",\n }),\n width: data.width,\n height: data.height,\n provider: \"cloudinary\",\n createdAt: new Date().toISOString(),\n };\n },\n\n async delete(id: string): Promise<void> {\n try {\n // Extract public_id from URL (id is actually the full URL in our case)\n const parts = id.split(\"/image/upload/\");\n if (parts.length !== 2) {\n console.warn(\"[Cloudinary delete] Could not parse URL:\", id);\n return;\n }\n\n const publicId = parts[1]\n .replace(/^v\\d+\\//, \"\")\n .replace(/\\.[^.]+$/, \"\");\n\n // Generate signature for deletion\n const timestamp = Math.round(Date.now() / 1000);\n const signatureParams: Record<string, string> = {\n timestamp: String(timestamp),\n public_id: publicId,\n };\n\n const sortedParams = Object.keys(signatureParams)\n .sort()\n .map((key) => `${key}=${signatureParams[key]}`)\n .join(\"&\");\n\n const crypto = await import(\"crypto\");\n const signature = crypto\n .createHash(\"sha256\")\n .update(sortedParams + config.apiSecret)\n .digest(\"hex\");\n\n // Delete using Cloudinary destroy API\n const deleteUrl = `https://api.cloudinary.com/v1_1/${config.cloudName}/image/destroy`;\n const formData = new FormData();\n formData.append(\"public_id\", publicId);\n formData.append(\"timestamp\", String(timestamp));\n formData.append(\"signature\", signature);\n formData.append(\"api_key\", config.apiKey);\n\n const response = await fetch(deleteUrl, {\n method: \"POST\",\n body: formData,\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.warn(\"[Cloudinary delete] Failed:\", error);\n }\n } catch (e: any) {\n console.warn(\"[Cloudinary delete] Error:\", e.message);\n }\n },\n\n async rename(oldUrl: string, newKey: string): Promise<string> {\n let version = \"\";\n let newPublicId = newKey.replace(/\\.[^.]+$/, \"\");\n let folder = \"\";\n\n try {\n // Extract old public_id from URL\n const parts = oldUrl.split(\"/image/upload/\");\n if (parts.length !== 2) {\n console.warn(\"[Cloudinary rename] Could not parse old URL:\", oldUrl);\n return oldUrl;\n }\n\n // Extract folder path and filename from old public_id\n const urlPath = parts[1];\n\n // First remove version (e.g., v1776872613/) from the path\n const versionMatch = urlPath.match(/^(v\\d+)\\//);\n version = versionMatch ? versionMatch[1] : \"\";\n\n // Now remove version from urlPath to get clean public_id\n const publicIdWithoutVersion = urlPath\n .replace(/^v\\d+\\//, \"\")\n .replace(/\\.[^.]+$/, \"\");\n\n // Extract folder path (everything before the last segment)\n const folderParts = publicIdWithoutVersion.split(\"/\");\n folder =\n folderParts.length > 1 ? folderParts.slice(0, -1).join(\"/\") : \"\";\n\n // Build new public_id: folder + new filename (without extension)\n const newFilename = newKey.replace(/\\.[^.]+$/, \"\");\n newPublicId = folder ? `${folder}/${newFilename}` : newFilename;\n\n console.log(\"[Cloudinary rename]\", {\n urlPath,\n version,\n publicIdWithoutVersion,\n folder,\n newPublicId,\n });\n\n // Generate signature for rename operation\n const timestamp = Math.round(Date.now() / 1000);\n const signatureParams: Record<string, string> = {\n from_public_id: publicIdWithoutVersion,\n to_public_id: newPublicId,\n timestamp: String(timestamp),\n };\n\n const sortedParams = Object.keys(signatureParams)\n .sort()\n .map((key) => `${key}=${signatureParams[key]}`)\n .join(\"&\");\n\n const crypto = await import(\"crypto\");\n const signature = crypto\n .createHash(\"sha256\")\n .update(sortedParams + config.apiSecret)\n .digest(\"hex\");\n\n // Rename using Cloudinary rename API\n const formData = new FormData();\n formData.append(\"from_public_id\", publicIdWithoutVersion);\n formData.append(\"to_public_id\", newPublicId);\n formData.append(\"timestamp\", String(timestamp));\n formData.append(\"signature\", signature);\n formData.append(\"api_key\", config.apiKey);\n\n const response = await fetch(\n `https://api.cloudinary.com/v1_1/${config.cloudName}/image/rename`,\n {\n method: \"POST\",\n body: formData,\n },\n );\n\n if (response.ok) {\n const data = (await response.json()) as { secure_url: string };\n console.log(\"[Cloudinary rename] Success:\", data.secure_url);\n return data.secure_url;\n } else {\n const error = await response.json();\n console.warn(\"[Cloudinary rename] Failed:\", error);\n // Return new URL with version\n const versionStr = version ? `/${version}/` : \"/\";\n return `https://res.cloudinary.com/${config.cloudName}/image/upload${versionStr}${newPublicId}.${newKey.split(\".\").pop()}`;\n }\n } catch (e: any) {\n console.warn(\"[Cloudinary rename] Error:\", e.message);\n // Return new URL on error with version\n const versionStr = version ? `/${version}/` : \"/\";\n return `https://res.cloudinary.com/${config.cloudName}/image/upload${versionStr}${newPublicId}.${newKey.split(\".\").pop()}`;\n }\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n if (!transforms) return url;\n\n // Cloudinary transformation URL structure:\n // res.cloudinary.com/cloud_name/image/upload/t_transform/v1/public_id.jpg\n const parts = url.split(\"/upload/\");\n if (parts.length !== 2) return url;\n\n const transformationArr: string[] = [];\n if (transforms.width) transformationArr.push(`w_${transforms.width}`);\n if (transforms.height) transformationArr.push(`h_${transforms.height}`);\n if (transforms.fit) {\n const fitMap: Record<string, string> = {\n crop: \"c_fill\",\n clip: \"c_fit\",\n scale: \"c_scale\",\n fill: \"c_fill\",\n };\n transformationArr.push(fitMap[transforms.fit] || \"c_limit\");\n }\n if (transforms.quality) transformationArr.push(`q_${transforms.quality}`);\n if (transforms.format) transformationArr.push(`f_${transforms.format}`);\n\n const transformationStr = transformationArr.join(\",\");\n return `${parts[0]}/upload/${transformationStr}/${parts[1]}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n return this.getImageUrl(file.url, {\n width: 200,\n height: 200,\n fit: \"crop\",\n });\n },\n\n async list(): Promise<UploadedFile[]> {\n return []; // Requires Admin API\n },\n\n async exists(url: string): Promise<boolean> {\n const response = await fetch(url, { method: \"HEAD\" });\n return response.ok;\n },\n\n async createFolder(): Promise<void> {\n // Cloudinary creates folders implicitly on upload\n },\n\n async deleteFolder(): Promise<void> {\n // Requires Cloudinary Admin API (not available from frontend)\n },\n };\n}\n","import { Readable } from \"stream\";\nimport { Client, FileInfo } from \"basic-ftp\";\nimport type {\n StorageProvider,\n UploadedFile,\n UploadOptions,\n ImageTransforms,\n} from \"./index.js\";\n\nexport interface FtpStorageConfig {\n host: string;\n port: number;\n user: string;\n password: string;\n secure: boolean;\n baseUrl: string;\n prefix?: string;\n type: \"ftp\" | \"sftp\";\n}\n\nexport function createFtpStorage(config: FtpStorageConfig): StorageProvider {\n let client: InstanceType<typeof Client> | null = null;\n\n async function getClient(): Promise<InstanceType<typeof Client>> {\n if (!client) {\n client = new Client(60000, { allowSeparateTransferHost: true });\n client.ftp.verbose = false;\n\n await client.access({\n host: config.host,\n port: config.port || 21,\n user: config.user,\n password: config.password,\n secure: config.secure,\n secureOptions: {},\n });\n }\n return client;\n }\n\n const getKey = (path: string) => {\n const prefix = config.prefix ? `${config.prefix}/` : \"\";\n return `${prefix}${path}`.replace(/\\/+/g, \"/\");\n };\n\n const getUrl = (key: string) => {\n const base = config.baseUrl.replace(/\\/$/, \"\");\n return `${base}/${key}`;\n };\n\n const getUrlPrefix = () => {\n const base = config.baseUrl.replace(/\\/$/, \"\");\n return base + \"/\";\n };\n\n return {\n name: config.type,\n displayName: config.type === \"sftp\" ? \"SFTP Storage\" : \"FTP Storage\",\n supportsDynamicResize: false,\n\n async upload(file: File, options?: UploadOptions): Promise<UploadedFile> {\n const ftp = await getClient();\n const key = getKey(\n `${options?.folder ? `${options.folder}/` : \"\"}${options?.filename || file.name}`,\n );\n\n const buffer = Buffer.from(await file.arrayBuffer());\n\n // Create directory structure if needed\n const parts = key.split(\"/\").slice(0, -1);\n let currentPath = \"\";\n for (const part of parts) {\n currentPath = currentPath ? `${currentPath}/${part}` : part;\n try {\n await ftp.ensureDir(currentPath);\n } catch {\n // Directory may already exist\n }\n }\n\n const readable = Readable.from(buffer);\n await ftp.uploadFrom(readable, key);\n\n return {\n id: Buffer.from(key).toString(\"base64url\"),\n filename: options?.filename || file.name,\n originalName: file.name,\n mimeType: file.type,\n size: buffer.length,\n url: getUrl(key),\n thumbnailUrl: file.type.startsWith(\"image/\") ? getUrl(key) : undefined,\n folder: options?.folder,\n provider: config.type,\n metadata: options?.metadata,\n createdAt: new Date().toISOString(),\n };\n },\n\n async uploadFromUrl(url: string): Promise<UploadedFile> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch: ${response.statusText}`);\n }\n const blob = await response.blob();\n const filename = url.split(\"/\").pop() || \"file\";\n const file = new File([blob], filename, { type: blob.type });\n return this.upload!(file);\n },\n\n async delete(url: string): Promise<void> {\n const ftp = await getClient();\n const key = url.replace(getUrlPrefix(), \"\");\n await ftp.remove(key);\n },\n\n async rename(oldUrl: string, newKey: string): Promise<string> {\n const ftp = await getClient();\n const oldKey = oldUrl.replace(getUrlPrefix(), \"\");\n const fullPath = config.prefix ? `${config.prefix}/${newKey}` : newKey;\n\n await ftp.rename(oldKey, fullPath);\n\n return getUrl(fullPath);\n },\n\n getImageUrl(url: string, transforms?: ImageTransforms): string {\n if (!transforms || Object.keys(transforms).length === 0) return url;\n\n const params = new URLSearchParams({ url });\n if (transforms.width) params.set(\"w\", String(transforms.width));\n if (transforms.height) params.set(\"h\", String(transforms.height));\n if (transforms.quality) params.set(\"q\", String(transforms.quality));\n if (transforms.format) params.set(\"f\", transforms.format);\n\n return `/api/media/resize?${params.toString()}`;\n },\n\n async generateThumbnail(file: UploadedFile): Promise<string> {\n return file.url;\n },\n\n async list(prefix?: string): Promise<UploadedFile[]> {\n const ftp = await getClient();\n const key = getKey(prefix || \"\");\n\n let items: FileInfo[];\n try {\n items = await ftp.list(key);\n } catch {\n return [];\n }\n\n return items\n .filter((item) => item.type === 0)\n .map((item) => ({\n id: Buffer.from(`${key}/${item.name}`).toString(\"base64url\"),\n filename: item.name,\n originalName: item.name,\n mimeType: \"application/octet-stream\",\n size: Number(item.size) || 0,\n url: getUrl(`${key}/${item.name}`.replace(/\\/+/g, \"/\")),\n provider: config.type,\n createdAt: item.modifiedAt\n ? item.modifiedAt.toISOString()\n : new Date().toISOString(),\n }));\n },\n\n async exists(url: string): Promise<boolean> {\n const ftp = await getClient();\n const key = url.replace(getUrlPrefix(), \"\");\n try {\n await ftp.size(key);\n return true;\n } catch {\n return false;\n }\n },\n\n async createFolder(folder: string): Promise<void> {\n const ftp = await getClient();\n const key = getKey(folder);\n await ftp.ensureDir(key);\n },\n\n async deleteFolder(folder: string): Promise<void> {\n const ftp = await getClient();\n const key = getKey(folder);\n await ftp.removeDir(key);\n },\n };\n}\n","// ============================================================================\n// Storage Provider Interface\n// ============================================================================\n\nexport interface UploadOptions {\n folder?: string;\n filename?: string;\n mimeType?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UploadedFile {\n id: string;\n filename: string;\n originalName: string;\n mimeType: string;\n size: number;\n url: string;\n thumbnailUrl?: string;\n width?: number;\n height?: number;\n folder?: string;\n provider: string;\n metadata?: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface ImageTransforms {\n width?: number;\n height?: number;\n fit?: \"clip\" | \"crop\" | \"fill\" | \"fillmax\" | \"scale\" | \"max\" | \"min\";\n format?: \"webp\" | \"avif\" | \"jpeg\" | \"jpg\" | \"png\" | \"gif\";\n quality?: number;\n blur?: number;\n sharpen?: number;\n}\n\nexport interface StorageProvider {\n name: string;\n displayName: string;\n supportsDynamicResize: boolean;\n\n upload(file: File, options?: UploadOptions): Promise<UploadedFile>;\n uploadFromUrl(url: string, options?: UploadOptions): Promise<UploadedFile>;\n delete(url: string): Promise<void>;\n rename(oldUrl: string, newKey: string): Promise<string>;\n\n getImageUrl(url: string, transforms?: ImageTransforms): string;\n generateThumbnail(\n file: UploadedFile,\n size: { width: number; height: number },\n ): Promise<string>;\n\n list(prefix?: string): Promise<UploadedFile[]>;\n exists(url: string): Promise<boolean>;\n createFolder?(folder: string): Promise<void>;\n deleteFolder?(folder: string): Promise<void>;\n}\n\nimport type { ConfigService } from \"../config/ConfigService.js\";\nimport path from \"path\";\nimport { createLocalStorage } from \"./local.js\";\nimport { createS3Storage, type S3ProviderType } from \"./s3.js\";\nimport { createCloudinaryStorage } from \"./cloudinary.js\";\nimport { createImgixStorage } from \"./imgix.js\";\nimport { createBunnyStorage } from \"./bunny.js\";\nimport { createFtpStorage } from \"./ftp.js\";\nimport { getDefaultRegistry } from \"./registry.js\";\n\nexport async function resolveProvider(\n configService: ConfigService,\n): Promise<StorageProvider> {\n const config = configService.getStorageConfig();\n const registry = getDefaultRegistry();\n\n try {\n return await registry.resolve(config.type, config);\n } catch (err: any) {\n console.warn(\n `[resolveProvider] ${err.message} — falling back to local storage`,\n );\n return createLocalStorage({\n uploadDir: path.join(process.cwd(), \"public\", \"uploads\"),\n baseUrl: \"/uploads\",\n });\n }\n}\n\n// ============================================================================\n// Base Adapter\n// ============================================================================\n\nexport function createBaseStorageAdapter(): Partial<StorageProvider> {\n return {\n upload: async (file: File, options?: UploadOptions) => {\n throw new Error(\"Not implemented\");\n },\n uploadFromUrl: async (url: string) => {\n throw new Error(\"Not implemented\");\n },\n delete: async (url: string) => {\n throw new Error(\"Not implemented\");\n },\n getImageUrl: (url: string) => url,\n generateThumbnail: async (file: UploadedFile) => file.url,\n list: async () => [],\n exists: async () => false,\n };\n}\n\nexport async function resolveProviderWithConfig(\n config: any,\n): Promise<StorageProvider> {\n if (!config) {\n console.warn(\"[resolveProviderWithConfig] No config, using local\");\n return createLocalStorage({\n uploadDir: path.join(process.cwd(), \"public\", \"uploads\"),\n baseUrl: \"/uploads\",\n });\n }\n\n const type = config.type || \"local\";\n const registry = getDefaultRegistry();\n\n try {\n return await registry.resolveWithConfig(type, config);\n } catch (err: any) {\n console.warn(\n `[resolveProviderWithConfig] ${err.message} — falling back to local storage`,\n );\n return createLocalStorage({\n uploadDir: path.join(process.cwd(), \"public\", \"uploads\"),\n baseUrl: \"/uploads\",\n });\n }\n}\n\n// Storage Provider Exports\nexport { createLocalStorage, type LocalStorageConfig } from \"./local.js\";\nexport {\n createS3Storage,\n type S3StorageConfig,\n type S3ProviderType,\n} from \"./s3.js\";\nexport {\n createCloudinaryStorage,\n type CloudinaryConfig,\n} from \"./cloudinary.js\";\nexport { createImgixStorage, type ImgixConfig } from \"./imgix.js\";\nexport { createBunnyStorage, type BunnyStorageConfig } from \"./bunny.js\";\nexport { createFtpStorage, type FtpStorageConfig } from \"./ftp.js\";\n","import sharp from \"sharp\";\n\nexport interface ProcessedImage {\n buffer: Buffer;\n thumbnailBuffer: Buffer;\n width?: number;\n height?: number;\n format: string;\n}\n\nexport async function processImage(\n buffer: Buffer,\n): Promise<ProcessedImage> {\n const metadata = await sharp(buffer).metadata();\n \n // Create main optimized version (WebP)\n const mainImage = sharp(buffer)\n .webp({ quality: 85 });\n \n // Create thumbnail (WebP, fixed width)\n const thumbnail = sharp(buffer)\n .resize({ width: 500, withoutEnlargement: true })\n .webp({ quality: 80 });\n\n return {\n buffer: await mainImage.toBuffer(),\n thumbnailBuffer: await thumbnail.toBuffer(),\n width: metadata.width,\n height: metadata.height,\n format: \"webp\",\n };\n}\n","import {\n resolveProvider,\n resolveProviderWithConfig,\n type StorageProvider,\n type UploadedFile,\n} from \"./index.js\";\nimport { processImage } from \"./processor.js\";\nimport { ConfigService } from \"../config/ConfigService.js\";\nimport { genId as defaultGenId } from \"../database/drizzle/database.js\";\nimport type { Dialect } from \"../database/drizzle/database.js\";\n\nlet _mediaTablesEnsured = false;\n\nexport interface MediaSearchParams {\n page?: number;\n limit?: number;\n search?: string;\n type?: string;\n folder?: string;\n sortBy?: string;\n sortDir?: \"asc\" | \"desc\";\n}\n\ninterface MediaRow {\n id: string;\n filename: string;\n title: string | null;\n originalName: string;\n mimeType: string;\n fileSize: number;\n width: number | null;\n height: number | null;\n url: string;\n thumbnailUrl: string | null;\n folder: string | null;\n provider: string;\n alt: string | null;\n caption: string | null;\n metadata: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport class MediaService {\n private db: any;\n private storage: StorageProvider;\n private dialect: Dialect;\n private genId: () => string;\n private mediaTable: string = \"media\";\n private foldersTable: string = \"media_folders\";\n\n constructor(\n db: any,\n storage: StorageProvider,\n options?: { dialect?: Dialect; genId?: () => string },\n ) {\n this.db = db;\n this.storage = storage;\n this.dialect = options?.dialect || \"sqlite\";\n this.genId = options?.genId || defaultGenId;\n }\n\n static async init(\n db: any,\n options?: { dialect?: Dialect; genId?: () => string; storageConfig?: any },\n ): Promise<MediaService> {\n let storage: StorageProvider;\n\n if (options?.storageConfig) {\n storage = await resolveProviderWithConfig(options.storageConfig);\n } else {\n const configService = new ConfigService(db);\n await configService.load();\n storage = await resolveProvider(configService);\n }\n\n const service = new MediaService(db, storage, options);\n await service.ensureTables();\n return service;\n }\n\n private async ensureTables(): Promise<void> {\n if (this.dialect === \"sqlite\") {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS media (\n id TEXT PRIMARY KEY,\n filename TEXT NOT NULL UNIQUE,\n title TEXT,\n original_name TEXT NOT NULL,\n mime_type TEXT NOT NULL,\n file_size INTEGER NOT NULL,\n width INTEGER,\n height INTEGER,\n url TEXT NOT NULL UNIQUE,\n thumbnail_url TEXT,\n folder TEXT,\n provider TEXT NOT NULL,\n alt TEXT,\n caption TEXT,\n metadata TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);\n CREATE INDEX IF NOT EXISTS idx_media_provider ON media(provider);\n CREATE INDEX IF NOT EXISTS idx_media_filename ON media(filename);\n `);\n\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS media_folders (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n path TEXT NOT NULL,\n parent_path TEXT,\n created_at TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_media_folders_path ON media_folders(path);\n `);\n } else if (this.dialect === \"postgres\") {\n if (_mediaTablesEnsured) return;\n const { sql } = await import(\"drizzle-orm\");\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"media\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"filename\" VARCHAR(255) NOT NULL UNIQUE,\n \"title\" VARCHAR(255),\n \"original_name\" VARCHAR(255) NOT NULL,\n \"mime_type\" VARCHAR(100),\n \"file_size\" INTEGER,\n \"width\" INTEGER,\n \"height\" INTEGER,\n \"url\" TEXT NOT NULL UNIQUE,\n \"thumbnail_url\" TEXT,\n \"folder\" VARCHAR(255),\n \"provider\" VARCHAR(50) NOT NULL,\n \"alt\" TEXT,\n \"caption\" TEXT,\n \"metadata\" JSONB,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW(),\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"idx_media_folder\" ON \"media\" (\"folder\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"idx_media_provider\" ON \"media\" (\"provider\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"idx_media_filename\" ON \"media\" (\"filename\")`);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"media_folders\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"name\" VARCHAR(255) NOT NULL,\n \"path\" TEXT NOT NULL,\n \"parent_path\" TEXT,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"idx_media_folders_path\" ON \"media_folders\" (\"path\")`);\n _mediaTablesEnsured = true;\n }\n }\n\n private now(): string {\n return new Date().toISOString();\n }\n\n private buildFindConditions(params: MediaSearchParams): {\n where: string;\n params: any[];\n orderBy: string;\n sortCol: string;\n } {\n const conditions: string[] = [];\n const p: any[] = [];\n const sortCol =\n params.sortBy === \"name\"\n ? \"title\"\n : params.sortBy === \"createdAt\"\n ? \"created_at\"\n : params.sortBy === \"updatedAt\"\n ? \"updated_at\"\n : params.sortBy || \"created_at\";\n const sortDir = params.sortDir === \"asc\" ? \"ASC\" : \"DESC\";\n\n if (params.search) {\n conditions.push(\n `(title LIKE ? OR filename LIKE ? OR original_name LIKE ? OR alt LIKE ?)`,\n );\n const s = `%${params.search}%`;\n p.push(s, s, s, s);\n }\n if (params.type && params.type !== \"all\") {\n conditions.push(`mime_type LIKE ?`);\n p.push(`${params.type}/%`);\n }\n if (params.folder) {\n conditions.push(`(folder = ? OR folder LIKE ?)`);\n p.push(params.folder, `${params.folder}/%`);\n }\n\n const where =\n conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n return { where, params: p, orderBy: sortDir, sortCol };\n }\n\n private rowToMedia(row: any): MediaRow {\n return {\n id: row.id,\n filename: row.filename,\n title: row.title ?? null,\n originalName: row.original_name ?? row.originalName,\n mimeType: row.mime_type ?? row.mimeType,\n fileSize: row.file_size ?? row.fileSize,\n width: row.width ?? null,\n height: row.height ?? null,\n url: row.url,\n thumbnailUrl: row.thumbnail_url ?? row.thumbnailUrl ?? null,\n folder: row.folder ?? null,\n provider: row.provider,\n alt: row.alt ?? null,\n caption: row.caption ?? null,\n metadata: row.metadata ?? null,\n createdAt: row.created_at ?? row.createdAt,\n updatedAt: row.updated_at ?? row.updatedAt,\n };\n }\n\n private async sqliteRun(sql: string, params: any[] = []): Promise<any> {\n const stmt = this.db.prepare(sql);\n const sqlLower = sql.trim().toLowerCase();\n\n // For INSERT/UPDATE/DELETE statements, use .run() instead of .all()\n if (\n sqlLower.startsWith(\"insert\") ||\n sqlLower.startsWith(\"update\") ||\n sqlLower.startsWith(\"delete\")\n ) {\n return stmt.run(...params);\n }\n\n // For SELECT statements, use .all()\n return stmt.all(...params);\n }\n\n private sqliteGet(sql: string, params: any[] = []): any {\n const stmt = this.db.prepare(sql);\n return stmt.get(...params);\n }\n\n async upload(file: File, folder: string = \"\"): Promise<MediaRow> {\n const isImage = file.type.startsWith(\"image/\");\n let processed;\n let uploadFile: File = file;\n let filename = file.name;\n let width: number | null = null;\n let height: number | null = null;\n\n if (isImage && !file.type.includes(\"svg\")) {\n const buffer = Buffer.from(await file.arrayBuffer());\n processed = await processImage(buffer);\n const originalName = file.name.replace(/\\.[^/.]+$/, \"\");\n const safeName = originalName\n .toLowerCase()\n .replace(/[^a-z0-9]/g, \"-\")\n .replace(/-+/g, \"-\")\n .substring(0, 50);\n filename = `${safeName}.webp`;\n width = processed.width ?? null;\n height = processed.height ?? null;\n uploadFile = new File([processed.buffer], filename, {\n type: \"image/webp\",\n });\n }\n\n const storageResult: UploadedFile = await this.storage.upload(uploadFile, {\n folder,\n filename,\n });\n\n const thumbnailUrl = await this.storage.generateThumbnail(\n {\n ...storageResult,\n id: \"\",\n provider: this.storage.name,\n createdAt: this.now(),\n },\n { width: 400, height: 400 },\n );\n\n const id = this.genId();\n const now = this.now();\n\n if (this.dialect === \"sqlite\") {\n await this.sqliteRun(\n `INSERT INTO ${this.mediaTable}\n (id, filename, title, original_name, mime_type, file_size, width, height, url, thumbnail_url, folder, provider, alt, caption, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n storageResult.filename,\n file.name.replace(/\\.[^/.]+$/, \"\"),\n file.name,\n storageResult.mimeType,\n storageResult.size,\n width,\n height,\n storageResult.url,\n thumbnailUrl,\n folder || null,\n this.storage.name,\n null,\n null,\n null,\n now,\n now,\n ],\n );\n } else {\n const { media: mediaSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const mime = storageResult.mimeType;\n const mediaType = mime.startsWith(\"image/\") ? \"image\"\n : mime.startsWith(\"video/\") ? \"video\"\n : mime.startsWith(\"audio/\") ? \"audio\"\n : mime.startsWith(\"application/pdf\") ? \"document\"\n : [\"application/zip\",\"application/x-zip\",\"application/x-tar\",\"application/gzip\",\"application/x-7z\"].includes(mime) ? \"archive\"\n : \"other\";\n await this.db\n .insert(mediaSchema)\n .values({\n id,\n filename: storageResult.filename,\n title: file.name.replace(/\\.[^/.]+$/, \"\"),\n originalName: file.name,\n mimeType: mime,\n fileSize: storageResult.size,\n width,\n height,\n url: storageResult.url,\n thumbnailUrl,\n folder: folder || \"\",\n provider: this.storage.name,\n type: mediaType,\n status: \"active\",\n alt: null,\n caption: null,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n .returning();\n }\n\n return {\n id,\n filename: storageResult.filename,\n title: file.name.replace(/\\.[^/.]+$/, \"\"),\n originalName: file.name,\n mimeType: storageResult.mimeType,\n fileSize: storageResult.size,\n width,\n height,\n url: storageResult.url,\n thumbnailUrl,\n folder: folder || null,\n provider: this.storage.name,\n alt: null,\n caption: null,\n metadata: null,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n async uploadFromUrl(url: string, folder: string = \"\"): Promise<MediaRow> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch URL: ${response.status}`);\n }\n const blob = await response.blob();\n const originalName = url.split(\"/\").pop() || \"url-image\";\n const mimeType = response.headers.get(\"content-type\") || blob.type || \"application/octet-stream\";\n const file = new File([blob], originalName, { type: mimeType });\n return this.upload(file, folder);\n }\n\n async delete(id: string): Promise<void> {\n let item: MediaRow | null = null;\n\n if (this.dialect === \"sqlite\") {\n item = this.sqliteGet(`SELECT * FROM ${this.mediaTable} WHERE id = ?`, [\n id,\n ]) as MediaRow | null;\n } else {\n const { media: mediaSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n const [row] = await this.db\n .select()\n .from(mediaSchema)\n .where(eq(mediaSchema.id, id));\n if (row) item = this.rowToMedia(row);\n }\n\n if (!item) return;\n await this.deleteFile(item.url);\n\n if (\n item.thumbnailUrl &&\n item.thumbnailUrl !== item.url &&\n item.thumbnailUrl !== item.url + \"?thumb\"\n ) {\n try {\n await this.deleteFile(item.thumbnailUrl);\n } catch {}\n }\n\n if (this.dialect === \"sqlite\") {\n await this.sqliteRun(`DELETE FROM ${this.mediaTable} WHERE id = ?`, [id]);\n } else {\n const { media: mediaSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n await this.db.delete(mediaSchema).where(eq(mediaSchema.id, id));\n }\n }\n\n async deleteFile(url: string): Promise<void> {\n await this.storage.delete(url);\n }\n\n async rename(id: string, newKey: string): Promise<MediaRow | null> {\n let item: MediaRow | null = null;\n\n if (this.dialect === \"sqlite\") {\n item = this.sqliteGet(`SELECT * FROM ${this.mediaTable} WHERE id = ?`, [\n id,\n ]) as MediaRow | null;\n } else {\n const { media: mediaSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n const [row] = await this.db\n .select()\n .from(mediaSchema)\n .where(eq(mediaSchema.id, id));\n if (row) item = this.rowToMedia(row);\n }\n\n if (!item) return null;\n\n const newUrl = await this.storage.rename(item.url, newKey);\n\n // For Cloudinary, construct thumbnail URL with transformations\n let newThumbnailUrl: string | undefined;\n if (item.thumbnailUrl || this.storage.name === \"cloudinary\") {\n // Get version from newUrl (format: .../upload/v{version}/...)\n const versionMatch = newUrl.match(/\\/upload\\/(v\\d+)\\//);\n const version = versionMatch ? versionMatch[1] + \"/\" : \"\";\n\n // Extract base URL (everything before /upload/)\n const baseUrlMatch = newUrl.match(/(.+?)\\/upload\\//);\n const baseUrl = baseUrlMatch\n ? baseUrlMatch[1]\n : \"https://res.cloudinary.com/\" +\n (this.storage as any).config?.cloudName || \"unknown\";\n\n // newKey already includes folder path\n newThumbnailUrl = `${baseUrl}/upload/w_200,h_200,c_fill/${version}${newKey}`;\n }\n\n const ext = item.filename.split(\".\").pop();\n const newFilename = newKey.includes(\".\") ? newKey : `${newKey}.${ext}`;\n\n const updateData = {\n url: newUrl,\n filename: newFilename,\n thumbnailUrl: newThumbnailUrl,\n };\n\n if (this.dialect === \"sqlite\") {\n // Map thumbnailUrl to thumbnail_url for SQLite\n const sqliteUpdateData: Record<string, any> = { ...updateData };\n if (\"thumbnailUrl\" in sqliteUpdateData) {\n sqliteUpdateData.thumbnail_url = sqliteUpdateData.thumbnailUrl;\n delete sqliteUpdateData.thumbnailUrl;\n }\n\n const sets = Object.keys(sqliteUpdateData)\n .map((k) => `${k} = ?`)\n .join(\", \");\n const vals = Object.values(sqliteUpdateData);\n await this.sqliteRun(\n `UPDATE ${this.mediaTable} SET ${sets}, updated_at = ? WHERE id = ?`,\n [...vals, this.now(), id],\n );\n } else {\n const { media: mediaSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n await this.db\n .update(mediaSchema)\n .set({ ...updateData, updatedAt: this.now() })\n .where(eq(mediaSchema.id, id));\n }\n\n return {\n ...item,\n ...updateData,\n updatedAt: this.now(),\n thumbnailUrl: updateData.thumbnailUrl ?? null,\n };\n }\n\n async findById(id: string): Promise<MediaRow | null> {\n if (this.dialect === \"sqlite\") {\n const row = this.sqliteGet(\n `SELECT * FROM ${this.mediaTable} WHERE id = ?`,\n [id],\n );\n return row ? this.rowToMedia(row) : null;\n }\n\n const { media: mediaSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n\n const [row] = await this.db\n .select()\n .from(mediaSchema)\n .where(eq(mediaSchema.id, id));\n\n return row ? this.rowToMedia(row) : null;\n }\n\n async find(params: MediaSearchParams = {}): Promise<{\n docs: MediaRow[];\n totalDocs: number;\n page: number;\n limit: number;\n totalPages: number;\n }> {\n const {\n page = 1,\n limit = 30,\n search = \"\",\n type = \"\",\n folder = \"\",\n sortBy = \"createdAt\",\n sortDir = \"desc\",\n } = params;\n\n const {\n where,\n params: p,\n orderBy,\n sortCol,\n } = this.buildFindConditions({\n page,\n limit,\n search,\n type,\n folder,\n sortBy,\n sortDir,\n });\n\n const offset = (page - 1) * limit;\n\n if (this.dialect === \"sqlite\") {\n const countRow = this.sqliteGet(\n `SELECT COUNT(*) as cnt FROM ${this.mediaTable} ${where}`,\n p,\n );\n const totalDocs = countRow?.cnt ?? 0;\n\n const rows = await this.sqliteRun(\n `SELECT * FROM ${this.mediaTable} ${where} ORDER BY ${sortCol} ${orderBy} LIMIT ? OFFSET ?`,\n [...p, limit, offset],\n );\n\n return {\n docs: rows.map((r: any) => this.rowToMedia(r)),\n totalDocs,\n page,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n };\n }\n\n const { media: mediaSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const { like, or, and, asc, desc, eq, sql } = await import(\n \"drizzle-orm\"\n );\n\n const conditions: any[] = [];\n if (search) {\n conditions.push(\n or(\n like(mediaSchema.title, `%${search}%`),\n like(mediaSchema.filename, `%${search}%`),\n like(mediaSchema.originalName, `%${search}%`),\n like(mediaSchema.alt, `%${search}%`),\n ),\n );\n }\n if (type && type !== \"all\") {\n conditions.push(like(mediaSchema.mimeType, `${type}/%`));\n }\n if (folder) {\n conditions.push(\n or(\n eq(mediaSchema.folder, folder),\n like(mediaSchema.folder, `${folder}/%`),\n ),\n );\n }\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined;\n const sortKey: Record<string, string> = {\n created_at: \"createdAt\",\n updated_at: \"updatedAt\",\n title: \"title\",\n filename: \"filename\",\n file_size: \"fileSize\",\n mime_type: \"mimeType\",\n original_name: \"originalName\",\n };\n const col = (mediaSchema as any)[sortKey[sortCol] || \"createdAt\"];\n const order = sortDir === \"asc\" ? asc(col) : desc(col);\n\n const docs = await this.db\n .select()\n .from(mediaSchema)\n .where(whereClause)\n .orderBy(order)\n .limit(limit)\n .offset(offset);\n\n const [{ count }] = await this.db\n .select({ count: sql`count(*)` })\n .from(mediaSchema)\n .where(whereClause);\n\n const totalDocs = Number(count);\n return {\n docs: docs.map((r: any) => this.rowToMedia(r)),\n totalDocs,\n page,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n };\n }\n\n async update(\n id: string,\n data: { title?: string; alt?: string; caption?: string; folder?: string },\n ): Promise<MediaRow | null> {\n const now = this.now();\n\n if (this.dialect === \"sqlite\") {\n const sets: string[] = [\"updated_at = ?\"];\n const p: any[] = [now];\n if (data.title !== undefined) {\n sets.push(\"title = ?\");\n p.push(data.title);\n }\n if (data.alt !== undefined) {\n sets.push(\"alt = ?\");\n p.push(data.alt);\n }\n if (data.caption !== undefined) {\n sets.push(\"caption = ?\");\n p.push(data.caption);\n }\n if (data.folder !== undefined) {\n sets.push(\"folder = ?\");\n p.push(data.folder || null);\n }\n p.push(id);\n await this.sqliteRun(\n `UPDATE ${this.mediaTable} SET ${sets.join(\", \")} WHERE id = ?`,\n p,\n );\n const row = this.sqliteGet(\n `SELECT * FROM ${this.mediaTable} WHERE id = ?`,\n [id],\n );\n return row ? this.rowToMedia(row) : null;\n }\n\n const { media: mediaSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n const [updated] = await this.db\n .update(mediaSchema)\n .set({ ...data, updatedAt: new Date() })\n .where(eq(mediaSchema.id, id))\n .returning();\n return updated ? this.rowToMedia(updated) : null;\n }\n\n async updateMany(ids: string[], data: { folder?: string }): Promise<void> {\n const now = this.now();\n if (this.dialect === \"sqlite\") {\n for (const id of ids) {\n const sets = [\"updated_at = ?\"];\n const p: any[] = [now];\n if (data.folder !== undefined) {\n sets.push(\"folder = ?\");\n p.push(data.folder || null);\n }\n p.push(id);\n await this.sqliteRun(\n `UPDATE ${this.mediaTable} SET ${sets.join(\", \")} WHERE id = ?`,\n p,\n );\n }\n } else {\n const { media: mediaSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const { eq } = await import(\"drizzle-orm\");\n for (const id of ids) {\n await this.db\n .update(mediaSchema)\n .set({ ...data, updatedAt: new Date() })\n .where(eq(mediaSchema.id, id));\n }\n }\n }\n\n async listFolders(): Promise<string[]> {\n if (this.dialect === \"sqlite\") {\n const rows = await this.sqliteRun(\n `SELECT path FROM ${this.foldersTable} UNION\n SELECT folder as path FROM ${this.mediaTable} WHERE folder IS NOT NULL AND folder != ''`,\n );\n return rows\n .map((r: any) => r.path)\n .filter((f: any) => f && f !== \"\")\n .sort();\n }\n\n const { media: mediaSchema, mediaFolders: folderSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const { eq, sql } = await import(\n \"drizzle-orm\"\n );\n\n const fromMedia = await this.db\n .select({ folder: mediaSchema.folder })\n .from(mediaSchema)\n .groupBy(mediaSchema.folder);\n\n const fromFolders = await this.db\n .select({ path: folderSchema.path })\n .from(folderSchema);\n\n const allPaths = new Set([\n ...fromMedia.map((r: any) => r.folder),\n ...fromFolders.map((r: any) => r.path),\n ]);\n\n return Array.from(allPaths)\n .filter((f: any) => f && f !== \"\")\n .sort() as string[];\n }\n\n async createFolder(name: string, parentPath: string = \"\"): Promise<void> {\n const fullPath = parentPath ? `${parentPath}/${name}` : name;\n\n await this.storage.createFolder?.(fullPath);\n\n const now = this.now();\n\n if (this.dialect === \"sqlite\") {\n await this.sqliteRun(\n `INSERT OR IGNORE INTO ${this.foldersTable} (path, name, parent_path, created_at) VALUES (?, ?, ?, ?)`,\n [fullPath, name, parentPath || null, now],\n );\n } else {\n const { mediaFolders: folderSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n await this.db\n .insert(folderSchema)\n .values({\n path: fullPath,\n name,\n parentPath: parentPath || null,\n createdAt: new Date(),\n })\n .onConflictDoNothing();\n }\n }\n\n async deleteFolder(folder: string): Promise<void> {\n const result = await this.find({ folder, limit: 10000 });\n for (const item of result.docs) {\n await this.delete(item.id);\n }\n\n await this.storage.deleteFolder?.(folder);\n\n if (this.dialect === \"sqlite\") {\n await this.sqliteRun(\n `DELETE FROM ${this.foldersTable} WHERE path = ? OR path LIKE ?`,\n [folder, `${folder}/%`],\n );\n } else {\n const { mediaFolders: folderSchema } = await import(\n \"../database/drizzle/schema/media.js\"\n );\n const { like, or, eq } = await import(\n \"drizzle-orm\"\n );\n await this.db\n .delete(folderSchema)\n .where(\n or(\n eq(folderSchema.path, folder),\n like(folderSchema.path, `${folder}/%`),\n ),\n );\n }\n }\n}\n"]}
|