Files
ui-tracker/backend/src/database.ts
T
2026-03-27 23:33:31 -05:00

58 lines
1.5 KiB
TypeScript

import Database from 'better-sqlite3';
import path from 'path';
const DB_PATH = process.env.DATABASE_PATH || path.join(__dirname, '../../data/tracker.db');
let db: Database.Database;
export function getDb(): Database.Database {
if (!db) {
db = new Database(DB_PATH);
db.pragma('journal_mode = WAL');
initSchema(db);
}
return db;
}
function initSchema(db: Database.Database): void {
db.exec(`
CREATE TABLE IF NOT EXISTS watched_items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT NOT NULL UNIQUE,
name TEXT,
thumbnail_url TEXT,
check_interval INTEGER NOT NULL DEFAULT 60,
is_active INTEGER NOT NULL DEFAULT 1,
last_status TEXT NOT NULL DEFAULT 'unknown',
alert_sent INTEGER NOT NULL DEFAULT 0,
check_count INTEGER NOT NULL DEFAULT 0,
last_checked_at TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL DEFAULT ''
);
INSERT OR IGNORE INTO settings (key, value) VALUES ('telegram_bot_token', '');
INSERT OR IGNORE INTO settings (key, value) VALUES ('telegram_chat_id', '');
`);
}
export type StockStatus = 'in_stock' | 'sold_out' | 'unknown';
export interface WatchedItem {
id: number;
url: string;
name: string | null;
thumbnail_url: string | null;
check_interval: number;
is_active: number;
last_status: StockStatus;
alert_sent: number;
check_count: number;
last_checked_at: string | null;
created_at: string;
}