Validation for Action.values and malformed JSON

This commit is contained in:
Felix Kaspar 2023-11-20 22:43:09 +01:00
parent 6d81fa1a9e
commit 90f0ee0bc5
3 changed files with 54 additions and 20 deletions

View File

@ -20,8 +20,17 @@ router.post("/:workflowUuid?", [
return; return;
} }
// TODO: Validate input further (json may be invalid or not be in workflow format) try {
const workflow = JSON.parse(req.body.workflow); var workflow = JSON.parse(req.body.workflow);
} catch (err) {
if (err instanceof Error) {
console.error("malformed workflow-json was provided", err.message);
res.status(400).json({error: "Malformed workflow-JSON was provided. See Server-Logs for more info", details: err.message});
return;
} else {
throw err;
}
}
// TODO: Replace with static multer function of pdffile // TODO: Replace with static multer function of pdffile
const inputs = await Promise.all((req.files as Express.Multer.File[]).map(async file => { const inputs = await Promise.all((req.files as Express.Multer.File[]).map(async file => {
@ -32,12 +41,17 @@ router.post("/:workflowUuid?", [
if(req.body.async === "false") { if(req.body.async === "false") {
console.log("Don't do async"); console.log("Don't do async");
let pdfResults = await traverseOperations(workflow.operations, inputs, (state) => { traverseOperations(workflow.operations, inputs, (state) => {
console.log("State: ", state); console.log("State: ", state);
}).then(async (pdfResults) => {
console.log("Download");
await respondWithPdfFiles(res, pdfResults, "workflow-results");
}).catch((err) => {
if(err.validationError)
res.status(400).json({error: err});
else
throw err;
}) })
console.log("Download");
await respondWithPdfFiles(res, pdfResults, "workflow-results");
} }
else { else {
console.log("Start Aync Workflow"); console.log("Start Aync Workflow");
@ -63,6 +77,7 @@ router.post("/:workflowUuid?", [
} }
}); });
// TODO: Handle when this throws errors
let pdfResults = await traverseOperations(workflow.operations, inputs, (state) => { let pdfResults = await traverseOperations(workflow.operations, inputs, (state) => {
console.log("State: ", state); console.log("State: ", state);
if(activeWorkflow.eventStream) if(activeWorkflow.eventStream)

View File

@ -6,11 +6,11 @@ import { validateOperations } from "./validateOperations";
import { getOperatorByName } from "./getOperatorByName"; import { getOperatorByName } from "./getOperatorByName";
export async function traverseOperations(operations: Action[], input: PdfFile[], progressCallback: (state: Progress) => void): Promise<PdfFile[]> { export async function traverseOperations(operations: Action[], input: PdfFile[], progressCallback: (state: Progress) => void): Promise<PdfFile[]> {
const validationResult = validateOperations(operations);
const validationResult = validateOperations(operations)
if(!validationResult.valid) { if(!validationResult.valid) {
throw Error(validationResult.reason); return Promise.reject({validationError: validationResult.reason});
} }
const waitOperations = organizeWaitOperations(operations); const waitOperations = organizeWaitOperations(operations);
let results: PdfFile[] = []; let results: PdfFile[] = [];

View File

@ -1,16 +1,35 @@
import { Action } from "../../declarations/Action"; import { Action } from "../../declarations/Action";
import { getOperatorByName } from "./getOperatorByName";
export function validateOperations(actions: Action[]): { valid: boolean, reason?: string} { export function validateOperations(actions: Action[]): { valid: boolean, reason?: string} {
// TODO: Validate using inbuilt validators: function validateOperation(actions: Action[]): { valid: boolean; reason?: string; } {
/* for (const action of actions) {
validationResult = impose.validate() if (action.type === "wait" || action.type === "done") {
if(validationResult.valid) { // TODO: Validate these too ):
// Check Next return { valid: true };
} }
else { else {
return validationResult.reason const operator = getOperatorByName(action.type);
} if(!operator) {
*/ return { valid: false, reason: `action.type ${action.type} does not exist` }
}
const validationResult = new operator(action).validate();
return { valid: true }; if(!validationResult.valid) {
return validationResult;
}
}
if (action.actions) {
const validationResult = validateOperation(action.actions);
if(!validationResult.valid) {
return validationResult;
}
}
}
return { valid: true };
}
return validateOperation(actions);
} }