@kyro-cms/core 0.1.6 → 0.1.7
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-BCgL1bLF.d.cts +112 -0
- package/dist/WebhookService-BPVJUgTl.d.ts +112 -0
- package/dist/{base-DlhVlwnN.d.cts → base-B0Y6isUJ.d.cts} +1 -1
- package/dist/{base-CQkFzqQl.d.ts → base-DaP-5PPG.d.ts} +1 -1
- package/dist/bootstrap-BMWVB2T6.cjs +31 -0
- package/dist/{bootstrap-WMWQ4DBX.cjs.map → bootstrap-BMWVB2T6.cjs.map} +1 -1
- package/dist/bootstrap-LL6O7PWO.js +6 -0
- package/dist/{bootstrap-WOVGAKZP.js.map → bootstrap-LL6O7PWO.js.map} +1 -1
- package/dist/{chunk-3VZCX4DF.cjs → chunk-42JPONZU.cjs} +77 -14
- package/dist/chunk-42JPONZU.cjs.map +1 -0
- package/dist/{chunk-3EVLFWH2.cjs → chunk-4M5PHMUE.cjs} +60 -346
- package/dist/chunk-4M5PHMUE.cjs.map +1 -0
- package/dist/chunk-4PWRCMTQ.cjs +15 -0
- package/dist/chunk-4PWRCMTQ.cjs.map +1 -0
- package/dist/chunk-6COM32WF.js +47 -0
- package/dist/chunk-6COM32WF.js.map +1 -0
- package/dist/chunk-6MSSF46R.js +941 -0
- package/dist/chunk-6MSSF46R.js.map +1 -0
- package/dist/{chunk-TZFJMPCH.cjs → chunk-7YITG2US.cjs} +9 -18
- package/dist/chunk-7YITG2US.cjs.map +1 -0
- package/dist/{chunk-A3RQWHKD.cjs → chunk-BLMFBDBG.cjs} +56 -6
- package/dist/chunk-BLMFBDBG.cjs.map +1 -0
- package/dist/{chunk-EINVJPFM.js → chunk-BTOE3VUK.js} +65 -3
- package/dist/chunk-BTOE3VUK.js.map +1 -0
- package/dist/chunk-E5X75WNB.js +497 -0
- package/dist/chunk-E5X75WNB.js.map +1 -0
- package/dist/chunk-E63IF3MD.cjs +951 -0
- package/dist/chunk-E63IF3MD.cjs.map +1 -0
- package/dist/{chunk-K7QF2QCM.cjs → chunk-FTSSDDZQ.cjs} +7 -3
- package/dist/chunk-FTSSDDZQ.cjs.map +1 -0
- package/dist/chunk-G7VZBCD6.cjs +35 -0
- package/dist/{chunk-5BLDMQED.cjs.map → chunk-G7VZBCD6.cjs.map} +1 -1
- package/dist/{chunk-VMSRTAH7.js → chunk-GLCPGZPM.js} +56 -6
- package/dist/chunk-GLCPGZPM.js.map +1 -0
- package/dist/{chunk-V3B25QOK.cjs → chunk-GVFB5C6O.cjs} +74 -2
- package/dist/chunk-GVFB5C6O.cjs.map +1 -0
- package/dist/chunk-HVSQDZZJ.cjs +765 -0
- package/dist/chunk-HVSQDZZJ.cjs.map +1 -0
- package/dist/chunk-HYC4GNHX.js +758 -0
- package/dist/chunk-HYC4GNHX.js.map +1 -0
- package/dist/chunk-KDVDIZ4Y.cjs +3479 -0
- package/dist/chunk-KDVDIZ4Y.cjs.map +1 -0
- package/dist/{chunk-OG3KX56O.js → chunk-KWGNR4HM.js} +7 -3
- package/dist/chunk-KWGNR4HM.js.map +1 -0
- package/dist/chunk-LIJVWQKU.cjs +256 -0
- package/dist/chunk-LIJVWQKU.cjs.map +1 -0
- package/dist/{chunk-XTZSUDSI.js → chunk-LTRCYJAG.js} +3 -18
- package/dist/chunk-LTRCYJAG.js.map +1 -0
- package/dist/{chunk-UEYC46RL.js → chunk-OUGKLCYF.js} +71 -8
- package/dist/chunk-OUGKLCYF.js.map +1 -0
- package/dist/chunk-RONAX6UU.js +3456 -0
- package/dist/chunk-RONAX6UU.js.map +1 -0
- package/dist/{chunk-5Y7QGIHD.js → chunk-RRYXQMZG.js} +60 -344
- package/dist/chunk-RRYXQMZG.js.map +1 -0
- package/dist/{chunk-QUJ4OLSC.js → chunk-U74F3YZU.js} +87 -7
- package/dist/chunk-U74F3YZU.js.map +1 -0
- package/dist/chunk-VIONYQ2K.cjs +517 -0
- package/dist/chunk-VIONYQ2K.cjs.map +1 -0
- package/dist/chunk-VSTRLXMQ.cjs +50 -0
- package/dist/chunk-VSTRLXMQ.cjs.map +1 -0
- package/dist/chunk-YT7HXXVN.js +13 -0
- package/dist/chunk-YT7HXXVN.js.map +1 -0
- package/dist/chunk-Z6ZWNWWR.js +30 -0
- package/dist/{chunk-NSBPE2FW.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
- package/dist/cli/index.cjs +11 -7
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +11 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/drizzle/index.cjs +20 -17
- package/dist/drizzle/index.d.cts +4 -4
- package/dist/drizzle/index.d.ts +4 -4
- package/dist/drizzle/index.js +4 -5
- package/dist/graphql/index.cjs +4 -4
- package/dist/graphql/index.d.cts +3 -2
- package/dist/graphql/index.d.ts +3 -2
- package/dist/graphql/index.js +2 -2
- package/dist/{index-DI0DRPNv.d.cts → index-BwE4NueJ.d.cts} +1 -1
- package/dist/{index-CMUNCIWQ.d.ts → index-DUKmDSeC.d.cts} +96 -24
- package/dist/{index-BMySjW6o.d.cts → index-DtBi3zP0.d.ts} +96 -24
- package/dist/{index-4fJKLFK2.d.ts → index-DupWTmW6.d.ts} +1 -1
- package/dist/index.cjs +3317 -352
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +379 -105
- package/dist/index.d.ts +379 -105
- package/dist/index.js +3211 -310
- package/dist/index.js.map +1 -1
- package/dist/media-HOT3O7RW.js +4 -0
- package/dist/media-HOT3O7RW.js.map +1 -0
- package/dist/media-WKP5AOX2.cjs +17 -0
- package/dist/media-WKP5AOX2.cjs.map +1 -0
- package/dist/mongodb/index.cjs +1 -1
- package/dist/mongodb/index.d.cts +2 -2
- package/dist/mongodb/index.d.ts +2 -2
- package/dist/mongodb/index.js +1 -1
- package/dist/mysql-media-AI6YK767.cjs +48 -0
- package/dist/mysql-media-AI6YK767.cjs.map +1 -0
- package/dist/mysql-media-CDZUS7YX.js +45 -0
- package/dist/mysql-media-CDZUS7YX.js.map +1 -0
- package/dist/postgres-auth-adapter-EVRPO7BQ.cjs +14 -0
- package/dist/{postgres-auth-adapter-VK6GY7LX.cjs.map → postgres-auth-adapter-EVRPO7BQ.cjs.map} +1 -1
- package/dist/postgres-auth-adapter-OTRWSTT5.js +5 -0
- package/dist/{postgres-auth-adapter-REJFUMP7.js.map → postgres-auth-adapter-OTRWSTT5.js.map} +1 -1
- package/dist/redis-adapter-2N6VA7BI.cjs +13 -0
- package/dist/{redis-adapter-LBLNKGNS.cjs.map → redis-adapter-2N6VA7BI.cjs.map} +1 -1
- package/dist/redis-adapter-RA24FNCX.js +4 -0
- package/dist/{redis-adapter-4YDY4LWE.js.map → redis-adapter-RA24FNCX.js.map} +1 -1
- package/dist/rest/index.cjs +7 -5
- package/dist/rest/index.d.cts +29 -3
- package/dist/rest/index.d.ts +29 -3
- package/dist/rest/index.js +5 -3
- package/dist/schema-CNB2DDTX.js +6 -0
- package/dist/schema-CNB2DDTX.js.map +1 -0
- package/dist/schema-Y777CQQS.cjs +67 -0
- package/dist/schema-Y777CQQS.cjs.map +1 -0
- package/dist/templates/index.cjs +24 -28
- package/dist/templates/index.d.cts +2 -4
- package/dist/templates/index.d.ts +2 -4
- package/dist/templates/index.js +2 -2
- package/dist/trpc/index.cjs +12 -12
- package/dist/trpc/index.d.cts +19 -14
- package/dist/trpc/index.d.ts +19 -14
- package/dist/trpc/index.js +3 -3
- package/dist/{types-BGM5MV_K.d.cts → types-BM0s_YOy.d.cts} +67 -35
- package/dist/{types-BGM5MV_K.d.ts → types-BM0s_YOy.d.ts} +67 -35
- package/dist/ws/index.cjs +1 -1
- package/dist/ws/index.js +1 -1
- package/package.json +11 -1
- package/dist/bootstrap-WMWQ4DBX.cjs +0 -29
- package/dist/bootstrap-WOVGAKZP.js +0 -4
- package/dist/chunk-3EVLFWH2.cjs.map +0 -1
- package/dist/chunk-3QX6KG2S.js +0 -2125
- package/dist/chunk-3QX6KG2S.js.map +0 -1
- package/dist/chunk-3VZCX4DF.cjs.map +0 -1
- package/dist/chunk-5BLDMQED.cjs +0 -18
- package/dist/chunk-5Y7QGIHD.js.map +0 -1
- package/dist/chunk-7G6EVYCU.cjs +0 -94
- package/dist/chunk-7G6EVYCU.cjs.map +0 -1
- package/dist/chunk-A3RQWHKD.cjs.map +0 -1
- package/dist/chunk-EINVJPFM.js.map +0 -1
- package/dist/chunk-F5B64H5S.cjs +0 -2149
- package/dist/chunk-F5B64H5S.cjs.map +0 -1
- package/dist/chunk-K7QF2QCM.cjs.map +0 -1
- package/dist/chunk-LRTZJJPD.js +0 -86
- package/dist/chunk-LRTZJJPD.js.map +0 -1
- package/dist/chunk-NSBPE2FW.js +0 -15
- package/dist/chunk-OG3KX56O.js.map +0 -1
- package/dist/chunk-QUJ4OLSC.js.map +0 -1
- package/dist/chunk-R3XIBBAW.cjs +0 -34
- package/dist/chunk-R3XIBBAW.cjs.map +0 -1
- package/dist/chunk-SDMNUYVU.js +0 -30
- package/dist/chunk-SDMNUYVU.js.map +0 -1
- package/dist/chunk-TZFJMPCH.cjs.map +0 -1
- package/dist/chunk-UEG7KMKC.cjs +0 -228
- package/dist/chunk-UEG7KMKC.cjs.map +0 -1
- package/dist/chunk-UEYC46RL.js.map +0 -1
- package/dist/chunk-V3B25QOK.cjs.map +0 -1
- package/dist/chunk-VMSRTAH7.js.map +0 -1
- package/dist/chunk-XTZSUDSI.js.map +0 -1
- package/dist/chunk-YD7Y25W7.cjs +0 -176
- package/dist/chunk-YD7Y25W7.cjs.map +0 -1
- package/dist/chunk-YPAFJ7EV.js +0 -225
- package/dist/chunk-YPAFJ7EV.js.map +0 -1
- package/dist/database-7CJOXEZR.js +0 -5
- package/dist/database-7CJOXEZR.js.map +0 -1
- package/dist/database-QOIV44GT.cjs +0 -22
- package/dist/database-QOIV44GT.cjs.map +0 -1
- package/dist/postgres-auth-adapter-REJFUMP7.js +0 -5
- package/dist/postgres-auth-adapter-VK6GY7LX.cjs +0 -14
- package/dist/redis-adapter-4YDY4LWE.js +0 -4
- package/dist/redis-adapter-LBLNKGNS.cjs +0 -13
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/rest/auth-middleware.ts","../src/auth/security/in-memory-rate-limit.ts","../src/api/rest/hono-app.ts"],"names":["collections"],"mappings":"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","file":"chunk-6MSSF46R.js","sourcesContent":["import jwt from \"jsonwebtoken\";\nimport 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\";\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 extractToken?: (req: Request) => string | null;\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?: \"jwt\" | \"apikey\";\n}\n\nexport function createAuthMiddleware(config: AuthMiddlewareConfig) {\n const {\n secret,\n issuer,\n audience,\n db,\n userLookup,\n extractToken = defaultExtractToken,\n } = config;\n\n return async function authMiddleware(\n req: Request,\n ): Promise<AuthMiddlewareResult> {\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 const token = extractToken(req);\n\n if (!token) {\n return {\n status: 401,\n error: \"No authentication token provided\",\n };\n }\n\n try {\n const payload = jwt.verify(token, secret, {\n issuer,\n audience,\n }) as JWTPayload;\n\n const user: Partial<AuthUser> = {\n id: payload.sub,\n email: payload.email,\n role: payload.role,\n tenantId: payload.tenantId,\n };\n\n return {\n user,\n token,\n tenantContext: createTenantContextFromUser(user),\n status: 200,\n authType: \"jwt\",\n };\n } catch (error) {\n if (error instanceof jwt.TokenExpiredError) {\n return {\n status: 401,\n error: \"Token has expired\",\n };\n }\n\n if (error instanceof jwt.JsonWebTokenError) {\n return {\n status: 401,\n error: \"Invalid token\",\n };\n }\n\n return {\n status: 401,\n error: \"Authentication failed\",\n };\n }\n };\n}\n\nexport { hasApiKeyPermission };\n\nexport function defaultExtractToken(req: Request): string | null {\n const authHeader = req.headers.get(\"Authorization\");\n if (authHeader?.startsWith(\"Bearer \")) {\n return authHeader.slice(7);\n }\n\n const cookieHeader = req.headers.get(\"Cookie\");\n if (cookieHeader) {\n const cookies = Object.fromEntries(\n cookieHeader.split(\"; \").map((c) => {\n const [key, ...val] = c.split(\"=\");\n return [key.trim(), val.join(\"=\")];\n }),\n );\n return cookies[\"auth_token\"] || null;\n }\n\n return null;\n}\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 generateToken(\n payload: JWTPayload,\n secret: string,\n options: {\n expiresIn?: string | number;\n issuer?: string;\n audience?: string;\n } = {},\n): string {\n return jwt.sign(payload, secret, {\n expiresIn: (options.expiresIn || \"24h\") as jwt.SignOptions[\"expiresIn\"],\n issuer: options.issuer,\n audience: options.audience,\n });\n}\n\nexport function verifyToken(\n token: string,\n secret: string,\n options: {\n issuer?: string;\n audience?: string;\n } = {},\n): JWTPayload | null {\n try {\n return jwt.verify(token, secret, options) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n return jwt.decode(token) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function isTokenExpiringSoon(\n token: string,\n secret: string,\n thresholdMinutes: number = 30,\n): boolean {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return true;\n }\n\n const expirationTime = payload.exp * 1000;\n const thresholdTime = Date.now() + thresholdMinutes * 60 * 1000;\n\n return expirationTime < thresholdTime;\n}\n\nexport function getTokenExpiration(token: string, secret: string): Date | null {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return null;\n }\n\n return new Date(payload.exp * 1000);\n}\n\nexport function extractUserFromRequest(\n req: Request,\n config: AuthMiddlewareConfig,\n): Promise<AuthMiddlewareResult> {\n const middleware = createAuthMiddleware(config);\n return middleware(req);\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","import { Hono } from \"hono\";\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\";\n\n// ============================================================================\n// REST API Factory\n// ============================================================================\n\nexport interface HonoAppOptions {\n registry: Registry;\n db: BaseAdapter;\n authSecret?: string;\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\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 = \"read\",\n): Promise<AccessCheckResult> {\n const accessRule = collection.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 create: operation === \"read\" || operation === \"create\",\n update:\n operation === \"read\" ||\n operation === \"create\" ||\n operation === \"update\",\n admin: true,\n };\n const allowed = enablePublicAccess && accessLevels[defaultCollectionAccess];\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 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}> {\n if (!authMw) {\n return {\n user: staticUser,\n tenantID: staticTenantID,\n apiKeyContext: undefined,\n };\n }\n\n const result: AuthMiddlewareResult = await authMw(req);\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 };\n}\n\n// ============================================================================\n// Hono App Factory\n// ============================================================================\n\nexport function createHonoApp(options: HonoAppOptions): Hono {\n const {\n registry,\n db,\n authSecret,\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 ?? true;\n const defaultCollectionAccess =\n settings?.access?.defaultCollectionAccess ?? \"read\";\n\n const requireAuth = apiAccess?.requireAuth;\n\n // Require auth secret if requireAuth is enabled in settings\n if (requireAuth && !authSecret) {\n throw new Error(\n \"authSecret is required when requireAuth is enabled in access settings\",\n );\n }\n\n const authMw = authSecret\n ? createAuthMiddleware({ secret: authSecret, db })\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 // Health check\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\n app.get(\"/api/collections\", (c) => {\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 console.log(\"[API /api/search] Query:\", query);\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 if (collection.slug === \"users\") 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 // Dynamic collection routes\n const collections = registry.getCollections();\n\n for (const collection of collections) {\n const slug = collection.slug;\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 );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\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 return c.json({ error: error.message }, 500);\n }\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 );\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\n const doc = await db.findByID({\n collection: slug,\n id,\n depth,\n tenantID: ctxTenantID,\n select,\n });\n\n if (!doc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n return c.json(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 \"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 body = await c.req.json();\n const schema = registry.getCreateZodSchema(slug);\n const validated = schema.parse(body);\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({ 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 schema = registry.getUpdateZodSchema(slug);\n const validated = schema.parse(body);\n\n const originalDoc = await db.findByID({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n });\n\n const doc = await db.update({\n collection: slug,\n id,\n data: validated,\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 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({ doc, message: \"Updated successfully\" });\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 // DELETE /api/:collection/:id - Delete\n app.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\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 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({ doc, message: \"Deleted successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n }\n\n // Dynamic global routes\n for (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 doc = await db.findOne({\n collection: `_globals_${slug}`,\n where: {},\n tenantID: ctxTenantID,\n });\n\n return c.json(doc || {});\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/globals/:slug - Update\n app.post(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 \"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 schema = registry.getZodSchema(slug);\n const validated = schema.parse(body);\n\n const doc = await db.create({\n collection: `_globals_${slug}`,\n data: { ...validated, id: slug },\n tenantID: ctxTenantID,\n });\n\n return c.json({ doc, message: \"Updated successfully\" });\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 // 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\n return 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"]}
|
|
@@ -1,23 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var chunk5BLDMQED_cjs = require('./chunk-5BLDMQED.cjs');
|
|
4
3
|
var pgCore = require('drizzle-orm/pg-core');
|
|
5
4
|
|
|
6
5
|
// src/database/drizzle/schema/auth.ts
|
|
7
|
-
var auth_exports = {};
|
|
8
|
-
chunk5BLDMQED_cjs.__export(auth_exports, {
|
|
9
|
-
apiKeys: () => apiKeys,
|
|
10
|
-
auditLogs: () => auditLogs,
|
|
11
|
-
emailVerifications: () => emailVerifications,
|
|
12
|
-
lockouts: () => lockouts,
|
|
13
|
-
passwordHistory: () => passwordHistory,
|
|
14
|
-
passwordResets: () => passwordResets,
|
|
15
|
-
permissions: () => permissions,
|
|
16
|
-
roles: () => roles,
|
|
17
|
-
sessions: () => sessions,
|
|
18
|
-
tenants: () => tenants,
|
|
19
|
-
users: () => users
|
|
20
|
-
});
|
|
21
6
|
var users = pgCore.pgTable(
|
|
22
7
|
"users",
|
|
23
8
|
{
|
|
@@ -203,10 +188,16 @@ var lockouts = pgCore.pgTable(
|
|
|
203
188
|
]
|
|
204
189
|
);
|
|
205
190
|
|
|
206
|
-
exports.
|
|
191
|
+
exports.apiKeys = apiKeys;
|
|
192
|
+
exports.auditLogs = auditLogs;
|
|
193
|
+
exports.emailVerifications = emailVerifications;
|
|
207
194
|
exports.lockouts = lockouts;
|
|
208
195
|
exports.passwordHistory = passwordHistory;
|
|
196
|
+
exports.passwordResets = passwordResets;
|
|
197
|
+
exports.permissions = permissions;
|
|
198
|
+
exports.roles = roles;
|
|
209
199
|
exports.sessions = sessions;
|
|
200
|
+
exports.tenants = tenants;
|
|
210
201
|
exports.users = users;
|
|
211
|
-
//# sourceMappingURL=chunk-
|
|
212
|
-
//# sourceMappingURL=chunk-
|
|
202
|
+
//# sourceMappingURL=chunk-7YITG2US.cjs.map
|
|
203
|
+
//# sourceMappingURL=chunk-7YITG2US.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/drizzle/schema/auth.ts"],"names":["pgTable","uuid","varchar","boolean","timestamp","integer","jsonb","uniqueIndex","index","text"],"mappings":"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","file":"chunk-7YITG2US.cjs","sourcesContent":["import {\n pgTable,\n uuid,\n varchar,\n boolean,\n timestamp,\n integer,\n text,\n jsonb,\n index,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\n\nexport const users = pgTable(\n \"users\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n email: varchar(\"email\", { length: 255 }).notNull(),\n passwordHash: varchar(\"password_hash\", { length: 255 }),\n role: varchar(\"role\", { length: 50 }).notNull().default(\"customer\"),\n tenantId: uuid(\"tenant_id\"),\n emailVerified: boolean(\"email_verified\").default(false),\n locked: boolean(\"locked\").default(false),\n lastLogin: timestamp(\"last_login\"),\n failedLoginAttempts: integer(\"failed_login_attempts\").default(0),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n uniqueIndex(\"users_email_idx\").on(table.email),\n index(\"users_tenant_idx\").on(table.tenantId),\n index(\"users_role_idx\").on(table.role),\n ],\n);\n\nexport const roles = pgTable(\n \"roles\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n name: varchar(\"name\", { length: 100 }).notNull().unique(),\n level: integer(\"level\").notNull().default(0),\n inherits: text(\"inherits\").array(),\n description: text(\"description\"),\n permissions: jsonb(\"permissions\").$type<string[]>().default([]),\n isSystem: boolean(\"is_system\").default(false),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [index(\"roles_level_idx\").on(table.level)],\n);\n\nexport const permissions = pgTable(\n \"permissions\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n roleId: uuid(\"role_id\").references(() => roles.id, { onDelete: \"cascade\" }),\n resource: varchar(\"resource\", { length: 100 }).notNull(),\n action: varchar(\"action\", { length: 50 }).notNull(),\n conditions: jsonb(\"conditions\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"permissions_role_idx\").on(table.roleId),\n index(\"permissions_resource_idx\").on(table.resource),\n ],\n);\n\nexport const sessions = pgTable(\n \"sessions\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .notNull()\n .references(() => users.id, { onDelete: \"cascade\" }),\n token: varchar(\"token\", { length: 512 }).notNull().unique(),\n refreshToken: varchar(\"refresh_token\", { length: 512 }),\n ipAddress: varchar(\"ip_address\", { length: 45 }),\n userAgent: text(\"user_agent\"),\n expiresAt: timestamp(\"expires_at\").notNull(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"sessions_user_idx\").on(table.userId),\n index(\"sessions_token_idx\").on(table.token),\n index(\"sessions_expires_idx\").on(table.expiresAt),\n ],\n);\n\nexport const auditLogs = pgTable(\n \"audit_logs\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n action: varchar(\"action\", { length: 100 }).notNull(),\n userId: uuid(\"user_id\").references(() => users.id, {\n onDelete: \"set null\",\n }),\n userEmail: varchar(\"user_email\", { length: 255 }),\n role: varchar(\"role\", { length: 50 }),\n resource: varchar(\"resource\", { length: 100 }).notNull(),\n resourceId: uuid(\"resource_id\"),\n changes:\n jsonb(\"changes\").$type<{ field: string; old: unknown; new: unknown }[]>(),\n ipAddress: varchar(\"ip_address\", { length: 45 }),\n userAgent: text(\"user_agent\"),\n success: boolean(\"success\").notNull().default(true),\n error: text(\"error\"),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n timestamp: timestamp(\"timestamp\").defaultNow().notNull(),\n },\n (table) => [\n index(\"audit_logs_user_idx\").on(table.userId),\n index(\"audit_logs_action_idx\").on(table.action),\n index(\"audit_logs_resource_idx\").on(table.resource),\n index(\"audit_logs_timestamp_idx\").on(table.timestamp),\n ],\n);\n\nexport const tenants = pgTable(\n \"tenants\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n name: varchar(\"name\", { length: 255 }).notNull(),\n slug: varchar(\"slug\", { length: 100 }).notNull().unique(),\n settings: jsonb(\"settings\").$type<Record<string, unknown>>().default({}),\n isActive: boolean(\"is_active\").default(true),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [uniqueIndex(\"tenants_slug_idx\").on(table.slug)],\n);\n\nexport const apiKeys = pgTable(\n \"api_keys\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .notNull()\n .references(() => users.id, { onDelete: \"cascade\" }),\n name: varchar(\"name\", { length: 255 }).notNull(),\n key: varchar(\"key\", { length: 64 }).notNull().unique(),\n keyPrefix: varchar(\"key_prefix\", { length: 8 }).notNull(),\n permissions: jsonb(\"permissions\").$type<string[]>().default([]),\n lastUsedAt: timestamp(\"last_used_at\"),\n expiresAt: timestamp(\"expires_at\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"api_keys_user_idx\").on(table.userId),\n index(\"api_keys_key_idx\").on(table.key),\n ],\n);\n\nexport const emailVerifications = pgTable(\n \"email_verifications\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .notNull()\n .references(() => users.id, { onDelete: \"cascade\" }),\n token: varchar(\"token\", { length: 64 }).notNull().unique(),\n expiresAt: timestamp(\"expires_at\").notNull(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"email_verifications_token_idx\").on(table.token),\n index(\"email_verifications_user_idx\").on(table.userId),\n ],\n);\n\nexport const passwordResets = pgTable(\n \"password_resets\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .notNull()\n .references(() => users.id, { onDelete: \"cascade\" }),\n token: varchar(\"token\", { length: 64 }).notNull().unique(),\n expiresAt: timestamp(\"expires_at\").notNull(),\n usedAt: timestamp(\"used_at\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"password_resets_token_idx\").on(table.token),\n index(\"password_resets_user_idx\").on(table.userId),\n ],\n);\n\nexport const passwordHistory = pgTable(\n \"password_history\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .notNull()\n .references(() => users.id, { onDelete: \"cascade\" }),\n passwordHash: varchar(\"password_hash\", { length: 255 }).notNull(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [index(\"password_history_user_idx\").on(table.userId)],\n);\n\nexport const lockouts = pgTable(\n \"lockouts\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .notNull()\n .references(() => users.id, { onDelete: \"cascade\" }),\n ipAddress: varchar(\"ip_address\", { length: 45 }),\n reason: varchar(\"reason\", { length: 255 }),\n lockedUntil: timestamp(\"locked_until\").notNull(),\n releasedAt: timestamp(\"released_at\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"lockouts_user_idx\").on(table.userId),\n index(\"lockouts_ip_idx\").on(table.ipAddress),\n index(\"lockouts_locked_until_idx\").on(table.lockedUntil),\n ],\n);\n\nexport type AuthUser = typeof users.$inferSelect;\nexport type AuthUserNew = typeof users.$inferInsert;\nexport type AuthRole = typeof roles.$inferSelect;\nexport type AuthRoleNew = typeof roles.$inferInsert;\nexport type AuthSession = typeof sessions.$inferSelect;\nexport type AuthSessionNew = typeof sessions.$inferInsert;\nexport type AuthAuditLog = typeof auditLogs.$inferSelect;\nexport type AuthAuditLogNew = typeof auditLogs.$inferInsert;\nexport type AuthTenant = typeof tenants.$inferSelect;\nexport type AuthTenantNew = typeof tenants.$inferInsert;\nexport type AuthApiKey = typeof apiKeys.$inferSelect;\nexport type AuthApiKeyNew = typeof apiKeys.$inferInsert;\nexport type AuthEmailVerification = typeof emailVerifications.$inferSelect;\nexport type AuthPasswordReset = typeof passwordResets.$inferSelect;\nexport type AuthPasswordHistoryEntry = typeof passwordHistory.$inferSelect;\nexport type AuthLockout = typeof lockouts.$inferSelect;\n"]}
|
|
@@ -54,10 +54,11 @@ var RedisAuthAdapter = class {
|
|
|
54
54
|
async createUser(data) {
|
|
55
55
|
const userId = crypto.randomBytes(16).toString("hex");
|
|
56
56
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
57
|
+
const passwordHash = await this.hashPassword(data.password);
|
|
57
58
|
const user = {
|
|
58
59
|
id: userId,
|
|
59
60
|
email: data.email.toLowerCase(),
|
|
60
|
-
passwordHash
|
|
61
|
+
passwordHash,
|
|
61
62
|
role: data.role || "customer",
|
|
62
63
|
tenantId: data.tenantId,
|
|
63
64
|
createdAt: now,
|
|
@@ -112,8 +113,13 @@ var RedisAuthAdapter = class {
|
|
|
112
113
|
async hashPassword(password) {
|
|
113
114
|
return bcrypt__default.default.hash(password, 12);
|
|
114
115
|
}
|
|
115
|
-
async verifyPassword(
|
|
116
|
-
|
|
116
|
+
async verifyPassword(email, password) {
|
|
117
|
+
const userId = await this.redis.get(this.userByEmailKey(email));
|
|
118
|
+
if (!userId) return null;
|
|
119
|
+
const user = await this.findUserById(userId);
|
|
120
|
+
if (!user || !user.passwordHash) return null;
|
|
121
|
+
const valid = await bcrypt__default.default.compare(password, user.passwordHash);
|
|
122
|
+
return valid ? user : null;
|
|
117
123
|
}
|
|
118
124
|
async createSession(userId, data = {}) {
|
|
119
125
|
const sessionId = crypto.randomBytes(32).toString("hex");
|
|
@@ -192,7 +198,7 @@ var RedisAuthAdapter = class {
|
|
|
192
198
|
async isPasswordInHistory(password, userId, historyCount = 5) {
|
|
193
199
|
const history = await this.getPasswordHistory(userId, historyCount);
|
|
194
200
|
for (const hash of history) {
|
|
195
|
-
if (await
|
|
201
|
+
if (await bcrypt__default.default.compare(password, hash)) {
|
|
196
202
|
return true;
|
|
197
203
|
}
|
|
198
204
|
}
|
|
@@ -256,8 +262,52 @@ var RedisAuthAdapter = class {
|
|
|
256
262
|
userAgent: hash.userAgent
|
|
257
263
|
};
|
|
258
264
|
}
|
|
265
|
+
auditLogKey(id) {
|
|
266
|
+
return `${this.prefix}audit:logs:${id}`;
|
|
267
|
+
}
|
|
268
|
+
auditLogIndexKey() {
|
|
269
|
+
return `${this.prefix}audit:index`;
|
|
270
|
+
}
|
|
271
|
+
async findAuditLogs(filter) {
|
|
272
|
+
const { limit = 50, offset = 0 } = filter;
|
|
273
|
+
const indexKey = this.auditLogIndexKey();
|
|
274
|
+
const allIds = await this.redis.zrevrange(indexKey, 0, -1);
|
|
275
|
+
const total = allIds.length;
|
|
276
|
+
const pagedIds = allIds.slice(offset, offset + limit);
|
|
277
|
+
const logs = [];
|
|
278
|
+
for (const id of pagedIds) {
|
|
279
|
+
const logData = await this.redis.get(this.auditLogKey(id));
|
|
280
|
+
if (logData) {
|
|
281
|
+
const log = JSON.parse(logData);
|
|
282
|
+
if ((!filter.userId || log.userId === filter.userId) && (!filter.action || (Array.isArray(filter.action) ? filter.action.includes(log.action) : log.action === filter.action)) && (!filter.resource || log.resource === filter.resource) && (filter.success === void 0 || log.success === filter.success)) {
|
|
283
|
+
logs.push({ ...log, timestamp: new Date(log.timestamp) });
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return { logs, total };
|
|
288
|
+
}
|
|
289
|
+
async createAuditLog(data) {
|
|
290
|
+
const id = crypto.randomBytes(16).toString("hex");
|
|
291
|
+
const timestamp = /* @__PURE__ */ new Date();
|
|
292
|
+
const log = { ...data, id, timestamp };
|
|
293
|
+
await this.redis.set(this.auditLogKey(id), JSON.stringify(log));
|
|
294
|
+
await this.redis.zadd(this.auditLogIndexKey(), Date.now(), id);
|
|
295
|
+
const count = await this.redis.zcard(this.auditLogIndexKey());
|
|
296
|
+
if (count > 1e4) {
|
|
297
|
+
const oldIds = await this.redis.zrange(
|
|
298
|
+
this.auditLogIndexKey(),
|
|
299
|
+
0,
|
|
300
|
+
count - 10001
|
|
301
|
+
);
|
|
302
|
+
for (const oldId of oldIds) {
|
|
303
|
+
await this.redis.del(this.auditLogKey(oldId));
|
|
304
|
+
await this.redis.zrem(this.auditLogIndexKey(), oldId);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return log;
|
|
308
|
+
}
|
|
259
309
|
};
|
|
260
310
|
|
|
261
311
|
exports.RedisAuthAdapter = RedisAuthAdapter;
|
|
262
|
-
//# sourceMappingURL=chunk-
|
|
263
|
-
//# sourceMappingURL=chunk-
|
|
312
|
+
//# sourceMappingURL=chunk-BLMFBDBG.cjs.map
|
|
313
|
+
//# sourceMappingURL=chunk-BLMFBDBG.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/redis-adapter.ts"],"names":["Redis","randomBytes","bcrypt"],"mappings":"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","file":"chunk-BLMFBDBG.cjs","sourcesContent":["import Redis from \"ioredis\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\nimport bcrypt from \"bcryptjs\";\nimport { randomBytes } from \"crypto\";\n\nexport interface RedisAuthAdapterOptions {\n url?: string;\n host?: string;\n port?: number;\n password?: string;\n db?: number;\n keyPrefix?: string;\n tokenExpiration?: number;\n refreshTokenExpiration?: number;\n tls?: boolean;\n}\n\nconst DEFAULT_PREFIX = \"kyro:auth:\";\nconst DEFAULT_TOKEN_EXPIRATION = 86400;\nconst DEFAULT_REFRESH_EXPIRATION = 604800;\n\nexport class RedisAuthAdapter implements AuthAdapter {\n private redis: Redis;\n private prefix: string;\n private tokenExpiration: number;\n private refreshExpiration: number;\n\n constructor(options: RedisAuthAdapterOptions = {}) {\n const url =\n options.url ||\n `redis://${options.host || \"localhost\"}:${options.port || 6379}`;\n\n this.redis = new Redis(url, {\n password: options.password,\n db: options.db,\n lazyConnect: true,\n tls: options.tls ? {} : undefined,\n });\n\n this.prefix = options.keyPrefix || DEFAULT_PREFIX;\n this.tokenExpiration = options.tokenExpiration || DEFAULT_TOKEN_EXPIRATION;\n this.refreshExpiration =\n options.refreshTokenExpiration || DEFAULT_REFRESH_EXPIRATION;\n }\n\n async connect(): Promise<void> {\n await this.redis.connect();\n }\n\n async disconnect(): Promise<void> {\n await this.redis.quit();\n }\n\n private userKey(userId: string): string {\n return `${this.prefix}users:${userId}`;\n }\n\n private sessionKey(sessionId: string): string {\n return `${this.prefix}sessions:${sessionId}`;\n }\n\n private refreshKey(token: string): string {\n return `${this.prefix}refresh:${token}`;\n }\n\n private userByEmailKey(email: string): string {\n return `${this.prefix}users:email:${email.toLowerCase()}`;\n }\n\n private passwordHistoryKey(userId: string): string {\n return `${this.prefix}users:${userId}:password_history`;\n }\n\n async createUser(data: {\n email: string;\n password: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const userId = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n const passwordHash = await this.hashPassword(data.password);\n\n const user: AuthUser = {\n id: userId,\n email: data.email.toLowerCase(),\n passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n const pipeline = this.redis.pipeline();\n\n pipeline.hset(this.userKey(userId), this.userToHash(user));\n pipeline.set(this.userByEmailKey(data.email), userId);\n\n await pipeline.exec();\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const userId = await this.redis.get(\n this.userByEmailKey(email.toLowerCase()),\n );\n if (!userId) return null;\n return this.findUserById(userId);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n const data = await this.redis.hgetall(this.userKey(userId));\n if (!data || Object.keys(data).length === 0) return null;\n return this.hashToUser(data);\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updated: AuthUser = {\n ...existing,\n ...data,\n id: userId,\n updatedAt: new Date().toISOString(),\n };\n\n if (data.email && data.email !== existing.email) {\n const pipeline = this.redis.pipeline();\n pipeline.del(this.userByEmailKey(existing.email));\n pipeline.set(this.userByEmailKey(data.email), userId);\n await pipeline.exec();\n }\n\n await this.redis.hset(this.userKey(userId), this.userToHash(updated));\n return updated;\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n const user = await this.findUserById(userId);\n if (!user) return false;\n\n const pipeline = this.redis.pipeline();\n pipeline.del(this.userKey(userId));\n pipeline.del(this.userByEmailKey(user.email));\n pipeline.del(this.passwordHistoryKey(userId));\n await pipeline.exec();\n\n return true;\n }\n\n async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, 12);\n }\n\n async verifyPassword(\n email: string,\n password: string,\n ): Promise<AuthUser | null> {\n const userId = await this.redis.get(this.userByEmailKey(email));\n if (!userId) return null;\n const user = await this.findUserById(userId);\n if (!user || !user.passwordHash) return null;\n const valid = await bcrypt.compare(password, user.passwordHash);\n return valid ? user : null;\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n const sessionId = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n\n const session: Session = {\n id: sessionId,\n userId,\n token,\n refreshToken,\n expiresAt: new Date(\n now.getTime() + this.tokenExpiration * 1000,\n ).toISOString(),\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n const pipeline = this.redis.pipeline();\n\n pipeline.hset(this.sessionKey(sessionId), this.sessionToHash(session));\n pipeline.setex(\n this.refreshKey(refreshToken),\n this.refreshExpiration,\n sessionId,\n );\n\n await pipeline.exec();\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n const data = await this.redis.hgetall(this.sessionKey(token));\n if (!data || Object.keys(data).length === 0) return null;\n return this.hashToSession(data);\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n const session = await this.redis.hgetall(this.sessionKey(sessionId));\n if (!session || Object.keys(session).length === 0) return false;\n\n const pipeline = this.redis.pipeline();\n pipeline.del(this.sessionKey(sessionId));\n if (session.refreshToken) {\n pipeline.del(this.refreshKey(session.refreshToken));\n }\n await pipeline.exec();\n\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n const pattern = `${this.prefix}sessions:*`;\n let cursor = \"0\";\n let deleted = 0;\n\n do {\n const [nextCursor, keys] = await this.redis.scan(\n cursor,\n \"MATCH\",\n pattern,\n \"COUNT\",\n 100,\n );\n cursor = nextCursor;\n\n for (const key of keys) {\n const sessionData = await this.redis.hgetall(key);\n if (sessionData.userId === userId) {\n const sessionId = key.replace(`${this.prefix}sessions:`, \"\");\n await this.deleteSession(sessionId);\n deleted++;\n }\n }\n } while (cursor !== \"0\");\n\n return deleted;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n await this.redis.lpush(this.passwordHistoryKey(userId), passwordHash);\n await this.redis.ltrim(this.passwordHistoryKey(userId), 0, 4);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n return this.redis.lrange(this.passwordHistoryKey(userId), 0, count - 1);\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n\n for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n\n return false;\n }\n\n private userToHash(user: AuthUser): Record<string, string> {\n const hash: Record<string, string> = {\n id: user.id,\n email: user.email,\n passwordHash: user.passwordHash || \"\",\n role: user.role,\n createdAt: user.createdAt,\n updatedAt: user.updatedAt,\n };\n\n if (user.tenantId) hash.tenantId = user.tenantId;\n if (user.emailVerified !== undefined)\n hash.emailVerified = String(user.emailVerified);\n if (user.locked !== undefined) hash.locked = String(user.locked);\n if (user.lastLogin) hash.lastLogin = user.lastLogin;\n if (user.failedLoginAttempts !== undefined)\n hash.failedLoginAttempts = String(user.failedLoginAttempts);\n\n return hash;\n }\n\n private hashToUser(hash: Record<string, string>): AuthUser {\n return {\n id: hash.id,\n email: hash.email,\n passwordHash: hash.passwordHash,\n role: hash.role as UserRole,\n tenantId: hash.tenantId,\n createdAt: hash.createdAt,\n updatedAt: hash.updatedAt,\n emailVerified: hash.emailVerified === \"true\",\n locked: hash.locked === \"true\",\n lastLogin: hash.lastLogin,\n failedLoginAttempts: hash.failedLoginAttempts\n ? parseInt(hash.failedLoginAttempts, 10)\n : 0,\n };\n }\n\n private sessionToHash(session: Session): Record<string, string> {\n const hash: Record<string, string> = {\n id: session.id,\n userId: session.userId,\n token: session.token,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n };\n\n if (session.refreshToken) hash.refreshToken = session.refreshToken;\n if (session.ipAddress) hash.ipAddress = session.ipAddress;\n if (session.userAgent) hash.userAgent = session.userAgent;\n\n return hash;\n }\n\n private hashToSession(hash: Record<string, string>): Session {\n return {\n id: hash.id,\n userId: hash.userId,\n token: hash.token,\n refreshToken: hash.refreshToken,\n expiresAt: hash.expiresAt,\n createdAt: hash.createdAt,\n ipAddress: hash.ipAddress,\n userAgent: hash.userAgent,\n };\n }\n\n private auditLogKey(id: string): string {\n return `${this.prefix}audit:logs:${id}`;\n }\n\n private auditLogIndexKey(): string {\n return `${this.prefix}audit:index`;\n }\n\n async findAuditLogs(filter: {\n userId?: string;\n action?: string | string[];\n resource?: string;\n success?: boolean;\n limit?: number;\n offset?: number;\n }): Promise<{ logs: any[]; total: number }> {\n const { limit = 50, offset = 0 } = filter;\n const indexKey = this.auditLogIndexKey();\n const allIds = await this.redis.zrevrange(indexKey, 0, -1);\n const total = allIds.length;\n\n const pagedIds = allIds.slice(offset, offset + limit);\n const logs: any[] = [];\n\n for (const id of pagedIds) {\n const logData = await this.redis.get(this.auditLogKey(id));\n if (logData) {\n const log = JSON.parse(logData);\n if (\n (!filter.userId || log.userId === filter.userId) &&\n (!filter.action ||\n (Array.isArray(filter.action)\n ? filter.action.includes(log.action)\n : log.action === filter.action)) &&\n (!filter.resource || log.resource === filter.resource) &&\n (filter.success === undefined || log.success === filter.success)\n ) {\n logs.push({ ...log, timestamp: new Date(log.timestamp) });\n }\n }\n }\n\n return { logs, total };\n }\n\n async createAuditLog(data: any): Promise<any> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n const log = { ...data, id, timestamp };\n await this.redis.set(this.auditLogKey(id), JSON.stringify(log));\n await this.redis.zadd(this.auditLogIndexKey(), Date.now(), id);\n const count = await this.redis.zcard(this.auditLogIndexKey());\n if (count > 10000) {\n const oldIds = await this.redis.zrange(\n this.auditLogIndexKey(),\n 0,\n count - 10001,\n );\n for (const oldId of oldIds) {\n await this.redis.del(this.auditLogKey(oldId));\n await this.redis.zrem(this.auditLogIndexKey(), oldId);\n }\n }\n return log;\n }\n}\n"]}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { AbstractBaseAdapter } from './chunk-BXMWDUED.js';
|
|
2
|
+
import { drizzle as drizzle$1 } from 'drizzle-orm/postgres-js';
|
|
3
|
+
import { drizzle } from 'drizzle-orm/mysql2';
|
|
4
|
+
import postgres from 'postgres';
|
|
5
|
+
import mysql from 'mysql2/promise';
|
|
6
|
+
import Database from 'better-sqlite3';
|
|
7
|
+
import { randomBytes } from 'crypto';
|
|
8
|
+
import { mkdir } from 'fs/promises';
|
|
9
|
+
import { resolve, dirname } from 'path';
|
|
2
10
|
|
|
3
11
|
// src/database/drizzle/adapter.ts
|
|
4
12
|
function fieldToDrizzleType(field, dialect = "postgres") {
|
|
@@ -262,7 +270,61 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
262
270
|
function createDrizzleAdapter(options) {
|
|
263
271
|
return new DrizzleAdapter(options);
|
|
264
272
|
}
|
|
273
|
+
function getDialect() {
|
|
274
|
+
const val = process.env.DB_TYPE;
|
|
275
|
+
if (val === "mysql") return "mysql";
|
|
276
|
+
if (val === "postgres") return "postgres";
|
|
277
|
+
return "sqlite";
|
|
278
|
+
}
|
|
279
|
+
function genId() {
|
|
280
|
+
return randomBytes(16).toString("hex");
|
|
281
|
+
}
|
|
282
|
+
async function createDatabase() {
|
|
283
|
+
const dialect = getDialect();
|
|
284
|
+
if (dialect === "sqlite") {
|
|
285
|
+
const dbPath = resolve(process.cwd(), "data", "kyro.db");
|
|
286
|
+
await mkdir(dirname(dbPath), { recursive: true });
|
|
287
|
+
const db2 = new Database(dbPath);
|
|
288
|
+
db2.pragma("journal_mode = WAL");
|
|
289
|
+
return { db: db2, dialect, genId };
|
|
290
|
+
}
|
|
291
|
+
if (dialect === "mysql") {
|
|
292
|
+
const connectionString = process.env.DATABASE_URL || `mysql://${process.env.DB_USER || "root"}:${process.env.DB_PASSWORD || ""}@${process.env.DB_HOST || "localhost"}:${process.env.DB_PORT || 3306}/${process.env.DB_NAME || "kyro"}?timezone=+00:00`;
|
|
293
|
+
const pool = mysql.createPool({
|
|
294
|
+
uri: connectionString,
|
|
295
|
+
waitForConnections: true,
|
|
296
|
+
connectionLimit: parseInt(process.env.DB_POOL_MAX || "10", 10),
|
|
297
|
+
enableKeepAlive: true
|
|
298
|
+
});
|
|
299
|
+
const db2 = drizzle(pool);
|
|
300
|
+
return { db: db2, dialect, genId };
|
|
301
|
+
}
|
|
302
|
+
const databaseUrl = process.env.DATABASE_URL || "postgresql://postgres:postgres@localhost:5432/kyro_cms";
|
|
303
|
+
const maxConnections = parseInt(process.env.DB_POOL_MAX || "10", 10);
|
|
304
|
+
const ssl = process.env.DB_SSL === "true";
|
|
305
|
+
const client = postgres(databaseUrl, {
|
|
306
|
+
max: maxConnections,
|
|
307
|
+
ssl: ssl ? "require" : false
|
|
308
|
+
});
|
|
309
|
+
const db = drizzle$1(client);
|
|
310
|
+
return { db, dialect, genId };
|
|
311
|
+
}
|
|
312
|
+
async function runMigrations(_db, _dialect) {
|
|
313
|
+
console.log(
|
|
314
|
+
`[createDatabase] runMigrations called \u2014 use drizzle-kit CLI for migrations (drizzle-kit migrate)`
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
async function seedDefaultRoles(db) {
|
|
318
|
+
const { roles } = await import('./schema-CNB2DDTX.js');
|
|
319
|
+
await db.insert(roles).values({
|
|
320
|
+
name: "super_admin",
|
|
321
|
+
level: 100,
|
|
322
|
+
inherits: [],
|
|
323
|
+
description: "Full system access across all tenants",
|
|
324
|
+
isSystem: true
|
|
325
|
+
}).onConflictDoNothing();
|
|
326
|
+
}
|
|
265
327
|
|
|
266
|
-
export { DrizzleAdapter, collectionToDrizzleSchema, createDrizzleAdapter, fieldToDrizzleType };
|
|
267
|
-
//# sourceMappingURL=chunk-
|
|
268
|
-
//# sourceMappingURL=chunk-
|
|
328
|
+
export { DrizzleAdapter, collectionToDrizzleSchema, createDatabase, createDrizzleAdapter, fieldToDrizzleType, genId, runMigrations, seedDefaultRoles };
|
|
329
|
+
//# sourceMappingURL=chunk-BTOE3VUK.js.map
|
|
330
|
+
//# sourceMappingURL=chunk-BTOE3VUK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/drizzle/adapter.ts","../src/database/drizzle/database.ts"],"names":["db","drizzleMysql","drizzle"],"mappings":"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","file":"chunk-BTOE3VUK.js","sourcesContent":["import { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n} from '../../registry/types.js';\nimport type { Field, RelationshipField } from '../../fields/types.js';\n\n// ============================================================================\n// Drizzle Schema Generator\n// ============================================================================\n\nexport function fieldToDrizzleType(field: Field, dialect: 'postgres' | 'mysql' | 'sqlite' = 'postgres'): string {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'number':\n return field.integer ? 'integer' : 'decimal';\n case 'checkbox':\n return 'boolean';\n case 'date':\n return 'timestamp';\n case 'select':\n case 'radio':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'richtext':\n case 'json':\n case 'array':\n case 'group':\n case 'blocks':\n case 'row':\n case 'collapsible':\n case 'tabs':\n return 'jsonb';\n case 'relationship':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'upload':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n default:\n return 'jsonb';\n }\n}\n\nexport function collectionToDrizzleSchema(\n collection: CollectionConfig,\n dialect: 'postgres' | 'mysql' | 'sqlite' = 'postgres'\n): string {\n const tableName = collection.slug.replace(/-/g, '_');\n const lines: string[] = [];\n \n lines.push(`export const ${tableName} = ${dialect === 'mysql' ? 'mysqlTable' : 'pgTable'}('${tableName}', {`);\n \n // Add id field\n lines.push(` id: ${dialect === 'mysql' ? 'varchar' : 'uuid'}('${dialect === 'mysql' ? 'id' : 'id'}').${dialect === 'mysql' ? \"primaryKey().default(sql`UUID()`)\" : \"primaryKey().defaultRandom()\"},`);\n \n // Process fields\n for (const field of collection.fields) {\n if (field.name === 'id') continue;\n \n const dbType = fieldToDrizzleType(field, dialect);\n const isRequired = field.required;\n \n let fieldDef = ` ${field.name}: ${dialect === 'mysql' ? 'mysql' : 'pg'}.${dbType}('${field.name}')`;\n \n // Add constraints\n if (field.unique) fieldDef += '.unique()';\n if (!isRequired) fieldDef += '.nullable()';\n \n // Add default value\n if (field.defaultValue !== undefined) {\n if (typeof field.defaultValue === 'string') {\n fieldDef += `.default('${field.defaultValue}')`;\n } else if (typeof field.defaultValue === 'boolean') {\n fieldDef += `.default(${field.defaultValue})`;\n } else {\n fieldDef += `.default(sql\\`${JSON.stringify(field.defaultValue)}\\`)`;\n }\n }\n \n fieldDef += ',';\n lines.push(fieldDef);\n }\n \n // Add timestamps\n if (collection.timestamps) {\n lines.push(` createdAt: ${dialect === 'mysql' ? 'mysql' : 'pg'}.timestamp('created_at').defaultNow(),`);\n lines.push(` updatedAt: ${dialect === 'mysql' ? 'mysql' : 'pg'}.timestamp('updated_at').defaultNow(),`);\n }\n \n // Add tenantID\n if (collection.tenantScoped) {\n lines.push(` tenantId: ${dialect === 'mysql' ? 'mysql' : 'pg'}.varchar('tenant_id'),`);\n }\n \n lines.push('});');\n \n return lines.join('\\n');\n}\n\n// ============================================================================\n// Drizzle Adapter\n// ============================================================================\n\nexport class DrizzleAdapter extends AbstractBaseAdapter {\n private client: any;\n private schema: any;\n private dialect: 'postgres' | 'mysql' | 'sqlite';\n \n constructor(options: {\n type: 'postgres' | 'mysql' | 'sqlite';\n client: any;\n schema?: any;\n }) {\n super();\n this.client = options.client;\n this.schema = options.schema || {};\n this.dialect = options.type;\n }\n\n async connect(): Promise<void> {\n this.connected = true;\n console.log(`[DrizzleAdapter] Connected to ${this.dialect}`);\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n console.log(`[DrizzleAdapter] Disconnected from ${this.dialect}`);\n }\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n // Build query\n const filters = this.buildWhereClause(where, config, tenantID);\n const sortOption = this.parseSort(sort);\n\n // Get total count\n const totalDocs = await this.count({ collection: slug, where, tenantID });\n\n // Execute query\n const offset = (page - 1) * limit;\n \n let docs: T[] = [];\n try {\n const results = await this.client\n .select()\n .from(table)\n .where(filters)\n .orderBy(sortOption.direction === 'asc' ? table[sortOption.field] : undefined)\n .limit(limit)\n .offset(offset);\n\n docs = results.map((doc: any) => this.processResult(doc, config));\n } catch (error) {\n console.error(`[DrizzleAdapter] Query error:`, error);\n docs = [];\n }\n\n return {\n docs,\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n let query = this.client\n .select()\n .from(table)\n .where(table.id.equals(id));\n\n if (tenantID) {\n query = query.where(table.tenantId.equals(tenantID));\n }\n\n const results = await query.limit(1);\n if (results.length === 0) return null;\n\n return this.processResult(results[0], config) as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const insertData = this.prepareData(data, config);\n if (tenantID) {\n insertData.tenantId = tenantID;\n }\n\n const result = await this.client\n .insert(table)\n .values(insertData)\n .returning();\n\n return this.processResult(result[0], config) as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const updateData = this.prepareData(data, config);\n if (tenantID) {\n updateData.tenantId = tenantID;\n }\n\n const result = await this.client\n .update(table)\n .set(updateData)\n .where(table.id.equals(id))\n .returning();\n\n return this.processResult(result[0], config) as T;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n let query = this.client\n .delete(table)\n .where(table.id.equals(id))\n .returning();\n\n if (tenantID) {\n query = query.where(table.tenantId.equals(tenantID));\n }\n\n const result = await query;\n if (result.length === 0) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(result[0], config) as T;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, where = {}, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const filters = this.buildWhereClause(where, config, tenantID);\n\n try {\n const result = await this.client\n .select({ count: `count(*)` })\n .from(table)\n .where(filters);\n\n return parseInt(result[0]?.count || '0');\n } catch {\n return 0;\n }\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string }): Promise<any> {\n const { collection: slug, where = {}, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const filters = this.buildWhereClause(where, config, tenantID);\n\n const results = await this.client\n .select()\n .from(table)\n .where(filters)\n .limit(1);\n\n if (results.length === 0) return null;\n\n return this.processResult(results[0], config);\n }\n\n async findVersions(args: FindArgs): Promise<FindResult<any>> {\n // Versions are stored in a separate table\n const { collection: slug, where = {}, sort, limit = 10, page = 1 } = args;\n \n // Placeholder implementation\n return {\n docs: [],\n ...this.calculatePagination(page, limit, 0),\n };\n }\n\n async findVersionByID(args: FindByIDArgs): Promise<any> {\n return null;\n }\n\n async createVersion(args: CreateArgs): Promise<any> {\n return args.data;\n }\n\n async deleteVersions(args: { collection: string; where: Record<string, any> }): Promise<void> {\n // Placeholder\n }\n\n // ========================================================================\n // Helper Methods\n // ========================================================================\n\n private getTable(slug: string): any {\n const tableName = this.getTableName(slug);\n const table = this.schema[tableName];\n if (!table) {\n throw new Error(`Table \"${tableName}\" not found in schema`);\n }\n return table;\n }\n\n private buildWhereClause(\n where: Record<string, any>,\n config: CollectionConfig,\n tenantID?: string\n ): any {\n // Simplified where clause builder\n const conditions: any[] = [];\n\n // Apply tenant filter\n if (tenantID && config.tenantScoped) {\n conditions.push({ tenantId: tenantID });\n }\n\n // Process where conditions\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' && Array.isArray(value)) {\n // AND conditions\n for (const subCondition of value) {\n conditions.push(...Object.entries(subCondition).map(([k, v]) => ({ [k]: v })));\n }\n } else if (key === 'OR' && Array.isArray(value)) {\n // OR conditions - simplified\n conditions.push(...value.flatMap((v: any) => \n Object.entries(v).map(([k, val]) => ({ [k]: val }))\n ));\n } else if (typeof value === 'object' && value !== null) {\n // Operator-based conditions\n if (value.equals !== undefined) conditions.push({ [key]: value.equals });\n if (value.not_equals !== undefined) conditions.push({ [key]: { not: value.not_equals } });\n if (value.in) conditions.push({ [key]: { in: value.in } });\n if (value.like) conditions.push({ [key]: { like: value.like } });\n if (value.greater_than !== undefined) conditions.push({ [key]: { gt: value.greater_than } });\n if (value.greater_than_equal !== undefined) conditions.push({ [key]: { gte: value.greater_than_equal } });\n if (value.less_than !== undefined) conditions.push({ [key]: { lt: value.less_than } });\n if (value.less_than_equal !== undefined) conditions.push({ [key]: { lte: value.less_than_equal } });\n } else {\n // Direct equality\n conditions.push({ [key]: value });\n }\n }\n\n return conditions.length > 0 ? conditions : undefined;\n }\n\n private processResult(data: any, config: CollectionConfig): any {\n if (!data) return null;\n\n const result = { ...data };\n\n // Convert id field\n if (data.id) {\n result.id = String(data.id);\n }\n\n // Parse JSON fields\n for (const field of config.fields) {\n if (field.type === 'json' || field.type === 'richtext' || field.type === 'array' || field.type === 'group' || field.type === 'blocks') {\n if (result[field.name] && typeof result[field.name] === 'string') {\n try {\n result[field.name] = JSON.parse(result[field.name]);\n } catch {\n // Keep original value\n }\n }\n }\n }\n\n // Convert timestamps to ISO strings\n if (result.createdAt) {\n result.createdAt = new Date(result.createdAt).toISOString();\n }\n if (result.updatedAt) {\n result.updatedAt = new Date(result.updatedAt).toISOString();\n }\n\n return result;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport function createDrizzleAdapter(options: {\n type: 'postgres' | 'mysql' | 'sqlite';\n client: any;\n schema?: any;\n}): DrizzleAdapter {\n return new DrizzleAdapter(options);\n}\n","import { drizzle } from \"drizzle-orm/postgres-js\";\nimport { drizzle as drizzleMysql } from \"drizzle-orm/mysql2\";\nimport postgres from \"postgres\";\nimport mysql from \"mysql2/promise\";\nimport Database from \"better-sqlite3\";\nimport { randomBytes } from \"crypto\";\nimport { mkdir } from \"fs/promises\";\nimport { dirname, resolve } from \"path\";\n\nexport type Dialect = \"sqlite\" | \"postgres\" | \"mysql\";\n\nfunction getDialect(): Dialect {\n const val = process.env.DB_TYPE as Dialect | undefined;\n if (val === \"mysql\") return \"mysql\";\n if (val === \"postgres\") return \"postgres\";\n return \"sqlite\";\n}\n\nexport function genId(): string {\n return randomBytes(16).toString(\"hex\");\n}\n\nexport interface DatabaseResult {\n db: any;\n dialect: Dialect;\n genId: () => string;\n}\n\nexport async function createDatabase(): Promise<DatabaseResult> {\n const dialect = getDialect();\n\n if (dialect === \"sqlite\") {\n const dbPath = resolve(process.cwd(), \"data\", \"kyro.db\");\n await mkdir(dirname(dbPath), { recursive: true });\n const db = new Database(dbPath);\n db.pragma(\"journal_mode = WAL\");\n return { db, dialect, genId };\n }\n\n if (dialect === \"mysql\") {\n const connectionString =\n process.env.DATABASE_URL ||\n `mysql://${process.env.DB_USER || \"root\"}:${process.env.DB_PASSWORD || \"\"}@${process.env.DB_HOST || \"localhost\"}:${process.env.DB_PORT || 3306}/${process.env.DB_NAME || \"kyro\"}?timezone=+00:00`;\n const pool = mysql.createPool({\n uri: connectionString,\n waitForConnections: true,\n connectionLimit: parseInt(process.env.DB_POOL_MAX || \"10\", 10),\n enableKeepAlive: true,\n });\n const db = drizzleMysql(pool);\n return { db, dialect, genId };\n }\n\n // postgres default\n const databaseUrl =\n process.env.DATABASE_URL ||\n \"postgresql://postgres:postgres@localhost:5432/kyro_cms\";\n const maxConnections = parseInt(process.env.DB_POOL_MAX || \"10\", 10);\n const ssl = process.env.DB_SSL === \"true\";\n const client = postgres(databaseUrl, {\n max: maxConnections,\n ssl: ssl ? \"require\" : false,\n });\n const db = drizzle(client);\n return { db, dialect, genId };\n}\n\nexport async function runMigrations(\n _db: any,\n _dialect?: Dialect,\n): Promise<void> {\n console.log(\n `[createDatabase] runMigrations called — use drizzle-kit CLI for migrations (drizzle-kit migrate)`,\n );\n}\n\nexport async function seedDefaultRoles(db: any): Promise<void> {\n const { roles } = await import(\"./schema/index.js\");\n await db\n .insert(roles)\n .values({\n name: \"super_admin\",\n level: 100,\n inherits: [],\n description: \"Full system access across all tenants\",\n isSystem: true,\n })\n .onConflictDoNothing();\n}\n"]}
|