mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-04 15:08:01 +00:00
330 lines
7.0 KiB
JavaScript
330 lines
7.0 KiB
JavaScript
// get database
|
|
import { db, data } from '../app.js';
|
|
|
|
// utils
|
|
import { customAlphabet } from 'nanoid';
|
|
const nanoid = customAlphabet('1234567890abcdef', 4);
|
|
import {
|
|
event as eventDef,
|
|
delay as delayDef,
|
|
block as blockDef,
|
|
} from '../data/eventsDefinition.js';
|
|
|
|
function _getEventsCount() {
|
|
return Array.from(data.events).length;
|
|
}
|
|
|
|
function _pushNew(entry) {
|
|
return data.events.push(entry).write();
|
|
}
|
|
|
|
async function _insertAt(entry, index) {
|
|
// get events
|
|
let events = data.events;
|
|
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
|
|
data.events = events;
|
|
await db.write();
|
|
}
|
|
|
|
async function _removeById(eventId) {
|
|
data.events = Array.from(data.events).filter((e) => e.id != eventId);
|
|
await db.write();
|
|
}
|
|
|
|
function getEventEvents() {
|
|
// return data.events.filter((e) => e.type === 'event');
|
|
return Array.from(data.events).filter((e) => e.type === 'event');
|
|
}
|
|
|
|
// Updates timer object
|
|
function _updateTimers() {
|
|
const results = getEventEvents();
|
|
global.timer.updateEventList(results);
|
|
}
|
|
|
|
// Updates timer object single event
|
|
function _updateTimersSingle(id, entry) {
|
|
global.timer.updateSingleEvent(id, entry);
|
|
}
|
|
|
|
// Delete a single entry in timer object
|
|
function _deleteTimerId(entryId) {
|
|
global.timer.deleteId(entryId);
|
|
}
|
|
|
|
// Create controller for GET request to '/events'
|
|
// Returns -
|
|
export const eventsGetAll = async (req, res) => {
|
|
res.json(data.events);
|
|
};
|
|
|
|
// Create controller for GET request to '/events/:eventId'
|
|
// Returns -
|
|
export const eventsGetById = async (req, res) => {
|
|
const e = data.events.find({ id: req.params.eventId }).value();
|
|
console.log('event by id', e);
|
|
res.json(e);
|
|
};
|
|
|
|
// Create controller for POST request to '/events/'
|
|
// Returns -
|
|
export const eventsPost = async (req, res) => {
|
|
// TODO: Validate event
|
|
if (!req.body) {
|
|
res.status(400).send(`No object found in request`);
|
|
return;
|
|
}
|
|
|
|
// ensure structure
|
|
let newEvent = {};
|
|
req.body.id = nanoid();
|
|
|
|
switch (req.body.type) {
|
|
case 'event':
|
|
newEvent = { ...eventDef, ...req.body };
|
|
break;
|
|
case 'delay':
|
|
newEvent = { ...delayDef, ...req.body };
|
|
break;
|
|
case 'block':
|
|
newEvent = { ...blockDef, ...req.body };
|
|
break;
|
|
|
|
default:
|
|
res
|
|
.status(400)
|
|
.send(`Object type missing or unrecognised: ${req.body.type}`);
|
|
break;
|
|
}
|
|
|
|
try {
|
|
// get place where event should be
|
|
const index = newEvent.order || 0;
|
|
|
|
// add new event in place
|
|
_insertAt(newEvent, index);
|
|
|
|
// update timers
|
|
_updateTimers();
|
|
|
|
// reply OK
|
|
res.sendStatus(201);
|
|
} catch (error) {
|
|
console.log(error);
|
|
res.status(400).send(error);
|
|
}
|
|
};
|
|
|
|
// Create controller for PUT request to '/events/'
|
|
// Returns -
|
|
export const eventsPut = async (req, res) => {
|
|
// no valid params
|
|
if (!req.body) {
|
|
res.status(400).send(`No object found`);
|
|
return;
|
|
}
|
|
|
|
let eventId = req.body.id;
|
|
if (!eventId) {
|
|
res.status(400).send(`Object malformed: id missing`);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const eventIndex = data.events.findIndex((e) => e.id === req.body.id);
|
|
if (eventIndex === -1) {
|
|
res.status(400).send(`No Id found found`);
|
|
return;
|
|
}
|
|
|
|
const e = data.events[eventIndex];
|
|
data.events[eventIndex] = { ...e, ...req.body };
|
|
data.events[eventIndex].revision++;
|
|
db.write();
|
|
|
|
// update timer
|
|
_updateTimersSingle(req.body.id, req.body);
|
|
|
|
res.sendStatus(200);
|
|
} catch (error) {
|
|
console.log(error);
|
|
res.status(400).send(error);
|
|
}
|
|
};
|
|
|
|
// Create controller for PATCH request to '/events/'
|
|
// Returns -
|
|
export const eventsPatch = async (req, res) => {
|
|
// Code is the same as put, call that
|
|
eventsPut(req, res);
|
|
};
|
|
|
|
export const eventsReorder = async (req, res) => {
|
|
// TODO: Validate event
|
|
if (!req.body) {
|
|
res.status(400).send(`No object found in request`);
|
|
return;
|
|
}
|
|
|
|
const { index, from, to } = req.body;
|
|
|
|
// get events
|
|
let events = data.events;
|
|
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`);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
// remove item at from
|
|
const [reorderedItem] = events.splice(from, 1);
|
|
|
|
// reinsert item at to
|
|
events.splice(to, 0, reorderedItem);
|
|
|
|
// save events
|
|
data.events = events;
|
|
db.write();
|
|
|
|
// TODO: would it be more efficient to reorder at timer?
|
|
// update timer
|
|
_updateTimers();
|
|
|
|
res.sendStatus(200);
|
|
} catch (error) {
|
|
console.log(error);
|
|
res.status(400).send(error);
|
|
}
|
|
};
|
|
|
|
// Create controller for PATCH request to '/events/applydelay/:eventId'
|
|
// Returns -
|
|
export const eventsApplyDelay = async (req, res) => {
|
|
// no valid params
|
|
if (!req.params.eventId) {
|
|
res.status(400).send(`No id found in request`);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
// get events
|
|
let events = data.events;
|
|
|
|
// AUX
|
|
let delayIndex = null;
|
|
let blockIndex = null;
|
|
let delayValue = 0;
|
|
|
|
for (const [index, e] of events.entries()) {
|
|
if (delayIndex == null) {
|
|
// look for delay
|
|
if (e.id === req.params.eventId && e.type === 'delay') {
|
|
delayValue = e.duration;
|
|
delayIndex = index;
|
|
}
|
|
}
|
|
|
|
// apply delay value to all items until block or end
|
|
else {
|
|
if (e.type === 'event') {
|
|
// update times
|
|
e.timeStart += delayValue;
|
|
e.timeEnd += delayValue;
|
|
|
|
// increment revision
|
|
e.revision += 1;
|
|
} else if (e.type === 'block') {
|
|
// save id and stop
|
|
blockIndex = index;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// delete delay
|
|
events.splice(delayIndex, 1);
|
|
|
|
// delete block
|
|
// index would have moved down since we deleted delay
|
|
if (blockIndex) events.splice(blockIndex - 1, 1);
|
|
|
|
// update events
|
|
data.events = events;
|
|
db.write();
|
|
|
|
// update timer
|
|
_updateTimers();
|
|
|
|
res.sendStatus(201);
|
|
} catch (error) {
|
|
console.log('debug:', error);
|
|
|
|
res.status(400).send(error);
|
|
}
|
|
};
|
|
|
|
// Create controller for DELETE request to '/events/:eventId'
|
|
// Returns -
|
|
export const eventsDelete = async (req, res) => {
|
|
// no valid params
|
|
if (!req.params.eventId) {
|
|
res.status(400).send(`No id found in request`);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
// remove new event
|
|
_removeById(req.params.eventId);
|
|
|
|
// update timer
|
|
_deleteTimerId(req.params.eventId);
|
|
|
|
res.sendStatus(201);
|
|
} catch (error) {
|
|
console.log('debug:', error);
|
|
|
|
res.status(400).send(error);
|
|
}
|
|
};
|
|
|
|
// Create controller for DELETE request to '/events/:eventId'
|
|
// Returns -
|
|
export const eventsDeleteAll = async (req, res) => {
|
|
try {
|
|
// set with nothing
|
|
data.events = [];
|
|
db.write();
|
|
|
|
// update timer object
|
|
_updateTimersSingle();
|
|
|
|
res.sendStatus(201);
|
|
} catch (error) {
|
|
res.status(400).send(error);
|
|
}
|
|
};
|