2019-11-21 16:39:42 +01:00
# Custom data response
2019-11-26 11:24:29 +01:00
In this guide we will see how you can customize your API's response..
2019-11-21 16:39:42 +01:00
## Introduction
To be able to update the default data response you have first to understand how it works.
2019-11-26 11:18:39 +01:00
When you create a content type, it generates an API with the following list of [endpoints ](../content-api/endpoint ).
2019-11-21 16:39:42 +01:00
2019-11-26 11:18:39 +01:00
Each of these endpoint triggers a controller action. Here is the list of [controller actions ](../concepts/controller.md ) that exist by default when a content type is created.
2019-11-21 16:39:42 +01:00
2019-11-26 11:21:19 +01:00
If you check the controller file of your generated API `./api/{content-type}/controller/{Content-Type}.js` , you will see an empty file. It is because all the default logic is managed by Strapi. But you can override these actions with your own code.
2019-11-21 16:39:42 +01:00
And that is what we will do to manage our custom data response.
## Example
2019-11-26 11:18:39 +01:00
In our example we will use a restaurant type with a chef.. By default when you fetch restaurants, you will got all information of the chef.
Let's consider you don't want to expose the chef's email for privacy reasons.
2019-11-21 16:39:42 +01:00
2019-11-26 11:18:39 +01:00
To enforce this rule we will customize the action that fetchs all restaurants and remove the email from the returned data.
2019-11-21 16:39:42 +01:00
2019-11-26 11:18:39 +01:00
To follow the example your will have to create a content type `restaurant` and add the following field definition:
2019-11-21 16:39:42 +01:00
- `string` attribute named `name`
- `text` attribute named `description`
- `relation` attribute **Restaurant** (`chef` ) - **User** has many **Restaurants** - **Users** (`restaurants` )
Then add some data.
## Override controller action
To customize the function that fetch all our restaurants we will have to override the `find` function.
First, to see the difference, let's request `GET /restaurants` . You will see all the data you created.
Now let's start the customization.
**Path —** `./api/restaurant/controller/Restaurant.js`
```js
module.exports = {
async find() {
return 'strapi';
},
};
```
After saving the new function, let's restart the `GET /restaurants` request. We will see `strapi` as response.
## Get the data back
We now know the function we have to update, but we just want to customize the returned restaurant values.
2019-11-25 19:16:42 +01:00
In the [controller documentation ](../concepts/controllers.html#extending-a-model-controller ) you will find the default implementation of every actions. It will help you overwrite the fetch logic.
2019-11-21 16:39:42 +01:00
**Path —** `./api/restaurant/controller/Restaurant.js`
```js
const { sanitizeEntity } = require('strapi-utils');
module.exports = {
async find(ctx) {
let entities;
if (ctx.query._q) {
entities = await strapi.services.restaurant.search(ctx.query);
} else {
entities = await strapi.services.restaurant.find(ctx.query);
}
return entities.map(entity =>
sanitizeEntity(entity, { model: strapi.models.restaurant })
);
},
};
```
And now the data is back on `GET /restaurants`
## Apply our changes
2019-11-25 19:16:42 +01:00
We can see the `find` function returns the result of the `map` . And the map function just sanitizes all entries.
2019-11-21 16:39:42 +01:00
So instead of just return the sanitized entry, we will also remove the chef email of each restaurant.
**Path —** `./api/restaurant/controller/Restaurant.js`
```js
const { sanitizeEntity } = require('strapi-utils');
module.exports = {
async find(ctx) {
let entities;
if (ctx.query._q) {
entities = await strapi.services.restaurant.search(ctx.query);
} else {
entities = await strapi.services.restaurant.find(ctx.query);
}
return entities.map(entity => {
const restaurant = sanitizeEntity(entity, {
model: strapi.models.restaurant,
});
if (restaurant.chef & & restaurant.chef.email) {
delete restaurant.chef.email;
}
return restaurant;
});
},
};
```
And tada! The email disapeared.
::: tip
This guide can be applied to any other controller action.
:::