You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

47 lines
1.1 KiB

  1. const Joi = require('joi');
  2. const constants = require('../constants');
  3. const { NAME_MIN, NAME_MAX, PASSWORD_MAX, PASSWORD_MIN } = constants;
  4. const schema = Joi.object().keys({
  5. name: Joi.string()
  6. .min(NAME_MIN)
  7. .max(NAME_MAX)
  8. .required(),
  9. password: Joi.string()
  10. .min(PASSWORD_MIN)
  11. .max(PASSWORD_MAX),
  12. username: Joi.string().email({ minDomainAtoms: 2 }),
  13. });
  14. async function validateRegisterPayload(req, res, next) {
  15. let payloadValidation;
  16. try {
  17. payloadValidation = await Joi.validate(req.body, schema, { abortEarly: false });
  18. } catch (validateRegisterError) {
  19. payloadValidation = validateRegisterError;
  20. }
  21. const { details } = payloadValidation;
  22. let errors;
  23. if (details) {
  24. errors = {};
  25. details.forEach(errorDetail => {
  26. const {
  27. path: [key],
  28. type,
  29. } = errorDetail;
  30. const errorType = type.split('.')[1];
  31. errors[key] = constants[`${key.toUpperCase()}_${errorType.toUpperCase()}_ERROR`];
  32. });
  33. }
  34. if (errors) {
  35. req.session.messages = { errors };
  36. return res.status(400).redirect('/register');
  37. }
  38. return next();
  39. }
  40. module.exports = validateRegisterPayload;