@kyro-cms/core 0.5.5 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-handler.cjs +75 -35
- package/dist/api-handler.cjs.map +1 -1
- package/dist/api-handler.d.cts +2 -5
- package/dist/api-handler.d.ts +2 -5
- package/dist/api-handler.js +75 -36
- package/dist/api-handler.js.map +1 -1
- package/dist/bootstrap-AKAUP6F6.cjs +32 -0
- package/dist/{bootstrap-EE6BJZWL.cjs.map → bootstrap-AKAUP6F6.cjs.map} +1 -1
- package/dist/bootstrap-JCML6NFO.js +7 -0
- package/dist/{bootstrap-4MH44YKG.js.map → bootstrap-JCML6NFO.js.map} +1 -1
- package/dist/{chunk-WVPOPOEQ.cjs → chunk-2KVHZE6O.cjs} +286 -126
- package/dist/chunk-2KVHZE6O.cjs.map +1 -0
- package/dist/{chunk-RALQO47U.cjs → chunk-2OL4O2TH.cjs} +55 -2
- package/dist/chunk-2OL4O2TH.cjs.map +1 -0
- package/dist/{chunk-XU7AFF6V.js → chunk-35U3FROB.js} +982 -4
- package/dist/chunk-35U3FROB.js.map +1 -0
- package/dist/{chunk-WSCJQI2B.js → chunk-3J4MFTI3.js} +27 -11
- package/dist/chunk-3J4MFTI3.js.map +1 -0
- package/dist/chunk-3ZFYL34R.js +391 -0
- package/dist/chunk-3ZFYL34R.js.map +1 -0
- package/dist/chunk-4DA7QPLA.cjs +356 -0
- package/dist/chunk-4DA7QPLA.cjs.map +1 -0
- package/dist/{chunk-TP5YQFIX.js → chunk-57P6MJKC.js} +3 -715
- package/dist/chunk-57P6MJKC.js.map +1 -0
- package/dist/{chunk-R2YHJN6W.cjs → chunk-5KVM3WEY.cjs} +34 -208
- package/dist/chunk-5KVM3WEY.cjs.map +1 -0
- package/dist/{chunk-Z2OVHWHB.cjs → chunk-6IMPH6WV.cjs} +28 -11
- package/dist/chunk-6IMPH6WV.cjs.map +1 -0
- package/dist/{chunk-QKVA2SOG.js → chunk-DXHRBMGB.js} +27 -284
- package/dist/chunk-DXHRBMGB.js.map +1 -0
- package/dist/{chunk-E3BZLMX6.js → chunk-ES5HNFFT.js} +43 -2
- package/dist/chunk-ES5HNFFT.js.map +1 -0
- package/dist/{chunk-QYZKIPSD.js → chunk-FXYP2HA6.js} +34 -3
- package/dist/chunk-FXYP2HA6.js.map +1 -0
- package/dist/chunk-H727JIG7.js +809 -0
- package/dist/chunk-H727JIG7.js.map +1 -0
- package/dist/{chunk-AM4JKIPP.js → chunk-HXRD4B37.js} +9 -183
- package/dist/chunk-HXRD4B37.js.map +1 -0
- package/dist/chunk-I7HHI6QV.cjs +816 -0
- package/dist/chunk-I7HHI6QV.cjs.map +1 -0
- package/dist/{chunk-RDRJVCL5.cjs → chunk-IA6AU5PI.cjs} +2 -720
- package/dist/chunk-IA6AU5PI.cjs.map +1 -0
- package/dist/{chunk-55BNRTLW.cjs → chunk-LINKCEG4.cjs} +985 -4
- package/dist/chunk-LINKCEG4.cjs.map +1 -0
- package/dist/{chunk-TVVYZ2TH.js → chunk-OHVB4AJ7.js} +56 -3
- package/dist/chunk-OHVB4AJ7.js.map +1 -0
- package/dist/{chunk-XAEBVZTI.cjs → chunk-PDYFVNUX.cjs} +26 -289
- package/dist/chunk-PDYFVNUX.cjs.map +1 -0
- package/dist/{chunk-6WXQRYTW.js → chunk-QPPDLRNR.js} +286 -126
- package/dist/chunk-QPPDLRNR.js.map +1 -0
- package/dist/{chunk-WBCIEYHC.cjs → chunk-QUW2RZTM.cjs} +35 -4
- package/dist/chunk-QUW2RZTM.cjs.map +1 -0
- package/dist/chunk-SA7NSSIQ.cjs +397 -0
- package/dist/chunk-SA7NSSIQ.cjs.map +1 -0
- package/dist/{chunk-H4XCAPA6.cjs → chunk-V3LKPM3O.cjs} +43 -2
- package/dist/chunk-V3LKPM3O.cjs.map +1 -0
- package/dist/chunk-Y3N7UUDO.js +349 -0
- package/dist/chunk-Y3N7UUDO.js.map +1 -0
- package/dist/{chunk-S3FG2NY7.js → chunk-Y3QQN7PN.js} +4 -3
- package/dist/chunk-Y3QQN7PN.js.map +1 -0
- package/dist/{chunk-5HA5OMFH.cjs → chunk-YVUJBEXE.cjs} +7 -6
- package/dist/chunk-YVUJBEXE.cjs.map +1 -0
- package/dist/cli/index.cjs +103 -20
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +103 -20
- package/dist/cli/index.js.map +1 -1
- package/dist/client.d.cts +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/drizzle/index.cjs +12 -12
- package/dist/drizzle/index.d.cts +23 -2
- package/dist/drizzle/index.d.ts +23 -2
- package/dist/drizzle/index.js +3 -3
- package/dist/index.cjs +174 -1054
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +85 -7
- package/dist/index.d.ts +85 -7
- package/dist/index.js +91 -980
- package/dist/index.js.map +1 -1
- package/dist/integration.cjs +2 -2
- package/dist/integration.d.cts +3 -16
- package/dist/integration.d.ts +3 -16
- package/dist/integration.js +1 -1
- package/dist/mongo-auth-adapter-NHHUJHVH.cjs +17 -0
- package/dist/mongo-auth-adapter-NHHUJHVH.cjs.map +1 -0
- package/dist/mongo-auth-adapter-NJQUUCTP.js +4 -0
- package/dist/mongo-auth-adapter-NJQUUCTP.js.map +1 -0
- package/dist/mongodb/index.cjs +9 -8
- package/dist/mongodb/index.d.cts +86 -5
- package/dist/mongodb/index.d.ts +86 -5
- package/dist/mongodb/index.js +3 -2
- package/dist/postgres-auth-adapter-3T2NKTSE.js +5 -0
- package/dist/{postgres-auth-adapter-B65BULNS.js.map → postgres-auth-adapter-3T2NKTSE.js.map} +1 -1
- package/dist/postgres-auth-adapter-7IEENCKQ.cjs +14 -0
- package/dist/{postgres-auth-adapter-6742WDCF.cjs.map → postgres-auth-adapter-7IEENCKQ.cjs.map} +1 -1
- package/dist/redis-adapter-D2E2S3GB.cjs +13 -0
- package/dist/{redis-adapter-LPUWLE4Y.cjs.map → redis-adapter-D2E2S3GB.cjs.map} +1 -1
- package/dist/redis-adapter-VQXD7ESY.js +4 -0
- package/dist/{redis-adapter-THYDCGQR.js.map → redis-adapter-VQXD7ESY.js.map} +1 -1
- package/dist/rest/index.cjs +10 -8
- package/dist/rest/index.js +8 -6
- package/dist/sqlite-adapter-LVK5PS4T.cjs +13 -0
- package/dist/sqlite-adapter-LVK5PS4T.cjs.map +1 -0
- package/dist/sqlite-adapter-TR3U3W6Q.js +4 -0
- package/dist/sqlite-adapter-TR3U3W6Q.js.map +1 -0
- package/dist/templates/index.cjs +31 -27
- package/dist/templates/index.d.cts +8 -5
- package/dist/templates/index.d.ts +8 -5
- package/dist/templates/index.js +1 -1
- package/dist/{base-eVegJ_Pr.d.ts → tenant-B1YB0Jy8.d.ts} +10 -1
- package/dist/{base-DvvNqnM-.d.cts → tenant-Cpeveji6.d.cts} +10 -1
- package/dist/{types-DqN4ckOC.d.cts → types-D6ZLRGbH.d.cts} +19 -1
- package/dist/{types-DqN4ckOC.d.ts → types-D6ZLRGbH.d.ts} +19 -1
- package/package.json +56 -9
- package/dist/adapter-BSvBudTG.d.cts +0 -65
- package/dist/adapter-CXGB2Elb.d.ts +0 -65
- package/dist/bootstrap-4MH44YKG.js +0 -6
- package/dist/bootstrap-EE6BJZWL.cjs +0 -31
- package/dist/chunk-55BNRTLW.cjs.map +0 -1
- package/dist/chunk-5HA5OMFH.cjs.map +0 -1
- package/dist/chunk-6WXQRYTW.js.map +0 -1
- package/dist/chunk-A4USRVTQ.js +0 -115
- package/dist/chunk-A4USRVTQ.js.map +0 -1
- package/dist/chunk-AM4JKIPP.js.map +0 -1
- package/dist/chunk-E3BZLMX6.js.map +0 -1
- package/dist/chunk-H4XCAPA6.cjs.map +0 -1
- package/dist/chunk-KOCTZKPV.cjs +0 -117
- package/dist/chunk-KOCTZKPV.cjs.map +0 -1
- package/dist/chunk-QKVA2SOG.js.map +0 -1
- package/dist/chunk-QYZKIPSD.js.map +0 -1
- package/dist/chunk-R2YHJN6W.cjs.map +0 -1
- package/dist/chunk-RALQO47U.cjs.map +0 -1
- package/dist/chunk-RDRJVCL5.cjs.map +0 -1
- package/dist/chunk-S3FG2NY7.js.map +0 -1
- package/dist/chunk-TP5YQFIX.js.map +0 -1
- package/dist/chunk-TVVYZ2TH.js.map +0 -1
- package/dist/chunk-WBCIEYHC.cjs.map +0 -1
- package/dist/chunk-WSCJQI2B.js.map +0 -1
- package/dist/chunk-WVPOPOEQ.cjs.map +0 -1
- package/dist/chunk-XAEBVZTI.cjs.map +0 -1
- package/dist/chunk-XU7AFF6V.js.map +0 -1
- package/dist/chunk-Z2OVHWHB.cjs.map +0 -1
- package/dist/postgres-auth-adapter-6742WDCF.cjs +0 -14
- package/dist/postgres-auth-adapter-B65BULNS.js +0 -5
- package/dist/redis-adapter-LPUWLE4Y.cjs +0 -13
- package/dist/redis-adapter-THYDCGQR.js +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/drizzle/adapter.ts","../src/database/drizzle/database.ts"],"names":["AbstractBaseAdapter","postgres","drizzle","sql","text","uuid","sqliteText","sqliteInteger","sqliteNumeric","varchar","integer","decimal","boolean","timestamp","jsonb","sqliteTable","pgTable","applyRLS","DEFAULT_RLS_CONFIG","eq","desc","and","canAccessDocument","or","ne","inArray","like","gt","gte","lt","lte","createRequire","randomBytes","resolve","mkdir","dirname","db"],"mappings":"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","file":"chunk-2KVHZE6O.cjs","sourcesContent":["import { AbstractBaseAdapter } from '../base.js';\nimport { sql, eq, and, or, desc, ne, inArray, like, gt, gte, lt, lte } from 'drizzle-orm';\nimport {\n pgTable,\n uuid,\n varchar,\n boolean,\n timestamp,\n integer,\n text,\n jsonb,\n decimal,\n} from 'drizzle-orm/pg-core';\nimport {\n sqliteTable,\n integer as sqliteInteger,\n text as sqliteText,\n numeric as sqliteNumeric,\n} from 'drizzle-orm/sqlite-core';\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n DraftFindArgs,\n DraftUpsertArgs,\n DraftDeleteArgs,\n DraftSnapshot,\n} from '../../registry/types.js';\nimport type { Field, RelationshipField } from '../../fields/types.js';\nimport type { TenantContext } from '../../auth/rls/tenant.js';\nimport { applyRLS, DEFAULT_RLS_CONFIG, canAccessDocument } from '../../auth/rls/tenant.js';\n\nlet _schemaEnsured = false;\n\n// ============================================================================\n// Drizzle Schema Generator\n// ============================================================================\n\nexport function fieldToDrizzleType(field: Field, dialect: 'postgres' | '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' | 'sqlite' = 'postgres'\n): string {\n const tableName = collection.slug.replace(/-/g, '_');\n const lines: string[] = [];\n \n lines.push(`export const ${tableName} = pgTable('${tableName}', {`);\n \n // Add id field\n lines.push(` id: uuid('id').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}: 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: pg.timestamp('created_at').defaultNow(),`);\n lines.push(` updatedAt: pg.timestamp('updated_at').defaultNow(),`);\n }\n \n // Add status field\n lines.push(` _status: ${dialect === 'sqlite' ? 'sqlite' : 'pg'}.varchar('_status').default('published'),`);\n lines.push(` _has_draft: ${dialect === 'sqlite' ? 'sqlite' : 'pg'}.boolean('_has_draft').default(false),`);\n \n lines.push('});');\n \n return lines.join('\\n');\n}\n\n// ============================================================================\n// Drizzle Adapter\n// ============================================================================\n\nexport class DrizzleAdapter extends AbstractBaseAdapter {\n public client: any;\n private schema: any;\n public dialect: 'postgres' | 'sqlite';\n private connectionString?: string;\n private draftsTableReady = false;\n private versionsTableReady = false;\n private tenantContext?: TenantContext;\n \n setTenantContext(context: TenantContext | undefined): void {\n this.tenantContext = context;\n }\n \n getTenantContext(): TenantContext | undefined {\n return this.tenantContext;\n }\n \n constructor(options: {\n type?: 'postgres' | 'sqlite';\n client?: any;\n schema?: any;\n connectionString?: string;\n }) {\n super();\n this.schema = options.schema || {};\n \n if (options.connectionString) {\n this.connectionString = options.connectionString;\n const connStr = options.connectionString.toLowerCase();\n if (connStr.startsWith('postgres://') || connStr.startsWith('postgresql://')) {\n this.dialect = 'postgres';\n } else if (connStr.includes('.db') || connStr.includes('sqlite') || connStr.includes('file:')) {\n this.dialect = 'sqlite';\n } else {\n this.dialect = options.type || 'postgres';\n }\n } else {\n this.client = options.client;\n this.dialect = options.type || 'sqlite';\n }\n }\n\n protected prepareData(data: Record<string, any>, config: CollectionConfig): Record<string, any> {\n const result = super.prepareData(data, config);\n\n // Convert ISO date strings to Date objects for Drizzle timestamp columns\n if (result.createdAt && typeof result.createdAt === \"string\") {\n result.createdAt = new Date(result.createdAt);\n }\n if (result.updatedAt && typeof result.updatedAt === \"string\") {\n result.updatedAt = new Date(result.updatedAt);\n }\n\n // Process complex fields — Drizzle ORM handles JSONB serialization natively,\n // so we only stringify for non-jsonb types and keep objects for jsonb columns.\n for (const field of config.fields) {\n const dbType = fieldToDrizzleType(field, this.dialect);\n const isJsonb = dbType === \"jsonb\";\n\n if (field.type === 'tabs' && 'tabs' in field && field.name) {\n const tabData = data[field.name];\n if (tabData && typeof tabData === 'object') {\n const processedTabData: any = {};\n for (const [key, value] of Object.entries(tabData)) {\n const tabField = field.tabs.flatMap((t: any) => t.fields).find((f: any) => f.name === key);\n const needsStringify = (tabField?.type === 'upload' || tabField?.type === 'image' || tabField?.type === 'list' || tabField?.type === 'relationship-block') && value;\n if (needsStringify) {\n processedTabData[key] = Array.isArray(value) ? JSON.stringify(value) : typeof value === 'object' ? JSON.stringify(value) : value;\n } else {\n processedTabData[key] = value;\n }\n }\n result[field.name] = isJsonb ? processedTabData : JSON.stringify(processedTabData);\n }\n }\n\n if ((field as any).type === 'upload' || (field as any).type === 'image' || (field as any).type === 'list' || (field as any).type === 'relationship-block') {\n if (field.name) {\n const value = data[field.name];\n if (value) {\n result[field.name] = isJsonb ? value : (Array.isArray(value) ? JSON.stringify(value) : typeof value === 'object' ? JSON.stringify(value) : value);\n }\n }\n }\n }\n \n return result;\n }\n\n async connect(): Promise<void> {\n if (this.connectionString && !this.client) {\n if (this.dialect === 'postgres') {\n const { default: postgres } = await import('postgres');\n const { drizzle } = await import('drizzle-orm/postgres-js');\n const sql = postgres(this.connectionString, { onnotice: () => {} });\n this.client = drizzle(sql, { schema: this.schema });\n } else if (this.dialect === 'sqlite') {\n const { default: betterSqlite3 } = await import('better-sqlite3');\n const { drizzle } = await import('drizzle-orm/better-sqlite3');\n const db = new betterSqlite3(this.connectionString.replace('file:', ''));\n this.client = drizzle(db, { schema: this.schema });\n }\n }\n this.connected = true;\n console.log(`[DrizzleAdapter] Connected to ${this.dialect}`);\n }\n\n async init(collections: CollectionConfig[], globals: GlobalConfig[] = []): Promise<void> {\n await super.init(collections, globals);\n\n if (this.connectionString && !this.client) {\n await this.connect();\n }\n\n if (this.client && !_schemaEnsured) {\n for (const config of collections) {\n const tableName = this.getTableName(config.slug);\n if (!this.schema[tableName]) {\n this.schema[tableName] = this.createTableFromConfig(config);\n }\n }\n await this.ensureCollectionTables(collections);\n\n // Create tables for globals (stored as _globals_{slug})\n const globalCollections: CollectionConfig[] = globals.map((g) => ({\n slug: `_globals_${g.slug}`,\n fields: g.fields,\n label: g.label,\n }));\n for (const gc of globalCollections) {\n const tableName = this.getTableName(gc.slug);\n if (!this.schema[tableName]) {\n this.schema[tableName] = this.createTableFromConfig(gc, true);\n }\n // Register in collections so CRUD methods can find them\n if (!this.collections.has(gc.slug)) {\n this.collections.set(gc.slug, gc as CollectionConfig);\n }\n }\n await this.ensureCollectionTables(globalCollections);\n _schemaEnsured = true;\n }\n }\n\n private createTableFromConfig(config: CollectionConfig, useTextId = false): any {\n const tableName = this.getTableName(config.slug);\n const columns: Record<string, any> = {\n id: useTextId ? text(\"id\").primaryKey() : uuid(\"id\").primaryKey().defaultRandom(),\n };\n\n for (const field of config.fields) {\n if (!field.name || field.name === \"id\") continue;\n const dbType = fieldToDrizzleType(field, this.dialect);\n const propName = field.name.replace(/-/g, \"_\");\n const sqlName = propName.replace(/([A-Z])/g, \"_$1\").toLowerCase();\n\n let col: any;\n if (this.dialect === 'sqlite') {\n switch (dbType) {\n case \"varchar\":\n case \"text\":\n col = sqliteText(sqlName);\n break;\n case \"integer\":\n col = sqliteInteger(sqlName);\n break;\n case \"decimal\":\n case \"numeric\":\n col = sqliteNumeric(sqlName);\n break;\n case \"boolean\":\n col = sqliteInteger(sqlName, { mode: 'boolean' });\n break;\n case \"timestamp\":\n col = sqliteText(sqlName);\n break;\n case \"jsonb\":\n col = sqliteText(sqlName);\n break;\n default:\n col = sqliteText(sqlName);\n }\n } else {\n switch (dbType) {\n case \"varchar\":\n col = varchar(sqlName, { length: 255 });\n break;\n case \"integer\":\n col = integer(sqlName);\n break;\n case \"decimal\":\n col = decimal(sqlName);\n break;\n case \"boolean\":\n col = boolean(sqlName);\n break;\n case \"timestamp\":\n col = timestamp(sqlName);\n break;\n case \"jsonb\":\n col = jsonb(sqlName);\n break;\n default:\n col = text(sqlName);\n }\n }\n if (!field.required) col = col.default(null);\n columns[propName] = col;\n }\n\n if (!columns.createdAt) columns.createdAt = this.dialect === 'sqlite' ? sqliteText(\"created_at\").default(new Date().toISOString()) : timestamp(\"created_at\").defaultNow();\n if (!columns.updatedAt) columns.updatedAt = this.dialect === 'sqlite' ? sqliteText(\"updated_at\").default(new Date().toISOString()) : timestamp(\"updated_at\").defaultNow();\n columns._status = this.dialect === 'sqlite' ? sqliteText(\"_status\").default(\"published\") : varchar(\"_status\", { length: 20 }).default(\"published\");\n columns._has_draft = this.dialect === 'sqlite' ? sqliteInteger(\"_has_draft\", { mode: 'boolean' }).default(false) : boolean(\"_has_draft\").default(false);\n\n return this.dialect === 'sqlite'\n ? sqliteTable(tableName, columns)\n : pgTable(tableName, columns);\n }\n\n private async ensureCollectionTables(collections: CollectionConfig[]): Promise<void> {\n const statements: string[] = [];\n for (const config of collections) {\n const isGlobal = config.slug.startsWith(\"_globals_\");\n const tableName = this.getTableName(config.slug);\n const colDefs = this.generateCreateColumns(config);\n const hasCreated = config.fields.some((f) => f.name === \"createdAt\");\n const hasUpdated = config.fields.some((f) => f.name === \"updatedAt\");\n \n if (this.dialect === 'postgres') {\n const idCol = isGlobal ? '\"id\" TEXT PRIMARY KEY' : '\"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid()';\n statements.push(`\n CREATE TABLE IF NOT EXISTS \"${tableName}\" (\n ${idCol},\n ${colDefs}\n ${hasCreated ? \"\" : '\"created_at\" TIMESTAMP NOT NULL DEFAULT NOW(),'}\n ${hasUpdated ? \"\" : '\"updated_at\" TIMESTAMP NOT NULL DEFAULT NOW(),'}\n \"_status\" VARCHAR(20) DEFAULT 'published',\n \"_has_draft\" BOOLEAN DEFAULT false\n )\n `);\n } else {\n const idCol = isGlobal ? '\"id\" TEXT PRIMARY KEY' : '\"id\" TEXT PRIMARY KEY';\n statements.push(`\n CREATE TABLE IF NOT EXISTS \"${tableName}\" (\n ${idCol},\n ${colDefs}\n ${hasCreated ? \"\" : '\"created_at\" TEXT NOT NULL DEFAULT (datetime(\\'now\\')),'}\n ${hasUpdated ? \"\" : '\"updated_at\" TEXT NOT NULL DEFAULT (datetime(\\'now\\')),'}\n \"_status\" TEXT DEFAULT 'published',\n \"_has_draft\" INTEGER DEFAULT 0\n )\n `);\n }\n }\n if (statements.length > 0) {\n if (this.dialect === 'postgres') {\n await this.client.execute(sql.raw(statements.join(\";\\n\")));\n } else {\n for (const stmt of statements) {\n await this.client.execute(sql.raw(stmt));\n }\n }\n }\n }\n\n private generateCreateColumns(config: CollectionConfig): string {\n const cols: string[] = [];\n for (const field of config.fields) {\n if (!field.name || field.name === \"id\") continue;\n const dbType = fieldToDrizzleType(field, this.dialect);\n const sqlName = field.name\n .replace(/-/g, \"_\")\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase();\n const nullable = field.required ? \"NOT NULL\" : \"DEFAULT NULL\";\n\n let sqlType: string;\n if (this.dialect === 'sqlite') {\n switch (dbType) {\n case \"varchar\":\n case \"text\":\n sqlType = `TEXT ${nullable}`;\n break;\n case \"integer\":\n sqlType = `INTEGER ${nullable}`;\n break;\n case \"decimal\":\n case \"numeric\":\n sqlType = `NUMERIC ${nullable}`;\n break;\n case \"boolean\":\n sqlType = `INTEGER ${nullable}`;\n break;\n case \"timestamp\":\n sqlType = `TEXT ${nullable}`;\n break;\n case \"jsonb\":\n sqlType = `TEXT ${nullable}`;\n break;\n default:\n sqlType = `TEXT ${nullable}`;\n }\n } else {\n switch (dbType) {\n case \"varchar\":\n sqlType = `VARCHAR(255) ${nullable}`;\n break;\n case \"integer\":\n sqlType = `INTEGER ${nullable}`;\n break;\n case \"decimal\":\n sqlType = `DECIMAL ${nullable}`;\n break;\n case \"boolean\":\n sqlType = `BOOLEAN ${nullable}`;\n break;\n case \"timestamp\":\n sqlType = `TIMESTAMP ${nullable}`;\n break;\n case \"jsonb\":\n sqlType = `JSONB ${nullable}`;\n break;\n default:\n sqlType = `TEXT ${nullable}`;\n }\n }\n cols.push(`\"${sqlName}\" ${sqlType}`);\n }\n return cols.join(\",\\n \") + (cols.length > 0 ? \",\" : \"\");\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, draft } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n let effectiveWhere = { ...where };\n if (this.tenantContext && config.tenantScoped) {\n const rlsQuery = applyRLS({ where: effectiveWhere }, slug, this.tenantContext, DEFAULT_RLS_CONFIG);\n effectiveWhere = rlsQuery.where || {};\n }\n\n // Build query\n const filters = this.buildWhereClause(effectiveWhere, config, table, tenantID);\n \n // Default filter for non-draft requests: only show published\n if (!draft && table._status) {\n filters.push(eq(table._status, 'published'));\n }\n\n const sortOption = this.parseSort(sort);\n\n // Get total count\n const totalDocs = await this.count({ collection: slug, where: effectiveWhere, tenantID });\n\n // Execute query\n const offset = (page - 1) * limit;\n \n let results = [];\n try {\n const sortCol = table[sortOption.field] || table.createdAt || table.id;\n const sorted = sortOption.direction === 'asc' ? sortCol : desc(sortCol);\n let query = this.client.select().from(table);\n \n if (filters.length > 0) {\n query = query.where(and(...filters));\n }\n \n results = await query.orderBy(sorted).limit(limit).offset(offset);\n } catch (error) {\n console.error(`[DrizzleAdapter] Query error:`, error);\n }\n\n let docs: T[] = results.map((doc: any) => this.processResult(doc, config));\n\n if (this.tenantContext && !this.tenantContext.isSuperAdmin) {\n docs = docs.filter((doc: any) => canAccessDocument(doc, slug, this.tenantContext!, DEFAULT_RLS_CONFIG)) as T[];\n }\n\n // If draft: true, we need to check if any docs have a separate draft version\n if (draft) {\n docs = await Promise.all(docs.map(async (doc: any) => {\n if (doc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: doc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n return { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };\n }\n }\n return doc;\n }));\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, draft } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n if (this.tenantContext && config.tenantScoped) {\n const tempDoc = { id, tenantId: this.tenantContext.tenantId };\n if (!canAccessDocument(tempDoc, slug, this.tenantContext, DEFAULT_RLS_CONFIG)) {\n return null;\n }\n }\n\n const conditions = [eq(table.id, id)];\n if (tenantID && table.tenantId) conditions.push(eq(table.tenantId, tenantID));\n if (!draft && table._status) conditions.push(eq(table._status, \"published\"));\n const whereClause = conditions.length > 1 ? and(...conditions) : conditions[0];\n let allRows = await this.client.select().from(table).where(whereClause);\n if (allRows.length === 0) return null;\n let doc = this.processResult(allRows[0], config) as T;\n\n // If draft: true and doc has a separate draft, merge it\n if (draft && (doc as any)._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: (doc as any).id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: (doc as any)._status };\n }\n }\n\n return doc;\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(eq(table.id, 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(eq(table.id, id))\n .returning();\n\n if (tenantID && table.tenantId) {\n query = query.where(eq(table.tenantId, 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, table, tenantID);\n\n try {\n let query = this.client.select({ count: sql<number>`count(*)` }).from(table);\n \n if (filters.length > 0) {\n query = query.where(and(...filters));\n }\n\n const result = await query;\n return Number(result[0]?.count || 0);\n } catch {\n return 0;\n }\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string; draft?: boolean }): Promise<any> {\n const { collection: slug, where = {}, tenantID, draft } = args;\n \n // Check if it's a Global\n if (slug.startsWith('_globals_')) {\n const globalSlug = slug.replace('_globals_', '');\n const globalConfig = this.globals.get(globalSlug);\n if (!globalConfig) throw new Error(`Global \"${globalSlug}\" not found`);\n \n const table = this.getTable(slug);\n let query = this.client.select().from(table);\n \n if (!draft && table._status) {\n query = query.where(eq(table._status, 'published'));\n }\n\n const results = await query.limit(1);\n if (results.length === 0) return null;\n\n let doc = this.processResult(results[0], globalConfig as any);\n\n // If draft: true and doc has a separate draft, merge it\n if (draft && (doc as any)._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: globalSlug,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: (doc as any)._status };\n }\n }\n return doc;\n }\n\n const result = await this.find({ ...args, limit: 1 });\n return result.docs[0] || null;\n }\n\n async findVersions(args: any): Promise<FindResult<any>> {\n await this.ensureVersionsTable();\n const { collection: slug, documentId, limit = 10, page = 1, tenantID } = args;\n\n const offset = (page - 1) * limit;\n \n const countResult = await this.executeRaw(sql`\n SELECT count(*) as count \n FROM kyro_versions \n WHERE collection_slug = ${slug} \n AND document_id = ${documentId}\n ${tenantID ? sql`AND tenant_id = ${tenantID}` : sql``}\n `);\n const totalDocs = parseInt(countResult[0]?.count || '0');\n\n const results = await this.executeRaw(sql`\n SELECT * \n FROM kyro_versions \n WHERE collection_slug = ${slug} \n AND document_id = ${documentId}\n ${tenantID ? sql`AND tenant_id = ${tenantID}` : sql``}\n ORDER BY created_at DESC\n LIMIT ${limit}\n OFFSET ${offset}\n `);\n\n return {\n docs: results.map(row => ({\n ...row,\n data: typeof row.data === 'string' ? JSON.parse(row.data) : row.data,\n })),\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findVersionByID(args: { collection: string; versionId: string; tenantID?: string }): Promise<any> {\n await this.ensureVersionsTable();\n const results = await this.executeRaw(sql`\n SELECT * FROM kyro_versions \n WHERE id = ${args.versionId} \n AND collection_slug = ${args.collection}\n ${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}\n LIMIT 1\n `);\n \n if (results.length === 0) return null;\n const row = results[0];\n return {\n ...row,\n data: typeof row.data === 'string' ? JSON.parse(row.data) : row.data,\n };\n }\n\n async createVersion(args: any): Promise<any> {\n await this.ensureVersionsTable();\n const id = Math.random().toString(36).substring(2, 15);\n const now = new Date().toISOString();\n \n await this.executeRaw(sql`\n INSERT INTO kyro_versions (\n id, collection_slug, document_id, tenant_id, data, status, created_by, change_description, created_at, updated_at\n ) VALUES (\n ${id}, ${args.collection}, ${args.documentId}, ${args.tenantID || null}, \n ${JSON.stringify(args.data)}, ${args.status}, ${args.createdBy || null}, \n ${args.changeDescription || null}, ${now}, ${now}\n )\n `);\n\n // Pruning logic\n const config = this.getCollection(args.collection);\n if (config.versions?.maxPerDoc) {\n await this.deleteVersions({\n collection: args.collection,\n documentId: args.documentId,\n keepLatest: config.versions.maxPerDoc,\n tenantID: args.tenantID,\n });\n }\n\n return this.findVersionByID({ collection: args.collection, versionId: id, tenantID: args.tenantID });\n }\n\n async deleteVersions(args: { collection: string; documentId: string; keepLatest?: number; tenantID?: string }): Promise<void> {\n await this.ensureVersionsTable();\n \n if (args.keepLatest) {\n // Find IDs of latest versions to keep\n const toKeep = await this.executeRaw(sql`\n SELECT id FROM kyro_versions\n WHERE collection_slug = ${args.collection}\n AND document_id = ${args.documentId}\n ${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}\n ORDER BY created_at DESC\n LIMIT ${args.keepLatest}\n `);\n \n const keepIds = toKeep.map(r => r.id);\n if (keepIds.length > 0) {\n await this.executeRaw(sql`\n DELETE FROM kyro_versions\n WHERE collection_slug = ${args.collection}\n AND document_id = ${args.documentId}\n AND id NOT IN (${sql.join(keepIds.map(id => sql`${id}`), sql`, `)})\n `);\n }\n } else {\n await this.executeRaw(sql`\n DELETE FROM kyro_versions\n WHERE collection_slug = ${args.collection}\n AND document_id = ${args.documentId}\n ${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}\n `);\n }\n }\n\n async findDraft<T>(args: DraftFindArgs): Promise<DraftSnapshot<T> | null> {\n await this.ensureDraftsTable();\n\n const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);\n const rows = await this.executeRaw<any>(sql`\n SELECT *\n FROM kyro_drafts\n WHERE id = ${draftId}\n LIMIT 1\n `);\n const row = rows[0];\n return row ? this.rowToDraft<T>(row) : null;\n }\n\n async upsertDraft<T>(args: DraftUpsertArgs<T>): Promise<DraftSnapshot<T>> {\n await this.ensureDraftsTable();\n\n const now = new Date().toISOString();\n const draftUpdatedAt = args.draftUpdatedAt || now;\n const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);\n const existing = await this.findDraft<T>(args);\n\n if (existing) {\n await this.executeRaw(sql`\n UPDATE kyro_drafts\n SET\n data = ${JSON.stringify(args.data)},\n base_updated_at = ${args.baseUpdatedAt ?? null},\n draft_updated_at = ${draftUpdatedAt},\n updated_at = ${now}\n WHERE id = ${draftId}\n `);\n } else {\n await this.executeRaw(sql`\n INSERT INTO kyro_drafts (\n id, collection_slug, document_id, tenant_id, data, base_updated_at, draft_updated_at, created_at, updated_at\n ) VALUES (\n ${draftId},\n ${args.collection},\n ${args.documentId},\n ${args.tenantID ?? null},\n ${JSON.stringify(args.data)},\n ${args.baseUpdatedAt ?? null},\n ${draftUpdatedAt},\n ${now},\n ${now}\n )\n `);\n }\n\n const saved = await this.findDraft<T>(args);\n if (!saved) {\n throw new Error('Failed to persist draft snapshot');\n }\n return saved;\n }\n\n async deleteDraft(args: DraftDeleteArgs): Promise<void> {\n await this.ensureDraftsTable();\n\n const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);\n await this.executeRaw(sql`\n DELETE FROM kyro_drafts\n WHERE id = ${draftId}\n `);\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 table: any,\n tenantID?: string\n ): any[] {\n const conditions: any[] = [];\n\n if (tenantID && config.tenantScoped && table.tenantId) {\n conditions.push(eq(table.tenantId, tenantID));\n }\n\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' && Array.isArray(value)) {\n const andConditions = value\n .map((sub: any) => this.buildWhereClause(sub, config, table))\n .flat()\n .filter(Boolean);\n if (andConditions.length > 0) {\n conditions.push(and(...andConditions));\n }\n } else if (key === 'OR' && Array.isArray(value)) {\n const orConditions = value\n .map((sub: any) => this.buildWhereClause(sub, config, table))\n .flat()\n .filter(Boolean);\n if (orConditions.length > 0) {\n conditions.push(or(...orConditions));\n }\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const col = table[key];\n if (!col) continue;\n\n if (value.equals !== undefined) conditions.push(eq(col, value.equals));\n if (value.not_equals !== undefined) conditions.push(ne(col, value.not_equals));\n if (value.in && Array.isArray(value.in)) conditions.push(inArray(col, value.in));\n if (value.like !== undefined) conditions.push(like(col, value.like));\n if (value.contains !== undefined) conditions.push(like(col, `%${value.contains}%`));\n if (value.greater_than !== undefined) conditions.push(gt(col, value.greater_than));\n if (value.greater_than_equal !== undefined) conditions.push(gte(col, value.greater_than_equal));\n if (value.less_than !== undefined) conditions.push(lt(col, value.less_than));\n if (value.less_than_equal !== undefined) conditions.push(lte(col, value.less_than_equal));\n } else {\n const col = table[key];\n if (col) conditions.push(eq(col, value));\n }\n }\n\n return conditions;\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 // Map snake_case SQL column names to camelCase field names\n // (createTableFromConfig converts field names like featuredImage → featured_image in SQL)\n for (const field of config.fields) {\n if (!field.name) continue;\n const sqlKey = field.name.replace(/-/g, \"_\").replace(/([A-Z])/g, \"_$1\").toLowerCase();\n if (sqlKey !== field.name && result[sqlKey] !== undefined && result[field.name] === undefined) {\n result[field.name] = result[sqlKey];\n delete result[sqlKey];\n }\n }\n\n // Parse JSON fields and upload/image fields\n for (const field of config.fields) {\n if (['json', 'richtext', 'array', 'group', 'blocks', 'upload', 'image', 'list', 'relationship-block'].includes((field as any).type)) {\n const f = field as any;\n if (result[f.name] && typeof result[f.name] === 'string') {\n try {\n const parsed = JSON.parse(result[f.name]);\n result[f.name] = parsed;\n } catch {\n // Keep original value\n }\n }\n }\n \n // Handle nested tab fields - build nested structure\n if (field.type === 'tabs' && 'tabs' in field && field.name) {\n // If the tabs column already has an object (from JSONB or parsed above), use it directly\n if (typeof result[field.name] === 'object' && result[field.name] !== null && !Array.isArray(result[field.name])) {\n continue; // Already resolved\n }\n // If the tabs column is a JSON string, parse it\n if (typeof result[field.name] === 'string') {\n try {\n const parsed = JSON.parse(result[field.name]);\n if (typeof parsed === 'object' && parsed !== null) {\n result[field.name] = parsed;\n continue;\n }\n } catch { /* fall through to flat rebuild */ }\n }\n const tabData: any = {};\n for (const tab of field.tabs) {\n for (const tabField of tab.fields) {\n if (tabField.name && result[tabField.name] !== undefined) {\n let value = result[tabField.name];\n if (['json', 'richtext', 'array', 'group', 'blocks', 'upload', 'image', 'list', 'relationship-block'].includes((tabField as any).type)) {\n if (value && typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n // Keep original value\n }\n }\n }\n tabData[tabField.name] = value;\n delete result[tabField.name];\n }\n }\n }\n result[field.name] = tabData;\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 private async ensureDraftsTable(): Promise<void> {\n if (_schemaEnsured || this.draftsTableReady) return;\n\n let createTableSQL: string;\n if (this.dialect === 'sqlite') {\n createTableSQL = `\n CREATE TABLE IF NOT EXISTS kyro_drafts (\n id text PRIMARY KEY,\n collection_slug text NOT NULL,\n document_id text NOT NULL,\n tenant_id text,\n data text NOT NULL,\n base_updated_at text,\n draft_updated_at text NOT NULL,\n created_at text DEFAULT (datetime('now')),\n updated_at text DEFAULT (datetime('now'))\n )\n `;\n } else {\n createTableSQL = `\n CREATE TABLE IF NOT EXISTS kyro_drafts (\n id text PRIMARY KEY,\n collection_slug text NOT NULL,\n document_id text NOT NULL,\n tenant_id text,\n data text NOT NULL,\n base_updated_at text,\n draft_updated_at text NOT NULL,\n created_at text NOT NULL,\n updated_at text NOT NULL\n )\n `;\n }\n\n await this.executeRaw(sql.raw(createTableSQL));\n this.draftsTableReady = true;\n }\n\n private async ensureVersionsTable(): Promise<void> {\n if (_schemaEnsured || this.versionsTableReady) return;\n\n let createTableSQL: string;\n if (this.dialect === 'sqlite') {\n createTableSQL = `\n CREATE TABLE IF NOT EXISTS kyro_versions (\n id text PRIMARY KEY,\n collection_slug text NOT NULL,\n document_id text NOT NULL,\n tenant_id text,\n data text NOT NULL,\n status text NOT NULL DEFAULT 'draft',\n created_by text,\n change_description text,\n created_at text DEFAULT (datetime('now')),\n updated_at text DEFAULT (datetime('now'))\n )\n `;\n } else {\n createTableSQL = `\n CREATE TABLE IF NOT EXISTS kyro_versions (\n id text PRIMARY KEY,\n collection_slug text NOT NULL,\n document_id text NOT NULL,\n tenant_id text,\n data text NOT NULL,\n status text NOT NULL,\n created_by text,\n change_description text,\n created_at text NOT NULL,\n updated_at text NOT NULL\n )\n `;\n }\n\n await this.executeRaw(sql.raw(createTableSQL));\n this.versionsTableReady = true;\n }\n\n private getDraftId(collection: string, documentId: string, tenantID?: string): string {\n return `${collection}::${documentId}::${tenantID || 'global'}`;\n }\n\n private async executeRaw<T = any>(query: any): Promise<T[]> {\n const result = await this.client.execute(query);\n if (Array.isArray(result)) {\n return result as T[];\n }\n if (Array.isArray(result?.rows)) {\n return result.rows as T[];\n }\n if (Array.isArray(result?.[0])) {\n return result[0] as T[];\n }\n return [];\n }\n\n private rowToDraft<T>(row: any): DraftSnapshot<T> {\n return {\n id: String(row.id),\n collection: row.collection_slug,\n documentId: row.document_id,\n tenantID: row.tenant_id ?? undefined,\n data: row.data ? JSON.parse(row.data) : {},\n baseUpdatedAt: row.base_updated_at ?? null,\n draftUpdatedAt: row.draft_updated_at,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport function createDrizzleAdapter(options: {\n type?: 'postgres' | 'sqlite';\n client?: any;\n schema?: any;\n connectionString?: string;\n}): DrizzleAdapter {\n return new DrizzleAdapter(options);\n}\n","import { drizzle } from \"drizzle-orm/postgres-js\";\nimport postgres from \"postgres\";\nimport { randomBytes } from \"crypto\";\nimport { mkdir } from \"fs/promises\";\nimport { dirname, resolve } from \"path\";\nimport { createRequire } from \"module\";\nconst _require = createRequire(import.meta.url);\nconst modPath = \"node:\" + \"sqlite\";\nconst { DatabaseSync } = _require(modPath) as typeof import(\"node:sqlite\");\n\nexport type Dialect = \"sqlite\" | \"postgres\";\n\nfunction getDialect(): Dialect {\n const val = process.env.DB_TYPE as Dialect | undefined;\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 DatabaseSync(dbPath);\n db.exec(\"PRAGMA journal_mode = WAL\");\n return { db, dialect, genId };\n }\n\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 onnotice: () => {},\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"]}
|
|
@@ -429,8 +429,61 @@ var PostgresAuthAdapter = class {
|
|
|
429
429
|
userAgent: session.userAgent || void 0
|
|
430
430
|
};
|
|
431
431
|
}
|
|
432
|
+
async createEmailVerificationToken(userId) {
|
|
433
|
+
const token = crypto$1.randomBytes(32).toString("hex");
|
|
434
|
+
const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1e3);
|
|
435
|
+
await this.db.insert(chunkWQBRWOQT_cjs.emailVerifications).values({
|
|
436
|
+
userId,
|
|
437
|
+
token,
|
|
438
|
+
expiresAt
|
|
439
|
+
});
|
|
440
|
+
return { token, expiresAt };
|
|
441
|
+
}
|
|
442
|
+
async verifyEmailToken(token) {
|
|
443
|
+
const [verification] = await this.db.select().from(chunkWQBRWOQT_cjs.emailVerifications).where(drizzleOrm.eq(chunkWQBRWOQT_cjs.emailVerifications.token, token)).limit(1);
|
|
444
|
+
if (!verification) {
|
|
445
|
+
return { success: false, error: "Invalid verification token" };
|
|
446
|
+
}
|
|
447
|
+
if (verification.expiresAt < /* @__PURE__ */ new Date()) {
|
|
448
|
+
return { success: false, error: "Verification token has expired" };
|
|
449
|
+
}
|
|
450
|
+
await this.db.update(chunkWQBRWOQT_cjs.users).set({ emailVerified: true }).where(drizzleOrm.eq(chunkWQBRWOQT_cjs.users.id, verification.userId));
|
|
451
|
+
await this.db.delete(chunkWQBRWOQT_cjs.emailVerifications).where(drizzleOrm.eq(chunkWQBRWOQT_cjs.emailVerifications.id, verification.id));
|
|
452
|
+
return { success: true, userId: verification.userId };
|
|
453
|
+
}
|
|
454
|
+
async createPasswordResetToken(email) {
|
|
455
|
+
const user = await this.findUserByEmail(email);
|
|
456
|
+
if (!user) {
|
|
457
|
+
return { token: "", expiresAt: /* @__PURE__ */ new Date(), error: "User not found" };
|
|
458
|
+
}
|
|
459
|
+
const token = crypto$1.randomBytes(32).toString("hex");
|
|
460
|
+
const expiresAt = new Date(Date.now() + 60 * 60 * 1e3);
|
|
461
|
+
await this.db.insert(chunkWQBRWOQT_cjs.passwordResets).values({
|
|
462
|
+
userId: user.id,
|
|
463
|
+
token,
|
|
464
|
+
expiresAt
|
|
465
|
+
});
|
|
466
|
+
return { token, expiresAt };
|
|
467
|
+
}
|
|
468
|
+
async resetPasswordWithToken(token, newPassword) {
|
|
469
|
+
const [reset] = await this.db.select().from(chunkWQBRWOQT_cjs.passwordResets).where(drizzleOrm.eq(chunkWQBRWOQT_cjs.passwordResets.token, token)).limit(1);
|
|
470
|
+
if (!reset) {
|
|
471
|
+
return { success: false, error: "Invalid reset token" };
|
|
472
|
+
}
|
|
473
|
+
if (reset.expiresAt < /* @__PURE__ */ new Date()) {
|
|
474
|
+
return { success: false, error: "Reset token has expired" };
|
|
475
|
+
}
|
|
476
|
+
if (reset.usedAt) {
|
|
477
|
+
return { success: false, error: "Reset token has already been used" };
|
|
478
|
+
}
|
|
479
|
+
const passwordHash = await this.hashPassword(newPassword);
|
|
480
|
+
await this.db.update(chunkWQBRWOQT_cjs.users).set({ passwordHash, updatedAt: /* @__PURE__ */ new Date() }).where(drizzleOrm.eq(chunkWQBRWOQT_cjs.users.id, reset.userId));
|
|
481
|
+
await this.db.update(chunkWQBRWOQT_cjs.passwordResets).set({ usedAt: /* @__PURE__ */ new Date() }).where(drizzleOrm.eq(chunkWQBRWOQT_cjs.passwordResets.id, reset.id));
|
|
482
|
+
await this.db.delete(chunkWQBRWOQT_cjs.sessions).where(drizzleOrm.eq(chunkWQBRWOQT_cjs.sessions.userId, reset.userId));
|
|
483
|
+
return { success: true };
|
|
484
|
+
}
|
|
432
485
|
};
|
|
433
486
|
|
|
434
487
|
exports.PostgresAuthAdapter = PostgresAuthAdapter;
|
|
435
|
-
//# sourceMappingURL=chunk-
|
|
436
|
-
//# sourceMappingURL=chunk-
|
|
488
|
+
//# sourceMappingURL=chunk-2OL4O2TH.cjs.map
|
|
489
|
+
//# sourceMappingURL=chunk-2OL4O2TH.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/drizzle/postgres-auth-adapter.ts"],"names":["sql","users","eq","rows","count","desc","bcrypt","randomBytes","sessions","and","gt","passwordHistory","lockouts","auditLogs","emailVerifications","passwordResets"],"mappings":"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","file":"chunk-2OL4O2TH.cjs","sourcesContent":["import type { PostgresJsDatabase } from \"drizzle-orm/postgres-js\";\nimport { eq, and, gt, desc, sql } from \"drizzle-orm\";\nimport bcrypt from \"bcryptjs\";\nimport { randomBytes, randomUUID } from \"crypto\";\nimport type {\n AuthAdapter,\n AuthUser,\n Session,\n UserRole,\n} from \"../../auth/types.js\";\nimport {\n users,\n sessions,\n passwordHistory,\n auditLogs,\n lockouts,\n roles,\n permissions,\n tenants,\n apiKeys,\n emailVerifications,\n passwordResets,\n type AuthUser as AuthUserRow,\n} from \"./schema/auth.js\";\nimport type {\n AuditLog,\n AuditLogFilter,\n} from \"../../auth/security/audit-log.js\";\n\nexport interface PostgresAuthAdapterOptions {\n db: PostgresJsDatabase;\n prefix?: string;\n sessionTTL?: number;\n refreshTokenTTL?: number;\n}\n\nlet _tablesEnsured = false;\n\nexport class PostgresAuthAdapter implements AuthAdapter {\n private db: PostgresJsDatabase;\n private prefix: string;\n private sessionTTL: number;\n private refreshTokenTTL: number;\n\n constructor(options: PostgresAuthAdapterOptions) {\n this.db = options.db;\n this.prefix = options.prefix || \"kyro:\";\n this.sessionTTL = options.sessionTTL || 86400;\n this.refreshTokenTTL = options.refreshTokenTTL || 604800;\n }\n\n async connect(): Promise<void> {\n if (_tablesEnsured) return;\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"users\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"name\" VARCHAR(255),\n \"email\" VARCHAR(255) NOT NULL,\n \"password_hash\" VARCHAR(255),\n \"role\" VARCHAR(50) NOT NULL DEFAULT 'customer',\n \"tenant_id\" UUID,\n \"email_verified\" BOOLEAN DEFAULT false,\n \"locked\" BOOLEAN DEFAULT false,\n \"last_login\" TIMESTAMP,\n \"failed_login_attempts\" INTEGER DEFAULT 0,\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 UNIQUE INDEX IF NOT EXISTS \"users_email_idx\" ON \"users\" (\"email\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"users_tenant_idx\" ON \"users\" (\"tenant_id\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"users_role_idx\" ON \"users\" (\"role\")`);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"sessions\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"user_id\" UUID NOT NULL REFERENCES \"users\"(\"id\") ON DELETE CASCADE,\n \"token\" VARCHAR(512) NOT NULL UNIQUE,\n \"refresh_token\" VARCHAR(512),\n \"ip_address\" VARCHAR(45),\n \"user_agent\" TEXT,\n \"expires_at\" TIMESTAMP NOT NULL,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"sessions_user_idx\" ON \"sessions\" (\"user_id\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"sessions_token_idx\" ON \"sessions\" (\"token\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"sessions_expires_idx\" ON \"sessions\" (\"expires_at\")`);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"audit_logs\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"action\" VARCHAR(100) NOT NULL,\n \"user_id\" UUID REFERENCES \"users\"(\"id\") ON DELETE SET NULL,\n \"user_email\" VARCHAR(255),\n \"role\" VARCHAR(50),\n \"resource\" VARCHAR(100) NOT NULL,\n \"resource_id\" UUID,\n \"changes\" JSONB,\n \"ip_address\" VARCHAR(45),\n \"user_agent\" TEXT,\n \"success\" BOOLEAN NOT NULL DEFAULT true,\n \"error\" TEXT,\n \"metadata\" JSONB,\n \"timestamp\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"audit_logs_user_idx\" ON \"audit_logs\" (\"user_id\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"audit_logs_action_idx\" ON \"audit_logs\" (\"action\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"audit_logs_resource_idx\" ON \"audit_logs\" (\"resource\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"audit_logs_timestamp_idx\" ON \"audit_logs\" (\"timestamp\")`);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"password_history\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"user_id\" UUID NOT NULL REFERENCES \"users\"(\"id\") ON DELETE CASCADE,\n \"password_hash\" VARCHAR(255) NOT NULL,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"password_history_user_idx\" ON \"password_history\" (\"user_id\")`);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"lockouts\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"user_id\" UUID NOT NULL REFERENCES \"users\"(\"id\") ON DELETE CASCADE,\n \"ip_address\" VARCHAR(45),\n \"reason\" VARCHAR(255),\n \"locked_until\" TIMESTAMP NOT NULL,\n \"released_at\" TIMESTAMP,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"lockouts_user_idx\" ON \"lockouts\" (\"user_id\")`);\n await this.db.execute(sql`CREATE INDEX IF NOT EXISTS \"lockouts_locked_until_idx\" ON \"lockouts\" (\"locked_until\")`);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"roles\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"name\" VARCHAR(100) NOT NULL UNIQUE,\n \"level\" INTEGER NOT NULL DEFAULT 0,\n \"inherits\" TEXT[],\n \"description\" TEXT,\n \"permissions\" JSONB DEFAULT '[]',\n \"is_system\" BOOLEAN DEFAULT false,\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 \"roles_level_idx\" ON \"roles\" (\"level\")`);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"tenants\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"name\" VARCHAR(255) NOT NULL,\n \"slug\" VARCHAR(100) NOT NULL UNIQUE,\n \"settings\" JSONB DEFAULT '{}',\n \"is_active\" BOOLEAN DEFAULT true,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW(),\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"api_keys\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"user_id\" UUID NOT NULL REFERENCES \"users\"(\"id\") ON DELETE CASCADE,\n \"name\" VARCHAR(255) NOT NULL,\n \"key\" VARCHAR(64) NOT NULL UNIQUE,\n \"key_prefix\" VARCHAR(8) NOT NULL,\n \"permissions\" JSONB DEFAULT '[]',\n \"last_used_at\" TIMESTAMP,\n \"expires_at\" TIMESTAMP,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"email_verifications\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"user_id\" UUID NOT NULL REFERENCES \"users\"(\"id\") ON DELETE CASCADE,\n \"token\" VARCHAR(64) NOT NULL UNIQUE,\n \"expires_at\" TIMESTAMP NOT NULL,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"password_resets\" (\n \"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n \"user_id\" UUID NOT NULL REFERENCES \"users\"(\"id\") ON DELETE CASCADE,\n \"token\" VARCHAR(64) NOT NULL UNIQUE,\n \"expires_at\" TIMESTAMP NOT NULL,\n \"used_at\" TIMESTAMP,\n \"created_at\" TIMESTAMP NOT NULL DEFAULT NOW()\n )\n `);\n _tablesEnsured = true;\n }\n\n async disconnect(): Promise<void> {\n }\n\n async createUser(data: {\n email: string;\n password: string;\n name?: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const passwordHash = await this.hashPassword(data.password);\n const [user] = await this.db\n .insert(users)\n .values({\n email: data.email.toLowerCase(),\n name: data.name,\n passwordHash,\n role: (data.role || \"customer\") as string,\n tenantId: data.tenantId,\n })\n .returning();\n\n return this.userToAuthUser(user);\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const [user] = await this.db\n .select()\n .from(users)\n .where(eq(users.email, email.toLowerCase()))\n .limit(1);\n\n return user ? this.userToAuthUser(user) : null;\n }\n\n async findUserById(id: string): Promise<AuthUser | null> {\n const [user] = await this.db\n .select()\n .from(users)\n .where(eq(users.id, id))\n .limit(1);\n\n return user ? this.userToAuthUser(user) : null;\n }\n\n async updateUser(\n id: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const dbData: Record<string, unknown> = { updatedAt: new Date() };\n if (data.name !== undefined) dbData.name = data.name;\n if (data.email !== undefined) dbData.email = data.email;\n if (data.passwordHash !== undefined)\n dbData.passwordHash = data.passwordHash;\n if (data.role !== undefined) dbData.role = data.role;\n if (data.tenantId !== undefined) dbData.tenantId = data.tenantId;\n if (data.emailVerified !== undefined)\n dbData.emailVerified = data.emailVerified;\n if (data.locked !== undefined) dbData.locked = data.locked;\n if (data.lastLogin !== undefined)\n dbData.lastLogin = data.lastLogin ? new Date(data.lastLogin) : null;\n if (data.failedLoginAttempts !== undefined)\n dbData.failedLoginAttempts = data.failedLoginAttempts;\n\n const [user] = await this.db\n .update(users)\n .set(dbData)\n .where(eq(users.id, id))\n .returning();\n\n return user ? this.userToAuthUser(user) : null;\n }\n\n async deleteUser(id: string): Promise<boolean> {\n await this.db.delete(users).where(eq(users.id, id));\n return true;\n }\n\n async findUsers(\n options: {\n page?: number;\n limit?: number;\n search?: string;\n } = {},\n ): Promise<{ users: AuthUser[]; total: number }> {\n const page = options.page ?? 1;\n const limit = options.limit ?? 10;\n const offset = (page - 1) * limit;\n const search = options.search;\n\n if (search) {\n const pattern = `%${search}%`;\n const [rows, [{ count }]] = await Promise.all([\n this.db\n .select()\n .from(users)\n .where(sql`${users.email} ILIKE ${pattern}`)\n .orderBy(desc(users.createdAt))\n .limit(limit)\n .offset(offset),\n this.db\n .select({ count: sql<number>`count(*)` })\n .from(users)\n .where(sql`${users.email} ILIKE ${pattern}`),\n ]);\n return {\n users: rows.map((r) => this.userToAuthUser(r)),\n total: Number(count),\n };\n }\n\n const [rows, [{ count }]] = await Promise.all([\n this.db\n .select()\n .from(users)\n .orderBy(desc(users.createdAt))\n .limit(limit)\n .offset(offset),\n this.db.select({ count: sql<number>`count(*)` }).from(users),\n ]);\n return {\n users: rows.map((r) => this.userToAuthUser(r)),\n total: Number(count),\n };\n }\n\n async verifyPassword(\n email: string,\n password: string,\n ): Promise<AuthUser | null> {\n const user = await this.findUserByEmail(email);\n if (!user) return null;\n const [stored] = await this.db\n .select()\n .from(users)\n .where(eq(users.email, email.toLowerCase()))\n .limit(1);\n if (!stored?.passwordHash) return null;\n const valid = await bcrypt.compare(password, stored.passwordHash);\n return valid ? user : null;\n }\n\n async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, 12);\n }\n\n async createSession(\n userId: string,\n data?: { ipAddress?: string; userAgent?: string },\n ): Promise<Session> {\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const expiresAt = new Date(Date.now() + this.sessionTTL * 1000);\n const refreshExpiresAt = new Date(Date.now() + this.refreshTokenTTL * 1000);\n\n const [session] = await this.db\n .insert(sessions)\n .values({\n userId,\n token,\n refreshToken,\n ipAddress: data?.ipAddress,\n userAgent: data?.userAgent,\n expiresAt,\n })\n .returning();\n\n return this.sessionToSession(session);\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n const [session] = await this.db\n .select()\n .from(sessions)\n .where(and(eq(sessions.token, token), gt(sessions.expiresAt, new Date())))\n .limit(1);\n\n return session ? this.sessionToSession(session) : null;\n }\n\n async findSessionByRefreshToken(\n refreshToken: string,\n ): Promise<Session | null> {\n const [session] = await this.db\n .select()\n .from(sessions)\n .where(\n and(\n eq(sessions.refreshToken, refreshToken),\n gt(sessions.expiresAt, new Date()),\n ),\n )\n .limit(1);\n\n return session ? this.sessionToSession(session) : null;\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n await this.db.delete(sessions).where(eq(sessions.id, sessionId));\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n await this.db.delete(sessions).where(eq(sessions.userId, userId));\n return 1;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n await this.db.insert(passwordHistory).values({\n userId,\n passwordHash,\n });\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n const history = await this.db\n .select({ passwordHash: passwordHistory.passwordHash })\n .from(passwordHistory)\n .where(eq(passwordHistory.userId, userId))\n .orderBy(desc(passwordHistory.createdAt))\n .limit(count);\n\n return history.map((h) => h.passwordHash);\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 this.verifyPassword(password, hash)) {\n return true;\n }\n }\n\n return false;\n }\n\n async isLocked(userId: string): Promise<boolean> {\n const [lockout] = await this.db\n .select()\n .from(lockouts)\n .where(\n and(eq(lockouts.userId, userId), gt(lockouts.lockedUntil, new Date())),\n )\n .limit(1);\n\n return !!lockout;\n }\n\n async getLockout(userId: string): Promise<{ lockedUntil: Date } | null> {\n const [lockout] = await this.db\n .select()\n .from(lockouts)\n .where(\n and(eq(lockouts.userId, userId), gt(lockouts.lockedUntil, new Date())),\n )\n .limit(1);\n\n return lockout ? { lockedUntil: lockout.lockedUntil } : null;\n }\n\n async recordFailedAttempt(\n userId: string,\n ipAddress?: string,\n ): Promise<{ attempts: number; locked: boolean }> {\n const user = await this.findUserById(userId);\n const attempts = (user?.failedLoginAttempts || 0) + 1;\n\n await this.updateUser(userId, { failedLoginAttempts: attempts });\n\n const maxAttempts = 5;\n const locked = attempts >= maxAttempts;\n\n if (locked) {\n const lockoutDuration = 15 * 60 * 1000;\n await this.db.insert(lockouts).values({\n userId,\n ipAddress,\n reason: \"Too many failed login attempts\",\n lockedUntil: new Date(Date.now() + lockoutDuration),\n });\n }\n\n return { attempts, locked };\n }\n\n async resetAttempts(userId: string): Promise<void> {\n await this.updateUser(userId, { failedLoginAttempts: 0 });\n }\n\n async findAuditLogs(\n filter: AuditLogFilter,\n ): Promise<{ logs: AuditLog[]; total: number }> {\n const {\n limit = 50,\n offset = 0,\n userId,\n action,\n resource,\n resourceId,\n success,\n startDate,\n endDate,\n } = filter;\n\n const conditions = [];\n if (userId) conditions.push(eq(auditLogs.userId, userId));\n if (action) {\n if (Array.isArray(action)) {\n conditions.push(sql`${auditLogs.action} = ANY(${action})`);\n } else {\n conditions.push(eq(auditLogs.action, action));\n }\n }\n if (resource) conditions.push(eq(auditLogs.resource, resource));\n if (resourceId) conditions.push(eq(auditLogs.resourceId, resourceId));\n if (success !== undefined) conditions.push(eq(auditLogs.success, success));\n if (startDate) conditions.push(sql`${auditLogs.timestamp} >= ${startDate}`);\n if (endDate) conditions.push(sql`${auditLogs.timestamp} <= ${endDate}`);\n\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined;\n\n const countResult = await this.db\n .select({ count: sql<number>`count(*)` })\n .from(auditLogs)\n .where(whereClause);\n\n const logs = await this.db\n .select()\n .from(auditLogs)\n .where(whereClause)\n .orderBy(desc(auditLogs.timestamp))\n .limit(limit)\n .offset(offset);\n\n return {\n logs: logs.map((log) => ({\n id: log.id,\n timestamp: log.timestamp,\n action: log.action as AuditLog[\"action\"],\n userId: log.userId || undefined,\n userEmail: log.userEmail || undefined,\n role: log.role || undefined,\n resource: log.resource,\n resourceId: log.resourceId || undefined,\n changes: log.changes || undefined,\n ipAddress: log.ipAddress || undefined,\n userAgent: log.userAgent || undefined,\n success: log.success,\n error: log.error || undefined,\n metadata: log.metadata || undefined,\n })),\n total: Number(countResult[0]?.count || 0),\n };\n }\n\n async createAuditLog(\n data: Omit<AuditLog, \"id\" | \"timestamp\">,\n ): Promise<AuditLog> {\n const id = crypto.randomUUID();\n const timestamp = new Date();\n\n await this.db.insert(auditLogs).values({\n id,\n action: data.action,\n userId: data.userId,\n userEmail: data.userEmail,\n role: data.role,\n resource: data.resource,\n resourceId: data.resourceId,\n changes: data.changes,\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n success: data.success,\n error: data.error,\n metadata: data.metadata,\n timestamp,\n });\n\n return {\n ...data,\n id,\n timestamp,\n };\n }\n\n private userToAuthUser(user: AuthUserRow): AuthUser {\n return {\n id: user.id,\n name: user.name || undefined,\n email: user.email,\n passwordHash: user.passwordHash || undefined,\n role: user.role as UserRole,\n tenantId: user.tenantId || undefined,\n emailVerified: user.emailVerified || false,\n locked: user.locked || false,\n lastLogin: user.lastLogin?.toISOString(),\n failedLoginAttempts: user.failedLoginAttempts || 0,\n createdAt: user.createdAt.toISOString(),\n updatedAt: user.updatedAt.toISOString(),\n };\n }\n\n private sessionToSession(session: typeof sessions.$inferSelect): Session {\n return {\n id: session.id,\n userId: session.userId,\n token: session.token,\n refreshToken: session.refreshToken || undefined,\n expiresAt: session.expiresAt.toISOString(),\n createdAt: session.createdAt.toISOString(),\n ipAddress: session.ipAddress || undefined,\n userAgent: session.userAgent || undefined,\n };\n }\n\n async createEmailVerificationToken(userId: string): Promise<{ token: string; expiresAt: Date }> {\n const token = randomBytes(32).toString(\"hex\");\n const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000);\n\n await this.db.insert(emailVerifications).values({\n userId,\n token,\n expiresAt,\n });\n\n return { token, expiresAt };\n }\n\n async verifyEmailToken(token: string): Promise<{ success: boolean; userId?: string; error?: string }> {\n const [verification] = await this.db\n .select()\n .from(emailVerifications)\n .where(eq(emailVerifications.token, token))\n .limit(1);\n\n if (!verification) {\n return { success: false, error: \"Invalid verification token\" };\n }\n\n if (verification.expiresAt < new Date()) {\n return { success: false, error: \"Verification token has expired\" };\n }\n\n await this.db\n .update(users)\n .set({ emailVerified: true })\n .where(eq(users.id, verification.userId));\n\n await this.db\n .delete(emailVerifications)\n .where(eq(emailVerifications.id, verification.id));\n\n return { success: true, userId: verification.userId };\n }\n\n async createPasswordResetToken(email: string): Promise<{ token: string; expiresAt: Date; error?: string }> {\n const user = await this.findUserByEmail(email);\n if (!user) {\n return { token: \"\", expiresAt: new Date(), error: \"User not found\" };\n }\n\n const token = randomBytes(32).toString(\"hex\");\n const expiresAt = new Date(Date.now() + 60 * 60 * 1000);\n\n await this.db.insert(passwordResets).values({\n userId: user.id,\n token,\n expiresAt,\n });\n\n return { token, expiresAt };\n }\n\n async resetPasswordWithToken(token: string, newPassword: string): Promise<{ success: boolean; error?: string }> {\n const [reset] = await this.db\n .select()\n .from(passwordResets)\n .where(eq(passwordResets.token, token))\n .limit(1);\n\n if (!reset) {\n return { success: false, error: \"Invalid reset token\" };\n }\n\n if (reset.expiresAt < new Date()) {\n return { success: false, error: \"Reset token has expired\" };\n }\n\n if (reset.usedAt) {\n return { success: false, error: \"Reset token has already been used\" };\n }\n\n const passwordHash = await this.hashPassword(newPassword);\n\n await this.db\n .update(users)\n .set({ passwordHash, updatedAt: new Date() })\n .where(eq(users.id, reset.userId));\n\n await this.db\n .update(passwordResets)\n .set({ usedAt: new Date() })\n .where(eq(passwordResets.id, reset.id));\n\n await this.db.delete(sessions).where(eq(sessions.userId, reset.userId));\n\n return { success: true };\n }\n}\n"]}
|