Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 30x 27x 35x 3x 3x 3x 1x 3x 2x 1x 25x 3x | /**
* Validates workflow fields in an entity's fields array.
* Each workflow field must have a startStateId that references an existing state.
*
* @param {Array} fields - The entity fields array from the request body
* @returns {{ valid: boolean, errorResponse?: object }} - valid=true or an API error response to return directly
*/
function validateWorkflowFields(fields) {
if (!Array.isArray(fields)) return { valid: true }
for (const field of fields) {
if (field.type !== 'workflow' || !field.workflow) continue
const { states = [], startStateId } = field.workflow
const fieldName = field.name || field.fieldId || 'unknown'
if (!startStateId) {
return {
valid: false,
errorResponse: {
statusCode: 400,
headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
body: JSON.stringify({
error: `Workflow field "${fieldName}" is missing a start state (startStateId). Please set a start state.`
})
}
}
}
const stateIds = states.map((s) => s.id)
if (!stateIds.includes(startStateId)) {
return {
valid: false,
errorResponse: {
statusCode: 400,
headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
body: JSON.stringify({
error: `Workflow field "${fieldName}" has an invalid startStateId "${startStateId}". It must reference an existing state.`
})
}
}
}
}
return { valid: true }
}
module.exports = { validateWorkflowFields }
|