UNPKG

vrem

Version:

An open-source automatic time-tracker

80 lines (79 loc) 3.77 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateCurrentProgramLastActiveTimestamp = exports.saveCurrentProgramToLogs = exports.addToLogs = exports.dev = void 0; const data_utils_1 = require("../data_utils"); const db_1 = __importDefault(require("../db")); exports.dev = process.argv[2] === '--dev'; function getLastLogEntry() { return db_1.default.prepare('SELECT * FROM ProgramLogs WHERE timestamp = (SELECT MAX(timestamp) FROM ProgramLogs);').get(); } function clearCurrentProgram() { db_1.default.prepare('DELETE FROM CurrentProgram;').run(); } function addToLogs(data, updateCurrentProgram = true) { exports.dev && console.log('add to logs', data); const timestamp = data.timestamp || Date.now(); let type = data_utils_1.programLogTypes.program, description = data.description || "", path = data.path; if (data.begin) { type = data_utils_1.programLogTypes.begin; } else if (data.end) { type = data_utils_1.programLogTypes.end; } else if (data.idle) { type = data_utils_1.programLogTypes.idle; } let programId; let parentId; if (type === data_utils_1.programLogTypes.program) { if (!path) return; const query = db_1.default.prepare('SELECT id FROM Programs WHERE path = ?;').pluck(); programId = query.get(path); if (data.parent) { parentId = query.get(data.parent.path); } } db_1.default.transaction(() => { if (!programId && type === data_utils_1.programLogTypes.program) { const query = db_1.default.prepare('INSERT INTO Programs (path, description, parentId) VALUES (?, ?, ?);'); if (data.parent && !parentId) { parentId = query.run(data.parent.path, data.parent.description, null).lastInsertRowid; } programId = query.run(path, description, parentId).lastInsertRowid; } if (type === data_utils_1.programLogTypes.program && updateCurrentProgram) { clearCurrentProgram(); db_1.default.prepare('INSERT INTO CurrentProgram (timestamp, type, programId, lastActiveTimestamp) VALUES (?, ?, ?, ?);') .run(timestamp, type, programId, timestamp); } const ON_CONFLICT = type === data_utils_1.programLogTypes.end ? 'REPLACE' : 'ABORT'; // ROLLBACK shouldn't be used inside "transaction()" db_1.default.prepare(`INSERT OR ${ON_CONFLICT} INTO ProgramLogs (timestamp, type, programId) VALUES (?, ?, ?);`) .run(timestamp, type, programId); })(); } exports.addToLogs = addToLogs; function saveCurrentProgramToLogs() { const currentProgram = db_1.default.prepare('SELECT * FROM CurrentProgram;').get(); if (!currentProgram) return; const lastEntry = getLastLogEntry(); if (lastEntry.type === data_utils_1.programLogTypes.end || lastEntry.timestamp !== currentProgram.timestamp || lastEntry.programId !== currentProgram.programId) { clearCurrentProgram(); return; } db_1.default.transaction(() => { addToLogs({ end: true, timestamp: currentProgram.lastActiveTimestamp }); clearCurrentProgram(); })(); } exports.saveCurrentProgramToLogs = saveCurrentProgramToLogs; function updateCurrentProgramLastActiveTimestamp(timestamp) { db_1.default.prepare('UPDATE CurrentProgram SET lastActiveTimestamp = ?;').run(timestamp); } exports.updateCurrentProgramLastActiveTimestamp = updateCurrentProgramLastActiveTimestamp;