feat: eventsAPI

This commit is contained in:
cv
2021-04-10 11:39:53 +02:00
parent e2561bcd54
commit e62b79f84e
13 changed files with 384 additions and 193 deletions
+2 -1
View File
@@ -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);
+100 -2
View File
@@ -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
View File
@@ -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"
}
]
+23
View File
@@ -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
View File
@@ -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"
}
}
}
+14 -8
View File
@@ -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;
+5
View File
@@ -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"