Files
itsc/libs/db.js
2022-05-22 17:19:00 +08:00

104 lines
2.7 KiB
JavaScript

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,
};