Url presets (#807)

This commit is contained in:
Carlos Valente
2024-03-08 23:10:43 +01:00
committed by GitHub
parent 10d7273ec0
commit ad71793cf3
54 changed files with 544 additions and 1109 deletions
@@ -1,31 +0,0 @@
import type { Alias, ErrorResponse } from 'ontime-types';
import { Request, Response } from 'express';
import { DataProvider } from '../../classes/data-provider/DataProvider.js';
import { failIsNotArray } from '../../utils/routerUtils.js';
export async function getAliases(_req: Request, res: Response<Alias[]>) {
const aliases = DataProvider.getAliases();
res.status(200).send(aliases);
}
export async function postAliases(req: Request, res: Response<Alias[] | ErrorResponse>) {
if (failIsNotArray(req.body, res)) {
return;
}
try {
const newAliases: Alias[] = [];
req.body.forEach((a) => {
newAliases.push({
enabled: a.enabled,
alias: a.alias,
pathAndParams: a.pathAndParams,
});
});
await DataProvider.setAliases(newAliases);
res.status(200).send(newAliases);
} catch (error) {
res.status(400).send({ message: String(error) });
}
}
@@ -1,8 +0,0 @@
import express from 'express';
import { getAliases, postAliases } from './aliases.controller.js';
import { validateAliases } from './aliases.validation.js';
export const router = express.Router();
router.get('/', getAliases);
router.post('/', validateAliases, postAliases);
+1 -1
View File
@@ -36,7 +36,7 @@ export async function patchPartialProjectFile(req: Request, res: Response<Databa
settings: req.body?.settings,
viewSettings: req.body?.viewSettings,
osc: req.body?.osc,
aliases: req.body?.aliases,
urlPresets: req.body?.urlPresets,
customFields: req.body?.customFields,
};
+2 -2
View File
@@ -1,6 +1,6 @@
import express from 'express';
import { router as aliasesRouter } from './aliases/aliases.router.js';
import { router as urlPresetsRouter } from './url-presets/urlPresets.router.js';
import { router as customFieldsRouter } from './custom-fields/customFields.router.js';
import { router as dbRouter } from './db/db.router.js';
import { router as httpRouter } from './http/http.router.js';
@@ -13,7 +13,6 @@ import { router as viewSettingsRouter } from './view-settings/viewSettings.route
export const appRouter = express.Router();
appRouter.use('/aliases', aliasesRouter);
appRouter.use('/custom-fields', customFieldsRouter);
appRouter.use('/db', dbRouter);
appRouter.use('/http', httpRouter);
@@ -22,4 +21,5 @@ appRouter.use('/project', projectRouter);
appRouter.use('/rundown', rundownRouter);
appRouter.use('/settings', settingsRouter);
appRouter.use('/sheets', sheetsRouter);
appRouter.use('/url-presets', urlPresetsRouter);
appRouter.use('/view-settings', viewSettingsRouter);
@@ -0,0 +1,28 @@
import type { ErrorResponse, URLPreset } from 'ontime-types';
import { Request, Response } from 'express';
import { DataProvider } from '../../classes/data-provider/DataProvider.js';
import { failIsNotArray } from '../../utils/routerUtils.js';
export async function getUrlPresets(_req: Request, res: Response<URLPreset[]>) {
const presets = DataProvider.getUrlPresets();
res.status(200).send(presets);
}
export async function postUrlPresets(req: Request, res: Response<URLPreset[] | ErrorResponse>) {
if (failIsNotArray(req.body, res)) {
return;
}
try {
const newPresets: URLPreset[] = req.body.map((preset) => ({
enabled: preset.enabled,
alias: preset.alias,
pathAndParams: preset.pathAndParams,
}));
await DataProvider.setUrlPresets(newPresets);
res.status(200).send(newPresets);
} catch (error) {
res.status(400).send({ message: String(error) });
}
}
@@ -0,0 +1,8 @@
import express from 'express';
import { getUrlPresets, postUrlPresets } from './urlPresets.controller.js';
import { validateUrlPresets } from './urlPresets.validation.js';
export const router = express.Router();
router.get('/', getUrlPresets);
router.post('/', validateUrlPresets, postUrlPresets);
@@ -2,9 +2,9 @@ import { body, validationResult } from 'express-validator';
import { Request, Response, NextFunction } from 'express';
/**
* @description Validates object for POST /ontime/aliases
* validate array of URL preset objects
*/
export const validateAliases = [
export const validateUrlPresets = [
body().isArray(),
body('*.enabled').isBoolean(),
body('*.alias').isString().trim(),
@@ -8,10 +8,10 @@ import {
ViewSettings,
DatabaseModel,
OSCSettings,
Alias,
Settings,
CustomFields,
HttpSettings,
URLPreset,
} from 'ontime-types';
import { data, db } from '../../setup/loadDb.js';
@@ -65,12 +65,12 @@ export class DataProvider {
return data.http;
}
static getAliases(): Alias[] {
return data.aliases;
static getUrlPresets(): URLPreset[] {
return data.urlPresets;
}
static async setAliases(newData: Alias[]) {
data.aliases = newData;
static async setUrlPresets(newData: URLPreset[]) {
data.urlPresets = newData;
await this.persist();
}
@@ -113,7 +113,7 @@ export class DataProvider {
data.viewSettings = mergedData.viewSettings;
data.osc = mergedData.osc;
data.http = mergedData.http;
data.aliases = mergedData.aliases;
data.urlPresets = mergedData.urlPresets;
data.customFields = mergedData.customFields;
data.rundown = mergedData.rundown;
await this.persist();
@@ -6,7 +6,7 @@ import { DatabaseModel } from 'ontime-types';
* @param {object} newData
*/
export function safeMerge(existing: DatabaseModel, newData: Partial<DatabaseModel>) {
const { rundown, project, settings, viewSettings, aliases, customFields, osc, http } = newData || {};
const { rundown, project, settings, viewSettings, urlPresets, customFields, osc, http } = newData || {};
return {
...existing,
@@ -14,7 +14,7 @@ export function safeMerge(existing: DatabaseModel, newData: Partial<DatabaseMode
project: { ...existing.project, ...project },
settings: { ...existing.settings, ...settings },
viewSettings: { ...existing.viewSettings, ...viewSettings },
aliases: aliases ?? existing.aliases,
urlPresets: urlPresets ?? existing.urlPresets,
customFields: customFields ?? existing.customFields,
osc: { ...existing.osc, ...osc },
http: { ...existing.http, ...http },
@@ -1,4 +1,4 @@
import { Alias, DatabaseModel, OntimeRundown, Settings } from 'ontime-types';
import { DatabaseModel, OntimeRundown, Settings, URLPreset } from 'ontime-types';
import { safeMerge } from '../DataProvider.utils.js';
describe('safeMerge', () => {
@@ -28,7 +28,7 @@ describe('safeMerge', () => {
warningColor: '#FFAB33',
dangerColor: '#ED3333',
},
aliases: [],
urlPresets: [],
customFields: {
lighting: { type: 'string', label: 'lighting', colour: 'red' },
vfx: { type: 'string', label: 'vfx', colour: 'blue' },
@@ -130,7 +130,7 @@ describe('safeMerge', () => {
});
});
it('should merge the aliases key when present', () => {
it('should merge the urlPresets key when present', () => {
const existingData = {
rundown: [],
project: {
@@ -153,7 +153,7 @@ describe('safeMerge', () => {
overrideStyles: false,
endMessage: '',
},
aliases: [],
urlPresets: [],
osc: {
portIn: 8888,
portOut: 9999,
@@ -165,15 +165,15 @@ describe('safeMerge', () => {
} as DatabaseModel;
const newData = {
aliases: [
urlPresets: [
{ enabled: true, alias: 'alias1', pathAndParams: '' },
{ enabled: true, alias: 'alias2', pathAndParams: '' },
] as Alias[],
] as URLPreset[],
};
const mergedData = safeMerge(existingData, newData);
expect(mergedData.aliases).toEqual(newData.aliases);
expect(mergedData.urlPresets).toEqual(newData.urlPresets);
});
it('merges customFields into existing object', () => {
+1 -1
View File
@@ -27,7 +27,7 @@ export const dbModel: DatabaseModel = {
dangerColor: '#ED3333',
endMessage: '',
},
aliases: [],
urlPresets: [],
customFields: {},
osc: {
portIn: 8888,
@@ -18,7 +18,7 @@ import { dbModel } from '../../models/dataModel.js';
import { parseExcel, parseJson, createEvent, getCustomFieldData } from '../parser.js';
import { makeString } from '../parserUtils.js';
import { parseAliases, parseViewSettings } from '../parserFunctions.js';
import { parseUrlPresets, parseViewSettings } from '../parserFunctions.js';
describe('test json parser with valid def', () => {
const testData: Partial<DatabaseModel> = {
@@ -514,23 +514,23 @@ describe('test event validator', () => {
});
describe('test aliases import', () => {
it('imports a well defined alias', () => {
it('imports a well defined urlPreset', () => {
const testData = {
rundown: [],
settings: {
app: 'ontime',
version: '2.0.0',
},
aliases: [
urlPresets: [
{
enabled: false,
alias: 'testalias',
pathAndParams: 'testpathAndParams',
},
],
};
} as DatabaseModel;
const parsed = parseAliases(testData);
const parsed = parseUrlPresets(testData);
expect(parsed.length).toBe(1);
// generates missing id
@@ -552,8 +552,10 @@ describe('test views import', () => {
dangerColor: '#ED3333',
endMessage: '',
overrideStyles: false,
// known error: properties do not exist
notAthing: true,
},
// known error: views does not exist
views: {
overrideStyles: true,
},
@@ -565,6 +567,7 @@ describe('test views import', () => {
endMessage: '',
overrideStyles: false,
};
// @ts-expect-error -- we know the above is incorrect
const parsed = parseViewSettings(testData);
expect(parsed).toStrictEqual(expectedParsedViewSettings);
});
@@ -576,7 +579,7 @@ describe('test views import', () => {
app: 'ontime',
version: '2.0.0',
},
};
} as DatabaseModel;
const parsed = parseViewSettings(testData);
expect(parsed).toStrictEqual({});
});
+2 -2
View File
@@ -26,7 +26,7 @@ import { event as eventDef } from '../models/eventsDefinition.js';
import { dbModel } from '../models/dataModel.js';
import { deleteFile, makeString } from './parserUtils.js';
import {
parseAliases,
parseUrlPresets,
parseProject,
parseOsc,
parseHttp,
@@ -274,7 +274,7 @@ export const parseJson = async (jsonData: Partial<DatabaseModel>): Promise<Datab
project: parseProject(jsonData) ?? dbModel.project,
settings: parseSettings(jsonData) ?? dbModel.settings,
viewSettings: parseViewSettings(jsonData) ?? dbModel.viewSettings,
aliases: parseAliases(jsonData),
urlPresets: parseUrlPresets(jsonData),
customFields: parseCustomFields(jsonData),
osc: parseOsc(jsonData) ?? dbModel.osc,
http: parseHttp(jsonData) ?? dbModel.http,
+17 -17
View File
@@ -1,6 +1,5 @@
import { generateId } from 'ontime-utils';
import {
Alias,
OntimeRundown,
HttpSettings,
OSCSettings,
@@ -15,6 +14,7 @@ import {
CustomFields,
isOntimeCycle,
HttpSubscription,
URLPreset,
} from 'ontime-types';
import { block as blockDef, delay as delayDef } from '../models/eventsDefinition.js';
@@ -74,7 +74,7 @@ export const parseRundown = (data: Partial<DatabaseModel>): OntimeRundown => {
* @param {object} data - data object
* @returns {object} - event object data
*/
export const parseProject = (data): ProjectData => {
export const parseProject = (data: Partial<DatabaseModel>): ProjectData => {
let newProjectData: Partial<ProjectData> = {};
// we are adding this here to aid transition, should be removed once enough time has past that users have fully migrated
if ('project' in data) {
@@ -134,7 +134,7 @@ export const parseSettings = (data): Settings => {
* @param {object} data - data object
* @returns {object} - event object data
*/
export const parseViewSettings = (data): ViewSettings => {
export const parseViewSettings = (data: Partial<DatabaseModel>): ViewSettings => {
let newViews: Partial<ViewSettings> = {};
if ('viewSettings' in data) {
console.log('Found view definition, importing...');
@@ -225,29 +225,29 @@ export const parseHttp = (data: { http?: Partial<HttpSettings> }): HttpSettings
};
/**
* Parse aliases portion of an entry
* Parse URL preset portion of an entry
* @param {object} data - data object
* @returns {object} - event object data
*/
export const parseAliases = (data): Alias[] => {
const newAliases: Alias[] = [];
if ('aliases' in data) {
console.log('Found Aliases definition, importing...');
export const parseUrlPresets = (data: Partial<DatabaseModel>): URLPreset[] => {
const newPresets: URLPreset[] = [];
if ('urlPresets' in data) {
console.log('Found URL presets definition, importing...');
try {
for (const alias of data.aliases) {
const newAlias = {
enabled: alias.enabled ?? false,
alias: alias.alias ?? '',
pathAndParams: alias.pathAndParams ?? '',
for (const preset of data.urlPresets) {
const newPreset = {
enabled: preset.enabled ?? false,
alias: preset.alias ?? '',
pathAndParams: preset.pathAndParams ?? '',
};
newAliases.push(newAlias);
newPresets.push(newPreset);
}
console.log(`Uploaded ${newAliases.length} alias(es)`);
console.log(`Uploaded ${newPresets.length} preset(s)`);
} catch (error) {
console.log(`Error: ${error}`);
}
}
return newAliases;
return newPresets;
};
/**
@@ -255,7 +255,7 @@ export const parseAliases = (data): Alias[] => {
* @param {object} data - data object
* @returns {object} - event object data
*/
export const parseCustomFields = (data): CustomFields => {
export const parseCustomFields = (data: Partial<DatabaseModel>): CustomFields => {
let newCustomFields: CustomFields = { ...dbModel.customFields };
if ('customFields' in data) {