@kyro-cms/core 0.5.4 → 0.5.5
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/WebhookService-118ZTFis.d.ts +112 -0
- package/dist/WebhookService-AefJfqX0.d.cts +112 -0
- package/dist/adapter-BSvBudTG.d.cts +65 -0
- package/dist/adapter-CXGB2Elb.d.ts +65 -0
- package/dist/api-handler.cjs +26 -8
- package/dist/api-handler.cjs.map +1 -1
- package/dist/api-handler.d.cts +9 -0
- package/dist/api-handler.d.ts +9 -0
- package/dist/api-handler.js +25 -7
- package/dist/api-handler.js.map +1 -1
- package/dist/base-DvvNqnM-.d.cts +73 -0
- package/dist/base-eVegJ_Pr.d.ts +73 -0
- package/dist/bootstrap-4MH44YKG.js +6 -0
- package/dist/{bootstrap-PBMMLBQC.js.map → bootstrap-4MH44YKG.js.map} +1 -1
- package/dist/bootstrap-EE6BJZWL.cjs +31 -0
- package/dist/{bootstrap-QN77EVI3.cjs.map → bootstrap-EE6BJZWL.cjs.map} +1 -1
- package/dist/chunk-3YELQL7Z.cjs +4 -0
- package/dist/chunk-3YELQL7Z.cjs.map +1 -0
- package/dist/{chunk-AGAIUDAV.cjs → chunk-55BNRTLW.cjs} +7 -7
- package/dist/chunk-55BNRTLW.cjs.map +1 -0
- package/dist/{chunk-XJ2VYR47.cjs → chunk-5HA5OMFH.cjs} +10 -7
- package/dist/chunk-5HA5OMFH.cjs.map +1 -0
- package/dist/{chunk-C4JJEE42.js → chunk-6WXQRYTW.js} +262 -43
- package/dist/chunk-6WXQRYTW.js.map +1 -0
- package/dist/{chunk-SO25EHOE.js → chunk-AM4JKIPP.js} +180 -77
- package/dist/chunk-AM4JKIPP.js.map +1 -0
- package/dist/{chunk-VSTRLXMQ.cjs → chunk-CKVOU6MX.cjs} +4 -2
- package/dist/chunk-CKVOU6MX.cjs.map +1 -0
- package/dist/chunk-GTGRLD4Y.js +3 -0
- package/dist/chunk-GTGRLD4Y.js.map +1 -0
- package/dist/chunk-MTIRYI7F.cjs +4 -0
- package/dist/chunk-MTIRYI7F.cjs.map +1 -0
- package/dist/{chunk-342BJNBI.js → chunk-QKVA2SOG.js} +300 -6
- package/dist/chunk-QKVA2SOG.js.map +1 -0
- package/dist/chunk-QU2RFFH4.js +3 -0
- package/dist/chunk-QU2RFFH4.js.map +1 -0
- package/dist/{chunk-ATVNYGRQ.js → chunk-QYZKIPSD.js} +7 -18
- package/dist/chunk-QYZKIPSD.js.map +1 -0
- package/dist/{chunk-SYRDCLH7.cjs → chunk-R2YHJN6W.cjs} +184 -81
- package/dist/chunk-R2YHJN6W.cjs.map +1 -0
- package/dist/{chunk-IX3ABYKZ.cjs → chunk-RALQO47U.cjs} +170 -2
- package/dist/chunk-RALQO47U.cjs.map +1 -0
- package/dist/{chunk-EVEJC22G.cjs → chunk-RDRJVCL5.cjs} +37 -5
- package/dist/chunk-RDRJVCL5.cjs.map +1 -0
- package/dist/{chunk-6COM32WF.js → chunk-RP7VZUEL.js} +5 -3
- package/dist/chunk-RP7VZUEL.js.map +1 -0
- package/dist/{chunk-XR5EJS3C.js → chunk-S3FG2NY7.js} +7 -4
- package/dist/chunk-S3FG2NY7.js.map +1 -0
- package/dist/{chunk-WH4Y5MT6.js → chunk-TP5YQFIX.js} +36 -4
- package/dist/chunk-TP5YQFIX.js.map +1 -0
- package/dist/{chunk-DBUYB32X.js → chunk-TVVYZ2TH.js} +171 -3
- package/dist/chunk-TVVYZ2TH.js.map +1 -0
- package/dist/{chunk-GBH6DN5C.cjs → chunk-WBCIEYHC.cjs} +8 -18
- package/dist/chunk-WBCIEYHC.cjs.map +1 -0
- package/dist/{chunk-3ZZPZYCM.cjs → chunk-WVPOPOEQ.cjs} +269 -41
- package/dist/chunk-WVPOPOEQ.cjs.map +1 -0
- package/dist/{chunk-W3KPQX7V.cjs → chunk-XAEBVZTI.cjs} +304 -4
- package/dist/chunk-XAEBVZTI.cjs.map +1 -0
- package/dist/{chunk-Q4DNT7FO.js → chunk-XU7AFF6V.js} +6 -6
- package/dist/chunk-XU7AFF6V.js.map +1 -0
- package/dist/cli/index.cjs +6 -4
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +6 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/client.d.cts +12 -0
- package/dist/client.d.ts +12 -0
- package/dist/drizzle/index.cjs +18 -18
- package/dist/drizzle/index.d.cts +152 -0
- package/dist/drizzle/index.d.ts +152 -0
- package/dist/drizzle/index.js +3 -3
- package/dist/fields/index.d.cts +27 -0
- package/dist/fields/index.d.ts +27 -0
- package/dist/graphql/index.d.cts +22 -0
- package/dist/graphql/index.d.ts +22 -0
- package/dist/index-Bz9JqRGI.d.cts +86 -0
- package/dist/index-Bz9JqRGI.d.ts +86 -0
- package/dist/index-CLp-DRKA.d.ts +64 -0
- package/dist/index-DfO7G4kN.d.cts +64 -0
- package/dist/index.cjs +118 -86
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1368 -0
- package/dist/index.d.ts +1368 -0
- package/dist/index.js +48 -14
- package/dist/index.js.map +1 -1
- package/dist/integration.cjs +2 -2
- package/dist/integration.d.cts +27 -0
- package/dist/integration.d.ts +27 -0
- package/dist/integration.js +1 -1
- package/dist/media-GPPTZ43E.js +4 -0
- package/dist/{media-HOT3O7RW.js.map → media-GPPTZ43E.js.map} +1 -1
- package/dist/media-XNTUFJZR.cjs +17 -0
- package/dist/{media-WKP5AOX2.cjs.map → media-XNTUFJZR.cjs.map} +1 -1
- package/dist/mongodb/index.cjs +12 -3
- package/dist/mongodb/index.d.cts +59 -0
- package/dist/mongodb/index.d.ts +59 -0
- package/dist/mongodb/index.js +2 -1
- package/dist/postgres-auth-adapter-6742WDCF.cjs +14 -0
- package/dist/{postgres-auth-adapter-Z463NYJZ.cjs.map → postgres-auth-adapter-6742WDCF.cjs.map} +1 -1
- package/dist/postgres-auth-adapter-B65BULNS.js +5 -0
- package/dist/{postgres-auth-adapter-7F3ECO7I.js.map → postgres-auth-adapter-B65BULNS.js.map} +1 -1
- package/dist/rest/index.cjs +9 -5
- package/dist/rest/index.d.cts +57 -0
- package/dist/rest/index.d.ts +57 -0
- package/dist/rest/index.js +7 -3
- package/dist/{schema-TIYTCIKX.cjs → schema-37SE2F4B.cjs} +5 -5
- package/dist/{schema-TIYTCIKX.cjs.map → schema-37SE2F4B.cjs.map} +1 -1
- package/dist/{schema-6Q4W6AE6.js → schema-5PHL5IVB.js} +3 -3
- package/dist/{schema-6Q4W6AE6.js.map → schema-5PHL5IVB.js.map} +1 -1
- package/dist/templates/index.d.cts +59 -0
- package/dist/templates/index.d.ts +59 -0
- package/dist/trpc/index.d.cts +136 -0
- package/dist/trpc/index.d.ts +136 -0
- package/dist/types-Bs1up4yP.d.ts +461 -0
- package/dist/types-DqN4ckOC.d.cts +130 -0
- package/dist/types-DqN4ckOC.d.ts +130 -0
- package/dist/types-J3R9nVsZ.d.cts +461 -0
- package/dist/types-VtjUxIMp.d.cts +246 -0
- package/dist/types-VtjUxIMp.d.ts +246 -0
- package/dist/ws/index.d.cts +88 -0
- package/dist/ws/index.d.ts +88 -0
- package/package.json +3 -2
- package/dist/bootstrap-PBMMLBQC.js +0 -6
- package/dist/bootstrap-QN77EVI3.cjs +0 -31
- package/dist/chunk-342BJNBI.js.map +0 -1
- package/dist/chunk-3ZZPZYCM.cjs.map +0 -1
- package/dist/chunk-6COM32WF.js.map +0 -1
- package/dist/chunk-7SXPHG3M.cjs +0 -67
- package/dist/chunk-7SXPHG3M.cjs.map +0 -1
- package/dist/chunk-AGAIUDAV.cjs.map +0 -1
- package/dist/chunk-ATVNYGRQ.js.map +0 -1
- package/dist/chunk-C4JJEE42.js.map +0 -1
- package/dist/chunk-DBUYB32X.js.map +0 -1
- package/dist/chunk-EVEJC22G.cjs.map +0 -1
- package/dist/chunk-GBH6DN5C.cjs.map +0 -1
- package/dist/chunk-IX3ABYKZ.cjs.map +0 -1
- package/dist/chunk-L4E76X2K.js +0 -57
- package/dist/chunk-L4E76X2K.js.map +0 -1
- package/dist/chunk-Q4DNT7FO.js.map +0 -1
- package/dist/chunk-SO25EHOE.js.map +0 -1
- package/dist/chunk-SYRDCLH7.cjs.map +0 -1
- package/dist/chunk-VSTRLXMQ.cjs.map +0 -1
- package/dist/chunk-W3KPQX7V.cjs.map +0 -1
- package/dist/chunk-WH4Y5MT6.js.map +0 -1
- package/dist/chunk-XJ2VYR47.cjs.map +0 -1
- package/dist/chunk-XR5EJS3C.js.map +0 -1
- package/dist/media-HOT3O7RW.js +0 -4
- package/dist/media-WKP5AOX2.cjs +0 -17
- package/dist/postgres-auth-adapter-7F3ECO7I.js +0 -5
- package/dist/postgres-auth-adapter-Z463NYJZ.cjs +0 -14
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/secret.ts","../src/api/rest/auth-session.ts","../src/api/rest/auth-middleware.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/s3.ts","../src/storage/cloudinary.ts","../src/storage/imgix.ts","../src/storage/ftp.ts","../src/storage/index.ts","../src/storage/processor.ts","../src/storage/MediaService.ts","../src/auth/rbac/roles.ts","../src/auth/rbac/checker.ts","../src/api/rest/hono-app.ts"],"names":["crypto","createAuditContext","randomBytes","path","getUrlPrefix","storage","row","totalDocs","user","collections","result","join","existsSync","sharp","computeDiff"],"mappings":"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","file":"chunk-AM4JKIPP.js","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',\n where: { slug: 'system' },\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 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: 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 try {\n const session = await getCurrentUser(req);\n \n if (!session) {\n return this.errorResponse(\"Not authenticated\", 401);\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 return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n });\n } catch (error: any) {\n console.error(\"[AuthRoutes.me] Authentication failed:\", error.message);\n return this.errorResponse(\"Authentication failed\", 401);\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_request\",\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 { 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, 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 {\n S3Client,\n PutObjectCommand,\n DeleteObjectCommand,\n DeleteObjectsCommand,\n CopyObjectCommand,\n ListObjectsV2Command,\n HeadObjectCommand,\n} from \"@aws-sdk/client-s3\";\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 (require(\"@smithy/node-http-handler\").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 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 { 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\";\n\nexport async function resolveProvider(\n configService: ConfigService,\n): Promise<StorageProvider> {\n const config = configService.getStorageConfig();\n\n switch (config.type) {\n case \"aws\":\n return createS3Storage({\n provider: \"aws\",\n bucket: config.s3.bucket || \"\",\n region: config.s3.region || \"us-east-1\",\n accessKeyId: config.s3.accessKeyId || \"\",\n secretAccessKey: config.s3.secretAccessKey || \"\",\n endpoint: config.s3.endpoint,\n cdnUrl: config.s3.cdnUrl,\n prefix: config.s3.prefix,\n });\n\n case \"r2\":\n return createS3Storage({\n provider: \"r2\",\n bucket: config.r2.bucket || \"\",\n region: \"auto\",\n accessKeyId: config.r2.accessKeyId || \"\",\n secretAccessKey: config.r2.secretAccessKey || \"\",\n accountId: config.r2.accountId || \"\",\n publicDevUrl: config.r2.publicDevUrl,\n endpoint: `https://${config.r2.accountId || \"\"}.r2.cloudflarestorage.com`,\n cdnUrl: config.r2.cdnUrl,\n prefix: config.r2.prefix,\n });\n\n case \"gcs\":\n return createS3Storage({\n provider: \"gcs\",\n bucket: config.gcs.bucket || \"\",\n region: config.gcs.projectId || \"auto\",\n accessKeyId: config.gcs.clientEmail || \"\",\n secretAccessKey: config.gcs.privateKey || \"\",\n cdnUrl: config.gcs.cdnUrl,\n prefix: config.gcs.prefix,\n });\n\n case \"digitalocean\":\n return createS3Storage({\n provider: \"digitalocean\",\n bucket: config.digitalocean.bucket || \"\",\n region: config.digitalocean.region || \"nyc3\",\n accessKeyId: config.digitalocean.accessKeyId || \"\",\n secretAccessKey: config.digitalocean.secretAccessKey || \"\",\n endpoint: `https://${config.digitalocean.region || \"nyc3\"}.digitaloceanspaces.com`,\n cdnUrl: config.digitalocean.cdnUrl,\n prefix: config.digitalocean.prefix,\n });\n\n case \"backblaze\":\n return createS3Storage({\n provider: \"backblaze\",\n bucket: config.backblaze.bucket || \"\",\n region: \"auto\",\n accessKeyId: config.backblaze.applicationKeyId || \"\",\n secretAccessKey: config.backblaze.applicationKey || \"\",\n accountId: config.backblaze.accountId || \"\",\n endpoint: `https://s3.backblazeb2.com`,\n cdnUrl: config.backblaze.cdnUrl,\n prefix: config.backblaze.prefix,\n });\n\n case \"wasabi\":\n return createS3Storage({\n provider: \"wasabi\",\n bucket: config.wasabi.bucket || \"\",\n region: config.wasabi.region || \"us-east-1\",\n accessKeyId: config.wasabi.accessKeyId || \"\",\n secretAccessKey: config.wasabi.secretAccessKey || \"\",\n endpoint: `https://s3.${config.wasabi.region || \"us-east-1\"}.wasabisys.com`,\n cdnUrl: config.wasabi.cdnUrl,\n prefix: config.wasabi.prefix,\n });\n\n case \"ftp\":\n case \"sftp\":\n return createFtpStorage({\n host: config.ftp?.host || \"\",\n port: config.ftp?.port || 21,\n user: config.ftp?.user || \"\",\n password: config.ftp?.password || \"\",\n secure: config.ftp?.secure || false,\n baseUrl: config.ftp?.baseUrl || \"\",\n prefix: config.ftp?.prefix,\n type: \"ftp\" as const,\n });\n\n case \"cloudinary\":\n return createCloudinaryStorage({\n cloudName: config.cloudinary.cloudName || \"\",\n apiKey: config.cloudinary.apiKey || \"\",\n apiSecret: config.cloudinary.apiSecret || \"\",\n folder: config.cloudinary.folder,\n });\n\n case \"imgix\":\n return createImgixStorage({\n domain: config.imgix.domain || \"\",\n signKey: config.imgix.signKey,\n });\n\n case \"local\":\n default:\n return createLocalStorage({\n uploadDir:\n config.local.uploadDir ||\n path.join(process.cwd(), \"public\", \"uploads\"),\n baseUrl: config.local.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 console.log(\"[resolveProviderWithConfig] Creating provider:\", config.type);\n switch (config.type) {\n case \"aws\":\n return createS3Storage({\n provider: \"aws\",\n bucket: config.s3?.bucket || \"\",\n region: config.s3?.region || \"us-east-1\",\n accessKeyId: config.s3?.accessKeyId || \"\",\n secretAccessKey: config.s3?.secretAccessKey || \"\",\n endpoint: config.s3?.endpoint,\n cdnUrl: config.s3?.cdnUrl,\n prefix: config.s3?.prefix,\n });\n case \"r2\":\n return createS3Storage({\n provider: \"r2\",\n bucket: config.r2?.bucket || \"\",\n region: \"auto\",\n accessKeyId: config.r2?.accessKeyId || \"\",\n secretAccessKey: config.r2?.secretAccessKey || \"\",\n accountId: config.r2?.accountId || \"\",\n publicDevUrl: config.r2?.publicDevUrl,\n endpoint: `https://${config.r2?.accountId || \"\"}.r2.cloudflarestorage.com`,\n cdnUrl: config.r2?.cdnUrl,\n prefix: config.r2?.prefix,\n });\n case \"gcs\":\n return createS3Storage({\n provider: \"gcs\",\n bucket: config.gcs?.bucket || \"\",\n region: config.gcs?.projectId || \"auto\",\n accessKeyId: config.gcs?.clientEmail || \"\",\n secretAccessKey: config.gcs?.privateKey || \"\",\n cdnUrl: config.gcs?.cdnUrl,\n prefix: config.gcs?.prefix,\n });\n case \"digitalocean\":\n return createS3Storage({\n provider: \"digitalocean\",\n bucket: config.digitalocean?.bucket || \"\",\n region: config.digitalocean?.region || \"nyc3\",\n accessKeyId: config.digitalocean?.accessKeyId || \"\",\n secretAccessKey: config.digitalocean?.secretAccessKey || \"\",\n cdnUrl: config.digitalocean?.cdnUrl,\n prefix: config.digitalocean?.prefix,\n });\n case \"backblaze\":\n return createS3Storage({\n provider: \"backblaze\",\n bucket: config.backblaze?.bucket || \"\",\n region: \"auto\",\n accessKeyId: config.backblaze?.applicationKeyId || \"\",\n secretAccessKey: config.backblaze?.applicationKey || \"\",\n cdnUrl: config.backblaze?.cdnUrl,\n prefix: config.backblaze?.prefix,\n });\n case \"wasabi\":\n return createS3Storage({\n provider: \"wasabi\",\n bucket: config.wasabi?.bucket || \"\",\n region: config.wasabi?.region || \"us-east-1\",\n accessKeyId: config.wasabi?.accessKeyId || \"\",\n secretAccessKey: config.wasabi?.secretAccessKey || \"\",\n cdnUrl: config.wasabi?.cdnUrl,\n prefix: config.wasabi?.prefix,\n });\n case \"cloudinary\":\n return createCloudinaryStorage({\n cloudName: config.cloudinary?.cloudName || \"\",\n apiKey: config.cloudinary?.apiKey || \"\",\n apiSecret: config.cloudinary?.apiSecret || \"\",\n folder: config.cloudinary?.folder,\n });\n case \"ftp\":\n case \"sftp\": {\n const ftpConf = config.ftp || config;\n return createFtpStorage({\n type: \"ftp\" as const,\n host: ftpConf.host || \"\",\n port: ftpConf.port || 21,\n user: ftpConf.user || \"\",\n password: ftpConf.password || \"\",\n secure: ftpConf.secure || false,\n baseUrl: ftpConf.baseUrl || \"\",\n prefix: ftpConf.prefix,\n });\n }\n case \"local\":\n default: {\n const localConfig = (config as any).local || {\n uploadDir: (config as any)[\"local.uploadDir\"],\n baseUrl: (config as any)[\"local.baseUrl\"],\n };\n\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\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\n return createLocalStorage({ uploadDir, baseUrl });\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 if (typeof db?.select === \"function\") {\n await configService.load();\n }\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","export interface Role {\n name: string;\n level: number;\n inherits: string[];\n description: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface Permission {\n resource: string;\n action: \"create\" | \"read\" | \"update\" | \"delete\" | \"admin\";\n conditions?: Condition[];\n}\n\nexport interface Condition {\n field: string;\n operator:\n | \"eq\"\n | \"neq\"\n | \"in\"\n | \"nin\"\n | \"gt\"\n | \"lt\"\n | \"gte\"\n | \"lte\"\n | \"contains\";\n value: any;\n}\n\nexport interface RolePermission {\n role: string;\n permissions: Permission[];\n}\n\nexport const DEFAULT_ROLES: Role[] = [\n {\n name: \"super_admin\",\n level: 100,\n inherits: [],\n description: \"Full system access across all tenants\",\n },\n {\n name: \"admin\",\n level: 90,\n inherits: [\"editor\"],\n description: \"Full tenant access with all content permissions\",\n },\n {\n name: \"editor\",\n level: 70,\n inherits: [\"author\"],\n description: \"Edit and publish all content\",\n },\n {\n name: \"author\",\n level: 50,\n inherits: [\"customer\"],\n description: \"Create and edit own content\",\n },\n {\n name: \"customer\",\n level: 30,\n inherits: [],\n description: \"Access own data and make purchases\",\n },\n {\n name: \"guest\",\n level: 10,\n inherits: [],\n description: \"Public read-only access\",\n },\n];\n\nexport const DEFAULT_PERMISSIONS: Permission[] = [\n { resource: \"users\", action: \"admin\" },\n { resource: \"users\", action: \"read\" },\n { resource: \"users\", action: \"create\" },\n { resource: \"users\", action: \"update\" },\n { resource: \"users\", action: \"delete\" },\n\n { resource: \"audit_logs\", action: \"admin\" },\n { resource: \"audit_logs\", action: \"read\" },\n\n { resource: \"posts\", action: \"admin\" },\n { resource: \"posts\", action: \"read\" },\n { resource: \"posts\", action: \"create\" },\n { resource: \"posts\", action: \"update\" },\n { resource: \"posts\", action: \"delete\" },\n\n { resource: \"pages\", action: \"admin\" },\n { resource: \"pages\", action: \"read\" },\n { resource: \"pages\", action: \"create\" },\n { resource: \"pages\", action: \"update\" },\n { resource: \"pages\", action: \"delete\" },\n\n { resource: \"media\", action: \"admin\" },\n { resource: \"media\", action: \"read\" },\n { resource: \"media\", action: \"create\" },\n { resource: \"media\", action: \"update\" },\n { resource: \"media\", action: \"delete\" },\n\n { resource: \"categories\", action: \"admin\" },\n { resource: \"categories\", action: \"read\" },\n { resource: \"categories\", action: \"create\" },\n { resource: \"categories\", action: \"update\" },\n { resource: \"categories\", action: \"delete\" },\n\n { resource: \"products\", action: \"admin\" },\n { resource: \"products\", action: \"read\" },\n { resource: \"products\", action: \"create\" },\n { resource: \"products\", action: \"update\" },\n { resource: \"products\", action: \"delete\" },\n\n { resource: \"orders\", action: \"admin\" },\n { resource: \"orders\", action: \"read\" },\n { resource: \"orders\", action: \"create\" },\n { resource: \"orders\", action: \"update\" },\n { resource: \"orders\", action: \"delete\" },\n\n { resource: \"customers\", action: \"admin\" },\n { resource: \"customers\", action: \"read\" },\n { resource: \"customers\", action: \"create\" },\n { resource: \"customers\", action: \"update\" },\n { resource: \"customers\", action: \"delete\" },\n\n { resource: \"coupons\", action: \"admin\" },\n { resource: \"coupons\", action: \"read\" },\n { resource: \"coupons\", action: \"create\" },\n { resource: \"coupons\", action: \"update\" },\n { resource: \"coupons\", action: \"delete\" },\n\n { resource: \"menu\", action: \"admin\" },\n { resource: \"menu\", action: \"read\" },\n { resource: \"menu\", action: \"create\" },\n { resource: \"menu\", action: \"update\" },\n { resource: \"menu\", action: \"delete\" },\n\n { resource: \"settings\", action: \"admin\" },\n { resource: \"settings\", action: \"read\" },\n { resource: \"settings\", action: \"update\" },\n\n { resource: \"profile\", action: \"admin\" },\n { resource: \"profile\", action: \"read\" },\n { resource: \"profile\", action: \"update\" },\n];\n\nexport const ROLE_PERMISSIONS: Record<string, string[]> = {\n super_admin: [\"*\"],\n\n admin: [\n \"users:admin\",\n \"users:read\",\n \"users:update\",\n \"audit_logs:read\",\n \"posts:admin\",\n \"posts:read\",\n \"posts:create\",\n \"posts:update\",\n \"posts:delete\",\n \"pages:admin\",\n \"pages:read\",\n \"pages:create\",\n \"pages:update\",\n \"pages:delete\",\n \"media:admin\",\n \"media:read\",\n \"media:create\",\n \"media:update\",\n \"media:delete\",\n \"categories:admin\",\n \"categories:read\",\n \"categories:create\",\n \"categories:update\",\n \"categories:delete\",\n \"products:admin\",\n \"products:read\",\n \"products:create\",\n \"products:update\",\n \"products:delete\",\n \"orders:admin\",\n \"orders:read\",\n \"orders:update\",\n \"customers:admin\",\n \"customers:read\",\n \"customers:update\",\n \"coupons:admin\",\n \"coupons:read\",\n \"coupons:create\",\n \"coupons:update\",\n \"coupons:delete\",\n \"navigation:admin\",\n \"navigation:read\",\n \"navigation:create\",\n \"navigation:update\",\n \"navigation:delete\",\n \"settings:admin\",\n \"settings:read\",\n \"settings:update\",\n \"profile:admin\",\n \"profile:read\",\n \"profile:update\",\n ],\n\n editor: [\n \"posts:admin\",\n \"posts:read\",\n \"posts:create\",\n \"posts:update\",\n \"posts:delete\",\n \"pages:admin\",\n \"pages:read\",\n \"pages:create\",\n \"pages:update\",\n \"pages:delete\",\n \"media:read\",\n \"media:create\",\n \"media:update\",\n \"categories:read\",\n \"categories:create\",\n \"categories:update\",\n \"products:read\",\n \"orders:read\",\n \"orders:update\",\n \"navigation:read\",\n \"navigation:create\",\n \"navigation:update\",\n \"profile:read\",\n \"profile:update\",\n ],\n\n author: [\n \"posts:read\",\n \"posts:create\",\n \"posts:update\",\n \"media:read\",\n \"media:create\",\n \"categories:read\",\n \"profile:read\",\n \"profile:update\",\n ],\n\n customer: [\"profile:read\", \"profile:update\", \"orders:read\", \"orders:create\"],\n\n guest: [\"posts:read\", \"pages:read\", \"products:read\"],\n};\n\nexport function getRoleHierarchy(\n role: string,\n roles: Role[] = DEFAULT_ROLES,\n): string[] {\n const hierarchy: string[] = [role];\n const roleMap = new Map(roles.map((r) => [r.name, r]));\n\n const addInherited = (r: string) => {\n const roleData = roleMap.get(r);\n if (roleData && roleData.inherits) {\n for (const inherited of roleData.inherits) {\n if (!hierarchy.includes(inherited)) {\n hierarchy.push(inherited);\n addInherited(inherited);\n }\n }\n }\n };\n\n addInherited(role);\n return hierarchy;\n}\n\nexport function getRoleLevel(\n role: string,\n roles: Role[] = DEFAULT_ROLES,\n): number {\n const roleMap = new Map(roles.map((r) => [r.name, r]));\n const roleData = roleMap.get(role);\n return roleData?.level ?? 0;\n}\n\nexport function isRoleHigherOrEqual(\n role1: string,\n role2: string,\n roles: Role[] = DEFAULT_ROLES,\n): boolean {\n return getRoleLevel(role1, roles) >= getRoleLevel(role2, roles);\n}\n\nexport function canInheritRole(\n role: string,\n targetRole: string,\n roles: Role[] = DEFAULT_ROLES,\n): boolean {\n const hierarchy = getRoleHierarchy(role, roles);\n return hierarchy.includes(targetRole);\n}\n","import type { AuthUser } from \"../types.js\";\nimport {\n ROLE_PERMISSIONS,\n getRoleHierarchy,\n type Permission,\n type Condition,\n} from \"./roles.js\";\n\nexport interface PermissionContext {\n user: AuthUser;\n resource?: string;\n action?: string;\n doc?: Record<string, any>;\n data?: Record<string, any>;\n tenantId?: string;\n}\n\nexport function hasPermission(\n user: AuthUser,\n permission: string,\n rolePermissions: Record<string, string[]> = ROLE_PERMISSIONS,\n): boolean {\n if (!user || !user.role) return false;\n\n const userPermissions = getUserPermissions(user, rolePermissions);\n\n if (userPermissions.includes(\"*\")) return true;\n if (userPermissions.includes(permission)) return true;\n\n const [resource, action] = permission.split(\":\");\n if (userPermissions.includes(`${resource}:*`)) return true;\n if (userPermissions.includes(`${resource}:admin`)) return true;\n\n return false;\n}\n\nexport function hasRole(\n user: AuthUser,\n role: string,\n roles: string[] = [],\n): boolean {\n if (!user || !user.role) return false;\n\n const hierarchy = getRoleHierarchy(user.role);\n return hierarchy.includes(role);\n}\n\nexport function hasAnyRole(user: AuthUser, checkRoles: string[]): boolean {\n if (!user || !user.role) return false;\n\n const hierarchy = getRoleHierarchy(user.role);\n return checkRoles.some((role) => hierarchy.includes(role));\n}\n\nexport function hasAllRoles(user: AuthUser, checkRoles: string[]): boolean {\n if (!user || !user.role) return false;\n\n const hierarchy = getRoleHierarchy(user.role);\n return checkRoles.every((role) => hierarchy.includes(role));\n}\n\nexport function getUserPermissions(\n user: AuthUser,\n rolePermissions: Record<string, string[]> = ROLE_PERMISSIONS,\n): string[] {\n if (!user || !user.role) return [];\n\n const hierarchy = getRoleHierarchy(user.role);\n const permissions = new Set<string>();\n\n for (const role of hierarchy) {\n const rolePerms = rolePermissions[role];\n if (rolePerms) {\n for (const perm of rolePerms) {\n permissions.add(perm);\n }\n }\n }\n\n return Array.from(permissions);\n}\n\nexport function getEffectivePermissions(\n user: AuthUser,\n rolePermissions: Record<string, string[]> = ROLE_PERMISSIONS,\n): string[] {\n return getUserPermissions(user, rolePermissions);\n}\n\nexport function canAccessResource(\n user: AuthUser,\n resource: string,\n action: string,\n rolePermissions: Record<string, string[]> = ROLE_PERMISSIONS,\n): boolean {\n return hasPermission(user, `${resource}:${action}`, rolePermissions);\n}\n\nexport function filterPermissions(\n permissions: string[],\n resource?: string,\n): string[] {\n if (!resource) return permissions;\n\n return permissions.filter((perm) => {\n const [permResource] = perm.split(\":\");\n return permResource === resource || permResource === \"*\";\n });\n}\n\nexport function parsePermission(permission: string): {\n resource: string;\n action: string;\n condition?: Condition;\n} {\n const [resource, action, ...rest] = permission.split(\":\");\n return {\n resource,\n action,\n condition: rest.length > 0 ? JSON.parse(rest.join(\":\")) : undefined,\n };\n}\n\nexport function buildPermission(\n resource: string,\n action: string,\n condition?: Condition,\n): string {\n if (condition) {\n return `${resource}:${action}:${JSON.stringify(condition)}`;\n }\n return `${resource}:${action}`;\n}\n\nexport function evaluateCondition(\n condition: Condition,\n context: Record<string, any>,\n): boolean {\n const { field, operator, value } = condition;\n const fieldValue = context[field];\n\n if (fieldValue === undefined) return false;\n\n switch (operator) {\n case \"eq\":\n return fieldValue === value;\n case \"neq\":\n return fieldValue !== value;\n case \"in\":\n return Array.isArray(value) && value.includes(fieldValue);\n case \"nin\":\n return Array.isArray(value) && !value.includes(fieldValue);\n case \"gt\":\n return fieldValue > value;\n case \"lt\":\n return fieldValue < value;\n case \"gte\":\n return fieldValue >= value;\n case \"lte\":\n return fieldValue <= value;\n case \"contains\":\n if (typeof fieldValue === \"string\") {\n return fieldValue.includes(value);\n }\n if (Array.isArray(fieldValue)) {\n return fieldValue.includes(value);\n }\n return false;\n default:\n return false;\n }\n}\n\nexport function evaluateConditions(\n conditions: Condition[],\n context: Record<string, any>,\n): boolean {\n if (!conditions || conditions.length === 0) return true;\n\n return conditions.every((condition) => evaluateCondition(condition, context));\n}\n\nexport function resolveConditionValue(\n value: any,\n context: Record<string, any>,\n): any {\n if (typeof value !== \"string\") return value;\n\n if (value.startsWith(\"${\") && value.endsWith(\"}\")) {\n const path = value.slice(2, -1);\n const keys = path.split(\".\");\n let resolved = context;\n\n for (const key of keys) {\n if (resolved === undefined || resolved === null) return undefined;\n resolved = resolved[key];\n }\n\n return resolved;\n }\n\n return value;\n}\n\nexport function evaluateConditionWithContext(\n condition: Condition,\n context: Record<string, any>,\n): boolean {\n const resolvedCondition = {\n ...condition,\n value: resolveConditionValue(condition.value, context),\n };\n\n return evaluateCondition(resolvedCondition, context);\n}\n\nexport class PermissionChecker {\n private rolePermissions: Record<string, string[]>;\n\n constructor(rolePermissions: Record<string, string[]> = ROLE_PERMISSIONS) {\n this.rolePermissions = rolePermissions;\n }\n\n check(user: AuthUser, permission: string): boolean {\n return hasPermission(user, permission, this.rolePermissions);\n }\n\n checkRole(user: AuthUser, role: string): boolean {\n return hasRole(user, role);\n }\n\n checkAnyRole(user: AuthUser, roles: string[]): boolean {\n return hasAnyRole(user, roles);\n }\n\n checkAllRoles(user: AuthUser, roles: string[]): boolean {\n return hasAllRoles(user, roles);\n }\n\n getPermissions(user: AuthUser): string[] {\n return getUserPermissions(user, this.rolePermissions);\n }\n\n canAccess(user: AuthUser, resource: string, action: string): boolean {\n return canAccessResource(user, resource, action, this.rolePermissions);\n }\n\n filterByResource(permissions: string[], resource: string): string[] {\n return filterPermissions(permissions, resource);\n }\n}\n","import { Hono } from \"hono\";\nimport { resolve, join } from \"path\";\nimport { existsSync, readFileSync } from \"fs\";\nimport sharp from \"sharp\";\nimport { execute, parse } from \"graphql\";\nimport {\n validateApiKey,\n extractApiKeyFromRequest,\n createApiKeyContext,\n} from \"../../auth/api-key.js\";\nimport type { ApiKeyValidationResult } from \"../../auth/api-key.js\";\nimport { buildGraphQLSchema } from \"../graphql/index.js\";\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 { 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\";\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) {\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 (!authMw) {\n return {\n user: staticUser,\n tenantID: staticTenantID,\n apiKeyContext: undefined,\n };\n }\n\n let result: AuthMiddlewareResult;\n try {\n result = await authMw(req);\n } catch (err) {\n return {\n user: staticUser,\n tenantID: staticTenantID,\n apiKeyContext: undefined,\n };\n }\n if (result.status === 401) {\n return { user: undefined, tenantID: undefined, apiKeyContext: undefined };\n }\n\n return {\n user: (result.user as User) || staticUser,\n tenantID: result.tenantContext?.tenantId || staticTenantID,\n apiKeyContext: result.apiKeyContext,\n authType: result.authType,\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 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 // POST /api/graphql — GraphQL endpoint with API key auth\n app.post(\"/api/graphql\", async (c) => {\n try {\n const req = c.req.raw;\n const apiKeyRaw = extractApiKeyFromRequest(req);\n\n // Validate API key (authenticate via API key only — session auth is handled at schema level)\n if (apiKeyRaw && db) {\n const apiKeyResult = await validateApiKey(apiKeyRaw, db);\n if (!apiKeyResult.valid) {\n return c.json({ errors: [{ message: apiKeyResult.error || \"Invalid API key\" }] }, 401);\n }\n // Audit log on successful API key validation\n const apiKeyId = apiKeyResult.apiKeyId || \"\";\n await sessionAuthAdapter?.createAuditLog({\n action: \"api_key_request\",\n userId: apiKeyResult.userId || \"\",\n resource: \"api_key\",\n resourceId: apiKeyId,\n success: true,\n metadata: {\n endpoint: \"/api/graphql\",\n method: \"POST\",\n ip: extractIp(req),\n },\n });\n }\n\n const body = await req.json().catch(() => ({}));\n const { query, variables } = body as { query?: string; variables?: Record<string, unknown> };\n\n if (!query) {\n return c.json({ errors: [{ message: \"No query provided\" }] }, 400);\n }\n\n // Build user context from validated API key\n let gqlUser: User | undefined;\n let apiKeyCtx: ReturnType<typeof createApiKeyContext> | undefined;\n if (apiKeyRaw && db) {\n const apiKeyResult = await validateApiKey(apiKeyRaw, db);\n if (apiKeyResult.valid && apiKeyResult.user) {\n gqlUser = apiKeyResult.user as User;\n apiKeyCtx = createApiKeyContext(apiKeyResult);\n }\n }\n\n const schema = buildGraphQLSchema({\n registry,\n db,\n user: gqlUser,\n req: req as unknown as import(\"../../hooks/types.js\").Request,\n settings,\n });\n\n const document = parse(query as string);\n const result = await execute({\n schema,\n document,\n variableValues: variables,\n contextValue: { user: gqlUser, apiKeyContext: apiKeyCtx, req, db },\n });\n\n return c.json(result);\n } catch (error: any) {\n if (error.message?.includes(\"GraphQL is disabled\")) {\n return c.json({ errors: [{ message: \"GraphQL API is disabled\" }] }, 403);\n }\n if (error instanceof SyntaxError) {\n return c.json({ errors: [{ message: \"Invalid request body\" }] }, 400);\n }\n console.error(\"[GraphQL] execution error:\", error);\n return c.json({ errors: [{ message: error.message || \"GraphQL execution failed\" }] }, 500);\n }\n });\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 = registry.getCollection(\"users\");\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 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 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 tenantId: body.tenantId,\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.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 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 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 // 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 // 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 // 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 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 ? doc[titleField] : 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 } = 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 console.log(\"[ApiKeys] Querying\", API_KEY_COLLECTION, { page, limit });\n const result = await db.find({ collection: API_KEY_COLLECTION, where: {}, page, limit });\n console.log(\"[ApiKeys] Result:\", result);\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 auditApiKeyUsage(sessionAuthAdapter, apiKeyContext, basePath, \"GET\", c.req.raw);\n\n const url = new URL(c.req.url);\n const page = parseInt(url.searchParams.get(\"page\") || \"1\");\n const limit = Math.min(\n parseInt(url.searchParams.get(\"limit\") || \"10\"),\n 100,\n );\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\n let where = {};\n const whereParam = url.searchParams.get(\"where\");\n if (whereParam) {\n try {\n where = JSON.parse(whereParam);\n } catch { }\n }\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 });\n\n return c.json(result);\n } catch (error: any) {\n console.error(`[API] Error listing ${slug}:`, error);\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/:collection/:id/versions - List versions or compare two versions\n // NOTE: Must be defined before /:id route to avoid param conflict\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 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.get(`${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 \"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 draft = await db.findDraft({\n collection: slug,\n documentId: c.req.param(\"id\"),\n tenantID: ctxTenantID,\n });\n\n return c.json({ data: draft });\n } catch (error: any) {\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 const data = body.data ?? omitRevisionFields(body);\n\n const originalDoc = await db.findByID<Record<string, any>>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n });\n\n if (!originalDoc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n const draft = await db.upsertDraft({\n collection: slug,\n documentId: id,\n tenantID: ctxTenantID,\n data,\n baseUpdatedAt,\n draftUpdatedAt: body.draftUpdatedAt,\n });\n\n return c.json({ data: draft, 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 await db.deleteDraft({\n collection: slug,\n documentId: c.req.param(\"id\"),\n tenantID: ctxTenantID,\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 });\n }\n\n if (!doc) {\n return c.json({ error: \"Document not found\" }, 404);\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 /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 auditApiKeyUsage(sessionAuthAdapter, apiKeyContext, basePath, \"POST\", c.req.raw);\n\n const body = await c.req.json();\n const schema = registry.getCreateZodSchema(slug);\n let validated;\n try {\n validated = schema.parse(body);\n } catch (zodErr: any) {\n return c.json({ error: \"Validation failed\", details: zodErr.errors }, 400);\n }\n\n if (collection.tenantScoped && ctxTenantID) {\n validated.tenantID = ctxTenantID;\n }\n\n const doc = await db.create({\n collection: slug,\n data: validated,\n tenantID: ctxTenantID,\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 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\", 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 console.log(`[PATCH] ${slug}/${id}`, {\n baseUpdatedAt,\n bodyKeys: Object.keys(body),\n tenantID: ctxTenantID\n });\n\n const cleaned = Object.fromEntries(\n Object.entries(omitRevisionFields(body)).filter(\n ([_, v]) => v !== \"null\" && v !== undefined,\n ),\n );\n const schema = registry.getUpdateZodSchema(slug);\n const validated = schema.parse(cleaned);\n\n console.log(`[PATCH] Validated data:`, Object.keys(validated));\n\n const originalDoc = await db.findByID<Record<string, any>>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n draft: true, // Always fetch current doc regardless of status\n });\n\n if (originalDoc) {\n console.log(`[PATCH] Original doc updatedAt:`, originalDoc.updatedAt);\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 const isDraftEnabled = collection.versions?.drafts === true;\n const isAlreadyPublished = originalDoc._status === 'published';\n\n let doc;\n if (isDraftEnabled && isAlreadyPublished) {\n // Non-destructive draft: Create version but don't overwrite main doc data\n await db.createVersion({\n collection: slug,\n documentId: id,\n data: validated,\n status: 'draft',\n createdBy: ctxUser?.id,\n changeDescription: 'Manual save (Draft)',\n tenantID: ctxTenantID,\n });\n\n // Mark main doc as having a draft\n await db.update({\n collection: slug,\n id,\n data: { _has_draft: true }, // Keep old data, just set flag\n tenantID: ctxTenantID,\n });\n } else {\n // Destructive save or first-time draft\n const saveData = isDraftEnabled\n ? { ...validated, _status: 'draft', _has_draft: false }\n : validated;\n\n await db.update({\n collection: slug,\n id,\n data: saveData,\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 (isDraftEnabled) {\n if (!isAlreadyPublished) {\n await db.createVersion({\n collection: slug,\n documentId: id,\n data: validated,\n status: 'draft',\n createdBy: ctxUser?.id,\n changeDescription: 'Manual save',\n tenantID: ctxTenantID,\n });\n }\n } else {\n await db.deleteDraft({\n collection: slug,\n documentId: id,\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 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 console.log(`[PATCH] Result doc updatedAt:`, (doc as any)?.updatedAt);\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\", details: error.errors },\n 400,\n );\n }\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 const id = c.req.param(\"id\");\n console.log(`[DELETE] Deleting ${slug}/${id}`);\n\n const originalDoc = await db.findByID({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n });\n\n const doc = await db.delete({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n });\n\n await db.deleteDraft({\n collection: slug,\n documentId: id,\n tenantID: ctxTenantID,\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 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 console.log(`[Duplicate] Request for ${slug}`);\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 console.log(\"[Duplicate] Access denied:\", access.error);\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n console.log(`[Duplicate] ID: ${id}`);\n\n // Get the original document\n const originalDoc = await db.findByID<any>({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n });\n\n if (!originalDoc) {\n console.log(\"[Duplicate] Document not found\");\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n console.log(`[Duplicate] Original doc:`, originalDoc);\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 console.log(`[Duplicate] New slug: ${newSlug}`);\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 console.log(`[Duplicate] Created successfully:`, (newDoc as any).id);\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', _has_draft: false },\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', _has_draft: false },\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 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\n let publishData = { _status: 'published', _has_draft: false };\n let finalContent = originalDoc;\n\n if (originalDoc._has_draft) {\n // Pull latest data from version history\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 && versions.docs[0].status === 'draft') {\n finalContent = { ...originalDoc, ...versions.docs[0].data };\n publishData = { ...versions.docs[0].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 // Clear the ephemeral autosave draft\n await db.deleteDraft({\n collection: slug,\n documentId: id,\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: \"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 = c.req.query(\"draft\") === \"true\" && !!ctxUser;\n\n const doc = await db.findOne({\n collection: `_globals_${slug}`,\n where: {},\n tenantID: ctxTenantID,\n draft: isDraftRequest,\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 = await c.req.json();\n const cleaned = Object.fromEntries(\n Object.entries(body).filter(([_, v]) => v !== null && v !== \"null\" && v !== undefined),\n );\n const schema = registry.getZodSchema(slug);\n\n let validated;\n try {\n validated = schema.parse(cleaned);\n } catch (zodErr: any) {\n return c.json({ error: \"Validation failed\", 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\", \"_has_draft\"]);\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 isDraftEnabled = globalConfig.versions?.drafts === true;\n const isAlreadyPublished = originalDoc?._status === 'published';\n\n let doc;\n if (isDraftEnabled && isAlreadyPublished) {\n await db.createVersion({\n collection: collectionSlug,\n documentId: slug,\n data: userData,\n status: 'draft',\n createdBy: ctxUser?.id,\n changeDescription: 'Manual save (Draft)',\n tenantID: ctxTenantID,\n });\n\n doc = await db.update({\n collection: collectionSlug,\n id: slug,\n data: { _has_draft: true },\n tenantID: ctxTenantID,\n });\n } else {\n const saveData = isDraftEnabled\n ? { ...userData, _status: 'draft', _has_draft: false }\n : { ...userData, _status: 'published', _has_draft: false };\n\n if (originalDoc) {\n doc = await db.update({\n collection: collectionSlug,\n id: slug,\n data: saveData,\n tenantID: ctxTenantID,\n });\n } else {\n doc = await db.create({\n collection: collectionSlug,\n data: { ...saveData, id: slug },\n tenantID: ctxTenantID,\n });\n }\n\n if (isDraftEnabled) {\n await db.createVersion({\n collection: collectionSlug,\n documentId: slug,\n data: userData,\n status: 'draft',\n createdBy: ctxUser?.id,\n changeDescription: 'Manual save',\n tenantID: ctxTenantID,\n });\n }\n }\n\n if (slug === \"storage-settings\") {\n mediaService = null;\n mediaServiceInitError = null;\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 = { _status: 'published', _has_draft: false };\n let finalContent = originalDoc;\n\n if (originalDoc._has_draft) {\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 && versions.docs[0].status === 'draft') {\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', _has_draft: false },\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', _has_draft: false },\n tenantID: ctxTenantID,\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"]}
|