@kyro-cms/core 0.9.0 → 0.9.1
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/README.md +57 -589
- package/dist/{WebhookService-118ZTFis.d.ts → WebhookService-CUTb9XOy.d.ts} +1 -1
- package/dist/{WebhookService-AefJfqX0.d.cts → WebhookService-Yg2UEOB4.d.cts} +1 -1
- package/dist/api-handler-graphql.cjs +44 -0
- package/dist/api-handler-graphql.cjs.map +1 -0
- package/dist/api-handler-graphql.d.cts +6 -0
- package/dist/api-handler-graphql.d.ts +6 -0
- package/dist/api-handler-graphql.js +41 -0
- package/dist/api-handler-graphql.js.map +1 -0
- package/dist/api-handler-trpc.cjs +38 -0
- package/dist/api-handler-trpc.cjs.map +1 -0
- package/dist/api-handler-trpc.d.cts +5 -0
- package/dist/api-handler-trpc.d.ts +5 -0
- package/dist/api-handler-trpc.js +36 -0
- package/dist/api-handler-trpc.js.map +1 -0
- package/dist/api-handler.cjs +31 -97
- package/dist/api-handler.cjs.map +1 -1
- package/dist/api-handler.d.cts +2 -1
- package/dist/api-handler.d.ts +2 -1
- package/dist/api-handler.js +19 -95
- package/dist/api-handler.js.map +1 -1
- package/dist/{tenant-B1YB0Jy8.d.ts → base-B71y_EAF.d.cts} +6 -12
- package/dist/{tenant-Cpeveji6.d.cts → base-DaqY2GhA.d.ts} +6 -12
- package/dist/bootstrap-5NLASFOG.cjs +32 -0
- package/dist/{bootstrap-AKAUP6F6.cjs.map → bootstrap-5NLASFOG.cjs.map} +1 -1
- package/dist/bootstrap-T5BK77LD.js +7 -0
- package/dist/{bootstrap-JCML6NFO.js.map → bootstrap-T5BK77LD.js.map} +1 -1
- package/dist/{chunk-35U3FROB.js → chunk-22M4O4ZJ.js} +607 -63
- package/dist/chunk-22M4O4ZJ.js.map +1 -0
- package/dist/chunk-2HZRBATX.cjs +253 -0
- package/dist/chunk-2HZRBATX.cjs.map +1 -0
- package/dist/{chunk-VJT6P4N6.cjs → chunk-3HR772HI.cjs} +199 -32
- package/dist/chunk-3HR772HI.cjs.map +1 -0
- package/dist/chunk-3KTWGODI.cjs +178 -0
- package/dist/chunk-3KTWGODI.cjs.map +1 -0
- package/dist/{chunk-QXIQWPAP.js → chunk-3UK5XBVJ.js} +4 -134
- package/dist/chunk-3UK5XBVJ.js.map +1 -0
- package/dist/{chunk-FXYP2HA6.js → chunk-4AO3A3JM.js} +48 -4
- package/dist/chunk-4AO3A3JM.js.map +1 -0
- package/dist/chunk-4M7X5HAB.cjs +173 -0
- package/dist/chunk-4M7X5HAB.cjs.map +1 -0
- package/dist/chunk-5EPFQUQD.js +3243 -0
- package/dist/chunk-5EPFQUQD.js.map +1 -0
- package/dist/{chunk-Y3N7UUDO.js → chunk-7OGPN7MP.js} +5 -2
- package/dist/chunk-7OGPN7MP.js.map +1 -0
- package/dist/{chunk-WOWUL7ZY.js → chunk-AL5KX63J.js} +4 -3
- package/dist/chunk-AL5KX63J.js.map +1 -0
- package/dist/{chunk-2OL4O2TH.cjs → chunk-C36TMDTY.cjs} +66 -61
- package/dist/chunk-C36TMDTY.cjs.map +1 -0
- package/dist/{chunk-ES5HNFFT.js → chunk-CF7OL6HR.js} +4 -2
- package/dist/chunk-CF7OL6HR.js.map +1 -0
- package/dist/chunk-CJONKRHJ.js +162 -0
- package/dist/chunk-CJONKRHJ.js.map +1 -0
- package/dist/{chunk-2KVHZE6O.cjs → chunk-COIASRDK.cjs} +202 -46
- package/dist/chunk-COIASRDK.cjs.map +1 -0
- package/dist/chunk-DEVFAKCQ.cjs +3291 -0
- package/dist/chunk-DEVFAKCQ.cjs.map +1 -0
- package/dist/{chunk-3ZFYL34R.js → chunk-DYTZ6FQ7.js} +12 -185
- package/dist/chunk-DYTZ6FQ7.js.map +1 -0
- package/dist/{chunk-QPPDLRNR.js → chunk-EJN2PAOE.js} +197 -41
- package/dist/chunk-EJN2PAOE.js.map +1 -0
- package/dist/chunk-FAXU7BMP.js +220 -0
- package/dist/chunk-FAXU7BMP.js.map +1 -0
- package/dist/{chunk-OHVB4AJ7.js → chunk-FOPGUM27.js} +22 -17
- package/dist/chunk-FOPGUM27.js.map +1 -0
- package/dist/chunk-GAOXD3XT.js +175 -0
- package/dist/chunk-GAOXD3XT.js.map +1 -0
- package/dist/{chunk-4DA7QPLA.cjs → chunk-GXFOGU7N.cjs} +5 -2
- package/dist/chunk-GXFOGU7N.cjs.map +1 -0
- package/dist/{chunk-I7HHI6QV.cjs → chunk-IDVRRRAK.cjs} +17 -9
- package/dist/chunk-IDVRRRAK.cjs.map +1 -0
- package/dist/{chunk-WQBRWOQT.cjs → chunk-JOPVMWTM.cjs} +3 -2
- package/dist/chunk-JOPVMWTM.cjs.map +1 -0
- package/dist/chunk-KC2GDBLS.cjs +84 -0
- package/dist/chunk-KC2GDBLS.cjs.map +1 -0
- package/dist/{chunk-K7JPTH3G.cjs → chunk-KNRSROWB.cjs} +132 -74
- package/dist/chunk-KNRSROWB.cjs.map +1 -0
- package/dist/{chunk-3AJE4SEG.js → chunk-KPA4AN4R.js} +125 -67
- package/dist/chunk-KPA4AN4R.js.map +1 -0
- package/dist/{chunk-QUW2RZTM.cjs → chunk-L46ROHUS.cjs} +51 -7
- package/dist/chunk-L46ROHUS.cjs.map +1 -0
- package/dist/chunk-L4EZKIEX.js +185 -0
- package/dist/chunk-L4EZKIEX.js.map +1 -0
- package/dist/{chunk-REK7AYOC.js → chunk-L5UKKZQN.js} +199 -32
- package/dist/chunk-L5UKKZQN.js.map +1 -0
- package/dist/chunk-NKPKR5BW.cjs +188 -0
- package/dist/chunk-NKPKR5BW.cjs.map +1 -0
- package/dist/{chunk-Y3QQN7PN.js → chunk-P2HKJ7P5.js} +13 -4
- package/dist/chunk-P2HKJ7P5.js.map +1 -0
- package/dist/{chunk-SA7NSSIQ.cjs → chunk-PI73NNOK.cjs} +13 -187
- package/dist/chunk-PI73NNOK.cjs.map +1 -0
- package/dist/{chunk-HXRD4B37.js → chunk-PU2Z5VWF.js} +1279 -556
- package/dist/chunk-PU2Z5VWF.js.map +1 -0
- package/dist/{chunk-H727JIG7.js → chunk-Q72BOAPK.js} +16 -8
- package/dist/chunk-Q72BOAPK.js.map +1 -0
- package/dist/{chunk-IBG6V56E.cjs → chunk-QFLB4EIJ.cjs} +2 -139
- package/dist/chunk-QFLB4EIJ.cjs.map +1 -0
- package/dist/{chunk-YVUJBEXE.cjs → chunk-RAMGUDJN.cjs} +16 -7
- package/dist/chunk-RAMGUDJN.cjs.map +1 -0
- package/dist/{chunk-LINKCEG4.cjs → chunk-ROJHKAQ4.cjs} +617 -73
- package/dist/chunk-ROJHKAQ4.cjs.map +1 -0
- package/dist/{chunk-5KVM3WEY.cjs → chunk-RSF3UU7H.cjs} +1330 -602
- package/dist/chunk-RSF3UU7H.cjs.map +1 -0
- package/dist/{chunk-V3LKPM3O.cjs → chunk-SHTTJMLT.cjs} +4 -2
- package/dist/chunk-SHTTJMLT.cjs.map +1 -0
- package/dist/chunk-SPBTLUN6.js +92 -0
- package/dist/chunk-SPBTLUN6.js.map +1 -0
- package/dist/{chunk-57P6MJKC.js → chunk-TXSZFA4G.js} +3 -3
- package/dist/chunk-TXSZFA4G.js.map +1 -0
- package/dist/chunk-UERVXYVK.cjs +99 -0
- package/dist/chunk-UERVXYVK.cjs.map +1 -0
- package/dist/{chunk-PDYFVNUX.cjs → chunk-V2TVSCV5.cjs} +16 -23
- package/dist/chunk-V2TVSCV5.cjs.map +1 -0
- package/dist/{chunk-DXHRBMGB.js → chunk-VO35MNPH.js} +12 -19
- package/dist/chunk-VO35MNPH.js.map +1 -0
- package/dist/{chunk-IA6AU5PI.cjs → chunk-WNCYAKF3.cjs} +3 -3
- package/dist/chunk-WNCYAKF3.cjs.map +1 -0
- package/dist/chunk-XEB7PH2E.js +81 -0
- package/dist/chunk-XEB7PH2E.js.map +1 -0
- package/dist/cli/index.cjs +5 -5
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +5 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/client.cjs +3 -3
- package/dist/client.d.cts +3 -3
- package/dist/client.d.ts +3 -3
- package/dist/client.js +1 -1
- package/dist/drizzle/index.cjs +14 -13
- package/dist/drizzle/index.d.cts +9 -7
- package/dist/drizzle/index.d.ts +9 -7
- package/dist/drizzle/index.js +5 -4
- package/dist/fields/index.cjs +21 -37
- package/dist/fields/index.d.cts +2 -22
- package/dist/fields/index.d.ts +2 -22
- package/dist/fields/index.js +1 -1
- package/dist/graphql/index.cjs +5 -4
- package/dist/graphql/index.d.cts +5 -3
- package/dist/graphql/index.d.ts +5 -3
- package/dist/graphql/index.js +3 -2
- package/dist/index-CJXPB_ot.d.ts +276 -0
- package/dist/index-CaTNnLGd.d.cts +276 -0
- package/dist/index.cjs +304 -162
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +129 -205
- package/dist/index.d.ts +129 -205
- package/dist/index.js +172 -33
- package/dist/index.js.map +1 -1
- package/dist/integration.cjs +2 -2
- package/dist/integration.js +1 -1
- package/dist/mongo-auth-adapter-ISOM7FSS.cjs +17 -0
- package/dist/{mongo-auth-adapter-NHHUJHVH.cjs.map → mongo-auth-adapter-ISOM7FSS.cjs.map} +1 -1
- package/dist/mongo-auth-adapter-MO6STCV3.js +4 -0
- package/dist/{mongo-auth-adapter-NJQUUCTP.js.map → mongo-auth-adapter-MO6STCV3.js.map} +1 -1
- package/dist/mongodb/index.cjs +8 -7
- package/dist/mongodb/index.d.cts +5 -7
- package/dist/mongodb/index.d.ts +5 -7
- package/dist/mongodb/index.js +4 -3
- package/dist/postgres-auth-adapter-DWDR7P5G.js +5 -0
- package/dist/{postgres-auth-adapter-3T2NKTSE.js.map → postgres-auth-adapter-DWDR7P5G.js.map} +1 -1
- package/dist/postgres-auth-adapter-WRWSJD4E.cjs +14 -0
- package/dist/{postgres-auth-adapter-7IEENCKQ.cjs.map → postgres-auth-adapter-WRWSJD4E.cjs.map} +1 -1
- package/dist/redis-adapter-HGTPWIGV.js +4 -0
- package/dist/{redis-adapter-VQXD7ESY.js.map → redis-adapter-HGTPWIGV.js.map} +1 -1
- package/dist/redis-adapter-KJ3YOOT6.cjs +13 -0
- package/dist/{redis-adapter-D2E2S3GB.cjs.map → redis-adapter-KJ3YOOT6.cjs.map} +1 -1
- package/dist/rest/index.cjs +15 -14
- package/dist/rest/index.d.cts +4 -4
- package/dist/rest/index.d.ts +4 -4
- package/dist/rest/index.js +13 -12
- package/dist/{schema-5PHL5IVB.js → schema-6I5OFR4Z.js} +3 -3
- package/dist/{schema-5PHL5IVB.js.map → schema-6I5OFR4Z.js.map} +1 -1
- package/dist/{schema-37SE2F4B.cjs → schema-TTFE4467.cjs} +14 -14
- package/dist/{schema-37SE2F4B.cjs.map → schema-TTFE4467.cjs.map} +1 -1
- package/dist/sqlite-adapter-6GEUSVXQ.js +4 -0
- package/dist/{sqlite-adapter-TR3U3W6Q.js.map → sqlite-adapter-6GEUSVXQ.js.map} +1 -1
- package/dist/sqlite-adapter-CSIZE5SX.cjs +13 -0
- package/dist/{sqlite-adapter-LVK5PS4T.cjs.map → sqlite-adapter-CSIZE5SX.cjs.map} +1 -1
- package/dist/templates/index.cjs +133 -31
- package/dist/templates/index.d.cts +52 -9
- package/dist/templates/index.d.ts +52 -9
- package/dist/templates/index.js +3 -1
- package/dist/trpc/index.cjs +13 -12
- package/dist/trpc/index.d.cts +55 -49
- package/dist/trpc/index.d.ts +55 -49
- package/dist/trpc/index.js +4 -3
- package/dist/{types-D6ZLRGbH.d.cts → types-CpjuXbe7.d.cts} +2 -0
- package/dist/{types-D6ZLRGbH.d.ts → types-CpjuXbe7.d.ts} +2 -0
- package/dist/{types-Bs1up4yP.d.ts → types-CyCQ6SAI.d.ts} +28 -2
- package/dist/{types-J3R9nVsZ.d.cts → types-DJxD9394.d.cts} +28 -2
- package/dist/{types-VtjUxIMp.d.cts → types-Z6FBiqa2.d.cts} +35 -14
- package/dist/{types-VtjUxIMp.d.ts → types-Z6FBiqa2.d.ts} +35 -14
- package/package.json +22 -4
- package/dist/bootstrap-AKAUP6F6.cjs +0 -32
- package/dist/bootstrap-JCML6NFO.js +0 -7
- package/dist/chunk-2KVHZE6O.cjs.map +0 -1
- package/dist/chunk-2OL4O2TH.cjs.map +0 -1
- package/dist/chunk-35U3FROB.js.map +0 -1
- package/dist/chunk-3AJE4SEG.js.map +0 -1
- package/dist/chunk-3J4MFTI3.js +0 -3872
- package/dist/chunk-3J4MFTI3.js.map +0 -1
- package/dist/chunk-3ZFYL34R.js.map +0 -1
- package/dist/chunk-4DA7QPLA.cjs.map +0 -1
- package/dist/chunk-57P6MJKC.js.map +0 -1
- package/dist/chunk-5KVM3WEY.cjs.map +0 -1
- package/dist/chunk-6IMPH6WV.cjs +0 -3897
- package/dist/chunk-6IMPH6WV.cjs.map +0 -1
- package/dist/chunk-ATBOUGQP.cjs +0 -513
- package/dist/chunk-ATBOUGQP.cjs.map +0 -1
- package/dist/chunk-DXHRBMGB.js.map +0 -1
- package/dist/chunk-ES5HNFFT.js.map +0 -1
- package/dist/chunk-FXYP2HA6.js.map +0 -1
- package/dist/chunk-H727JIG7.js.map +0 -1
- package/dist/chunk-HXRD4B37.js.map +0 -1
- package/dist/chunk-I7HHI6QV.cjs.map +0 -1
- package/dist/chunk-IA6AU5PI.cjs.map +0 -1
- package/dist/chunk-IBG6V56E.cjs.map +0 -1
- package/dist/chunk-K7JPTH3G.cjs.map +0 -1
- package/dist/chunk-LINKCEG4.cjs.map +0 -1
- package/dist/chunk-OHVB4AJ7.js.map +0 -1
- package/dist/chunk-PDYFVNUX.cjs.map +0 -1
- package/dist/chunk-Q23JB3KL.js +0 -488
- package/dist/chunk-Q23JB3KL.js.map +0 -1
- package/dist/chunk-QPPDLRNR.js.map +0 -1
- package/dist/chunk-QUW2RZTM.cjs.map +0 -1
- package/dist/chunk-QXIQWPAP.js.map +0 -1
- package/dist/chunk-R3XIBBAW.cjs +0 -34
- package/dist/chunk-R3XIBBAW.cjs.map +0 -1
- package/dist/chunk-REK7AYOC.js.map +0 -1
- package/dist/chunk-SA7NSSIQ.cjs.map +0 -1
- package/dist/chunk-SDMNUYVU.js +0 -30
- package/dist/chunk-SDMNUYVU.js.map +0 -1
- package/dist/chunk-V3LKPM3O.cjs.map +0 -1
- package/dist/chunk-VJT6P4N6.cjs.map +0 -1
- package/dist/chunk-WOWUL7ZY.js.map +0 -1
- package/dist/chunk-WQBRWOQT.cjs.map +0 -1
- package/dist/chunk-Y3N7UUDO.js.map +0 -1
- package/dist/chunk-Y3QQN7PN.js.map +0 -1
- package/dist/chunk-YVUJBEXE.cjs.map +0 -1
- package/dist/index-CLp-DRKA.d.ts +0 -64
- package/dist/index-DfO7G4kN.d.cts +0 -64
- package/dist/mongo-auth-adapter-NHHUJHVH.cjs +0 -17
- package/dist/mongo-auth-adapter-NJQUUCTP.js +0 -4
- package/dist/postgres-auth-adapter-3T2NKTSE.js +0 -5
- package/dist/postgres-auth-adapter-7IEENCKQ.cjs +0 -14
- package/dist/redis-adapter-D2E2S3GB.cjs +0 -13
- package/dist/redis-adapter-VQXD7ESY.js +0 -4
- package/dist/sqlite-adapter-LVK5PS4T.cjs +0 -13
- package/dist/sqlite-adapter-TR3U3W6Q.js +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/sqlite-adapter.ts"],"names":["createRequire","dirname","mkdirSync","randomBytes","bcrypt"],"mappings":"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","file":"chunk-IDVRRRAK.cjs","sourcesContent":["import bcrypt from \"bcryptjs\";\nimport { randomBytes } from \"crypto\";\nimport { mkdirSync } from \"fs\";\nimport { dirname } 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\");\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\nimport type { AuditLog, AuditLogFilter } from \"./security/audit-log.js\";\n\nexport interface SQLiteAuthAdapterOptions {\n path?: string;\n db?: any;\n saltRounds?: number;\n busyTimeout?: number;\n walAutoCheckpoint?: number;\n cacheSize?: number;\n mmapSize?: number;\n}\n\nconst DEFAULT_BUSY_TIMEOUT = 5000;\nconst DEFAULT_WAL_CHECKPOINT = 1000;\nconst DEFAULT_CACHE_SIZE = -64000;\nconst DEFAULT_MMAP_SIZE = 268435456;\n\nexport class SQLiteAuthAdapter implements AuthAdapter {\n private db: any = null;\n private path: string;\n private saltRounds: number;\n private externalDb: boolean;\n private busyTimeout: number;\n private walAutoCheckpoint: number;\n private cacheSize: number;\n private mmapSize: number;\n\n private preparedStatements: Map<string, any> = new Map();\n\n constructor(options: SQLiteAuthAdapterOptions = {}) {\n this.path = options.path || \"./data/auth.db\";\n this.saltRounds = options.saltRounds || 12;\n this.externalDb = !!options.db;\n this.busyTimeout = options.busyTimeout ?? DEFAULT_BUSY_TIMEOUT;\n this.walAutoCheckpoint =\n options.walAutoCheckpoint ?? DEFAULT_WAL_CHECKPOINT;\n this.cacheSize = options.cacheSize ?? DEFAULT_CACHE_SIZE;\n this.mmapSize = options.mmapSize ?? DEFAULT_MMAP_SIZE;\n\n if (options.db) {\n this.db = options.db;\n }\n }\n\n async connect(): Promise<void> {\n if (this.db) return;\n\n const dir = dirname(this.path);\n if (dir && dir !== \".\") {\n mkdirSync(dir, { recursive: true });\n }\n\n this.db = new DatabaseSync(this.path);\n this.db.exec(`PRAGMA busy_timeout = ${this.busyTimeout}`);\n\n this.db.exec(\"PRAGMA journal_mode = WAL\");\n this.db.exec(\"PRAGMA synchronous = NORMAL\");\n this.db.exec(\"PRAGMA cache_size = \" + this.cacheSize);\n this.db.exec(\"PRAGMA mmap_size = \" + this.mmapSize);\n this.db.exec(\"PRAGMA wal_autocheckpoint = \" + this.walAutoCheckpoint);\n this.db.exec(\"PRAGMA foreign_keys = ON\");\n this.db.exec(\"PRAGMA temp_store = MEMORY\");\n\n this.ensureTables();\n this.prepareStatements();\n }\n\n async disconnect(): Promise<void> {\n if (this.db && !this.externalDb) {\n this.db.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\");\n this.db.close();\n this.db = null;\n this.preparedStatements.clear();\n }\n }\n\n private async ensureConnected(): Promise<any> {\n if (!this.db) {\n await this.connect();\n }\n if (!this.db) {\n throw new Error(\"Failed to connect to SQLite database\");\n }\n return this.db;\n }\n\n private ensureTables(): void {\n if (!this.db) return;\n\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS kyro_users (\n id TEXT PRIMARY KEY,\n name TEXT,\n email TEXT UNIQUE NOT NULL,\n password_hash TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'customer',\n tenant_id TEXT,\n email_verified INTEGER DEFAULT 0,\n locked INTEGER DEFAULT 0,\n last_login TEXT,\n failed_login_attempts INTEGER DEFAULT 0,\n locked_until TEXT,\n avatar TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS kyro_sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n token TEXT NOT NULL,\n refresh_token TEXT,\n expires_at TEXT NOT NULL,\n created_at TEXT NOT NULL,\n ip_address TEXT,\n user_agent TEXT,\n FOREIGN KEY (user_id) REFERENCES kyro_users(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS kyro_password_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id TEXT NOT NULL,\n password_hash TEXT NOT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (user_id) REFERENCES kyro_users(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS kyro_rate_limits (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n key TEXT NOT NULL,\n window_start INTEGER NOT NULL,\n count INTEGER NOT NULL DEFAULT 1,\n UNIQUE(key, window_start)\n );\n\n CREATE TABLE IF NOT EXISTS kyro_lockouts (\n user_id TEXT PRIMARY KEY,\n attempts INTEGER NOT NULL DEFAULT 0,\n last_attempt INTEGER,\n locked_at INTEGER,\n locked_until INTEGER\n );\n\n CREATE TABLE IF NOT EXISTS kyro_audit_logs (\n id TEXT PRIMARY KEY,\n timestamp TEXT NOT NULL,\n action TEXT NOT NULL,\n user_id TEXT,\n user_email TEXT,\n role TEXT,\n resource TEXT NOT NULL,\n resource_id TEXT,\n ip_address TEXT,\n user_agent TEXT,\n success INTEGER NOT NULL,\n error TEXT,\n metadata TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE INDEX IF NOT EXISTS idx_kyro_users_email ON kyro_users(email);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_user_id ON kyro_sessions(user_id);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_token ON kyro_sessions(token);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_refresh_token ON kyro_sessions(refresh_token);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_expires ON kyro_sessions(expires_at);\n CREATE INDEX IF NOT EXISTS idx_kyro_password_history_user_id ON kyro_password_history(user_id);\n CREATE INDEX IF NOT EXISTS idx_kyro_rate_limits_key ON kyro_rate_limits(key);\n CREATE INDEX IF NOT EXISTS idx_kyro_rate_limits_window ON kyro_rate_limits(window_start);\n CREATE INDEX IF NOT EXISTS idx_kyro_lockouts_locked_until ON kyro_lockouts(locked_until);\n CREATE INDEX IF NOT EXISTS idx_kyro_audit_logs_timestamp ON kyro_audit_logs(timestamp);\n CREATE INDEX IF NOT EXISTS idx_kyro_audit_logs_action ON kyro_audit_logs(action);\n CREATE INDEX IF NOT EXISTS idx_kyro_audit_logs_user_id ON kyro_audit_logs(user_id);\n CREATE INDEX IF NOT EXISTS idx_kyro_audit_logs_resource ON kyro_audit_logs(resource);\n\n CREATE TABLE IF NOT EXISTS kyro_email_verifications (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n token TEXT UNIQUE NOT NULL,\n expires_at TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n FOREIGN KEY (user_id) REFERENCES kyro_users(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS kyro_password_resets (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n token TEXT UNIQUE NOT NULL,\n expires_at TEXT NOT NULL,\n used_at TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n FOREIGN KEY (user_id) REFERENCES kyro_users(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_kyro_email_verifications_token ON kyro_email_verifications(token);\n CREATE INDEX IF NOT EXISTS idx_kyro_password_resets_token ON kyro_password_resets(token);\n `);\n\n try {\n this.db.exec(`ALTER TABLE kyro_users ADD COLUMN name TEXT`);\n } catch {\n // Column already exists, ignore\n }\n }\n\n private prepareStatements(): void {\n if (!this.db) return;\n\n this.preparedStatements.set(\n \"findUserByEmail\",\n this.db.prepare(\"SELECT * FROM kyro_users WHERE email = ?\"),\n );\n this.preparedStatements.set(\n \"findUserById\",\n this.db.prepare(\"SELECT * FROM kyro_users WHERE id = ?\"),\n );\n this.preparedStatements.set(\n \"findSessionByToken\",\n this.db.prepare(\"SELECT * FROM kyro_sessions WHERE token = ?\"),\n );\n this.preparedStatements.set(\n \"findSessionByRefreshToken\",\n this.db.prepare(\"SELECT * FROM kyro_sessions WHERE refresh_token = ?\"),\n );\n this.preparedStatements.set(\n \"deleteSession\",\n this.db.prepare(\"DELETE FROM kyro_sessions WHERE id = ? OR token = ?\"),\n );\n this.preparedStatements.set(\n \"deleteUserSessions\",\n this.db.prepare(\"DELETE FROM kyro_sessions WHERE user_id = ?\"),\n );\n this.preparedStatements.set(\n \"countUsers\",\n this.db.prepare(\"SELECT COUNT(*) as count FROM kyro_users\"),\n );\n this.preparedStatements.set(\n \"deleteUser\",\n this.db.prepare(\"DELETE FROM kyro_users WHERE id = ?\"),\n );\n this.preparedStatements.set(\n \"findUsersPaginated\",\n this.db.prepare(\n \"SELECT * FROM kyro_users ORDER BY created_at DESC LIMIT ? OFFSET ?\",\n ),\n );\n this.preparedStatements.set(\n \"findUsersWithSearch\",\n this.db.prepare(\n \"SELECT * FROM kyro_users WHERE email LIKE ? ORDER BY created_at DESC LIMIT ? OFFSET ?\",\n ),\n );\n this.preparedStatements.set(\n \"countUsersWithSearch\",\n this.db.prepare(\n \"SELECT COUNT(*) as count FROM kyro_users WHERE email LIKE ?\",\n ),\n );\n this.preparedStatements.set(\n \"getPasswordHistory\",\n this.db.prepare(\n \"SELECT password_hash FROM kyro_password_history WHERE user_id = ? ORDER BY created_at DESC LIMIT ?\",\n ),\n );\n this.preparedStatements.set(\n \"addPasswordHistory\",\n this.db.prepare(\n \"INSERT INTO kyro_password_history (user_id, password_hash, created_at) VALUES (?, ?, ?)\",\n ),\n );\n this.preparedStatements.set(\n \"trimPasswordHistory\",\n this.db.prepare(\n `DELETE FROM kyro_password_history WHERE id IN (\n SELECT id FROM kyro_password_history WHERE user_id = ? ORDER BY created_at DESC LIMIT -1 OFFSET 5\n )`,\n ),\n );\n this.preparedStatements.set(\n \"deleteExpiredSessions\",\n this.db.prepare(\"DELETE FROM kyro_sessions WHERE expires_at < ?\"),\n );\n this.preparedStatements.set(\n \"cleanupOldAuditLogs\",\n this.db.prepare(\"DELETE FROM kyro_audit_logs WHERE timestamp < ?\"),\n );\n this.preparedStatements.set(\n \"cleanupExpiredLockouts\",\n this.db.prepare(\n \"UPDATE kyro_lockouts SET attempts = 0, locked_at = NULL, locked_until = NULL WHERE locked_until < ?\",\n ),\n );\n this.preparedStatements.set(\n \"getLockout\",\n this.db.prepare(\"SELECT * FROM kyro_lockouts WHERE user_id = ?\"),\n );\n this.preparedStatements.set(\n \"upsertLockout\",\n this.db.prepare(`\n INSERT INTO kyro_lockouts (user_id, attempts, last_attempt, locked_at, locked_until)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(user_id) DO UPDATE SET\n attempts = excluded.attempts,\n last_attempt = excluded.last_attempt,\n locked_at = excluded.locked_at,\n locked_until = excluded.locked_until\n `),\n );\n this.preparedStatements.set(\n \"resetLockout\",\n this.db.prepare(\n \"UPDATE kyro_lockouts SET attempts = 0, locked_at = NULL, locked_until = NULL WHERE user_id = ?\",\n ),\n );\n }\n\n private stmt(name: string): any {\n const stmt = this.preparedStatements.get(name);\n if (!stmt) throw new Error(`Prepared statement not found: ${name}`);\n return stmt;\n }\n\n async cleanupExpiredSessions(): Promise<number> {\n await this.ensureConnected();\n const result = this.stmt(\"deleteExpiredSessions\").run(\n new Date().toISOString(),\n );\n return result.changes;\n }\n\n async cleanupOldAuditLogs(retentionDays: number = 30): Promise<number> {\n await this.ensureConnected();\n const cutoff = new Date(\n Date.now() - retentionDays * 24 * 60 * 60 * 1000,\n ).toISOString();\n const result = this.stmt(\"cleanupOldAuditLogs\").run(cutoff);\n return result.changes;\n }\n\n async getStats(): Promise<{\n userCount: number;\n activeSessionCount: number;\n auditLogCount: number;\n }> {\n await this.ensureConnected();\n\n const userCount = (this.stmt(\"countUsers\").get() as { count: number })\n .count;\n\n const activeSessionCount = (\n this.db!.prepare(\n \"SELECT COUNT(*) as count FROM kyro_sessions WHERE expires_at > ?\",\n ).get(new Date().toISOString()) as { count: number }\n ).count;\n\n const auditLogCount = (\n this.db!.prepare(\n \"SELECT COUNT(*) as count FROM kyro_audit_logs\",\n ).get() as { count: number }\n ).count;\n\n return { userCount, activeSessionCount, auditLogCount };\n }\n\n async createUser(data: {\n email: string;\n password: string;\n name?: string;\n role?: UserRole;\n avatar?: string;\n tenantId?: string;\n }): Promise<AuthUser> {\n await this.ensureConnected();\n\n const id = 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,\n name: data.name,\n email: data.email.toLowerCase(),\n passwordHash,\n role: (data.role || \"customer\") as UserRole,\n avatar: data.avatar,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n this.db!.prepare(\n `INSERT INTO kyro_users (id, name, email, password_hash, role, avatar, tenant_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id,\n user.name || null,\n user.email,\n user.passwordHash,\n user.role,\n user.avatar || null,\n user.tenantId || null,\n now,\n now,\n );\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n await this.ensureConnected();\n\n const row = this.stmt(\"findUserByEmail\").get(email.toLowerCase()) as\n | Record<string, unknown>\n | undefined;\n\n if (!row) return null;\n return this.rowToUser(row);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n await this.ensureConnected();\n\n const row = this.stmt(\"findUserById\").get(userId) as\n | Record<string, unknown>\n | undefined;\n\n if (!row) return null;\n return this.rowToUser(row);\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n await this.ensureConnected();\n\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (data.email !== undefined) {\n updates.push(\"email = ?\");\n values.push(data.email.toLowerCase());\n }\n if (data.name !== undefined) {\n updates.push(\"name = ?\");\n values.push(data.name);\n }\n if (data.passwordHash !== undefined) {\n updates.push(\"password_hash = ?\");\n values.push(data.passwordHash);\n }\n if (data.role !== undefined) {\n updates.push(\"role = ?\");\n values.push(data.role);\n }\n if (data.avatar !== undefined) {\n updates.push(\"avatar = ?\");\n values.push(data.avatar);\n }\n if (data.tenantId !== undefined) {\n updates.push(\"tenant_id = ?\");\n values.push(data.tenantId);\n }\n if (data.emailVerified !== undefined) {\n updates.push(\"email_verified = ?\");\n values.push(data.emailVerified ? 1 : 0);\n }\n if (data.locked !== undefined) {\n updates.push(\"locked = ?\");\n values.push(data.locked ? 1 : 0);\n }\n if (data.lastLogin !== undefined) {\n updates.push(\"last_login = ?\");\n values.push(data.lastLogin);\n }\n if (data.failedLoginAttempts !== undefined) {\n updates.push(\"failed_login_attempts = ?\");\n values.push(data.failedLoginAttempts);\n }\n\n updates.push(\"updated_at = ?\");\n values.push(new Date().toISOString());\n\n values.push(userId);\n\n this.db!.prepare(\n `UPDATE kyro_users SET ${updates.join(\", \")} WHERE id = ?`,\n ).run(...values);\n\n return this.findUserById(userId);\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n await this.ensureConnected();\n\n const result = this.stmt(\"deleteUser\").run(userId);\n return result.changes > 0;\n }\n\n async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, this.saltRounds);\n }\n\n async verifyPassword(\n email: string,\n password: string,\n ): Promise<AuthUser | null> {\n await this.ensureConnected();\n const user = await this.findUserByEmail(email);\n if (!user) return null;\n const stored = this.db!.prepare(\n \"SELECT password_hash FROM kyro_users WHERE id = ?\",\n ).get(user.id) as { password_hash: string } | undefined;\n if (!stored?.password_hash) return null;\n const valid = await bcrypt.compare(password, stored.password_hash);\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 await this.ensureConnected();\n\n const id = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n const expiresAt = new Date(now.getTime() + 86400000).toISOString();\n\n const session: Session = {\n id,\n userId,\n token,\n refreshToken,\n expiresAt,\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n this.db!.prepare(\n `INSERT INTO kyro_sessions (id, user_id, token, refresh_token, expires_at, created_at, ip_address, user_agent)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n session.id,\n session.userId,\n session.token,\n session.refreshToken ?? null,\n session.expiresAt,\n session.createdAt,\n session.ipAddress ?? null,\n session.userAgent ?? null,\n );\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n await this.ensureConnected();\n\n const row = this.stmt(\"findSessionByToken\").get(token) as\n | Record<string, unknown>\n | undefined;\n\n if (!row) return null;\n return this.rowToSession(row);\n }\n\n async findSessionByRefreshToken(\n refreshToken: string,\n ): Promise<Session | null> {\n await this.ensureConnected();\n\n const row = this.stmt(\"findSessionByRefreshToken\").get(refreshToken) as\n | Record<string, unknown>\n | undefined;\n\n if (!row) return null;\n return this.rowToSession(row);\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n await this.ensureConnected();\n\n const result = this.stmt(\"deleteSession\").run(sessionId, sessionId);\n return result.changes > 0;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n await this.ensureConnected();\n\n const result = this.stmt(\"deleteUserSessions\").run(userId);\n return result.changes;\n }\n\n async hasAnyUsers(): Promise<boolean> {\n await this.ensureConnected();\n\n const row = this.stmt(\"countUsers\").get() as { count: number };\n return row.count > 0;\n }\n\n async findUsers(\n options: {\n page?: number;\n limit?: number;\n search?: string;\n } = {},\n ): Promise<{ users: AuthUser[]; total: number }> {\n await this.ensureConnected();\n\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 let total: number;\n let rows: Record<string, unknown>[];\n\n if (search) {\n const searchPattern = `%${search}%`;\n total = (\n this.stmt(\"countUsersWithSearch\").get(searchPattern) as {\n count: number;\n }\n ).count;\n rows = this.stmt(\"findUsersWithSearch\").all(\n searchPattern,\n limit,\n offset,\n ) as Record<string, unknown>[];\n } else {\n total = (this.stmt(\"countUsers\").get() as { count: number }).count;\n rows = this.stmt(\"findUsersPaginated\").all(limit, offset) as Record<\n string,\n unknown\n >[];\n }\n\n return {\n users: rows.map((row) => this.rowToUser(row)),\n total,\n };\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n await this.ensureConnected();\n\n this.stmt(\"addPasswordHistory\").run(\n userId,\n passwordHash,\n new Date().toISOString(),\n );\n this.stmt(\"trimPasswordHistory\").run(userId);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n await this.ensureConnected();\n\n const rows = this.stmt(\"getPasswordHistory\").all(userId, count) as Array<{\n password_hash: string;\n }>;\n\n return rows.map((r) => r.password_hash);\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 for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n async recordFailedAttempt(userId: string): Promise<void> {\n await this.ensureConnected();\n\n const now = Date.now();\n const lockout = this.stmt(\"getLockout\").get(userId) as\n | { attempts: number; locked_until: number | null }\n | undefined;\n\n const attempts = (lockout?.attempts || 0) + 1;\n const lockedUntil =\n attempts >= 5 ? now + 15 * 60 * 1000 : lockout?.locked_until || null;\n\n this.stmt(\"upsertLockout\").run(\n userId,\n attempts,\n now,\n lockedUntil !== null ? now : null,\n lockedUntil,\n );\n }\n\n async resetAttempts(userId: string): Promise<void> {\n await this.ensureConnected();\n this.stmt(\"resetLockout\").run(userId);\n }\n\n async checkLockout(userId: string): Promise<{\n locked: boolean;\n attemptsRemaining: number;\n lockedUntil?: Date;\n totalAttempts: number;\n }> {\n await this.ensureConnected();\n\n this.stmt(\"cleanupExpiredLockouts\").run(Date.now());\n\n const lockout = this.stmt(\"getLockout\").get(userId) as\n | { attempts: number; locked_until: number | null }\n | undefined;\n\n if (!lockout) {\n return {\n locked: false,\n attemptsRemaining: 5,\n totalAttempts: 0,\n };\n }\n\n if (lockout.locked_until !== null && lockout.locked_until > Date.now()) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil: new Date(lockout.locked_until),\n totalAttempts: lockout.attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, 5 - lockout.attempts),\n totalAttempts: lockout.attempts,\n };\n }\n\n async logAudit(data: {\n action: string;\n userId?: string;\n userEmail?: string;\n role?: string;\n resource: string;\n resourceId?: string;\n ipAddress?: string;\n userAgent?: string;\n success: boolean;\n error?: string;\n metadata?: Record<string, unknown>;\n }): Promise<string> {\n await this.ensureConnected();\n\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date().toISOString();\n\n this.db!.prepare(\n `INSERT INTO kyro_audit_logs (\n id, timestamp, action, user_id, user_email, role, resource, resource_id,\n ip_address, user_agent, success, error, metadata, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id,\n timestamp,\n data.action,\n data.userId || null,\n data.userEmail || null,\n data.role || null,\n data.resource,\n data.resourceId || null,\n data.ipAddress || null,\n data.userAgent || null,\n data.success ? 1 : 0,\n data.error || null,\n data.metadata ? JSON.stringify(data.metadata) : null,\n new Date().toISOString(),\n );\n\n return id;\n }\n\n async queryAuditLogs(\n options: {\n action?: string;\n userId?: string;\n resource?: string;\n success?: boolean;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n } = {},\n ): Promise<{\n logs: Array<{\n id: string;\n timestamp: Date;\n action: string;\n userId?: string;\n userEmail?: string;\n resource: string;\n resourceId?: string;\n ipAddress?: string;\n userAgent?: string;\n success: boolean;\n error?: string;\n metadata?: Record<string, unknown>;\n }>;\n total: number;\n }> {\n await this.ensureConnected();\n\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.action) {\n conditions.push(\"action = ?\");\n params.push(options.action);\n }\n if (options.userId) {\n conditions.push(\"user_id = ?\");\n params.push(options.userId);\n }\n if (options.resource) {\n conditions.push(\"resource = ?\");\n params.push(options.resource);\n }\n if (options.success !== undefined) {\n conditions.push(\"success = ?\");\n params.push(options.success ? 1 : 0);\n }\n if (options.startDate) {\n conditions.push(\"timestamp >= ?\");\n params.push(options.startDate.toISOString());\n }\n if (options.endDate) {\n conditions.push(\"timestamp <= ?\");\n params.push(options.endDate.toISOString());\n }\n\n const where =\n conditions.length > 0 ? \"WHERE \" + conditions.join(\" AND \") : \"\";\n const limit = options.limit || 50;\n const offset = options.offset || 0;\n\n const totalResult = this.db!.prepare(\n `SELECT COUNT(*) as count FROM kyro_audit_logs ${where}`,\n ).get(...params) as { count: number };\n\n const rows = this.db!.prepare(\n `SELECT * FROM kyro_audit_logs ${where} ORDER BY timestamp DESC LIMIT ? OFFSET ?`,\n ).all(...params, limit, offset) as Array<Record<string, unknown>>;\n\n return {\n total: totalResult.count,\n logs: rows.map((row) => ({\n id: row.id as string,\n timestamp: new Date(row.timestamp as string),\n action: row.action as string,\n userId: (row.user_id as string) || undefined,\n userEmail: (row.user_email as string) || undefined,\n resource: row.resource as string,\n resourceId: (row.resource_id as string) || undefined,\n ipAddress: (row.ip_address as string) || undefined,\n userAgent: (row.user_agent as string) || undefined,\n success: (row.success as number) === 1,\n error: (row.error as string) || undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n })),\n };\n }\n\n private rowToUser(row: Record<string, unknown>): AuthUser {\n return {\n id: row.id as string,\n name: (row.name as string) || undefined,\n email: row.email as string,\n passwordHash: row.password_hash as string,\n role: row.role as UserRole,\n tenantId: row.tenant_id as string | undefined,\n avatar: row.avatar as string | undefined,\n emailVerified: (row.email_verified as number) === 1,\n locked: (row.locked as number) === 1,\n lastLogin: row.last_login as string | undefined,\n failedLoginAttempts: (row.failed_login_attempts as number) || 0,\n createdAt: row.created_at as string,\n updatedAt: row.updated_at as string,\n };\n }\n\n private rowToSession(row: Record<string, unknown>): Session {\n return {\n id: row.id as string,\n userId: row.user_id as string,\n token: row.token as string,\n refreshToken: row.refresh_token as string | undefined,\n expiresAt: row.expires_at as string,\n createdAt: row.created_at as string,\n ipAddress: row.ip_address as string | undefined,\n userAgent: row.user_agent as string | undefined,\n };\n }\n\n async findAuditLogs(\n filter: AuditLogFilter,\n ): Promise<{ logs: AuditLog[]; total: number }> {\n const result = await this.queryAuditLogs({\n action: filter.action as string | undefined,\n userId: filter.userId,\n resource: filter.resource,\n success: filter.success,\n startDate: filter.startDate,\n endDate: filter.endDate,\n limit: filter.limit,\n offset: filter.offset,\n });\n return {\n logs: result.logs.map((log) => ({\n ...log,\n action: log.action as AuditLog[\"action\"],\n })),\n total: result.total,\n };\n }\n\n async createAuditLog(\n data: Omit<AuditLog, \"id\" | \"timestamp\">,\n ): Promise<AuditLog> {\n const id = await this.logAudit({\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 ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n success: data.success,\n error: data.error,\n metadata: data.metadata,\n });\n const row = this.db\n ?.prepare(\"SELECT * FROM kyro_audit_logs WHERE id = ?\")\n .get(id) as Record<string, unknown> | undefined;\n return {\n ...data,\n id,\n timestamp: row ? new Date(row.timestamp as string) : new Date(),\n };\n }\n\n async createEmailVerificationToken(userId: string): Promise<{ token: string; expiresAt: Date }> {\n await this.ensureConnected();\n const id = randomBytes(16).toString(\"hex\");\n const token = randomBytes(32).toString(\"hex\");\n const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000);\n\n this.db!.prepare(\n \"INSERT INTO kyro_email_verifications (id, user_id, token, expires_at, created_at) VALUES (?, ?, ?, ?, ?)\"\n ).run(id, userId, token, expiresAt.toISOString(), new Date().toISOString());\n\n return { token, expiresAt };\n }\n\n async verifyEmailToken(token: string): Promise<{ success: boolean; userId?: string; error?: string }> {\n await this.ensureConnected();\n\n const row = this.db!.prepare(\n \"SELECT * FROM kyro_email_verifications WHERE token = ?\"\n ).get(token) as { id: string; user_id: string; expires_at: string } | undefined;\n\n if (!row) {\n return { success: false, error: \"Invalid verification token\" };\n }\n\n if (new Date(row.expires_at) < new Date()) {\n return { success: false, error: \"Verification token has expired\" };\n }\n\n this.db!.prepare(\n \"UPDATE kyro_users SET email_verified = 1 WHERE id = ?\"\n ).run(row.user_id);\n\n this.db!.prepare(\n \"DELETE FROM kyro_email_verifications WHERE id = ?\"\n ).run(row.id);\n\n return { success: true, userId: row.user_id };\n }\n\n async createPasswordResetToken(email: string): Promise<{ token: string; expiresAt: Date; error?: string }> {\n await this.ensureConnected();\n\n const user = await this.findUserByEmail(email);\n if (!user) {\n return { token: \"\", expiresAt: new Date(), error: \"User not found\" };\n }\n\n const id = randomBytes(16).toString(\"hex\");\n const token = randomBytes(32).toString(\"hex\");\n const expiresAt = new Date(Date.now() + 60 * 60 * 1000);\n\n this.db!.prepare(\n \"INSERT INTO kyro_password_resets (id, user_id, token, expires_at, created_at) VALUES (?, ?, ?, ?, ?)\"\n ).run(id, user.id, token, expiresAt.toISOString(), new Date().toISOString());\n\n return { token, expiresAt };\n }\n\n async resetPasswordWithToken(token: string, newPassword: string): Promise<{ success: boolean; error?: string }> {\n await this.ensureConnected();\n\n const row = this.db!.prepare(\n \"SELECT * FROM kyro_password_resets WHERE token = ?\"\n ).get(token) as { id: string; user_id: string; expires_at: string; used_at: string | null } | undefined;\n\n if (!row) {\n return { success: false, error: \"Invalid reset token\" };\n }\n\n if (new Date(row.expires_at) < new Date()) {\n return { success: false, error: \"Reset token has expired\" };\n }\n\n if (row.used_at) {\n return { success: false, error: \"Reset token has already been used\" };\n }\n\n const passwordHash = await this.hashPassword(newPassword);\n\n this.db!.prepare(\n \"UPDATE kyro_users SET password_hash = ?, updated_at = ? WHERE id = ?\"\n ).run(passwordHash, new Date().toISOString(), row.user_id);\n\n this.db!.prepare(\n \"UPDATE kyro_password_resets SET used_at = ? WHERE id = ?\"\n ).run(new Date().toISOString(), row.id);\n\n this.db!.prepare(\n \"DELETE FROM kyro_sessions WHERE user_id = ?\"\n ).run(row.user_id);\n\n return { success: true };\n }\n}\n"]}
|
|
@@ -13,6 +13,7 @@ var users = pgCore.pgTable(
|
|
|
13
13
|
role: pgCore.varchar("role", { length: 50 }).notNull().default("customer"),
|
|
14
14
|
tenantId: pgCore.uuid("tenant_id"),
|
|
15
15
|
emailVerified: pgCore.boolean("email_verified").default(false),
|
|
16
|
+
avatar: pgCore.varchar("avatar", { length: 255 }),
|
|
16
17
|
locked: pgCore.boolean("locked").default(false),
|
|
17
18
|
lastLogin: pgCore.timestamp("last_login"),
|
|
18
19
|
failedLoginAttempts: pgCore.integer("failed_login_attempts").default(0),
|
|
@@ -200,5 +201,5 @@ exports.roles = roles;
|
|
|
200
201
|
exports.sessions = sessions;
|
|
201
202
|
exports.tenants = tenants;
|
|
202
203
|
exports.users = users;
|
|
203
|
-
//# sourceMappingURL=chunk-
|
|
204
|
-
//# sourceMappingURL=chunk-
|
|
204
|
+
//# sourceMappingURL=chunk-JOPVMWTM.cjs.map
|
|
205
|
+
//# sourceMappingURL=chunk-JOPVMWTM.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-JOPVMWTM.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 name: varchar(\"name\", { length: 255 }),\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 avatar: varchar(\"avatar\", { length: 255 }),\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"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/templates/auth.ts
|
|
4
|
+
var usersCollection = {
|
|
5
|
+
slug: "users",
|
|
6
|
+
label: "Users",
|
|
7
|
+
fields: [
|
|
8
|
+
{ name: "name", type: "text", label: "Name" },
|
|
9
|
+
{ name: "email", type: "email", required: true },
|
|
10
|
+
{
|
|
11
|
+
name: "passwordHash",
|
|
12
|
+
type: "text",
|
|
13
|
+
label: "Password Hash",
|
|
14
|
+
admin: { hidden: true }
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: "role",
|
|
18
|
+
type: "select",
|
|
19
|
+
options: [
|
|
20
|
+
{ label: "Super Admin", value: "super_admin" },
|
|
21
|
+
{ label: "Admin", value: "admin" },
|
|
22
|
+
{ label: "Editor", value: "editor" },
|
|
23
|
+
{ label: "Author", value: "author" },
|
|
24
|
+
{ label: "Customer", value: "customer" },
|
|
25
|
+
{ label: "Guest", value: "guest" }
|
|
26
|
+
],
|
|
27
|
+
required: true
|
|
28
|
+
},
|
|
29
|
+
{ name: "avatar", type: "upload", relationTo: "media", label: "Profile Picture" },
|
|
30
|
+
{ name: "tenantId", type: "text", label: "Tenant" },
|
|
31
|
+
{ name: "emailVerified", type: "checkbox", label: "Email Verified" },
|
|
32
|
+
{ name: "locked", type: "checkbox" },
|
|
33
|
+
{
|
|
34
|
+
name: "lastLogin",
|
|
35
|
+
type: "date",
|
|
36
|
+
time: true,
|
|
37
|
+
label: "Last Login",
|
|
38
|
+
admin: { readOnly: true }
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "failedLoginAttempts",
|
|
42
|
+
type: "number",
|
|
43
|
+
label: "Failed Login Attempts",
|
|
44
|
+
admin: { readOnly: true }
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
timestamps: true,
|
|
48
|
+
admin: {
|
|
49
|
+
useAsTitle: "email",
|
|
50
|
+
defaultColumns: ["email", "role", "tenantId", "lastLogin"]
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var auditLogsCollection = {
|
|
54
|
+
slug: "audit_logs",
|
|
55
|
+
label: "Audit Logs",
|
|
56
|
+
fields: [
|
|
57
|
+
{ name: "action", type: "text", required: true },
|
|
58
|
+
{ name: "userId", type: "text", label: "User ID" },
|
|
59
|
+
{ name: "userEmail", type: "email", label: "User Email" },
|
|
60
|
+
{ name: "role", type: "text" },
|
|
61
|
+
{ name: "resource", type: "text", label: "Resource" },
|
|
62
|
+
{ name: "ipAddress", type: "text", label: "IP Address" },
|
|
63
|
+
{ name: "success", type: "checkbox" },
|
|
64
|
+
{
|
|
65
|
+
name: "timestamp",
|
|
66
|
+
type: "date",
|
|
67
|
+
time: true,
|
|
68
|
+
required: true,
|
|
69
|
+
admin: { readOnly: true }
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
admin: {
|
|
73
|
+
defaultColumns: ["action", "userEmail", "resource", "success", "timestamp"]
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
var authCollections = {
|
|
77
|
+
users: usersCollection,
|
|
78
|
+
audit_logs: auditLogsCollection
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
exports.authCollections = authCollections;
|
|
82
|
+
exports.usersCollection = usersCollection;
|
|
83
|
+
//# sourceMappingURL=chunk-KC2GDBLS.cjs.map
|
|
84
|
+
//# sourceMappingURL=chunk-KC2GDBLS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/templates/auth.ts"],"names":[],"mappings":"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","file":"chunk-KC2GDBLS.cjs","sourcesContent":["import type { CollectionConfig } from \"../registry/types.js\";\n\nexport const usersCollection: CollectionConfig = {\n slug: \"users\",\n label: \"Users\",\n fields: [\n { name: \"name\", type: \"text\", label: \"Name\" },\n { name: \"email\", type: \"email\", required: true },\n {\n name: \"passwordHash\",\n type: \"text\",\n label: \"Password Hash\",\n admin: { hidden: true },\n },\n {\n name: \"role\",\n type: \"select\",\n options: [\n { label: \"Super Admin\", value: \"super_admin\" },\n { label: \"Admin\", value: \"admin\" },\n { label: \"Editor\", value: \"editor\" },\n { label: \"Author\", value: \"author\" },\n { label: \"Customer\", value: \"customer\" },\n { label: \"Guest\", value: \"guest\" },\n ],\n required: true,\n },\n { name: \"avatar\", type: \"upload\", relationTo: \"media\", label: \"Profile Picture\" },\n { name: \"tenantId\", type: \"text\", label: \"Tenant\" },\n { name: \"emailVerified\", type: \"checkbox\", label: \"Email Verified\" },\n { name: \"locked\", type: \"checkbox\" },\n {\n name: \"lastLogin\",\n type: \"date\",\n time: true,\n label: \"Last Login\",\n admin: { readOnly: true },\n },\n {\n name: \"failedLoginAttempts\",\n type: \"number\",\n label: \"Failed Login Attempts\",\n admin: { readOnly: true },\n },\n ],\n timestamps: true,\n admin: {\n useAsTitle: \"email\",\n defaultColumns: [\"email\", \"role\", \"tenantId\", \"lastLogin\"],\n },\n};\n\nexport const auditLogsCollection: CollectionConfig = {\n slug: \"audit_logs\",\n label: \"Audit Logs\",\n fields: [\n { name: \"action\", type: \"text\", required: true },\n { name: \"userId\", type: \"text\", label: \"User ID\" },\n { name: \"userEmail\", type: \"email\", label: \"User Email\" },\n { name: \"role\", type: \"text\" },\n { name: \"resource\", type: \"text\", label: \"Resource\" },\n { name: \"ipAddress\", type: \"text\", label: \"IP Address\" },\n { name: \"success\", type: \"checkbox\" },\n {\n name: \"timestamp\",\n type: \"date\",\n time: true,\n required: true,\n admin: { readOnly: true },\n },\n ],\n admin: {\n defaultColumns: [\"action\", \"userEmail\", \"resource\", \"success\", \"timestamp\"],\n },\n};\n\nexport const authCollections = {\n users: usersCollection,\n audit_logs: auditLogsCollection,\n};\n"]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkQFLB4EIJ_cjs = require('./chunk-QFLB4EIJ.cjs');
|
|
4
|
+
var chunk4M7X5HAB_cjs = require('./chunk-4M7X5HAB.cjs');
|
|
5
|
+
var chunkNKPKR5BW_cjs = require('./chunk-NKPKR5BW.cjs');
|
|
5
6
|
|
|
6
7
|
// src/api/trpc/context.ts
|
|
7
8
|
async function createContext(options) {
|
|
8
|
-
const webhookService =
|
|
9
|
+
const webhookService = chunkQFLB4EIJ_cjs.createWebhookService(options.db);
|
|
9
10
|
const baseContext = {
|
|
10
11
|
db: options.db,
|
|
11
12
|
registry: options.registry,
|
|
@@ -15,13 +16,13 @@ async function createContext(options) {
|
|
|
15
16
|
webhookService,
|
|
16
17
|
settings: options.settings
|
|
17
18
|
};
|
|
18
|
-
const apiKeyRaw =
|
|
19
|
+
const apiKeyRaw = chunk4M7X5HAB_cjs.extractApiKeyFromRequest(options.req);
|
|
19
20
|
if (apiKeyRaw) {
|
|
20
|
-
const result = await
|
|
21
|
+
const result = await chunk4M7X5HAB_cjs.validateApiKey(apiKeyRaw, options.db);
|
|
21
22
|
if (result.valid) {
|
|
22
23
|
baseContext.user = result.user || options.user;
|
|
23
24
|
baseContext.tenantID = result.tenantId || options.tenantID;
|
|
24
|
-
baseContext.apiKey =
|
|
25
|
+
baseContext.apiKey = chunk4M7X5HAB_cjs.createApiKeyContext(result);
|
|
25
26
|
}
|
|
26
27
|
}
|
|
27
28
|
return baseContext;
|
|
@@ -30,9 +31,9 @@ async function createContext(options) {
|
|
|
30
31
|
// src/api/trpc/procedures.ts
|
|
31
32
|
var COLLECTION_EVENT_MAP = {
|
|
32
33
|
_media: {
|
|
33
|
-
create:
|
|
34
|
-
update:
|
|
35
|
-
delete:
|
|
34
|
+
create: chunkQFLB4EIJ_cjs.WEBHOOK_EVENTS.MEDIA_UPLOAD,
|
|
35
|
+
update: chunkQFLB4EIJ_cjs.WEBHOOK_EVENTS.MEDIA_UPLOAD,
|
|
36
|
+
delete: chunkQFLB4EIJ_cjs.WEBHOOK_EVENTS.MEDIA_DELETE
|
|
36
37
|
}
|
|
37
38
|
};
|
|
38
39
|
function getWebhookEvent(collection, operation) {
|
|
@@ -55,18 +56,53 @@ async function triggerWebhook(ctx, event, payload) {
|
|
|
55
56
|
console.error(`[Webhook] Failed to trigger ${event}:`, err);
|
|
56
57
|
}
|
|
57
58
|
}
|
|
59
|
+
async function checkTRPCAccess(config, operation, ctx) {
|
|
60
|
+
const accessRule = config.access?.[operation];
|
|
61
|
+
const apiKey = ctx.apiKey;
|
|
62
|
+
if (apiKey && apiKey.permissions && apiKey.permissions.length > 0) {
|
|
63
|
+
const resource = config.slug;
|
|
64
|
+
const action = operation === "read" ? "read" : operation === "create" ? "create" : "update";
|
|
65
|
+
const permission = `${resource}:${action}`;
|
|
66
|
+
if (!chunk4M7X5HAB_cjs.hasApiKeyPermission(apiKey.permissions, permission) && !chunk4M7X5HAB_cjs.hasApiKeyPermission(apiKey.permissions, `${resource}:admin`)) {
|
|
67
|
+
throw new Error(`Access denied: missing API key permission ${permission}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (ctx.user) {
|
|
71
|
+
const resource = config.slug;
|
|
72
|
+
const action = operation === "read" ? "read" : operation === "create" ? "create" : operation === "update" ? "update" : "delete";
|
|
73
|
+
const permission = `${resource}:${action}`;
|
|
74
|
+
const userHasPermission = chunkNKPKR5BW_cjs.hasPermission(
|
|
75
|
+
{ id: ctx.user.id, email: ctx.user.email, role: ctx.user.role },
|
|
76
|
+
permission
|
|
77
|
+
);
|
|
78
|
+
if (!userHasPermission && !chunkNKPKR5BW_cjs.hasPermission(
|
|
79
|
+
{ id: ctx.user.id, email: ctx.user.email, role: ctx.user.role },
|
|
80
|
+
`${resource}:admin`
|
|
81
|
+
)) {
|
|
82
|
+
if (!accessRule) {
|
|
83
|
+
throw new Error(`Access denied: missing RBAC permission ${permission}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (accessRule) {
|
|
88
|
+
const allowed = await chunk4M7X5HAB_cjs.evaluateAccess(accessRule, {
|
|
89
|
+
req: ctx.req,
|
|
90
|
+
user: ctx.user,
|
|
91
|
+
tenantID: ctx.tenantID
|
|
92
|
+
});
|
|
93
|
+
if (allowed === false) throw new Error("Access denied");
|
|
94
|
+
} else if (!ctx.user && !ctx.apiKey) {
|
|
95
|
+
throw new Error("Access denied: authentication required");
|
|
96
|
+
}
|
|
97
|
+
if (ctx.tenantID) {
|
|
98
|
+
ctx.db.setTenantContext({ tenantId: ctx.tenantID, userId: ctx.user?.id ?? "", role: ctx.user?.role, isSuperAdmin: ctx.user?.role === "super_admin" });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
58
101
|
function createFindProcedure(ctx) {
|
|
59
102
|
return async (input) => {
|
|
60
|
-
const { collection, where, sort, limit, page, depth, select } = input;
|
|
103
|
+
const { collection, where, sort, limit, page, depth, select, draft } = input;
|
|
61
104
|
const config = ctx.registry.getCollection(collection);
|
|
62
|
-
|
|
63
|
-
const allowed = await chunkR3XIBBAW_cjs.evaluateAccess(config.access.read, {
|
|
64
|
-
req: ctx.req,
|
|
65
|
-
user: ctx.user,
|
|
66
|
-
tenantID: ctx.tenantID
|
|
67
|
-
});
|
|
68
|
-
if (allowed === false) throw new Error("Access denied");
|
|
69
|
-
}
|
|
105
|
+
await checkTRPCAccess(config, "read", ctx);
|
|
70
106
|
if (config.hooks?.beforeRead) {
|
|
71
107
|
for (const hook of config.hooks.beforeRead) {
|
|
72
108
|
await hook({
|
|
@@ -79,6 +115,7 @@ function createFindProcedure(ctx) {
|
|
|
79
115
|
});
|
|
80
116
|
}
|
|
81
117
|
}
|
|
118
|
+
const isDraft = draft ?? !!ctx.user;
|
|
82
119
|
const result = await ctx.db.find({
|
|
83
120
|
collection,
|
|
84
121
|
where: where || {},
|
|
@@ -87,7 +124,8 @@ function createFindProcedure(ctx) {
|
|
|
87
124
|
page: page || 1,
|
|
88
125
|
depth: depth || 0,
|
|
89
126
|
tenantID: ctx.tenantID,
|
|
90
|
-
select
|
|
127
|
+
select,
|
|
128
|
+
draft: isDraft
|
|
91
129
|
});
|
|
92
130
|
if (config.hooks?.afterRead) {
|
|
93
131
|
for (const doc of result.docs) {
|
|
@@ -108,23 +146,17 @@ function createFindProcedure(ctx) {
|
|
|
108
146
|
}
|
|
109
147
|
function createFindByIDProcedure(ctx) {
|
|
110
148
|
return async (input) => {
|
|
111
|
-
const { collection, id, depth, select } = input;
|
|
149
|
+
const { collection, id, depth, select, draft } = input;
|
|
112
150
|
const config = ctx.registry.getCollection(collection);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
req: ctx.req,
|
|
116
|
-
user: ctx.user,
|
|
117
|
-
tenantID: ctx.tenantID,
|
|
118
|
-
id
|
|
119
|
-
});
|
|
120
|
-
if (allowed === false) throw new Error("Access denied");
|
|
121
|
-
}
|
|
151
|
+
await checkTRPCAccess(config, "read", ctx);
|
|
152
|
+
const isDraft = draft ?? !!ctx.user;
|
|
122
153
|
const doc = await ctx.db.findByID({
|
|
123
154
|
collection,
|
|
124
155
|
id,
|
|
125
156
|
depth: depth || 0,
|
|
126
157
|
tenantID: ctx.tenantID,
|
|
127
|
-
select
|
|
158
|
+
select,
|
|
159
|
+
draft: isDraft
|
|
128
160
|
});
|
|
129
161
|
if (!doc) throw new Error(`Document not found: ${collection}/${id}`);
|
|
130
162
|
if (config.hooks?.afterRead) {
|
|
@@ -147,15 +179,7 @@ function createCreateProcedure(ctx) {
|
|
|
147
179
|
return async (input) => {
|
|
148
180
|
const { collection, data, depth, select } = input;
|
|
149
181
|
const config = ctx.registry.getCollection(collection);
|
|
150
|
-
|
|
151
|
-
const allowed = await chunkR3XIBBAW_cjs.evaluateAccess(config.access.create, {
|
|
152
|
-
req: ctx.req,
|
|
153
|
-
user: ctx.user,
|
|
154
|
-
tenantID: ctx.tenantID,
|
|
155
|
-
data
|
|
156
|
-
});
|
|
157
|
-
if (allowed === false) throw new Error("Access denied");
|
|
158
|
-
}
|
|
182
|
+
await checkTRPCAccess(config, "create", ctx);
|
|
159
183
|
const schema = ctx.registry.getCreateZodSchema(collection);
|
|
160
184
|
const validated = schema.parse(data);
|
|
161
185
|
if (config.tenantScoped && ctx.tenantID) {
|
|
@@ -217,25 +241,19 @@ function createCreateProcedure(ctx) {
|
|
|
217
241
|
}
|
|
218
242
|
function createUpdateProcedure(ctx) {
|
|
219
243
|
return async (input) => {
|
|
220
|
-
const { collection, id, data, depth, select } = input;
|
|
244
|
+
const { collection, id, data, depth, select, baseUpdatedAt } = input;
|
|
221
245
|
const config = ctx.registry.getCollection(collection);
|
|
246
|
+
await checkTRPCAccess(config, "update", ctx);
|
|
222
247
|
const originalDoc = await ctx.db.findByID({
|
|
223
248
|
collection,
|
|
224
249
|
id,
|
|
225
|
-
tenantID: ctx.tenantID
|
|
250
|
+
tenantID: ctx.tenantID,
|
|
251
|
+
draft: true
|
|
226
252
|
});
|
|
227
253
|
if (!originalDoc)
|
|
228
254
|
throw new Error(`Document not found: ${collection}/${id}`);
|
|
229
|
-
if (
|
|
230
|
-
|
|
231
|
-
req: ctx.req,
|
|
232
|
-
user: ctx.user,
|
|
233
|
-
tenantID: ctx.tenantID,
|
|
234
|
-
id,
|
|
235
|
-
doc: originalDoc,
|
|
236
|
-
data
|
|
237
|
-
});
|
|
238
|
-
if (allowed === false) throw new Error("Access denied");
|
|
255
|
+
if (baseUpdatedAt && originalDoc.updatedAt && baseUpdatedAt !== originalDoc.updatedAt) {
|
|
256
|
+
throw new Error(`Revision conflict: document has changed since ${baseUpdatedAt}. Current updatedAt: ${originalDoc.updatedAt}`);
|
|
239
257
|
}
|
|
240
258
|
const schema = ctx.registry.getUpdateZodSchema(collection);
|
|
241
259
|
const validated = schema.parse(data);
|
|
@@ -308,23 +326,15 @@ function createDeleteProcedure(ctx) {
|
|
|
308
326
|
return async (input) => {
|
|
309
327
|
const { collection, id } = input;
|
|
310
328
|
const config = ctx.registry.getCollection(collection);
|
|
329
|
+
await checkTRPCAccess(config, "delete", ctx);
|
|
311
330
|
const originalDoc = await ctx.db.findByID({
|
|
312
331
|
collection,
|
|
313
332
|
id,
|
|
314
|
-
tenantID: ctx.tenantID
|
|
333
|
+
tenantID: ctx.tenantID,
|
|
334
|
+
draft: true
|
|
315
335
|
});
|
|
316
336
|
if (!originalDoc)
|
|
317
337
|
throw new Error(`Document not found: ${collection}/${id}`);
|
|
318
|
-
if (config.access?.delete) {
|
|
319
|
-
const allowed = await chunkR3XIBBAW_cjs.evaluateAccess(config.access.delete, {
|
|
320
|
-
req: ctx.req,
|
|
321
|
-
user: ctx.user,
|
|
322
|
-
tenantID: ctx.tenantID,
|
|
323
|
-
id,
|
|
324
|
-
doc: originalDoc
|
|
325
|
-
});
|
|
326
|
-
if (allowed === false) throw new Error("Access denied");
|
|
327
|
-
}
|
|
328
338
|
if (config.hooks?.beforeDelete) {
|
|
329
339
|
for (const hook of config.hooks.beforeDelete) {
|
|
330
340
|
await hook({
|
|
@@ -369,14 +379,7 @@ function createCountProcedure(ctx) {
|
|
|
369
379
|
return async (input) => {
|
|
370
380
|
const { collection, where } = input;
|
|
371
381
|
const config = ctx.registry.getCollection(collection);
|
|
372
|
-
|
|
373
|
-
const allowed = await chunkR3XIBBAW_cjs.evaluateAccess(config.access.read, {
|
|
374
|
-
req: ctx.req,
|
|
375
|
-
user: ctx.user,
|
|
376
|
-
tenantID: ctx.tenantID
|
|
377
|
-
});
|
|
378
|
-
if (allowed === false) throw new Error("Access denied");
|
|
379
|
-
}
|
|
382
|
+
await checkTRPCAccess(config, "read", ctx);
|
|
380
383
|
const totalDocs = await ctx.db.count({
|
|
381
384
|
collection,
|
|
382
385
|
where: where || {},
|
|
@@ -387,6 +390,44 @@ function createCountProcedure(ctx) {
|
|
|
387
390
|
}
|
|
388
391
|
|
|
389
392
|
// src/api/trpc/router.ts
|
|
393
|
+
async function checkGlobalAccessTRPC(global, operation, ctx) {
|
|
394
|
+
const accessRule = global.access?.[operation];
|
|
395
|
+
const apiKey = ctx.apiKey;
|
|
396
|
+
if (apiKey && apiKey.permissions && apiKey.permissions.length > 0) {
|
|
397
|
+
const permission = `globals:${operation}`;
|
|
398
|
+
if (!chunk4M7X5HAB_cjs.hasApiKeyPermission(apiKey.permissions, permission) && !chunk4M7X5HAB_cjs.hasApiKeyPermission(apiKey.permissions, "globals:admin")) {
|
|
399
|
+
throw new Error(`Access denied: missing API key permission ${permission}`);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
if (ctx.user) {
|
|
403
|
+
const permission = `globals:${operation}`;
|
|
404
|
+
const userHasPermission = chunkNKPKR5BW_cjs.hasPermission(
|
|
405
|
+
{ id: ctx.user.id, email: ctx.user.email, role: ctx.user.role },
|
|
406
|
+
permission
|
|
407
|
+
);
|
|
408
|
+
if (!userHasPermission && !chunkNKPKR5BW_cjs.hasPermission(
|
|
409
|
+
{ id: ctx.user.id, email: ctx.user.email, role: ctx.user.role },
|
|
410
|
+
"globals:admin"
|
|
411
|
+
)) {
|
|
412
|
+
if (!accessRule) {
|
|
413
|
+
throw new Error(`Access denied: missing RBAC permission ${permission}`);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
if (accessRule) {
|
|
418
|
+
const allowed = await chunk4M7X5HAB_cjs.evaluateAccess(accessRule, {
|
|
419
|
+
req: ctx.req,
|
|
420
|
+
user: ctx.user,
|
|
421
|
+
tenantID: ctx.tenantID
|
|
422
|
+
});
|
|
423
|
+
if (allowed === false) throw new Error("Access denied");
|
|
424
|
+
} else if (!ctx.user && !ctx.apiKey) {
|
|
425
|
+
throw new Error("Access denied: authentication required");
|
|
426
|
+
}
|
|
427
|
+
if (ctx.tenantID) {
|
|
428
|
+
ctx.db.setTenantContext({ tenantId: ctx.tenantID, userId: ctx.user?.id ?? "", role: ctx.user?.role, isSuperAdmin: ctx.user?.role === "super_admin" });
|
|
429
|
+
}
|
|
430
|
+
}
|
|
390
431
|
function createDynamicRouter(ctx) {
|
|
391
432
|
const router = {};
|
|
392
433
|
const collections = ctx.registry.getCollections();
|
|
@@ -406,6 +447,7 @@ function createDynamicRouter(ctx) {
|
|
|
406
447
|
const slug = global.slug;
|
|
407
448
|
router[`_globals_${slug}`] = {
|
|
408
449
|
get: async () => {
|
|
450
|
+
await checkGlobalAccessTRPC(global, "read", ctx);
|
|
409
451
|
const doc = await ctx.db.findOne({
|
|
410
452
|
collection: `_globals_${slug}`,
|
|
411
453
|
where: {},
|
|
@@ -414,13 +456,29 @@ function createDynamicRouter(ctx) {
|
|
|
414
456
|
return doc;
|
|
415
457
|
},
|
|
416
458
|
update: async (input) => {
|
|
459
|
+
await checkGlobalAccessTRPC(global, "update", ctx);
|
|
417
460
|
const schema = ctx.registry.getZodSchema(slug);
|
|
418
461
|
const validated = schema.parse(input.data);
|
|
419
|
-
const
|
|
462
|
+
const existing = await ctx.db.findOne({
|
|
420
463
|
collection: `_globals_${slug}`,
|
|
421
|
-
|
|
464
|
+
where: {},
|
|
422
465
|
tenantID: ctx.tenantID
|
|
423
466
|
});
|
|
467
|
+
let doc;
|
|
468
|
+
if (existing) {
|
|
469
|
+
doc = await ctx.db.update({
|
|
470
|
+
collection: `_globals_${slug}`,
|
|
471
|
+
id: existing.id,
|
|
472
|
+
data: validated,
|
|
473
|
+
tenantID: ctx.tenantID
|
|
474
|
+
});
|
|
475
|
+
} else {
|
|
476
|
+
doc = await ctx.db.create({
|
|
477
|
+
collection: `_globals_${slug}`,
|
|
478
|
+
data: { ...validated, id: slug },
|
|
479
|
+
tenantID: ctx.tenantID
|
|
480
|
+
});
|
|
481
|
+
}
|
|
424
482
|
return doc;
|
|
425
483
|
}
|
|
426
484
|
};
|
|
@@ -444,5 +502,5 @@ exports.createFindByIDProcedure = createFindByIDProcedure;
|
|
|
444
502
|
exports.createFindProcedure = createFindProcedure;
|
|
445
503
|
exports.createKyroServer = createKyroServer;
|
|
446
504
|
exports.createUpdateProcedure = createUpdateProcedure;
|
|
447
|
-
//# sourceMappingURL=chunk-
|
|
448
|
-
//# sourceMappingURL=chunk-
|
|
505
|
+
//# sourceMappingURL=chunk-KNRSROWB.cjs.map
|
|
506
|
+
//# sourceMappingURL=chunk-KNRSROWB.cjs.map
|