61 lines
2.0 KiB
TypeScript
61 lines
2.0 KiB
TypeScript
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<void> {
|
|
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<User> {
|
|
const [user] = await db.insert(users).values(data).returning();
|
|
return user;
|
|
}
|
|
|
|
export async function getUserByEmail(email: string): Promise<User | undefined> {
|
|
const result = await db.select().from(users).where(eq(users.email, email.toLowerCase()));
|
|
return result[0];
|
|
}
|
|
|
|
export async function getUserById(id: number): Promise<User | undefined> {
|
|
const result = await db.select().from(users).where(eq(users.id, id));
|
|
return result[0];
|
|
}
|
|
|
|
export async function updateUser(id: number, data: Partial<Pick<User, "name" | "email">>): Promise<User> {
|
|
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<User> {
|
|
const result = await db.update(users).set({ passwordHash }).where(eq(users.id, id)).returning();
|
|
return result[0];
|
|
}
|