andela/magma-backend

View on GitHub
src/utils/validationSchema.js

Summary

Maintainability
A
0 mins
Test Coverage
import Joi from '@hapi/joi';

const name = Joi.string().trim().required().regex(/^[A-Za-z]+$/)
  .min(3);

const firstName = name
  .label('firstname is required, must be alphabets only and have at least 3 characters');

const lastName = name
  .label('lastname is required, must be alphabets only and have at least 3 characters');

const email = Joi.string().trim().lowercase().email()
  .required()
  .label('email is required, and should follow this format: myemail@domain.com');

const password = Joi.string().required().regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.{8,})/)
  .label('password is required, must be at least 8 characters and must'
    + ' contain at least a number, one lowercase and one uppercase alphabet');

const required = Joi.string().trim().required();
const str = Joi.string().allow('');
const date = Joi.date().iso();

export default {
  signup: Joi.object().keys({
    firstName,
    lastName,
    email,
    password
  }),
  signin: Joi.object().keys({
    email,
    password: Joi.string().required().label('password is required')
  }),
  request: Joi.object().keys({
    origin: required.label('origin is required'),
    destination: required.label('destination is required'),
    type: required.valid('one-way', 'return')
      .label('type is required and can either be "one-way" or "return"'),
    departureDate: date.required()
      .label('departureDate is required and must follow this format: YYYY-MM-DD'),
    returnDate: date.when('type', {
      is: 'return', then: date.min(Joi.ref('departureDate')).required()
    })
      .concat(date.when('type', { is: 'one-way', then: date.allow('') }))
      .label('returnDate is required for a "return" trip,'
      + ' it cannot come before departureDate'
      + ' and must follow this format: YYYY-MM-DD'),
    reason: str.label('reason must be a string'),
    accommodation: str.label('accommodation must be a string')
  }),
  updatePassword: Joi.object().keys({
    password
  }),
};