All files / utils validateWorkflowFields.js

100% Statements 15/15
85.71% Branches 12/14
100% Functions 2/2
100% Lines 12/12

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 }