> For the complete documentation index, see [llms.txt](https://medellin-js.gitbook.io/workshop-fullstack-js-developer/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://medellin-js.gitbook.io/workshop-fullstack-js-developer/backend/mongoose-js/metodos.md).

# Métodos

Los controladores de las rutas de nuestra API los vamos a crear en un archivo `product.controller.js` en el mismo definiremos los métodos de nuestros modelos que vamos a utilizar para la funcionalidad de carrito de compras, con el siguiente código.

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

```javascript
/**
 * Using Rails-like standard naming convention for endpoints.
 * GET     /api/products           ->  index
 * GET     /api/products/:id       ->  show
 * POSG    /api/products           ->  create
 */
 
const Product = require('./product.model');

// Gets a list of products
function index(req, res) {
  return Product.find().exec()
    .then(respondWithResult(res))
    .catch(handleError(res));
}

// Create product
function create(req, res) {
  return Product.create(req.body)
    .then(respondWithResult(res, 201))
    .catch(handleError(res));
}

// Gets a single product from the DB
function show(req, res) {
  return Product.findById(req.params.id).exec()
    .then(handleEntityNotFound(res))
    .then(respondWithResult(res))
    .catch(handleError(res));
}

module.exports = {
  create,
  show,
  index,
};

```

{% endcode %}

De esta manera tan sencilla, al llamar a la función `index` se envia como respuesta toda la colección de `products` almacenada y en formato [JSON](http://www.json.org/). Si queremos que sólo nos devuelva un registro con un identificador único, llamamos en este caso a la función `show.`

Por ultimo para crear un nuevo objeto `producto` siguiendo el patrón del modelo, recogiendo los valores del cuerpo de la petición, lo salvamos en la base de datos con la función `create`.

Vamos agregar tres funciones a este archivo que nos dará mejor legibilidad en el código al momento de responder a las promesas.&#x20;

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

```javascript
function respondWithResult(res, code) {
  const statusCode = code || 200;
  return (entity) => {
    if (entity) {
      res.status(statusCode).json(entity);
    }
  };
}

function handleEntityNotFound(res) {
  return (entity) => {
    if (!entity) {
      res.status(404).end();
      return null;
    }
    return entity;
  };
}

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

{% endcode %}

### Repositorio: [Add the Product's controller](https://github.com/colombia-dev/medjs-workshop-fullstack-js-backend/commit/56a222d1faa16ce601de05aacdaed9bd8f73011c)
