Skip to content
This repository has been archived by the owner on Feb 21, 2018. It is now read-only.

wearereasonablepeople/generic-joi-validator

Repository files navigation

Generic-joi-validator Logo

Deprecated

This package is no longer maintained.

Generic Joi Validator

Build Status codecov dependencies Status devDependencies Status

Installation

npm install generic-joi-validator

Description

This package facilitates managing multiple Joi structures and running validation on them.

Current translators

mongoose-to-joi-translator

More are coming soon. Got a new translator? Create an issue and I'll include it.

Usage

Requiring methods from the package.

const { schemata, prepare } = require('generic-joi-validator');

Add domain models to your schemata object. You may use your mongoose database models directly with mongoose-to-joi-translator.

const getJoiSchema = require('mongoose-to-joi-translator');
schemata.stores = getJoiSchema(new Schema({
    name: {
        type: String,
        required: true
    },
    location: new Schema({
        latitude: {
            type: String,
            required: true
        },
        longitude: {
            type: String,
            required: true
        }
    })
}));

Add your schema manually

schemata.stores = {
    name: Joi.string().required(),
    location: {
        latitude: Joi.string().required(),
        longitude: Joi.string().required()
    }
};

Other domain models may also be included Examples:

  • schemata.storesQuery to contain what is queryable in stores and validates user input based on it.
  • schemata.pagination to contain the pagination structure.
schemata.pagination = {
    skip: Joi.number().optional().default(defaultSkip),
    limit: Joi.number().optional().default(defaultLimit)
};

An example of how to use this package with Koa

Create middleware

// You may also create middlewares for getQuery input, getPagination input, etc.

/**
* Koa-specific Wrapper for the prepare function, looks for data in the body, params, and query
* of ctx.request and assign the validated data to ctx.state.data
* @param {String} [params] list of strings in space-separated value format, example 'word location.latitude location.longitude'.
* By default it will check all properties found in the specified joi structure.
* @param {Boolean} [areOptional] specifies whether the attributes are optional
* (overrides required check) useful for partial update validation
*/
const koaValidator = (params, areOptional) => (ctx, next) => {
    // takes foo from '/foo/something/another'
    const resourceName = ctx.url.replace(/^\/([^/]*).*$/, '$1');
    // source the object the validator will look through
    const source = {
        ...ctx.request.body,
        ...ctx.params,
        ...ctx.request.query
    };
    const {error, value} = prepare(resourceName, source, params, areOptional);
    ctx.assert(!error, 400, {message: error ? error.message : error});
    ctx.state.data = {...ctx.state.data, ...value};
    return next();
};

Use in your routes

router.post(
    '/stores',
    koaValidator(),
    async (ctx, next) => {
        ctx.body = ctx.state.data;
        return next();
    }
);

Test

npm test

Documentation

Members

schemata

property that contains all schemata to check against, the property isJoi in each schema is reserved.

Functions

prepare(resourceName, sourceObject, [attributes], [areOptional])Object

validates the object based on the schema of the resource

schemata

property that contains all schemata to check against, the property isJoi in each schema is reserved.

Kind: global variable

prepare(resourceName, sourceObject, [attributes], [areOptional]) ⇒ Object

validates the object based on the schema of the resource

Kind: global function
Returns: Object - same as Joi.valdidate return value

Param Type Description
resourceName String resource name
sourceObject Object location of attributes to validate
[attributes] String list of attributes to be checked in space-separated value format, defaults to all.
[areOptional] Boolean specifies whether the attributes specified are optional

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published