mirror of
https://github.com/cpvalente/ontime.git
synced 2026-09-09 16:19:47 +00:00
lowdb persistence
- bug: while creating a new entry, the database briefly returns an empty array which causes the interface to flash
This commit is contained in:
@@ -27,3 +27,4 @@ TODO.md
|
|||||||
# working stuff
|
# working stuff
|
||||||
_SS/
|
_SS/
|
||||||
.vscode/launch.json
|
.vscode/launch.json
|
||||||
|
server/db.json
|
||||||
|
|||||||
@@ -1,31 +1,61 @@
|
|||||||
|
// CONST
|
||||||
|
const filename = 'db.json';
|
||||||
|
const tableName = 'events';
|
||||||
|
const countfield = 'eventCount';
|
||||||
|
|
||||||
|
// data
|
||||||
|
const low = require('lowdb');
|
||||||
|
const FileSync = require('lowdb/adapters/FileSync');
|
||||||
|
const adapter = new FileSync('db.json');
|
||||||
|
const db = low(adapter);
|
||||||
|
|
||||||
|
db.defaults({ events: [] }).write();
|
||||||
|
|
||||||
// utils
|
// utils
|
||||||
const { nanoid } = require('nanoid');
|
const { nanoid } = require('nanoid');
|
||||||
|
|
||||||
// import json with initial data
|
|
||||||
let events = require('../data/eventsData.json');
|
|
||||||
const eventDefs = require('../data/eventsDefinition.js');
|
const eventDefs = require('../data/eventsDefinition.js');
|
||||||
|
|
||||||
// aux
|
// incrementFrom
|
||||||
const replaceAt = (array, index, value) => {
|
function incrementFrom(start, incr = 1) {
|
||||||
const ret = array.slice(0);
|
try {
|
||||||
ret[index] = value;
|
let entries = db.get('events').sortBy('order').value();
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getEvents = () => {
|
entries.map((e) => {
|
||||||
return global.timer.events;
|
if (e.order < start) return;
|
||||||
};
|
db.get('events')
|
||||||
|
.find({ id: e.id })
|
||||||
|
.assign({ order: e.order + incr })
|
||||||
|
.write();
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.log('error on increment function', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create controller for GET request to '/events/all'
|
function _getEventsCount() {
|
||||||
|
return db.get('events').size().value();
|
||||||
|
}
|
||||||
|
|
||||||
|
function _pushNew(entry) {
|
||||||
|
return db.get('events').push(entry).write();
|
||||||
|
}
|
||||||
|
|
||||||
|
function _removeById(eventId) {
|
||||||
|
return db.get('events').remove({ id: eventId }).write();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create controller for GET request to '/events'
|
||||||
// Returns -
|
// Returns -
|
||||||
exports.eventsGetAll = async (req, res) => {
|
exports.eventsGetAll = async (req, res) => {
|
||||||
res.json(events);
|
const results = db.get('events').sortBy('order').value();
|
||||||
|
res.json(results);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create controller for GET request to '/events/:Id'
|
// Create controller for GET request to '/events/:eventId'
|
||||||
// Returns -
|
// Returns -
|
||||||
exports.eventsGetById = async (req, res) => {
|
exports.eventsGetById = async (req, res) => {
|
||||||
// TODO
|
const e = db.get('events').find({ id: req.params.eventId }).value();
|
||||||
|
res.json(e);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create controller for POST request to '/events/'
|
// Create controller for POST request to '/events/'
|
||||||
@@ -33,7 +63,7 @@ exports.eventsGetById = async (req, res) => {
|
|||||||
exports.eventsPost = async (req, res) => {
|
exports.eventsPost = async (req, res) => {
|
||||||
// TODO: Validate event
|
// TODO: Validate event
|
||||||
if (!req.body) {
|
if (!req.body) {
|
||||||
res.sendStatus(400);
|
res.status(400).send(`No object found in request`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,89 +83,102 @@ exports.eventsPost = async (req, res) => {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
res.sendStatus(400);
|
res
|
||||||
|
.status(400)
|
||||||
|
.send(`Object type missing or unrecognised: ${req.body.type}`);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Torbjorn: hmmmmmmm, can we look here?
|
try {
|
||||||
if (newEvent.order <= 0) {
|
// increment count if necessary
|
||||||
newEvent.order = 0;
|
const c = _getEventsCount();
|
||||||
// insert at top
|
|
||||||
events.forEach((e) => {
|
if (c > 0 && newEvent.order < c) incrementFrom(newEvent.order);
|
||||||
e.order = e.order + 1;
|
|
||||||
});
|
// add new event
|
||||||
events = [newEvent, ...events];
|
_pushNew(newEvent);
|
||||||
} else if (newEvent.order >= events.length) {
|
|
||||||
newEvent.order = events.length;
|
res.sendStatus(201);
|
||||||
events = [...events, newEvent];
|
} catch (error) {
|
||||||
} else {
|
res.status(400).send(error);
|
||||||
let before = events.slice(0, newEvent.order);
|
|
||||||
let after = events.slice(newEvent.order);
|
|
||||||
// move all items one element down, starting from new position
|
|
||||||
after.forEach((e) => {
|
|
||||||
e.order = e.order + 1;
|
|
||||||
});
|
|
||||||
events = [...before, newEvent, ...after];
|
|
||||||
}
|
}
|
||||||
console.log('added', events);
|
|
||||||
res.sendStatus(201);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create controller for PUT request to '/events/:id'
|
// Create controller for PUT request to '/events/'
|
||||||
// Returns -
|
// Returns -
|
||||||
exports.eventsPut = async (req, res) => {
|
exports.eventsPut = async (req, res) => {
|
||||||
const itemIndex = events.findIndex((e) => e.id == req.body.id);
|
// no valid params
|
||||||
|
if (!req.body) {
|
||||||
// Item with index not found
|
res.status(400).send(`No object found`);
|
||||||
if (itemIndex === -1) {
|
|
||||||
res.sendStatus(400);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Torbjorn: bad syntax?
|
let eventId = req.body.id;
|
||||||
const newEvents = replaceAt(events, itemIndex, req.body);
|
if (!eventId) {
|
||||||
events = [...newEvents];
|
res.status(400).send(`No id found`);
|
||||||
res.sendStatus(200);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
db.get('events')
|
||||||
|
.find({ id: req.body.id })
|
||||||
|
.assign({ ...req.body })
|
||||||
|
.write()
|
||||||
|
.then(res.sendStatus(200));
|
||||||
|
} catch (error) {
|
||||||
|
res.status(400).send(error);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create controller for PATCH request to '/events/:id'
|
// Create controller for PATCH request to '/events/'
|
||||||
// Returns -
|
// Returns -
|
||||||
exports.eventsPatch = async (req, res) => {
|
exports.eventsPatch = async (req, res) => {
|
||||||
const itemIndex = events.findIndex((e) => e.id == req.body.id);
|
// no valid params
|
||||||
|
if (!req.body) {
|
||||||
// Item with index not found
|
res.status(400).send(`No object found`);
|
||||||
if (itemIndex === -1) {
|
|
||||||
res.sendStatus(400);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get current object
|
let eventId = req.body.id;
|
||||||
const eventToUpdate = events[itemIndex];
|
if (!eventId) {
|
||||||
|
res.status(400).send(`No id found`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Update and replace
|
try {
|
||||||
const updatedEvent = { ...eventToUpdate, ...req.body };
|
db.get('events')
|
||||||
const newEvents = replaceAt(events, itemIndex, updatedEvent);
|
.find({ id: req.body.id })
|
||||||
|
.assign({ ...req.body })
|
||||||
|
.write();
|
||||||
|
|
||||||
events = [...newEvents];
|
res.sendStatus(200);
|
||||||
res.send(updatedEvent);
|
} catch (error) {
|
||||||
|
res.status(400).send(error);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create controller for DELETE request to '/events/'
|
// Create controller for DELETE request to '/events/:eventId'
|
||||||
// Returns -
|
// Returns -
|
||||||
|
// TODO: should reorder al events down
|
||||||
exports.eventsDelete = async (req, res) => {
|
exports.eventsDelete = async (req, res) => {
|
||||||
if (!req.params.id) {
|
// no valid params
|
||||||
res.sendStatus(400);
|
if (!req.params.eventId) {
|
||||||
|
res.status(400).send(`No id found in request`);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const itemIndex = events.findIndex((e) => e.id == req.params.id);
|
try {
|
||||||
|
// increment count if necessary
|
||||||
|
const c = _getEventsCount();
|
||||||
|
const e = db.get('events').find({ id: req.params.eventId }).value();
|
||||||
|
|
||||||
if (itemIndex === -1) {
|
if (c > 0 && e.order < c) incrementFrom(e.order, -1);
|
||||||
res.sendStatus(400);
|
|
||||||
return;
|
|
||||||
} else if (itemIndex === 0) events.shift();
|
|
||||||
else events.splice(itemIndex, 1);
|
|
||||||
|
|
||||||
// Update events
|
// add new event
|
||||||
events = [...events];
|
_removeById(req.params.eventId);
|
||||||
res.sendStatus(200);
|
|
||||||
|
res.sendStatus(201);
|
||||||
|
} catch (error) {
|
||||||
|
res.status(400).send(error);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"events": []
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
"body-parser": "~1.19.0",
|
"body-parser": "~1.19.0",
|
||||||
"express": "~4.17.1",
|
"express": "~4.17.1",
|
||||||
"express-session": "~1.17.1",
|
"express-session": "~1.17.1",
|
||||||
|
"lowdb": "^1.0.0",
|
||||||
"nanoid": "^3.1.22",
|
"nanoid": "^3.1.22",
|
||||||
"passport": "~0.4.1",
|
"passport": "~0.4.1",
|
||||||
"passport-local": "~1.0.0",
|
"passport-local": "~1.0.0",
|
||||||
|
|||||||
@@ -2,13 +2,13 @@ const express = require('express');
|
|||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
// import playback controller
|
// import playback controller
|
||||||
const eventsController = require('../controllers/eventsController');
|
const eventsController = require('../controllers/eventsController');
|
||||||
|
|
||||||
// create route between controller and '/events' endpoint
|
// create route between controller and '/events' endpoint
|
||||||
router.get('/', eventsController.eventsGetAll);
|
router.get('/', eventsController.eventsGetAll);
|
||||||
|
|
||||||
// create route between controller and '/events/:id' endpoint
|
// create route between controller and '/events/:id' endpoint
|
||||||
router.get('/:id', eventsController.eventsGetById);
|
router.get('/:eventId', eventsController.eventsGetById);
|
||||||
|
|
||||||
// create route between controller and '/events/' endpoint
|
// create route between controller and '/events/' endpoint
|
||||||
router.post('/', eventsController.eventsPost);
|
router.post('/', eventsController.eventsPost);
|
||||||
@@ -20,6 +20,6 @@ router.put('/', eventsController.eventsPut);
|
|||||||
router.patch('/', eventsController.eventsPatch);
|
router.patch('/', eventsController.eventsPatch);
|
||||||
|
|
||||||
// create route between controller and '/events/:id' endpoint
|
// create route between controller and '/events/:id' endpoint
|
||||||
router.delete('/:id', eventsController.eventsDelete);
|
router.delete('/:eventId', eventsController.eventsDelete);
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
@@ -248,6 +248,11 @@ fresh@0.5.2:
|
|||||||
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
|
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
|
||||||
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
|
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
|
||||||
|
|
||||||
|
graceful-fs@^4.1.3:
|
||||||
|
version "4.2.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
|
||||||
|
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
|
||||||
|
|
||||||
http-errors@1.7.2:
|
http-errors@1.7.2:
|
||||||
version "1.7.2"
|
version "1.7.2"
|
||||||
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
|
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
|
||||||
@@ -292,6 +297,27 @@ ipaddr.js@1.9.1:
|
|||||||
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
|
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
|
||||||
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
|
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
|
||||||
|
|
||||||
|
is-promise@^2.1.0:
|
||||||
|
version "2.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
|
||||||
|
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
|
||||||
|
|
||||||
|
lodash@4:
|
||||||
|
version "4.17.21"
|
||||||
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
||||||
|
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
|
||||||
|
|
||||||
|
lowdb@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064"
|
||||||
|
integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==
|
||||||
|
dependencies:
|
||||||
|
graceful-fs "^4.1.3"
|
||||||
|
is-promise "^2.1.0"
|
||||||
|
lodash "4"
|
||||||
|
pify "^3.0.0"
|
||||||
|
steno "^0.4.1"
|
||||||
|
|
||||||
media-typer@0.3.0:
|
media-typer@0.3.0:
|
||||||
version "0.3.0"
|
version "0.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
|
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
|
||||||
@@ -401,6 +427,11 @@ pause@0.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
|
resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
|
||||||
integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
|
integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
|
||||||
|
|
||||||
|
pify@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
|
||||||
|
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
|
||||||
|
|
||||||
proxy-addr@~2.0.5:
|
proxy-addr@~2.0.5:
|
||||||
version "2.0.6"
|
version "2.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
|
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
|
||||||
@@ -517,6 +548,13 @@ socket.io@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
|
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
|
||||||
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
|
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
|
||||||
|
|
||||||
|
steno@^0.4.1:
|
||||||
|
version "0.4.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb"
|
||||||
|
integrity sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=
|
||||||
|
dependencies:
|
||||||
|
graceful-fs "^4.1.3"
|
||||||
|
|
||||||
toidentifier@1.0.0:
|
toidentifier@1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
|
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
|
||||||
|
|||||||
Reference in New Issue
Block a user