<file_sep>const { Router } = require('express');
const { check } = require('express-validator');
const { usersDelete, usersPost, usersGet, usersGetById, userPut, usersPutError } = require('../controller/users');
const { validarCampos, validarRol, existeEmail, existeIdUsuario } = require('../custom-middleware/validator-campos');

const router = Router();

router.get('/', usersGet);
router.get('/:id', [
    check('id', "No es un ID mongo Adecuado").isMongoId(),
    check('id').custom(existeIdUsuario),
    validarCampos
], usersGetById);

router.post('/', [
    check('nombre', "El nombre es Obligatorio !!!").notEmpty(),
    check('email', "El correo no es Valido!!!").isEmail(),
    check('password', "<PASSWORD>!!!").not<PASSWORD>(),
    check('rol').custom(validarRol),
    check('email').custom(existeEmail),
    //check('rol', "El rol es Obligatorio !!!").notEmpty(),
    validarCampos
], usersPost);

router.put('/:usuarioId', [
    check('usuarioId', "No es un ID mongo Adecuado").isMongoId(),
    check('usuarioId').custom(existeIdUsuario),
    // check('rol').custom(validarRol),
    validarCampos
], userPut);
router.delete('/:id', [
    check('id', "No es un ID mongo Adecuado").isMongoId(),
    check('id').custom(existeIdUsuario),
    validarCampos
], usersDelete);
router.put('*', usersPutError);


module.exports = router;<file_sep>const { response, request } = require('express');
const Usuario = require('../model/user');
const createCustomHash = require('../helpers/encrypt');


const usersGet = async(req = request, res = response) => {

    const { from = 0, limit = 3 } = req.query;



    const [usuarios, count] = await Promise.all([Usuario
        .find({ estado: true })
        .skip(Number(from))
        .limit(Number(limit)),
        Usuario.countDocuments({ estado: true })
    ]);

    /* const usuarios = await Usuario
         .find({ estado: true })
         .skip(Number(from))
         .limit(Number(limit));

     const count = await Usuario.countDocuments({ estado: true });*/
    /* res.json({
         VideoJuego: 'Contra',
         id,
         name,
         page
     });*/

    res.json({
        count,
        usuarios,
    });
};

const usersGetById = async(req = request, res = response) => {

    const { id } = req.params;

    const { password, nombre, rol, email, estado } = await Usuario.findById(id);

    res.json({
        usuario: {
            nombre,
            rol,
            email,
            estado,
            password
        },
    });
};

const usersPost = async(req, res = response) => {

    const { nombre, email, password, rol } = req.body;

    const usuario = new Usuario({ nombre, email, password, rol });
    // crypt the password 
    console.log('encriptando');
    usuario.password = createCustomHash(password);
    console.log('encriptado');
    await usuario.save();

    res.json({
        msj: 'Hello World POST 5',
        usuario
    });
};

const userPut = async(req = request, res = response) => {
    const { usuarioId } = req.params;
    const { password, google, email, estado, ...resto } = req.body;


    if (password) {
        resto.password = createCustomHash(password);
    }

    const usuario = await Usuario.findByIdAndUpdate(usuarioId, resto);


    res.json({
        msj: 'Hello World PUT 2',
        usuario
    });
};
const usersPutError = (req, res = response) => {

    const dirArray = __dirname.split("\\");
    const dirRoot = dirArray.splice(0, dirArray.length - 1).join('\\');
    res.sendFile(`${dirRoot}/public/error.html`);
    //res.send('Nada que ver ' + dirRoot);
};

const usersDelete = async(req, res = response) => {
    const { id } = req.params;

    const usuario = await Usuario.findByIdAndUpdate(id, { estado: false });
    const { nombre } = usuario;


    res.json({
        nombre
    });
};




module.exports = {
    usersGet,
    usersGetById,
    usersPost,
    usersDelete,
    userPut,
    usersPutError
};<file_sep>const { Schema, model } = require('mongoose');

const schemaRole = Schema({
    rol: {
        type: String,
        require: [true, "El rol "]
    }
});



module.exports = model('rol', schemaRole);
<file_sep>const { validationResult } = require('express-validator');
const Rol = require('../model/rol');
const Usuario = require('../model/user');

const validarCampos = (req, res, next) => {

    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(400).json(errors);
    }

    next();
};

const validarRol = async(rol = '') => {
    const existe = await Rol.findOne({ rol });
    if (!existe) {
        throw new Error('No existe rol: ' + rol);
    }
};

const existeEmail = async(email) => {
    const existeemail = await Usuario.findOne({ email });
    if (existeemail) {
        throw new Error("El correo ya esta registrado: " + email);
        //return res.status(400).json({ msg: "El correo ya esta registrado" });
    }
};

const existeIdUsuario = async(usuarioId) => {
    const usuarioBD = await Usuario.findById(usuarioId);
    if (!usuarioBD) {
        throw new Error("ID usuario no existe: " + usuarioId);
        //res.status(400).json({ error: "ID usuario no existe" });        
    }
};

module.exports = {
    validarCampos,
    validarRol,
    existeEmail,
    existeIdUsuario
};<file_sep>## Temas puntuales de la sección

### Aquí cubriremos varios temas como: 

- Definir los alcances de nuestro RESTServer CRUD
- Encriptación de contraseñas
- Validaciones personalizadas
- Creación de roles
- Conexiones con MLAB
- Despliegue de base de datos en la nube
- Conexión con Robo 3T con base de datos en la nube
- Configuración de variables de entorno
- Borrado de archivos
- Eliminado físico de la base de datos
- Eliminación por estado en un campo de la colección