This commit is contained in:
Carlos Valente
2022-09-19 21:15:06 +02:00
committed by GitHub
parent fc0cbf6134
commit 70436059d8
71 changed files with 2001 additions and 1175 deletions
+3 -3
View File
@@ -48,15 +48,15 @@ app.options('*', cors());
app.use(express.urlencoded({ extended: true }));
app.use(express.json({ limit: '1mb' }));
app.use('/uploads', express.static('uploads'));
// Implement route endpoints
app.use('/events', eventsRouter);
app.use('/event', eventRouter);
app.use('/ontime', ontimeRouter);
app.use('/playback', playbackRouter);
// serve react
// serve static - css
app.use('/external', express.static(join(__dirname, 'external')));
// serve static - react
app.use(express.static(join(__dirname, env === 'production' ? '../' : '../../', 'client/build')));
app.get('*', (req, res) => {
@@ -234,6 +234,34 @@ export const postSettings = async (req, res) => {
}
};
/**
* @description Get view Settings
* @method GET
*/
export const getViewSettings = async (req, res) => {
res.status(200).send({ ...data.views });
};
/**
* @description Change view Settings
* @method POST
*/
export const postViewSettings = async (req, res) => {
if (!req.body) {
res.status(400).send('No object found in request');
return;
}
try {
data.views = {
overrideStyles: req.body?.overrideStyles ?? data.views.overrideStyles,
};
await db.write();
res.sendStatus(200);
} catch (error) {
res.status(400).send(error);
}
};
// Create controller for POST request to '/ontime/info'
// Returns ACK message
export const postInfo = async (req, res) => {
+11
View File
@@ -0,0 +1,11 @@
:root {
--background-color-override: #f3f4f8;
--color-override: #5051f9;
--accent-color-override: #23235f;
--timer-color-override: #5051f9;
--outdent-background-color-override: white;
}
.timer {
font-family: "Comic Sans MS", serif !important;
}
+3
View File
@@ -15,6 +15,9 @@ export const dbModelv1 = {
pinCode: null,
timeFormat: '24',
},
views: {
overrideStyles: false,
},
aliases: [],
userFields: {
user0: 'user0',
+2 -1
View File
@@ -1,12 +1,13 @@
{
"name": "ontime-server",
"type": "module",
"version": "1.3.0",
"version": "1.4.0",
"dependencies": {
"body-parser": "^1.20.0",
"dotenv": "^16.0.1",
"express": "^4.18.1",
"express-session": "^1.17.3",
"express-validator": "^6.14.2",
"lowdb": "3.0.0",
"multer": "^1.4.4",
"nanoid": "^3.3.3",
+21 -12
View File
@@ -1,25 +1,28 @@
import express from 'express';
import { uploadFile } from '../utils/upload.js';
export const router = express.Router();
import {
dbDownload,
dbUpload,
getInfo,
postInfo,
dbPathToUpload,
getOSC,
postOSC,
getSettings,
postSettings,
dbUpload,
getAliases,
postAliases,
poll,
getInfo,
getOSC,
getSettings,
getUserFields,
getViewSettings,
poll,
postAliases,
postInfo,
postOSC,
postSettings,
postUserFields,
postViewSettings,
} from '../controllers/ontimeController.js';
import { viewValidator } from '../validation/ontimeValidator.js';
export const router = express.Router();
// create route between controller and '/ontime/sync' endpoint
router.get('/poll', poll);
@@ -35,6 +38,12 @@ router.get('/settings', getSettings);
// create route between controller and '/ontime/settings' endpoint
router.post('/settings', postSettings);
// create route between controller and '/ontime/views' endpoint
router.get('/views', getViewSettings);
// create route between controller and '/ontime/views' endpoint
router.post('/views', viewValidator, postViewSettings);
// create route between controller and '/ontime/aliases' endpoint
router.get('/aliases', getAliases);
+30 -1
View File
@@ -2,7 +2,7 @@ import jest from 'jest-mock';
import { dbModelv1, dbModelv1 as dbModel } from '../../models/dataModel.js';
import { isStringEmpty, parseExcel_v1, parseJson_v1, validateEvent_v1 } from '../parser.js';
import { makeString, validateDuration } from '../parserUtils.js';
import { parseAliases_v1, parseUserFields_v1 } from '../parserUtils_v1.js';
import { parseAliases_v1, parseUserFields_v1, parseViews_v1 } from '../parserUtils_v1.js';
describe('test json parser with valid def', () => {
const testData = {
@@ -817,6 +817,35 @@ describe('test userFields import', () => {
});
});
describe('test views import', () => {
it('imports data from file', () => {
const testData = {
events: [],
settings: {
app: 'ontime',
version: 1,
},
views: {
overrideStyles: true,
},
};
const parsed = parseViews_v1(testData);
expect(parsed).toStrictEqual(testData.views);
});
it('imports defaults to model', () => {
const testData = {
events: [],
settings: {
app: 'ontime',
version: 1,
},
};
const parsed = parseViews_v1(testData, true);
expect(parsed).toStrictEqual(dbModelv1.views);
});
});
describe('test validateDuration()', () => {
describe('handles valid inputs', () => {
const valid = [
+3
View File
@@ -11,6 +11,7 @@ import {
parseOsc_v1,
parseSettings_v1,
parseUserFields_v1,
parseViews_v1,
} from './parserUtils_v1.js';
import { parseExcelDate } from './time.js';
import { generateId } from './generate_id.js';
@@ -272,6 +273,8 @@ export const parseJson_v1 = async (jsonData, enforce = false) => {
returnData.event = parseEvent_v1(jsonData, enforce);
// Settings handled partially
returnData.settings = parseSettings_v1(jsonData, enforce);
// View settings handled partially
returnData.views = parseViews_v1(jsonData, enforce);
// Import OSC settings if any
returnData.osc = parseOsc_v1(jsonData, enforce);
// Import HTTP settings if any
+27
View File
@@ -118,6 +118,33 @@ export const parseSettings_v1 = (data, enforce) => {
return newSettings;
};
/**
* Parse settings portion of an entry
* @param {object} data - data object
* @param {boolean} enforce - whether to create a definition if one is missing
* @returns {object} - event object data
*/
export const parseViews_v1 = (data, enforce) => {
let newViews = {};
if ('views' in data) {
console.log('Found view definition, importing...');
const v = data.views;
const viewSettings = {
overrideStyles: v.overrideStyles ?? dbModelv1.views.overrideStyles,
};
// write to db
newViews = {
...viewSettings,
};
} else if (enforce) {
newViews = dbModelv1.views;
console.log(`Created view object in db`);
}
return newViews;
};
/**
* Parse osc portion of an entry
* @param {object} data - data object
+13
View File
@@ -0,0 +1,13 @@
import { check, validationResult } from 'express-validator';
/**
* @description Validates object for POST /ontime/views
*/
export const viewValidator = [
check('overrideStyles').isBoolean().withMessage('overrideStyles value must be boolean'),
(req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) return res.status(422).json({ errors: errors.array() });
next();
},
];
+18
View File
@@ -559,6 +559,14 @@ express-session@^1.17.3:
safe-buffer "5.2.1"
uid-safe "~2.1.5"
express-validator@^6.14.2:
version "6.14.2"
resolved "https://registry.yarnpkg.com/express-validator/-/express-validator-6.14.2.tgz#6147893f7bec0e14162c3a88b3653121afc4678f"
integrity sha512-8XfAUrQ6Y7dIIuy9KcUPCfG/uCbvREctrxf5EeeME+ulanJ4iiW71lWmm9r4YcKKYOCBMan0WpVg7FtHu4Z4Wg==
dependencies:
lodash "^4.17.21"
validator "^13.7.0"
express@^4.18.1:
version "4.18.1"
resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf"
@@ -837,6 +845,11 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
lowdb@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-3.0.0.tgz#c10ab4e7eb86f1cbe255e35e60ffb0c6f42049e0"
@@ -1420,6 +1433,11 @@ v8-compile-cache@^2.0.3:
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
validator@^13.7.0:
version "13.7.0"
resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857"
integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==
vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"