gammanexus/server/db.ts

57 lines
1.9 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";
// 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];
}