mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-05 07:28:01 +00:00
3db40be8a8
using optimistic updates
138 lines
3.2 KiB
JavaScript
138 lines
3.2 KiB
JavaScript
// utils
|
|
const { nanoid } = require('nanoid');
|
|
|
|
// import json with initial data
|
|
let events = require('../data/eventsData.json');
|
|
const eventDefs = require('../data/eventsDefinition.js');
|
|
|
|
// aux
|
|
const replaceAt = (array, index, value) => {
|
|
const ret = array.slice(0);
|
|
ret[index] = value;
|
|
return ret;
|
|
};
|
|
|
|
// Create controller for GET request to '/events/all'
|
|
// Returns -
|
|
exports.eventsGetAll = async (req, res) => {
|
|
res.json(events);
|
|
};
|
|
|
|
// Create controller for GET request to '/events/:Id'
|
|
// Returns -
|
|
exports.eventsGetById = async (req, res) => {
|
|
// TODO
|
|
};
|
|
|
|
// Create controller for POST request to '/events/'
|
|
// Returns -
|
|
exports.eventsPost = async (req, res) => {
|
|
// TODO: Validate event
|
|
if (!req.body) {
|
|
res.sendStatus(400);
|
|
return;
|
|
}
|
|
|
|
// ensure structure
|
|
let newEvent = {};
|
|
req.body.id = nanoid(6);
|
|
|
|
switch (req.body.type) {
|
|
case 'event':
|
|
newEvent = { ...eventDefs.event, ...req.body };
|
|
break;
|
|
case 'delay':
|
|
newEvent = { ...eventDefs.delay, ...req.body };
|
|
break;
|
|
case 'block':
|
|
newEvent = { ...eventDefs.block, ...req.body };
|
|
break;
|
|
|
|
default:
|
|
res.sendStatus(400);
|
|
break;
|
|
}
|
|
|
|
// Torbjorn: hmmmmmmm, can we look here?
|
|
if (newEvent.order <= 0) {
|
|
newEvent.order = 0;
|
|
// insert at top
|
|
events.forEach((e) => {
|
|
e.order = e.order + 1;
|
|
});
|
|
events = [newEvent, ...events];
|
|
} else if (newEvent.order >= events.length) {
|
|
newEvent.order = events.length;
|
|
events = [...events, newEvent];
|
|
} else {
|
|
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'
|
|
// Returns -
|
|
exports.eventsPut = async (req, res) => {
|
|
const itemIndex = events.findIndex((e) => e.id == req.body.id);
|
|
|
|
// Item with index not found
|
|
if (itemIndex === -1) {
|
|
res.sendStatus(400);
|
|
return;
|
|
}
|
|
|
|
// Torbjorn: bad syntax?
|
|
const newEvents = replaceAt(events, itemIndex, req.body);
|
|
events = [...newEvents];
|
|
res.sendStatus(200);
|
|
};
|
|
|
|
// Create controller for PATCH request to '/events/:id'
|
|
// Returns -
|
|
exports.eventsPatch = async (req, res) => {
|
|
const itemIndex = events.findIndex((e) => e.id == req.body.id);
|
|
|
|
// Item with index not found
|
|
if (itemIndex === -1) {
|
|
res.sendStatus(400);
|
|
return;
|
|
}
|
|
|
|
// Get current object
|
|
const eventToUpdate = events[itemIndex];
|
|
|
|
// Update and replace
|
|
const updatedEvent = { ...eventToUpdate, ...req.body };
|
|
const newEvents = replaceAt(events, itemIndex, updatedEvent);
|
|
|
|
events = [...newEvents];
|
|
res.send(updatedEvent);
|
|
};
|
|
|
|
// Create controller for DELETE request to '/events/'
|
|
// Returns -
|
|
exports.eventsDelete = async (req, res) => {
|
|
if (!req.params.id) {
|
|
res.sendStatus(400);
|
|
}
|
|
|
|
const itemIndex = events.findIndex((e) => e.id == req.params.id);
|
|
|
|
if (itemIndex === -1) {
|
|
res.sendStatus(400);
|
|
return;
|
|
} else if (itemIndex === 0) events.shift();
|
|
else events.splice(itemIndex, 1);
|
|
|
|
// Update events
|
|
events = [...events];
|
|
res.sendStatus(200);
|
|
};
|