Search code examples
javascriptvalidationjoi

How can I ensure that an array of objects contains only one of a particular key with Joi?


I have something like:

  let moduleId

  moduleRackOutputs.forEach((output) => {
    if (!moduleId) {
      moduleId = output.moduleId
    } else if (output.moduleId !== moduleId) {
      errors.add([
        'The drawing contains more than one module type. Multiple module types are not yet supported by the PVsyst RPA.'
      ])
    }
  })

I want to convert this to a Joi schema. How would I accomplish this?

Thank you


Solution

  • This can be accomplished as follows:

    Joi.array()
        .items(
            Joi.object().keys({
                moduleId: Joi.string().required(),
                framingType: Joi.string().required()
            })
        )
        .unique((a, b) => a.moduleId !== b.moduleId)
        .message({
            'array.unique': 'The drawing contains more than one module type...'
        })
        .unique((a, b) => a.framingType !== b.framingType)
        .message({
            'array.unique': 'The drawing contains more than one framing type...'
        })