# API users

Como ya tenemos el modelo **User**, vamos a crear el endpoint `/users` para poder consultar, crear, eliminar y actualizar un usuario.

### Controlador

En la carpeta `api/user` creamos el archivo `user.controller.js` que va a tener todos los métodos que necesitemos, en este punto solo vamos a usar el de crear usuario.

{% code title="api/user/user.controller.js" %}

```javascript
const jwt = require('jsonwebtoken');

const User = require('./user.model');
const config = require('../../config/environment');

function validationError(res, statusCode) {
  const statusCodeLocal = statusCode || 422;
  return err => res.status(statusCodeLocal).json(err);
}

function handleError(res, statusCode) {
  const statusCodeLocal = statusCode || 500;
  return err => res.status(statusCodeLocal).send(err);
}

/**
 * Get list of users
 * restriction: 'admin'
 */
function index(req, res) {
  return User.find({}, '-salt -password').exec()
    .then(users => res.status(200).json(users))
    .catch(handleError(res));
}

/**
 * Creates a new user
 */
function create(req, res) {
  const newUser = new User(req.body);
  newUser.provider = 'local';
  newUser.role = 'user';

  return newUser.save()
    .then((user) => {
      const token = jwt.sign(
        { _id: user._id },
        config.secrets.session,
        { expiresIn: 60 * 60 * 5 },
      );
      res.json({ token });
    })
    .catch(validationError(res));
}

module.exports = {
  index,
  create,
};

```

{% endcode %}

Ahora necesitamos una ruta para consumir estos métodos, vamos a crearlos.

### Rutas

En la misma carpeta crearemos el archivo `index.js` con el siguiente código:

{% code title="api/user/index.js" %}

```javascript
/**
 * User
 * @author: Cristian Moreno Zuluaga <khriztianmoreno@gmail.com>
 */

const { Router } = require('express');
const controller = require('./user.controller');

const router = new Router();

router.post('/', controller.create);

module.exports = router;
```

{% endcode %}

La idea es llegar a tener en este archivo todas estas rutas:

| Route                  | HTTP Verb | Route Middleware   | Description                          |
| ---------------------- | --------- | ------------------ | ------------------------------------ |
| /api/users             | GET       | `isAuthenticated`  | Get list of users                    |
| /api/users             | POST      |                    | Creates a new user                   |
| /api/users/:id         | GET       | `isAuthenticated`  | Get a single user                    |
| /api/users/:id         | DELETE    | `hasRole('admin')` | Deletes a user, restriction: 'admin' |
| /api/users/me          | GET       | `isAuthenticated`  | Get my info                          |
| /api/users:id/password | PUT       | `isAuthenticated`  | Change a users password              |

Solo nos falta registrar nuestro endpoint en el archivo de rutas `rotues.js`

{% code title="routes.js" %}

```javascript
/**
 * Main application routes
 * @author: Cristian Moreno Zuluaga <khriztianmoreno@gmail.com>
 */

// Import Endpoints
const helloWorld = require('./api/helloworld');
const product = require('./api/product');
// New line
const user = require('./api/user');

module.exports = (app) => {
  app.use('/api/helloworld', helloWorld);
  app.use('/api/products', product);
  // New line
  app.use('/api/users', user);
};
```

{% endcode %}

Podemos crear un usuario accediendo por postman a la siguiente url:  `/api/users`

![Create new user](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-Lgyno4NC7rhy49BAEjN%2F-LhGvGk-xNnF2C9qksb5%2F-LhH4ZVOyt2p6U08g87T%2FScreen%20Shot%202019-06-13%20at%201.24.28%20PM.png?alt=media\&token=6b9bb849-8b0f-48f2-8d0a-bb3cc0aa2b29)

### Repositorio: [Add the Users's route](https://github.com/colombia-dev/medjs-workshop-fullstack-js-backend/commit/0f16e6f74bcabd0d98aebcf63a58f0d2e92039cb)
