feat: multiple selection (#703)

feat: multiple event selection

---------

Co-authored-by: asharonbaltazar <asharonbaltazar@outlook.com>
Co-authored-by: Alex <ac@omnivox.dk>
This commit is contained in:
Carlos Valente
2024-01-12 13:07:56 +01:00
committed by GitHub
parent f965db148c
commit 7f63cde7a5
20 changed files with 460 additions and 171 deletions
@@ -6,6 +6,7 @@ import { failEmptyObjects } from '../utils/routerUtils.js';
import {
addEvent,
applyDelay,
batchEditEvents,
deleteAllEvents,
deleteEvent,
editEvent,
@@ -58,6 +59,20 @@ export const rundownPut: RequestHandler = async (req, res) => {
}
};
export const rundownBatchPut: RequestHandler = async (req, res) => {
if (failEmptyObjects(req.body, res)) {
return res.status(404);
}
try {
const { data, ids } = req.body;
await batchEditEvents(ids, data);
res.status(200);
} catch (error) {
res.status(400).send(error);
}
};
export const rundownReorder: RequestHandler = async (req, res) => {
if (failEmptyObjects(req.body, res)) {
return;
@@ -18,6 +18,16 @@ export const rundownPutValidator = [
},
];
export const rundownBatchPutValidator = [
body('data').isObject().exists(),
body('ids').isArray().exists(),
(req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) return res.status(422).json({ errors: errors.array() });
next();
},
];
export const rundownReorderValidator = [
body('eventId').isString().exists(),
body('from').isNumeric().exists(),
+4
View File
@@ -9,9 +9,11 @@ import {
rundownPut,
rundownReorder,
rundownSwap,
rundownBatchPut,
} from '../controllers/rundownController.js';
import {
paramsMustHaveEventId,
rundownBatchPutValidator,
rundownPostValidator,
rundownPutValidator,
rundownReorderValidator,
@@ -32,6 +34,8 @@ router.post('/', rundownPostValidator, rundownPost);
// create route between controller and '/events/' endpoint
router.put('/', rundownPutValidator, rundownPut);
router.put('/batchEdit', rundownBatchPutValidator, rundownBatchPut);
// create route between controller and '/events/reorder' endpoint
router.patch('/reorder/', rundownReorderValidator, rundownReorder);
@@ -21,6 +21,7 @@ import {
cachedClear,
cachedDelete,
cachedEdit,
cachedBatchEdit,
cachedReorder,
cachedSwap,
delayedRundownCacheKey,
@@ -212,6 +213,16 @@ export async function editEvent(eventData: Partial<OntimeEvent> | Partial<Ontime
return newEvent;
}
export async function batchEditEvents(ids: string[], data: Partial<OntimeEvent>) {
await cachedBatchEdit(ids, data);
// notify timer service of changed events
updateTimer(ids);
// advice socket subscribers of change
sendRefetch();
}
/**
* deletes event by its ID
* @param eventId
@@ -115,7 +115,17 @@ export async function cachedEdit(
}
const updatedRundown = DataProvider.getRundown();
const newEvent = { ...updatedRundown[indexInMemory], ...patchObject } as OntimeRundownEntry;
const eventFromRundown = updatedRundown[indexInMemory];
const isPatchObjectDifferentFromRundownEvent = Object.entries(patchObject).some(
([key, value]) => eventFromRundown[key] !== value,
);
if (!isPatchObjectDifferentFromRundownEvent) {
return eventFromRundown;
}
const newEvent = { ...eventFromRundown, ...patchObject } as OntimeRundownEntry;
if (isOntimeEvent(newEvent)) {
newEvent.revision++;
}
@@ -144,6 +154,12 @@ export async function cachedEdit(
return newEvent;
}
export async function cachedBatchEdit(ids: string[], patchObject: Partial<OntimeEvent>) {
const cachedEdits = ids.map((id) => cachedEdit(id, patchObject));
await Promise.allSettled(cachedEdits);
}
/**
* Deletes an event with given id from rundown, ensuring replication to delayed rundown cache
* @param eventId