import Database from "better-sqlite3"; const db = new Database("db.sqlite"); // init DB db.prepare( `CREATE TABLE IF NOT EXISTS time_ranges ( id INTEGER PRIMARY KEY, name TEXT NOT NULL DEFAULT '', range TEXT NOT NULL DEFAULT '', username TEXT NOT NULL DEFAULT '' )` ).run(); db.prepare( `CREATE TABLE IF NOT EXISTS configs ( name TEXT PRIMARY KEY, value TEXT NOT NULL )` ).run(); db.prepare( `INSERT OR IGNORE INTO configs (name, value) VALUES ('limit', '1')` ).run(); db.prepare( `INSERT OR IGNORE INTO configs (name, value) VALUES ('token', 'woshimima')` ).run(); db.prepare( `INSERT OR IGNORE INTO configs (name, value) VALUES ('started', 'false')` ).run(); // prepare statements const insertTimeRange = db.prepare( `INSERT INTO time_ranges (name, range) VALUES (?, ?)` ); const getTimeRanges = db.prepare(`SELECT * FROM time_ranges ORDER BY range, name`); const deleteTimeRange = db.prepare(`DELETE FROM time_ranges WHERE id = ?`); const update = db.prepare( `UPDATE time_ranges SET name = ?, range = ?, username = ? WHERE id = ?` ); const updateUsername = db.prepare( `UPDATE time_ranges SET username = ? WHERE id = ?` ); const countUser = db.prepare( `SELECT COUNT(*) as count FROM time_ranges WHERE username = ?` ); const getUsername = db.prepare(`SELECT username FROM time_ranges WHERE id = ?`); const updateUsernameWithLimit = db.transaction((username, id, limit) => { const count = countUser.get(username).count; const existingUsername = getUsername.get(id).username; if (!getStarted()) { throw new Error("还没到开始时间喔"); } if (existingUsername !== "") { throw new Error("这个时间段已经有人了喔"); } if (count >= limit) { throw new Error("达到数量上限啦"); } updateUsername.run(username, id); }); const getConfigStmt = db.prepare(`SELECT value FROM configs WHERE name = ?`); const setConfigStmt = db.prepare(`UPDATE configs SET value = ? WHERE name = ?`); const getLimit = () => { const limit = getConfigStmt.get("limit").value; return parseInt(limit); }; const setLimit = (limit) => { setConfigStmt.run(limit, "limit"); }; const getToken = () => { const token = getConfigStmt.get("token").value; return token; }; const authenticate = (token) => { const tokenFromDB = getToken(); return token === tokenFromDB; }; const getStarted = () => { const started = getConfigStmt.get("started").value; return started === "true"; }; const setStarted = (started) => { const started_string = started ? "true" : "false"; setConfigStmt.run(started_string, "started"); }; export { insertTimeRange, getTimeRanges, deleteTimeRange, update, updateUsername, updateUsernameWithLimit, getLimit, setLimit, authenticate, getStarted, setStarted, };