refactor: project data (#523)

This commit is contained in:
Carlos Valente
2023-09-15 17:33:30 +02:00
committed by GitHub
parent 9708f0bfc6
commit a0c5375376
43 changed files with 207 additions and 193 deletions
+13 -11
View File
@@ -1,6 +1,6 @@
import { vi } from 'vitest';
import { EndAction, OntimeEvent, TimerType } from 'ontime-types';
import { EndAction, TimerType } from 'ontime-types';
import { dbModel } from '../../models/dataModel.js';
import { parseExcel, parseJson, validateEvent } from '../parser.js';
@@ -192,7 +192,7 @@ describe('test json parser with valid def', () => {
user9: '',
},
],
eventData: {
project: {
title: 'This is a test definition',
url: 'www.carlosvalente.com',
publicInfo: 'WiFi: demoproject \nPassword: ontimeproject',
@@ -246,7 +246,7 @@ describe('test json parser with valid def', () => {
});
it('loaded event settings', () => {
const eventTitle = parseResponse?.eventData?.title;
const eventTitle = parseResponse?.project?.title;
expect(eventTitle).toBe('This is a test definition');
});
@@ -420,10 +420,10 @@ describe('test corrupt data', () => {
expect(parsedDef.rundown.length).toBe(0);
});
it('handles missing event data', async () => {
const emptyEventData = {
it('handles missing project data', async () => {
const emptyProjectData = {
rundown: [{}, {}, {}, {}, {}, {}, {}, {}],
eventData: {},
project: {},
settings: {
app: 'ontime',
version: 2,
@@ -433,8 +433,8 @@ describe('test corrupt data', () => {
},
};
const parsedDef = await parseJson(emptyEventData);
expect(parsedDef.eventData).toStrictEqual(dbModel.eventData);
const parsedDef = await parseJson(emptyProjectData);
expect(parsedDef.project).toStrictEqual(dbModel.project);
});
it('handles missing settings', async () => {
@@ -568,7 +568,8 @@ describe('test parseExcel function', () => {
const testdata = [
['Ontime ┬À Schedule Template'],
[],
['Event Name', 'Test Event'],
['Project Name', 'Test Event'],
['Project Description', 'test description'],
['Public URL', 'www.public.com'],
['Backstage URL', 'www.backstage.com'],
['Public Info', 'test public info'],
@@ -650,8 +651,9 @@ describe('test parseExcel function', () => {
[],
];
const expectedParsedEvent = {
const expectedParsedProjectData = {
title: 'Test Event',
description: 'test description',
publicUrl: 'www.public.com',
backstageUrl: 'www.backstage.com',
publicInfo: 'test public info',
@@ -705,7 +707,7 @@ describe('test parseExcel function', () => {
];
const parsedData = await parseExcel(testdata);
expect(parsedData.eventData).toStrictEqual(expectedParsedEvent);
expect(parsedData.project).toStrictEqual(expectedParsedProjectData);
expect(parsedData.rundown).toBeDefined();
expect(parsedData.rundown[0]).toMatchObject(expectedParsedRundown[0]);
expect(parsedData.rundown[1]).toMatchObject(expectedParsedRundown[1]);
+19 -12
View File
@@ -7,7 +7,6 @@ import { generateId, calculateDuration } from 'ontime-utils';
import {
DatabaseModel,
EndAction,
EventData,
OntimeEvent,
OntimeRundown,
SupportedEvent,
@@ -19,7 +18,7 @@ import { dbModel } from '../models/dataModel.js';
import { deleteFile, makeString } from './parserUtils.js';
import {
parseAliases,
parseEventData,
parseProject,
parseOsc,
parseRundown,
parseSettings,
@@ -37,8 +36,9 @@ export const JSON_MIME = 'application/json';
* @returns {object} - parsed object
*/
export const parseExcel = async (excelData) => {
const eventData: Partial<EventData> = {
const projectData: Partial<ProjectData> = {
title: '',
description: '',
publicUrl: '',
backstageUrl: '',
};
@@ -71,6 +71,7 @@ export const parseExcel = async (excelData) => {
.filter((e) => e.length > 0)
.forEach((row) => {
let eventTitleNext = false;
let projectTitleNext = false;
let publicUrlNext = false;
let publicInfoNext = false;
let backstageUrlNext = false;
@@ -81,19 +82,22 @@ export const parseExcel = async (excelData) => {
row.forEach((column, j) => {
// check flags
if (eventTitleNext) {
eventData.title = column;
projectData.title = column;
eventTitleNext = false;
} else if (projectTitleNext) {
projectData.description = column;
projectTitleNext = false;
} else if (publicUrlNext) {
eventData.publicUrl = column;
projectData.publicUrl = column;
publicUrlNext = false;
} else if (publicInfoNext) {
eventData.publicInfo = column;
projectData.publicInfo = column;
publicInfoNext = false;
} else if (backstageUrlNext) {
eventData.backstageUrl = column;
projectData.backstageUrl = column;
backstageUrlNext = false;
} else if (backstageInfoNext) {
eventData.backstageInfo = column;
projectData.backstageInfo = column;
backstageInfoNext = false;
} else if (j === timeStartIndex) {
event.timeStart = parseExcelDate(column);
@@ -154,9 +158,12 @@ export const parseExcel = async (excelData) => {
// look for keywords
// need to make sure it is a string first
switch (col) {
case 'event name':
case 'project name':
eventTitleNext = true;
break;
case 'project description':
projectTitleNext = true;
break;
case 'public url':
publicUrlNext = true;
break;
@@ -273,7 +280,7 @@ export const parseExcel = async (excelData) => {
});
return {
rundown,
eventData,
project: projectData,
settings: {
app: 'ontime',
version: 2,
@@ -299,7 +306,7 @@ export const parseJson = async (jsonData, enforce = false): Promise<DatabaseMode
// parse Events
returnData.rundown = parseRundown(jsonData);
// parse Event
returnData.eventData = parseEventData(jsonData, enforce);
returnData.project = parseProject(jsonData, enforce);
// Settings handled partially
returnData.settings = parseSettings(jsonData, enforce);
// View settings handled partially
@@ -395,7 +402,7 @@ export const fileHandler = async (file): Promise<ResponseOK | ResponseError> =>
const dataFromExcel = await parseExcel(excelData.data);
res.data = {};
res.data.rundown = parseRundown(dataFromExcel);
res.data.eventData = parseEventData(dataFromExcel, true);
res.data.project = parseProject(dataFromExcel, true);
res.data.userFields = parseUserFields(dataFromExcel);
res.message = 'success';
} else {
+20 -17
View File
@@ -2,11 +2,11 @@ import { generateId } from 'ontime-utils';
import {
Alias,
EndAction,
EventData,
OntimeRundown,
OSCSettings,
OscSubscription,
OscSubscriptionOptions,
ProjectData,
Settings,
TimerLifeCycle,
TimerType,
@@ -91,26 +91,29 @@ export const parseRundown = (data): OntimeRundown => {
* @param {boolean} enforce - whether to create a definition if one is missing
* @returns {object} - event object data
*/
export const parseEventData = (data, enforce): EventData => {
let newEventData: Partial<EventData> = {};
if ('eventData' in data) {
console.log('Found event data, importing...');
const e = data.eventData;
export const parseProject = (data, enforce): 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
// TODO: Remove eventually
if ('project' in data || 'eventData' in data) {
console.log('Found project data, importing...');
const project = data.project ?? data.eventData;
// filter known properties and write to db
newEventData = {
...dbModel.eventData,
title: e.title || dbModel.eventData.title,
description: e.description || dbModel.eventData.description,
publicUrl: e.publicUrl || dbModel.eventData.publicUrl,
publicInfo: e.publicInfo || dbModel.eventData.publicInfo,
backstageUrl: e.backstageUrl || dbModel.eventData.backstageUrl,
backstageInfo: e.backstageInfo || dbModel.eventData.backstageInfo,
newProjectData = {
...dbModel.project,
title: project.title || dbModel.project.title,
description: project.description || dbModel.project.description,
publicUrl: project.publicUrl || dbModel.project.publicUrl,
publicInfo: project.publicInfo || dbModel.project.publicInfo,
backstageUrl: project.backstageUrl || dbModel.project.backstageUrl,
backstageInfo: project.backstageInfo || dbModel.project.backstageInfo,
};
} else if (enforce) {
newEventData = { ...dbModel.eventData };
console.log('Created event object in db');
newProjectData = { ...dbModel.project };
console.log('Created project object in db');
}
return newEventData as EventData;
return newProjectData as ProjectData;
};
/**