mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-11 10:23:54 +00:00
feat: eventsAPI
This commit is contained in:
+2
-1
@@ -28,7 +28,8 @@ const app = express();
|
||||
app.use(cors());
|
||||
|
||||
// Implement middleware
|
||||
// ---
|
||||
app.use(express.urlencoded({ extended: true }));
|
||||
app.use(express.json());
|
||||
|
||||
// Implement route endpoints
|
||||
app.use('/events', eventsRouter);
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
// utils
|
||||
const { nanoid } = require('nanoid');
|
||||
|
||||
// import json with initial data
|
||||
const events = require('../data/eventsData.json');
|
||||
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'
|
||||
// Returns ACK message
|
||||
@@ -8,7 +19,94 @@ exports.eventsGet = async (req, res) => {
|
||||
};
|
||||
|
||||
// Create controller for GET request to '/events/all'
|
||||
// Returns playback state object
|
||||
// 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) {
|
||||
// ensure structure
|
||||
let newEvent = {};
|
||||
req.body.id = nanoid(10);
|
||||
|
||||
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);
|
||||
} else {
|
||||
console.log('nothing to add', req.body);
|
||||
res.sendStatus(400);
|
||||
}
|
||||
};
|
||||
|
||||
// Create controller for PUT request to '/events/:id'
|
||||
// Returns -
|
||||
exports.eventsPut = async (req, res) => {
|
||||
const itemIndex = events.findIndex((e) => e.id == req.body.id);
|
||||
|
||||
if (!itemIndex) res.sendStatus(400);
|
||||
const newEvents = replaceAt(events, itemIndex, req.body);
|
||||
events = [...newEvents];
|
||||
res.sendStatus(200);
|
||||
};
|
||||
|
||||
// Create controller for DELETE request to '/events/'
|
||||
// Returns -
|
||||
exports.eventsDelete = async (req, res) => {
|
||||
if (req.params.id) {
|
||||
const itemIndex = events.findIndex((e) => e.id == req.params.id);
|
||||
|
||||
if (!itemIndex) res.sendStatus(400);
|
||||
|
||||
// Torbjorn: this syntax is very bad
|
||||
const e = events.splice(itemIndex, 1);
|
||||
events = [...events];
|
||||
res.sendStatus(200);
|
||||
} else {
|
||||
res.sendStatus(400);
|
||||
}
|
||||
};
|
||||
|
||||
+19
-13
@@ -1,48 +1,54 @@
|
||||
[
|
||||
{
|
||||
"id": "1",
|
||||
"id":"5ce39a29-a70c-426a-9ce2-f97782049c71",
|
||||
"order": 0,
|
||||
"timerDuration": 5,
|
||||
"type": "delay"
|
||||
},
|
||||
{
|
||||
"id": "5ce39a29-a70c-426a-9ce2-f97782049c72",
|
||||
"order": 1,
|
||||
"title": "Is the internet a fad?",
|
||||
"subtitle": "It is",
|
||||
"presenter": "Carlos Valente",
|
||||
"timeStart": "",
|
||||
"timeEnd":"",
|
||||
"timeStart": "2020-04-09T11:25:43.511Z",
|
||||
"timeEnd": "2020-04-09T12:25:43.511Z",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"id": 0.4849093424577693,
|
||||
"id":"5ce39a29-a70c-426a-9ce2-f97782049c73",
|
||||
"order": 2,
|
||||
"timerDuration": 25,
|
||||
"type": "delay"
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"id": "5ce39a29-a70c-426a-9ce2-f97782049c74",
|
||||
"order": 3,
|
||||
"title": "Is reddit a dictatorship?",
|
||||
"subtitle": "It is",
|
||||
"presenter": "Carlos Valente",
|
||||
"timeStart": "",
|
||||
"timeEnd":"",
|
||||
"timeStart": "2020-04-09T13:25:43.511Z",
|
||||
"timeEnd": "2020-04-09T14:25:43.511Z",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"id": "5ce39a29-a70c-426a-9ce2-f97782049c75",
|
||||
"order": 4,
|
||||
"title": "Out of words",
|
||||
"subtitle": "",
|
||||
"presenter": "Carlos Valente",
|
||||
"timeStart": "",
|
||||
"timeEnd":"",
|
||||
"timeStart": "2020-04-09T15:25:43.511Z",
|
||||
"timeEnd": "2020-04-09T16:25:43.511Z",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"id": "5ce39a29-a70c-426a-9ce2-f97782049c76",
|
||||
"order": 5,
|
||||
"title": "Really",
|
||||
"subtitle": "",
|
||||
"presenter": "Carlos Valente",
|
||||
"timeStart": "",
|
||||
"timeEnd":"",
|
||||
"timeStart": "2020-04-09T17:25:43.511Z",
|
||||
"timeEnd": "2020-04-09T18:25:43.511Z",
|
||||
"type": "event"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
const event = {
|
||||
order: 0,
|
||||
title: '',
|
||||
subtitle: '',
|
||||
presenter: '',
|
||||
timeStart: new Date(),
|
||||
timeEnd: new Date(),
|
||||
clockStarted: null,
|
||||
type: 'event',
|
||||
};
|
||||
|
||||
const delay = {
|
||||
order: 0,
|
||||
timerDuration: 0,
|
||||
type: 'delay',
|
||||
};
|
||||
|
||||
const block = {
|
||||
order: 0,
|
||||
type: 'block',
|
||||
};
|
||||
|
||||
module.exports = { event, delay, block };
|
||||
+2
-1
@@ -6,6 +6,7 @@
|
||||
"body-parser": "~1.19.0",
|
||||
"express": "~4.17.1",
|
||||
"express-session": "~1.17.1",
|
||||
"nanoid": "^3.1.22",
|
||||
"passport": "~0.4.1",
|
||||
"passport-local": "~1.0.0",
|
||||
"socket.io": "^4.0.0"
|
||||
@@ -13,4 +14,4 @@
|
||||
"scripts": {
|
||||
"start": "node app.js"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,25 @@
|
||||
const express = require('express');
|
||||
const cors = require('cors');
|
||||
const router = express.Router();
|
||||
|
||||
// Cross origin stuff
|
||||
const corsOptions = {
|
||||
origin: 'http://localhost',
|
||||
}
|
||||
|
||||
// import playback controller
|
||||
const eventsController = require('../controllers/eventsController');
|
||||
|
||||
// create route between controller and '/events' endpoint
|
||||
router.get('/', cors(corsOptions), eventsController.eventsGet);
|
||||
router.get('/', eventsController.eventsGet);
|
||||
|
||||
// create route between controller and '/events/all' endpoint
|
||||
router.get('/all', cors(corsOptions), eventsController.eventsGetAll);
|
||||
router.get('/all', eventsController.eventsGetAll);
|
||||
|
||||
// create route between controller and '/events/:id' endpoint
|
||||
router.get('/:id', eventsController.eventsGetById);
|
||||
|
||||
// create route between controller and '/events/' endpoint
|
||||
router.post('/', eventsController.eventsPost);
|
||||
|
||||
// create route between controller and '/events/:id' endpoint
|
||||
router.put('/', eventsController.eventsPut);
|
||||
|
||||
// create route between controller and '/events/:id' endpoint
|
||||
router.delete('/:id', eventsController.eventsDelete);
|
||||
|
||||
module.exports = router;
|
||||
|
||||
@@ -339,6 +339,11 @@ ms@2.1.2:
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||
|
||||
nanoid@^3.1.22:
|
||||
version "3.1.22"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844"
|
||||
integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==
|
||||
|
||||
negotiator@0.6.2:
|
||||
version "0.6.2"
|
||||
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
|
||||
|
||||
Reference in New Issue
Block a user