You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
5.2 KiB
227 lines
5.2 KiB
const sqlite3 = require("sqlite3").verbose();
|
|
|
|
class SQLite3Repository {
|
|
constructor(path) {
|
|
this.db = new sqlite3.Database(path);
|
|
}
|
|
|
|
/**
|
|
* @returns {Promise<void>}
|
|
*/
|
|
setup() {
|
|
return new Promise((resolve, reject) => {
|
|
this.db.run(SQL_TABLE_BIKE, (err) => {
|
|
if (err != null) {
|
|
reject(err);
|
|
}
|
|
|
|
this.db.run(SQL_TABLE_PROGRAM, (err) => {
|
|
if (err != null) {
|
|
reject(err);
|
|
}
|
|
|
|
this.db.run(SQL_TABLE_WORKOUT, (err) => {
|
|
if (err != null) {
|
|
reject(err);
|
|
}
|
|
|
|
this.db.run(SQL_TABLE_MEASUREMENT, (err) => {
|
|
if (err != null) {
|
|
reject(err);
|
|
}
|
|
|
|
resolve();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
insert(obj, table, params) {
|
|
return new Promise((resolve, reject) => {
|
|
const query = `INSERT INTO ${table} (${params.join(", ")}) VALUES (${params.map(p => ':'+p).join(", ")});`;
|
|
const values = params.map(p => obj[p]);
|
|
this.db.run(query, values, function(err) {
|
|
if (err != null) {
|
|
return reject(err);
|
|
}
|
|
|
|
resolve(this.lastID);
|
|
});
|
|
});
|
|
}
|
|
|
|
update(obj, table, key, keys) {
|
|
return new Promise((resolve, reject) => {
|
|
const query = `UPDATE ${table} SET ${keys.map(k => `${k}=:${k}`).join(" AND ")} WHERE ${key}=:${key}`;
|
|
const values = [
|
|
...keys.map(k => obj[k]),
|
|
obj[key],
|
|
];
|
|
|
|
this.db.run(query, values, function(err) {
|
|
if (err != null) {
|
|
return reject(err);
|
|
}
|
|
|
|
resolve();
|
|
});
|
|
});
|
|
}
|
|
|
|
delete(obj, table, key) {
|
|
return new Promise((resolve, reject) => {
|
|
const query = `DELETE FROM ${table} WHERE ${key}=:${key};`
|
|
this.db.run(query, [obj[key]], function(err) {
|
|
if (err != null) {
|
|
return reject(err);
|
|
}
|
|
|
|
resolve(this.changes);
|
|
});
|
|
});
|
|
}
|
|
|
|
findOne(table, match) {
|
|
return this.find(table, match).then(res => res[0] || null)
|
|
}
|
|
|
|
find(table, match) {
|
|
return new Promise((resolve, reject) => {
|
|
const keys = Object.keys(match).filter(k => match[k] != null);
|
|
const params = keys.map(k => match[k]);
|
|
const query = `SELECT * FROM ${table}${keys.length > 0 ? ` WHERE ${keys.map(k => `${k}=:${k}`).join(" AND ")}` : ""};`;
|
|
this.db.all(query, params, function(err, rows) {
|
|
if (err != null) {
|
|
return reject(err);
|
|
}
|
|
|
|
resolve(rows);
|
|
});
|
|
});
|
|
}
|
|
|
|
findBike(id) {
|
|
return this.findOne("bike", {id});
|
|
}
|
|
|
|
listBikes() {
|
|
return this.find("bike", {});
|
|
}
|
|
|
|
insertBike(bike) {
|
|
return this.insert(bike, "bike", ["name", "driver", "connect", "maxLevel"]);
|
|
}
|
|
|
|
updateBike(bike) {
|
|
return this.update(bike, "bike", "id", ["name"]);
|
|
}
|
|
|
|
deleteBike(bike) {
|
|
return this.delete(bike, "bike", "id");
|
|
}
|
|
|
|
findProgram(id) {
|
|
return this.findOne("program", {id});
|
|
}
|
|
|
|
listPrograms() {
|
|
return this.find("program", {});
|
|
}
|
|
|
|
insertProgram(program) {
|
|
return this.insert(program, "program", ["name", "cpm", "warmupMin", "warmupCpm"]);
|
|
}
|
|
|
|
updateProgram(program) {
|
|
return this.update(program, "program", "id", ["name"]);
|
|
}
|
|
|
|
deleteProgram(program) {
|
|
return this.delete(program, "program", "id");
|
|
}
|
|
|
|
findWorkout(id) {
|
|
return this.findOne("workout", {id}).then(d => ({...d, date: new Date(d.date)}));
|
|
}
|
|
|
|
listWorkouts({programId, bikeId} = {}) {
|
|
return this.find("workout", {programId, bikeId}).then(l => l.map(d => ({...d, date: new Date(d.date)})));
|
|
}
|
|
|
|
insertWorkout(workout) {
|
|
return this.insert(workout, "workout", ["bikeId","programId","date"]);
|
|
}
|
|
|
|
deleteWorkout(workout) {
|
|
return this.delete(workout, "workout", "id");
|
|
}
|
|
|
|
findMeasurement(id) {
|
|
return this.findOne("measurement", {id});
|
|
}
|
|
|
|
listMeasurements(workoutId) {
|
|
return this.find("measurement", {workoutId});
|
|
}
|
|
|
|
insertMeasurement(measurement) {
|
|
return this.insert(measurement, "measurement", ["workoutId","minutes","seconds","speed","rpm","distance","calories","pulse","watt","level"]);
|
|
}
|
|
|
|
deleteMeasurement(measurement) {
|
|
return this.delete(measurement, "measurement", "id");
|
|
}
|
|
|
|
deleteMeasurements({workoutId}) {
|
|
return this.delete({workoutId}, "measurement", "workoutId");
|
|
}
|
|
}
|
|
|
|
const SQL_TABLE_BIKE = `
|
|
CREATE TABLE IF NOT EXISTS bike (
|
|
id INTEGER PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
driver VARCHAR(255) NOT NULL,
|
|
connect VARCHAR(255) NOT NULL,
|
|
maxLevel INT
|
|
);
|
|
`;
|
|
|
|
const SQL_TABLE_PROGRAM = `
|
|
CREATE TABLE IF NOT EXISTS program (
|
|
id INTEGER PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
cpm INT NOT NULL,
|
|
warmupMin INT NOT NULL,
|
|
warmupCpm INT NOT NULL
|
|
);
|
|
`;
|
|
|
|
const SQL_TABLE_WORKOUT = `
|
|
CREATE TABLE IF NOT EXISTS workout (
|
|
id INTEGER PRIMARY KEY,
|
|
bikeId INT NOT NULL,
|
|
programId INT NOT NULL,
|
|
date DATETIME NOT NULL
|
|
);
|
|
`;
|
|
|
|
const SQL_TABLE_MEASUREMENT = `
|
|
CREATE TABLE IF NOT EXISTS measurement (
|
|
id INTEGER PRIMARY KEY,
|
|
workoutId INT NOT NULL,
|
|
minutes INT,
|
|
seconds INT,
|
|
speed REAL,
|
|
rpm REAL,
|
|
distance REAL,
|
|
calories REAL,
|
|
pulse INT,
|
|
watt REAL,
|
|
level INT
|
|
);
|
|
`;
|
|
|
|
module.exports = SQLite3Repository;
|