@@ -5,6 +5,31 @@ import { logger } from '../core/monitoring/logger.js';
55
66type Database = BetterSqlite3 . Database ;
77
8+ interface UserRow {
9+ id : string ;
10+ sub : string ;
11+ email : string ;
12+ name ?: string ;
13+ avatar ?: string ;
14+ tier : 'free' | 'pro' | 'enterprise' ;
15+ permissions : string ;
16+ organizations : string ;
17+ api_keys : string ;
18+ created_at : number ;
19+ updated_at : number ;
20+ last_login_at ?: number ;
21+ metadata ?: string ;
22+ }
23+
24+ interface SessionRow {
25+ id : string ;
26+ user_id : string ;
27+ token : string ;
28+ expires_at : number ;
29+ created_at : number ;
30+ metadata ?: string ;
31+ }
32+
833export interface User {
934 id : string ;
1035 sub : string ; // Subject identifier from auth provider
@@ -22,7 +47,7 @@ export interface User {
2247 createdAt : Date ;
2348 updatedAt : Date ;
2449 lastLoginAt ?: Date ;
25- metadata ?: Record < string , any > ;
50+ metadata ?: Record < string , unknown > ;
2651}
2752
2853export interface UserSession {
@@ -31,7 +56,7 @@ export interface UserSession {
3156 token : string ;
3257 expiresAt : Date ;
3358 createdAt : Date ;
34- metadata ?: Record < string , any > ;
59+ metadata ?: Record < string , unknown > ;
3560}
3661
3762export class UserModel {
@@ -105,10 +130,14 @@ export class UserModel {
105130 }
106131
107132 async createUser ( userData : Partial < User > ) : Promise < User > {
133+ if ( ! userData . sub || ! userData . email ) {
134+ throw new Error ( 'User sub and email are required' ) ;
135+ }
136+
108137 const user : User = {
109138 id : userData . id || uuidv4 ( ) ,
110- sub : userData . sub ! ,
111- email : userData . email ! ,
139+ sub : userData . sub ,
140+ email : userData . email ,
112141 name : userData . name ,
113142 avatar : userData . avatar ,
114143 tier : userData . tier || 'free' ,
@@ -148,7 +177,7 @@ export class UserModel {
148177
149178 async findUserBySub ( sub : string ) : Promise < User | null > {
150179 const stmt = this . db . prepare ( 'SELECT * FROM users WHERE sub = ?' ) ;
151- const row = stmt . get ( sub ) as any ;
180+ const row = stmt . get ( sub ) as UserRow | undefined ;
152181
153182 if ( ! row ) {
154183 return null ;
@@ -159,7 +188,7 @@ export class UserModel {
159188
160189 async findUserByEmail ( email : string ) : Promise < User | null > {
161190 const stmt = this . db . prepare ( 'SELECT * FROM users WHERE email = ?' ) ;
162- const row = stmt . get ( email ) as any ;
191+ const row = stmt . get ( email ) as UserRow | undefined ;
163192
164193 if ( ! row ) {
165194 return null ;
@@ -170,7 +199,7 @@ export class UserModel {
170199
171200 async findUserById ( id : string ) : Promise < User | null > {
172201 const stmt = this . db . prepare ( 'SELECT * FROM users WHERE id = ?' ) ;
173- const row = stmt . get ( id ) as any ;
202+ const row = stmt . get ( id ) as UserRow | undefined ;
174203
175204 if ( ! row ) {
176205 return null ;
@@ -267,7 +296,7 @@ export class UserModel {
267296
268297 async findSessionByToken ( token : string ) : Promise < UserSession | null > {
269298 const stmt = this . db . prepare ( 'SELECT * FROM user_sessions WHERE token = ?' ) ;
270- const row = stmt . get ( token ) as any ;
299+ const row = stmt . get ( token ) as SessionRow | undefined ;
271300
272301 if ( ! row ) {
273302 return null ;
@@ -350,7 +379,7 @@ export class UserModel {
350379 WHERE (ak.expires_at IS NULL OR ak.expires_at > datetime('now'))
351380 ` ) ;
352381
353- const rows = stmt . all ( ) as any [ ] ;
382+ const rows = stmt . all ( ) as SessionRow [ ] ;
354383
355384 for ( const row of rows ) {
356385 if ( await bcrypt . compare ( apiKey , row . key_hash ) ) {
@@ -393,7 +422,7 @@ export class UserModel {
393422 ORDER BY created_at DESC
394423 ` ) ;
395424
396- const rows = stmt . all ( userId ) as any [ ] ;
425+ const rows = stmt . all ( userId ) as SessionRow [ ] ;
397426 return rows . map ( ( row ) => ( {
398427 id : row . id ,
399428 name : row . name ,
@@ -403,7 +432,7 @@ export class UserModel {
403432 }
404433
405434 // Helper methods
406- private rowToUser ( row : any ) : User {
435+ private rowToUser ( row : UserRow ) : User {
407436 return {
408437 id : row . id ,
409438 sub : row . sub ,
@@ -421,7 +450,7 @@ export class UserModel {
421450 } ;
422451 }
423452
424- private rowToSession ( row : any ) : UserSession {
453+ private rowToSession ( row : SessionRow ) : UserSession {
425454 return {
426455 id : row . id ,
427456 userId : row . user_id ,
0 commit comments