feat: draggable events

This commit is contained in:
cv
2021-05-06 12:05:21 +02:00
parent 0631dec3d3
commit 4161dd29c8
17 changed files with 408 additions and 209 deletions
+2 -1
View File
@@ -6,6 +6,7 @@ const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');
const adapter = new FileSync(config.database.filename);
const db = low(adapter);
// TODO: move defaults to config file
db.defaults({
events: [],
@@ -65,7 +66,7 @@ app.use((err, req, res, next) => {
const server = http.createServer(app);
// get data (if any)
const eventlist = db.get('events').sortBy('order').value();
const eventlist = db.get('events').value();
// init timer
global.timer = new EventTimer(server, config);
+69 -50
View File
@@ -5,20 +5,6 @@ const db = require('../app.js').db;
const { nanoid } = require('nanoid');
const eventDefs = require('../data/eventsDefinition.js');
// incrementFrom
function incrementFrom(start, incr = 1) {
let entries = db.get('events').sortBy('order').value();
entries.map((e) => {
if (e.order < start) return;
db.get('events')
.find({ id: e.id })
.assign({ order: e.order + incr })
.update('revision', (n) => n + 1)
.write();
});
}
function _getEventsCount() {
return db.get('events').size().value();
}
@@ -27,17 +13,40 @@ function _pushNew(entry) {
return db.get('events').push(entry).write();
}
function _insertAt(entry, index) {
// get events
let events = db.get('events').value();
let count = events.length;
let order = entry.order;
// Remove order field from object
delete entry.order;
// Insert at beggining
if (order === 0) {
events.unshift(entry);
}
// insert at end
else if (order >= count) {
events.push(entry);
}
// insert in the middle
else {
events.splice(index, 0, entry);
}
// save events
db.set('events', events).write();
}
function _removeById(eventId) {
return db.get('events').remove({ id: eventId }).write();
}
function getEventEvents() {
return db
.get('events')
.chain()
.filter({ type: 'event' })
.sortBy('order')
.value();
return db.get('events').chain().filter({ type: 'event' }).value();
}
// Updates timer object
@@ -54,7 +63,7 @@ function _updateTimersSingle(id, entry) {
// Create controller for GET request to '/events'
// Returns -
exports.eventsGetAll = async (req, res) => {
const results = db.get('events').sortBy('order').value();
const results = db.get('events').value();
res.json(results);
};
@@ -97,13 +106,11 @@ exports.eventsPost = async (req, res) => {
}
try {
// increment count if necessary
const c = _getEventsCount();
// get place where event should be
const index = newEvent.order || 0;
if (newEvent.order < c) incrementFrom(newEvent.order);
// add new event
_pushNew(newEvent);
// add new event in place
_insertAt(newEvent, index);
// update timers
_updateTimers();
@@ -111,6 +118,7 @@ exports.eventsPost = async (req, res) => {
// reply OK
res.sendStatus(201);
} catch (error) {
console.log(error);
res.status(400).send(error);
}
};
@@ -134,6 +142,7 @@ exports.eventsPut = async (req, res) => {
db.get('events')
.find({ id: req.body.id })
.assign({ ...req.body })
.update('revision', (n) => n + 1)
.write();
// update timer
@@ -148,30 +157,51 @@ exports.eventsPut = async (req, res) => {
// Create controller for PATCH request to '/events/'
// Returns -
exports.eventsPatch = async (req, res) => {
// no valid params
// Code is the same as put, call that
this.eventsPut(req, res);
};
exports.eventsReorder = async (req, res) => {
// TODO: Validate event
if (!req.body) {
res.status(400).send(`No object found`);
res.status(400).send(`No object found in request`);
console.log(`No object found in request`);
return;
}
let eventId = req.body.id;
if (!eventId) {
res.status(400).send(`No id found`);
const { index, from, to } = req.body;
console.log(req.body);
// get events
let events = db.get('events').value();
let idx = events.findIndex((e) => e.id === index, from);
// Check if item is at given index
if (idx !== from) {
res.status(400).send(`Id not found at index`);
console.log(`Id not found at index`, idx, from);
return;
}
try {
db.get('events')
.find({ id: req.body.id })
.assign({ ...req.body })
.update('revision', (n) => n + 1)
.write();
// remove item at from
const [reorderedItem] = events.splice(from, 1);
// reinsert item at to
events.splice(to, 0, reorderedItem);
// save events
db.set('events', events).write();
// TODO: would it be more efficient to reorder at timer?
// update timer
_updateTimersSingle(req.body.id, req.body);
_updateTimers();
res.sendStatus(200);
} catch (error) {
console.log(error);
res.status(400).send(error);
}
};
@@ -187,18 +217,7 @@ exports.eventsDelete = async (req, res) => {
}
try {
// increment count if necessary
const c = _getEventsCount();
const e = db.get('events').find({ id: req.params.eventId }).value();
if (e == null) {
res.status(400).send(`No match`);
return;
}
if (c > 0 && e.order < c) incrementFrom(e.order, -1);
// add new event
// remove new event
_removeById(req.params.eventId);
// update timer
-7
View File
@@ -1,13 +1,11 @@
[
{
"id":"xxxxx0",
"order": 0,
"duration": 300000,
"type": "delay"
},
{
"id":"xxxxx1",
"order": 1,
"title": "Is the internet a fad?",
"subtitle": "It is",
"presenter": "Carlos Valente",
@@ -17,13 +15,11 @@
},
{
"id":"xxxxx2",
"order": 2,
"duration": 1500000,
"type": "delay"
},
{
"id":"xxxxx3",
"order": 3,
"title": "Is reddit a dictatorship?",
"subtitle": "It is",
"presenter": "Carlos Valente",
@@ -33,7 +29,6 @@
},
{
"id":"xxxxx4",
"order": 4,
"title": "Out of words",
"subtitle": "",
"presenter": "Carlos Valente",
@@ -43,7 +38,6 @@
},
{
"id":"xxxxx5",
"order": 5,
"title": "Really",
"subtitle": "",
"presenter": "Carlos Valente",
@@ -53,7 +47,6 @@
},
{
"id":"xxxxx6",
"order": 6,
"title": "...",
"subtitle": "",
"presenter": "Carlos Valente",
+1 -3
View File
@@ -1,8 +1,8 @@
const event = {
order: 0,
title: '',
subtitle: '',
presenter: '',
note: '',
timeStart: 0,
timeEnd: 0,
isPublic: false,
@@ -11,13 +11,11 @@ const event = {
};
const delay = {
order: 0,
duration: 0,
type: 'delay',
};
const block = {
order: 0,
type: 'block',
};
+8 -5
View File
@@ -4,22 +4,25 @@ const router = express.Router();
// import events controller
const eventsController = require('../controllers/eventsController');
// create route between controller and '/events' endpoint
// create route between controller and '/events/' endpoint
router.get('/', eventsController.eventsGetAll);
// create route between controller and '/events/:id' endpoint
// create route between controller and '/events/:eventId' endpoint
router.get('/:eventId', eventsController.eventsGetById);
// create route between controller and '/events/' endpoint
router.post('/', eventsController.eventsPost);
// create route between controller and '/events/:id' endpoint
// create route between controller and '/events/' endpoint
router.put('/', eventsController.eventsPut);
// create route between controller and '/events/:id' endpoint
// create route between controller and '/events/' endpoint
router.patch('/', eventsController.eventsPatch);
// create route between controller and '/events/:id' endpoint
// create route between controller and '/events/reorder' endpoint
router.patch('/reorder/', eventsController.eventsReorder);
// create route between controller and '/events/:eventId' endpoint
router.delete('/:eventId', eventsController.eventsDelete);
module.exports = router;