vrem
Version:
An open-source automatic time-tracker
80 lines (79 loc) • 3.77 kB
JavaScript
;
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;