vrem
Version:
An open-source automatic time-tracker
120 lines (119 loc) • 4.75 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteTaskLogEntry = exports.updateTaskLogEntry = exports.getTaskLogs = exports.startTask = exports.stopCurrentTask = exports.getCurrentTask = void 0;
const db_1 = __importDefault(require("./db"));
function getCurrentTask() {
return db_1.default.prepare(`SELECT taskId AS id, name, startTime FROM CurrentTask JOIN Tasks ON taskId = Tasks.id LIMIT 1;`).get();
}
exports.getCurrentTask = getCurrentTask;
function stopCurrentTask(currentTask = getCurrentTask()) {
if (!currentTask)
return false;
try {
db_1.default.exec('SAVEPOINT stop_current_task;');
db_1.default.prepare('INSERT INTO TaskLogs (taskId, startTime, endTime) VALUES (?, ?, ?);')
.run(currentTask.id, currentTask.startTime, Date.now());
db_1.default.prepare('DELETE FROM CurrentTask;').run();
db_1.default.exec('RELEASE stop_current_task;');
return currentTask;
}
catch (e) {
db_1.default.exec('ROLLBACK TO stop_current_task;');
throw e;
}
}
exports.stopCurrentTask = stopCurrentTask;
function createNewTask(name) {
const info = db_1.default.prepare('INSERT INTO Tasks (name) VALUES (?);').run(name);
return info.lastInsertRowid;
}
function getTaskIdByName(name) {
return db_1.default.prepare('SELECT id FROM Tasks WHERE name = ?;').pluck().get(name);
}
function startTask(name) {
try {
const currentTask = getCurrentTask();
let id = getTaskIdByName(name);
if (currentTask && currentTask.id === id) {
return {
success: false,
reason: 'already_started',
activeTask: currentTask,
};
}
const result = { success: true };
db_1.default.exec('BEGIN;');
if (!id) {
id = createNewTask(name);
}
if (currentTask) {
stopCurrentTask(currentTask);
result.stoppedTask = currentTask;
}
const currentTime = Date.now();
db_1.default.prepare('INSERT INTO CurrentTask (taskId, startTime) VALUES (?, ?);').run(id, currentTime);
db_1.default.exec('COMMIT;');
result.activeTask = {
id: id,
name: name,
startTime: currentTime,
};
return result;
}
catch (e) {
db_1.default.exec('ROLLBACK;');
throw e;
}
}
exports.startTask = startTask;
function getTaskLogs(limit = 100, offset = 0) {
return db_1.default.prepare(`
SELECT logs.id, Tasks.name as taskName, startTime, endTime
FROM TaskLogs logs JOIN Tasks ON Tasks.id = logs.taskId
ORDER BY startTime DESC
LIMIT ? OFFSET ?;
`).all(limit, offset);
}
exports.getTaskLogs = getTaskLogs;
function getTaskIdByTaskLogEntryId(id) {
const taskId = db_1.default.prepare('SELECT taskId FROM TaskLogs WHERE id = ?;').pluck().get(id);
if (!taskId)
throw new Error('There is no task log entry with the id ' + id);
return taskId;
}
function deleteTaskIfNotUsed(taskId) {
const exists = db_1.default.prepare('SELECT EXISTS(SELECT 1 FROM TaskLogs WHERE taskId = ? LIMIT 1);').pluck().get(taskId);
if (!exists) {
db_1.default.prepare("DELETE FROM Tasks WHERE id = ?;").run(taskId);
}
}
function updateTaskLogEntry(data) {
if (data.taskName) {
const name = data.taskName;
let taskId = getTaskIdByName(name);
const oldTaskId = db_1.default.prepare('SELECT taskId FROM TaskLogs WHERE id = ?;').pluck().get(data.id);
db_1.default.transaction(() => {
if (!taskId) {
taskId = createNewTask(name);
}
db_1.default.prepare(`UPDATE TaskLogs SET taskId = ? WHERE id = ?;`).run(taskId, data.id);
deleteTaskIfNotUsed(oldTaskId);
})();
return;
}
const targets = [data.startTime ? 'startTime = :startTime' : '', data.endTime ? 'endTime = :endTime' : '']
.filter(t => t).join(',');
targets && db_1.default.prepare(`UPDATE TaskLogs SET ${targets} WHERE id = :id;`).run(data);
}
exports.updateTaskLogEntry = updateTaskLogEntry;
function deleteTaskLogEntry(id) {
const taskId = getTaskIdByTaskLogEntryId(id);
db_1.default.transaction(() => {
db_1.default.prepare('DELETE FROM TaskLogs WHERE id = ?;').run(id);
deleteTaskIfNotUsed(taskId);
})();
}
exports.deleteTaskLogEntry = deleteTaskLogEntry;