import { drizzle } from "drizzle-orm/better-sqlite3"; import { eq } from "drizzle-orm"; import { users, User, NewUser } from "../shared/schema"; import Database from "better-sqlite3"; import path from "node:path"; import fs from "node:fs"; import { fileURLToPath } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Use SQLite for production (PostgreSQL migration later) const dbPath = path.resolve(__dirname, "..", "data.db"); // Ensure data directory exists const dbDir = path.dirname(dbPath); if (!fs.existsSync(dbDir)) { fs.mkdirSync(dbDir, { recursive: true }); } const sqlite = new Database(dbPath); export const db = drizzle(sqlite); // Initialize users table if it doesn't exist (called at startup) export async function initDb(): Promise { sqlite.exec(` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) `); } export async function createUser(data: NewUser): Promise { const [user] = await db.insert(users).values(data).returning(); return user; } export async function getUserByEmail(email: string): Promise { const result = await db.select().from(users).where(eq(users.email, email.toLowerCase())); return result[0]; } export async function getUserById(id: number): Promise { const result = await db.select().from(users).where(eq(users.id, id)); return result[0]; } export async function updateUser(id: number, data: Partial>): Promise { const result = await db.update(users).set(data).where(eq(users.id, id)).returning(); return result[0]; } export async function updateUserPassword(id: number, passwordHash: string): Promise { const result = await db.update(users).set({ passwordHash }).where(eq(users.id, id)).returning(); return result[0]; }