diff --git a/server/app.js b/server/app.js index 3210ded28..6064b1251 100644 --- a/server/app.js +++ b/server/app.js @@ -1,27 +1,33 @@ // get config -const config = require('./config.json'); +import { config } from './config.js'; // init database -const low = require('lowdb'); -const FileSync = require('lowdb/adapters/FileSync'); +import { Low, JSONFile } from 'lowdb'; -const adapter = new FileSync(config.database.filename); -const db = low(adapter); +const adapter = new JSONFile(config.database.filename); +export const db = new Low(adapter); // dependencies -const express = require('express'); -const http = require('http'); -const cors = require('cors'); -const { dbModel } = require('./data/dataModel.js'); +import express from 'express'; +import http from 'http'; +import cors from 'cors'; +import { dbModel } from './data/dataModel.js'; -db.defaults(dbModel).write(); +// Read data from JSON file, this will set db.data content +await db.read(); -// export db -module.exports.db = db; +// If file.json doesn't exist, db.data will be null +// Set default data +// db.data ||= { posts: [] }; +if (!db.data) db.data = { dbModel }; + +// get data +const { events } = db.data; // Import Routes -const eventsRouter = require('./routes/eventsRouter.js'); -const eventRouter = require('./routes/eventRouter.js'); +import { router as eventsRouter } from './routes/eventsRouter.js'; +import { router as eventRouter } from './routes/eventRouter.js'; + // No settings yet // const settingsRouter = require('./routes/settingsRouter.js'); @@ -29,7 +35,7 @@ const eventRouter = require('./routes/eventRouter.js'); const port = process.env.PORT || config.server.port; // Global Objects -const EventTimer = require('./classes/EventTimer.js'); +import { EventTimer } from './classes/EventTimer.js'; // Create express APP const app = express(); @@ -62,12 +68,9 @@ app.use((err, req, res, next) => { // create HTTP server const server = http.createServer(app); -// get data (if any) -const eventlist = db.get('events').value(); - // init timer global.timer = new EventTimer(server, config); -global.timer.setupWithEventList(eventlist); +global.timer.setupWithEventList(events); // Start server server.listen(port, () => @@ -75,6 +78,6 @@ server.listen(port, () => ); // Start OSC server -const { initiateOSC } = require('./controllers/OscController.js'); +import { initiateOSC } from './controllers/OscController.js'; initiateOSC(config.osc); diff --git a/server/classes/EventTimer.js b/server/classes/EventTimer.js index 6059a7a18..a81ee4388 100644 --- a/server/classes/EventTimer.js +++ b/server/classes/EventTimer.js @@ -1,5 +1,5 @@ -const Timer = require('./Timer'); -const socketIo = require('socket.io'); +import { Timer } from './Timer.js'; +import { Server } from 'socket.io'; /* * EventTimer adds functions specific to APP @@ -9,7 +9,7 @@ const socketIo = require('socket.io'); * */ -class EventTimer extends Timer { +export class EventTimer extends Timer { // AUX DAYMS = 86400000; @@ -57,12 +57,12 @@ class EventTimer extends Timer { numEvents = null; _eventlist = null; - constructor(server, config) { + constructor(httpServer, config) { // call super constructor super(); // initialise socketIO server - this.io = socketIo(server, { + this.io = new Server(httpServer, { cors: { origin: '*', methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', @@ -797,5 +797,3 @@ class EventTimer extends Timer { this.loadEvent(this.selectedEventIndex); } } - -module.exports = EventTimer; diff --git a/server/classes/Timer.js b/server/classes/Timer.js index 6fd83e5e3..3a402ccd7 100644 --- a/server/classes/Timer.js +++ b/server/classes/Timer.js @@ -4,7 +4,7 @@ * */ -class Timer { +export class Timer { clock = null; duration = null; current = null; @@ -210,6 +210,4 @@ class Timer { this._finishedAt = null; } } -} - -module.exports = Timer; +} \ No newline at end of file diff --git a/server/config.js b/server/config.js new file mode 100644 index 000000000..64ef4ef2b --- /dev/null +++ b/server/config.js @@ -0,0 +1,15 @@ +export const config = { + timer: { + refresh: 1000, + }, + server: { + port: 4001, + }, + database: { + filename: 'db.json', + tablename: 'events', + }, + osc: { + port: 8888, + }, +}; diff --git a/server/config.json b/server/config.json deleted file mode 100644 index 40d18e4a8..000000000 --- a/server/config.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "timer": { - "refresh": 1000 - }, - "server": { - "port": 4001 - }, - "database": { - "filename": "db.json", - "tablename": "events" - }, - "osc": { - "port": 8888 - } -} \ No newline at end of file diff --git a/server/controllers/OscController.js b/server/controllers/OscController.js index 288e5ee5e..89b1010f2 100644 --- a/server/controllers/OscController.js +++ b/server/controllers/OscController.js @@ -1,7 +1,7 @@ -const osc = require('node-osc'); +import { Server } from 'node-osc'; -const initiateOSC = (config) => { - const oscServer = new osc.Server(config.port, '0.0.0.0', () => { +export const initiateOSC = (config) => { + const oscServer = new Server(config.port, '0.0.0.0', () => { console.log(`OSC Server is listening on port ${config.port}`); }); @@ -83,5 +83,3 @@ const initiateOSC = (config) => { } }); }; - -module.exports = { initiateOSC }; diff --git a/server/controllers/eventController.js b/server/controllers/eventController.js index f78e4204e..23988490b 100644 --- a/server/controllers/eventController.js +++ b/server/controllers/eventController.js @@ -1,5 +1,5 @@ // get database -const { db } = require('../app.js'); +import { db } from '../app.js'; const table = 'event'; @@ -9,7 +9,7 @@ function getSettings() { // Create controller for GET request to 'event' // Returns ACK message -exports.getAll = async (req, res) => { +export const getAll = async (req, res) => { const settings = getSettings(); if (settings) res.json(settings); else res.sendStatus(400); @@ -17,7 +17,7 @@ exports.getAll = async (req, res) => { // Create controller for POST request to 'event' // Returns ACK message -exports.post = async (req, res) => { +export const post = async (req, res) => { if (!req.body) { res.status(400).send('No object found in request'); return; @@ -35,7 +35,7 @@ exports.post = async (req, res) => { // Create controller for GET request to 'event/title' // Returns ACK message -exports.titleGet = async (req, res) => { +export const titleGet = async (req, res) => { const settings = getSettings(); if (settings) res.json(settings.title); @@ -44,7 +44,7 @@ exports.titleGet = async (req, res) => { // Create controller for POST request to 'event/title' // Returns ACK message -exports.titlePost = async (req, res) => { +export const titlePost = async (req, res) => { if (!req.body) { res.status(400).send('No object found in request'); return; @@ -61,7 +61,7 @@ exports.titlePost = async (req, res) => { // Create controller for GET request to '/event/url' // Returns ACK message -exports.urlGet = async (req, res) => { +export const urlGet = async (req, res) => { const event = getSettings(); if (event) res.json(event.url); @@ -70,7 +70,7 @@ exports.urlGet = async (req, res) => { // Create controller for POST request to '/event/url' // Returns ACK message -exports.urlPost = async (req, res) => { +export const urlPost = async (req, res) => { if (!req.body) { res.status(400).send('No object found in request'); return; @@ -87,7 +87,7 @@ exports.urlPost = async (req, res) => { // Create controller for GET request to 'event/publicInfo' // Returns ACK message -exports.publicInfoGet = async (req, res) => { +export const publicInfoGet = async (req, res) => { const settings = getSettings(); if (settings) res.json(settings.publicInfo); @@ -96,7 +96,7 @@ exports.publicInfoGet = async (req, res) => { // Create controller for POST request to '/event/publicInfo' // Returns ACK message -exports.publicInfoPost = async (req, res) => { +export const publicInfoPost = async (req, res) => { if (!req.body) { res.status(400).send('No object found in request'); return; @@ -113,7 +113,7 @@ exports.publicInfoPost = async (req, res) => { // Create controller for GET request to 'event/backstageInfo' // Returns ACK message -exports.backstageInfoGet = async (req, res) => { +export const backstageInfoGet = async (req, res) => { const settings = getSettings(); if (settings) res.json(settings.backstageInfo); @@ -122,7 +122,7 @@ exports.backstageInfoGet = async (req, res) => { // Create controller for POST request to '/event/info' // Returns ACK message -exports.backstageInfoPost = async (req, res) => { +export const backstageInfoPost = async (req, res) => { if (!req.body) { res.status(400).send('No object found in request'); return; @@ -139,6 +139,6 @@ exports.backstageInfoPost = async (req, res) => { // Create controller for GET request to 'event/osc' // Returns ACK message -exports.osc = async (req, res) => { +export const osc = async (req, res) => { res.send('Not yet implemented').status(500); }; diff --git a/server/controllers/eventsController.js b/server/controllers/eventsController.js index 5f3973121..4768eeb16 100644 --- a/server/controllers/eventsController.js +++ b/server/controllers/eventsController.js @@ -1,10 +1,14 @@ // get database -const db = require('../app.js').db; +import { db } from '../app.js'; // utils -const customAlphabet = require('nanoid').customAlphabet; +import { customAlphabet } from 'nanoid'; const nanoid = customAlphabet('1234567890abcdef', 4); -const eventDefs = require('../data/eventsDefinition.js'); +import { + event as eventDef, + block as blockDef, + delay as delayDEf, +} from '../data/eventsDefinition.js'; function _getEventsCount() { return db.get('events').size().value(); @@ -68,21 +72,21 @@ function _deleteTimerId(entryId) { // Create controller for GET request to '/events' // Returns - -exports.eventsGetAll = async (req, res) => { +export const eventsGetAll = async (req, res) => { const results = db.get('events').value(); res.json(results); }; // Create controller for GET request to '/events/:eventId' // Returns - -exports.eventsGetById = async (req, res) => { +export const eventsGetById = async (req, res) => { const e = db.get('events').find({ id: req.params.eventId }).value(); res.json(e); }; // Create controller for POST request to '/events/' // Returns - -exports.eventsPost = async (req, res) => { +export const eventsPost = async (req, res) => { // TODO: Validate event if (!req.body) { res.status(400).send(`No object found in request`); @@ -131,7 +135,7 @@ exports.eventsPost = async (req, res) => { // Create controller for PUT request to '/events/' // Returns - -exports.eventsPut = async (req, res) => { +export const eventsPut = async (req, res) => { // no valid params if (!req.body) { res.status(400).send(`No object found`); @@ -162,12 +166,12 @@ exports.eventsPut = async (req, res) => { // Create controller for PATCH request to '/events/' // Returns - -exports.eventsPatch = async (req, res) => { +export const eventsPatch = async (req, res) => { // Code is the same as put, call that this.eventsPut(req, res); }; -exports.eventsReorder = async (req, res) => { +export const eventsReorder = async (req, res) => { // TODO: Validate event if (!req.body) { res.status(400).send(`No object found in request`); @@ -209,7 +213,7 @@ exports.eventsReorder = async (req, res) => { // Create controller for PATCH request to '/events/applydelay/:eventId' // Returns - -exports.eventsApplyDelay = async (req, res) => { +export const eventsApplyDelay = async (req, res) => { // no valid params if (!req.params.eventId) { res.status(400).send(`No id found in request`); @@ -274,7 +278,7 @@ exports.eventsApplyDelay = async (req, res) => { // Create controller for DELETE request to '/events/:eventId' // Returns - -exports.eventsDelete = async (req, res) => { +export const eventsDelete = async (req, res) => { // no valid params if (!req.params.eventId) { res.status(400).send(`No id found in request`); @@ -298,7 +302,7 @@ exports.eventsDelete = async (req, res) => { // Create controller for DELETE request to '/events/:eventId' // Returns - -exports.eventsDeleteAll = async (req, res) => { +export const eventsDeleteAll = async (req, res) => { try { // set with nothing db.set('events', []).write(); diff --git a/server/data/dataModel.js b/server/data/dataModel.js index cc6f67470..cbe964153 100644 --- a/server/data/dataModel.js +++ b/server/data/dataModel.js @@ -1,4 +1,4 @@ -const dbModel = { +export const dbModel = { events: [], event: { title: '', @@ -14,5 +14,3 @@ const dbModel = { lock: false, }, }; - -module.exports = { dbModel }; diff --git a/server/data/eventsDefinition.js b/server/data/eventsDefinition.js index d98f968f8..f1f326ee8 100644 --- a/server/data/eventsDefinition.js +++ b/server/data/eventsDefinition.js @@ -1,4 +1,4 @@ -const event = { +export const event = { title: '', subtitle: '', presenter: '', @@ -10,14 +10,12 @@ const event = { revision: 0, }; -const delay = { +export const delay = { duration: 0, type: 'delay', revision: 0, }; -const block = { +export const block = { type: 'block', }; - -module.exports = { event, delay, block }; diff --git a/server/data/playbackData.json b/server/data/playbackData.json deleted file mode 100644 index 0337f8752..000000000 --- a/server/data/playbackData.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "current": null, - "next": null, - "currentTimer": null, - "numEvents": 0, - "state": "pause", - "prevState": "pause" -} \ No newline at end of file diff --git a/server/package.json b/server/package.json index 45025a56a..243cd0fa3 100644 --- a/server/package.json +++ b/server/package.json @@ -6,7 +6,7 @@ "body-parser": "~1.19.0", "express": "~4.17.1", "express-session": "~1.17.1", - "lowdb": "^1.0.0", + "lowdb": "2.1.0", "nanoid": "^3.1.22", "node-osc": "^6.0.1", "passport": "~0.4.1", diff --git a/server/routes/eventRouter.js b/server/routes/eventRouter.js index 327fe30b5..99a6b5054 100644 --- a/server/routes/eventRouter.js +++ b/server/routes/eventRouter.js @@ -1,37 +1,46 @@ -const express = require('express'); -const router = express.Router(); +import express from 'express'; +export const router = express.Router(); // import event controller -const eventController = require('../controllers/eventController'); +import { + getAll, + post, + titleGet, + titlePost, + publicInfoGet, + publicInfoPost, + backstageInfoGet, + backstageInfoPost, + urlGet, + urlPost, +} from '../controllers/eventController.js'; // create route between controller and '/settings' endpoint -router.get('/', eventController.getAll); +router.get('/', getAll); // create route between controller and '/settings' endpoint -router.post('/', eventController.post); +router.post('/', post); // create route between controller and '/event/title' endpoint -router.get('/title', eventController.titleGet); +router.get('/title', titleGet); // create route between controller and '/event/title' endpoint -router.post('/title', eventController.titlePost); +router.post('/title', titlePost); // create route between controller and '/event/info' endpoint -router.get('/publicInfo', eventController.publicInfoGet); +router.get('/publicInfo', publicInfoGet); // create route between controller and '/event/info' endpoint -router.post('/publicInfo', eventController.publicInfoPost); +router.post('/publicInfo', publicInfoPost); // create route between controller and '/event/info' endpoint -router.get('/backstageInfo', eventController.backstageInfoGet); +router.get('/backstageInfo', backstageInfoGet); // create route between controller and '/event/info' endpoint -router.post('/backstageInfo', eventController.backstageInfoPost); +router.post('/backstageInfo', backstageInfoPost); // create route between controller and '/event/url' endpoint -router.get('/url', eventController.urlGet); +router.get('/url', urlGet); // create route between controller and '/event/url' endpoint -router.post('/url', eventController.urlPost); - -module.exports = router; +router.post('/url', urlPost); diff --git a/server/routes/eventsRouter.js b/server/routes/eventsRouter.js index b8bf90cd9..9ea280c45 100644 --- a/server/routes/eventsRouter.js +++ b/server/routes/eventsRouter.js @@ -1,34 +1,42 @@ -const express = require('express'); -const router = express.Router(); +import express from 'express'; +export const router = express.Router(); // import events controller -const eventsController = require('../controllers/eventsController'); +import { + eventsGetAll, + eventsGetById, + eventsPost, + eventsPut, + eventsPatch, + eventsReorder, + eventsApplyDelay, + eventsDeleteAll, + eventsDelete, +} from '../controllers/eventsController.js'; // create route between controller and '/events/' endpoint -router.get('/', eventsController.eventsGetAll); +router.get('/', eventsGetAll); // create route between controller and '/events/:eventId' endpoint -router.get('/:eventId', eventsController.eventsGetById); +router.get('/:eventId', eventsGetById); // create route between controller and '/events/' endpoint -router.post('/', eventsController.eventsPost); +router.post('/', eventsPost); // create route between controller and '/events/' endpoint -router.put('/', eventsController.eventsPut); +router.put('/', eventsPut); // create route between controller and '/events/' endpoint -router.patch('/', eventsController.eventsPatch); +router.patch('/', eventsPatch); // create route between controller and '/events/reorder' endpoint -router.patch('/reorder/', eventsController.eventsReorder); +router.patch('/reorder/', eventsReorder); // create route between controller and '/events/applydelay/:eventId' endpoint -router.patch('/applydelay/:eventId', eventsController.eventsApplyDelay); +router.patch('/applydelay/:eventId', eventsApplyDelay); // create route between controller and '/events/all' endpoint -router.delete('/all', eventsController.eventsDeleteAll); +router.delete('/all', eventsDeleteAll); // create route between controller and '/events/:eventId' endpoint -router.delete('/:eventId', eventsController.eventsDelete); - -module.exports = router; +router.delete('/:eventId', eventsDelete); diff --git a/server/routes/playbackRouter.js b/server/routes/playbackRouter.js index e767a3156..3b71b9c86 100644 --- a/server/routes/playbackRouter.js +++ b/server/routes/playbackRouter.js @@ -1,5 +1,5 @@ -const express = require('express'); -const router = express.Router(); +import express from 'express'; +export const router = express.Router(); // import event controller const playbackController = require('../controllers/playbackController'); @@ -30,5 +30,3 @@ router.get('/unload', playbackController.pbUnload); // create route between controller and '/playback/reload' endpoint router.get('/reload', playbackController.pbReload); - -module.exports = router; diff --git a/server/yarn.lock b/server/yarn.lock index 4b7da8610..7ef514f68 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -253,11 +253,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -graceful-fs@^4.1.3: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - http-errors@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" @@ -302,26 +297,12 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-promise@^2.1.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" - integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== - -lodash@4: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lowdb@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064" - integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ== +lowdb@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-2.1.0.tgz#c8063e228b5ab3e082ece90e0512537ecb6e1e2a" + integrity sha512-F4Go8/V37gAidTR3c5poyjprOpZSDNSLJVOmI0ny4D4q9rC37OkBhlzX0bqj7LZlT3UIj4FchmZrrSw7qY+eGQ== dependencies: - graceful-fs "^4.1.3" - is-promise "^2.1.0" - lodash "4" - pify "^3.0.0" - steno "^0.4.1" + steno "^1.0.0" media-typer@0.3.0: version "0.3.0" @@ -446,11 +427,6 @@ pause@0.0.1: resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - proxy-addr@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" @@ -567,12 +543,10 @@ socket.io@^4.0.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -steno@^0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb" - integrity sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs= - dependencies: - graceful-fs "^4.1.3" +steno@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/steno/-/steno-1.0.0.tgz#475e32c6066ec9760229eaaf1550601764fbecba" + integrity sha512-C/KgCvEa1yWnpHmaPjAXrz1yWxh6hs+HvhqqPa71euaQmNi1wr4+WFo57VQxjKKuFl2KqS7gtlrN0oxj2noQLw== toidentifier@1.0.0: version "1.0.0"