UNPKG

vrem

Version:

An open-source automatic time-tracker

120 lines (119 loc) 4.75 kB
"use strict"; 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;