Prefeat/skip (#188)

* refactor: refactor size of event list
* refactor: optimise event mutations
* refactor: prepare skip feature
* refactor: update tests
* refactor: simplify type assertion
This commit is contained in:
Carlos Valente
2022-08-09 14:02:46 +02:00
committed by GitHub
parent 9b5d536378
commit b80ae543a4
10 changed files with 370 additions and 85 deletions
+64 -28
View File
@@ -9,6 +9,22 @@ import {
} from '../models/eventsDefinition.js';
import { generateId } from '../utils/generate_id.js';
import { MAX_EVENTS } from '../settings.js';
import { getPreviousPlayable } from '../utils/eventUtils.js';
async function _insertAndSync(newEvent) {
if (newEvent.order) {
const events = data.events;
await _insertAt(newEvent, newEvent.order);
const previousId = events?.[newEvent.order - 1]?.id;
_insertEventInTimerAfterId(newEvent, previousId);
} else if (newEvent.after) {
await _insertAfterId(newEvent, newEvent.after);
_insertEventInTimerAfterId(newEvent, newEvent.after);
} else {
await _insertAt(newEvent, 0);
_insertEventInTimerAfterId(newEvent);
}
}
/**
* Insets an event after a given index
@@ -83,9 +99,32 @@ function _updateTimers() {
global.timer.updateEventList(results);
}
// Updates timer object single event
function _updateTimersSingle(id, entry) {
global.timer.updateSingleEvent(id, entry);
/**
* @description Adds an event to the timer after an event with given id
* @param {object} event
* @param {string} [previousId]
* @private
*/
function _insertEventInTimerAfterId(event, previousId) {
if (typeof previousId === 'undefined') {
global.timer.insertEventAtStart(event);
} else {
try {
global.timer.insertEventAfterId(event, previousId);
} catch (error) {
global.timer.error('SERVER', `Unable to update object: ${error}`);
}
}
}
/**
* @description Updates timer object single event
* @param {string} id
* @param {object} event
* @private
*/
function _updateTimersSingle(id, event) {
global.timer.updateSingleEvent(id, event);
}
// Delete a single entry in timer object
@@ -148,22 +187,9 @@ export const eventsPost = async (req, res) => {
}
try {
// get place where event should be
if (newEvent.order) {
await _insertAt(newEvent, newEvent.order);
} else if (newEvent.after) {
await _insertAfterId(newEvent, newEvent.after);
} else {
await _insertAt(newEvent, 0);
}
// update timers
_updateTimers();
// reply OK
_insertAndSync(newEvent);
res.sendStatus(201);
} catch (error) {
console.log(error);
res.status(400).send(error);
}
};
@@ -183,30 +209,41 @@ export const eventsPut = async (req, res) => {
return;
}
try {
const eventIndex = data.events.findIndex((e) => e.id === eventId);
if (eventIndex === -1) {
res.status(400).send(`No Id found found`);
return;
}
const eventIndex = data.events.findIndex((e) => e.id === eventId);
if (eventIndex === -1) {
res.status(400).send(`No Id found found`);
return;
}
try {
const e = data.events[eventIndex];
data.events[eventIndex] = { ...e, ...req.body };
data.events[eventIndex].revision++;
await db.write();
// update timer
_updateTimersSingle(eventId, req.body);
if (data.events[eventIndex].skip) {
_deleteTimerId(eventId);
// if it is a skip, i make sure it is deleted from timer
// event id might already not exist
} else {
try {
_updateTimersSingle(eventId, req.body);
} catch (error) {
if (error === 'Event not found') {
const { id: previousId } = getPreviousPlayable(data.events, e.id);
_insertEventInTimerAfterId(data.events[eventIndex], previousId);
}
}
}
res.sendStatus(200);
} catch (error) {
console.log(error);
res.status(400).send(error);
}
};
// Create controller for PATCH request to '/events/'
// Returns -
// DEPRECATED
export const eventsPatch = async (req, res) => {
// Code is the same as put, call that
await eventsPut(req, res);
@@ -247,7 +284,6 @@ export const eventsReorder = async (req, res) => {
res.sendStatus(200);
} catch (error) {
console.log(error);
res.status(400).send(error);
}
};