@truepic/queryql
Version:
Easily add filtering, sorting, and pagination to your REST API through your old friend: the query string!
83 lines (61 loc) • 1.53 kB
JavaScript
const Joi = require('joi')
const BaseValidator = require('./base')
const joiValidationErrorConverter = require('../../services/joi_validation_error_converter')
class JoiValidator extends BaseValidator {
constructor(defineSchema) {
super(defineSchema)
if (this.schema) {
this.schema = Joi.object().keys(this.schema)
}
}
get defineSchemaArgs() {
return [Joi]
}
buildError(error, key) {
return joiValidationErrorConverter(error, key)
}
validateValue(key, value) {
let keySchema
try {
keySchema = this.schema && this.schema.extract(key)
} catch {
// Don't throw error if key doesn't exist.
}
if (!keySchema) {
return value
}
const { value: valueValidated, error } = keySchema.validate(value)
if (error) {
throw this.buildError(error, key)
}
return valueValidated
}
validateFilters(filters) {
if (!this.schema) {
return filters
}
for (const [key, filter] of filters) {
filter.value = this.validateValue(key, filter.value)
}
return filters
}
validateSorts(sorts) {
if (!this.schema) {
return sorts
}
for (const [key, sort] of sorts) {
sort.order = this.validateValue(key, sort.order)
}
return sorts
}
validatePage(page) {
if (!this.schema) {
return page
}
for (const [key, pageField] of page) {
pageField.value = this.validateValue(key, pageField.value)
}
return page
}
}
module.exports = JoiValidator