interview-v2/README.md

145 lines
4.0 KiB
Markdown
Raw Normal View History

2018-08-19 14:07:32 +00:00
# interview-v2
2018-08-30 09:26:03 +00:00
Simple REST API application based on Expressjs to fetch blog posts and users from an external API with custom endpoint and response.
2018-08-30 09:15:19 +00:00
### Installation (docker)
~~~
$ git clone
$ cd interview-v2/
$ docker-compose build
~~~
2018-08-19 17:01:20 +00:00
### Installation
2018-08-30 09:15:19 +00:00
~~~
$ npm install
~~~
2018-08-19 17:01:20 +00:00
### Usage
2018-08-30 09:15:19 +00:00
Launch server
~~~
$ node index.js
~~~
Launch application with Docker
~~~
$ docker-compose up -d
~~~
2018-08-19 17:01:20 +00:00
### API endpoints
2018-08-30 09:15:19 +00:00
| Method / Route | Resource | Description |
| --------------------- | ------------------ | ------------ |
| `GET` /posts | Posts,Users | Fetch posts and their users |
The `/posts` route can receive extra parameters :
| Parameter | Values/type | Description |
| --------------------- | ------------------ | ------------ |
| user_pos | eq,cancer,cap,arctic,antarctic | Search posts by user position |
2018-08-30 09:40:28 +00:00
| user | *int* | Search posts of a single user using user id |
2018-08-30 09:15:19 +00:00
2018-08-30 09:26:03 +00:00
A bad value will result in an error.
2018-08-19 17:01:20 +00:00
### Response
2018-08-30 09:15:19 +00:00
The response follows the [Google JSON guide](https://google.github.io/styleguide/jsoncstyleguide.xml).
**Success response return data**
2018-08-19 17:01:20 +00:00
```json
2018-08-30 09:15:19 +00:00
{
"data": [
{
"id": 1001,
"name": "Wing"
2018-08-19 17:01:20 +00:00
}
2018-08-30 09:15:19 +00:00
]
}
```
**Error response return error**
```json
{
"error": {
"code": 404,
"message": "ID not found"
2018-08-19 17:01:20 +00:00
}
2018-08-30 09:15:19 +00:00
}
2018-08-19 17:01:20 +00:00
```
2018-08-30 09:15:19 +00:00
Here is an example response for `/posts` :
```json
{
"data": [
{
"id": 1,
"title": "<h1>sunt aut facere repellat provident occaecati excepturi optio reprehenderit</h1>",
"body": "<p>quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto</p>",
"user": {
"id": 1,
"firstname": "Raphael",
"lastname": "Cerveaux",
"email": "raphael@crvx.fr",
"comments_count": 3,
"pos": {
"lat": "-37.3159",
"lng": "81.1496"
}
}
}
]
}
```
### Architecture
The application fetch resources from an external REST API and formats the response for the end user.
![](https://i.imgur.com/vRJhQMP.png)
2018-08-30 09:26:03 +00:00
The Docker configuration is composed of 2 layers. It uses a node image to launch the app with Nginx.
2018-08-30 09:15:19 +00:00
2018-08-19 17:01:20 +00:00
-----
2018-08-19 14:07:32 +00:00
## Exercice
### Objectif
Créer une route d'API spécifique basée sur une API tierce.
### Sources
2018-08-19 17:01:20 +00:00
API externe : https://jsonplaceholder.typicode.com
2018-08-19 14:07:32 +00:00
### Un paramètre spécifique
Je dois être en mesure de récupérer des posts selon une position géographie.
Exemple : https://monapi.io/posts?pos=eq
Avec un URL de ce type, je devrais être en mesure de récupérer uniquement les posts ayant un créateur localisé au niveau de l'équateur.
Liberté totale sur la nomenclature et sur l'organisation de ce paramètre dans l'url (argument, post, get).
## Rappels
La latitude sert à déterminer où se situe un point sur le globe par rapport l'équateur. On part de l'équateur pour aller vers un des deux pôles afin de se positionner (de bas en haut et de haut en bas). On parle de latitude sud dans l'hémisphère sud, et de latitude nord dans l'hémisphère nord. La valeur de la prise entre 0 et 90 degrés.
2018-08-19 17:01:20 +00:00
#### Les 5 latitudes remarquables sont
- La latitude 0 ou équateur (latitude 0°)
- Le tropique du cancer (latitude 23° 27' nord)
- Le tropique du capricorne (latitude 23° 27' sud)
- Le cercle polaire arctique (latitude 66° 33' nord)
- Le cercle polaire antarctique (latitude 66° 33' sud)
2018-08-30 09:26:03 +00:00
-----
## Retours sur le test
2018-08-30 12:13:28 +00:00
Le test n'était pas très difficile. J'ai essayé de réflechir le plus loin possible pour ne pas produire quelque chose de simplement fonctionnel. J'ai donc documenté le projet et réflechis à l'architecture technique et les standards que j'allais utiliser. La principale difficulté était de mettre en place l'architecture du code sous nodejs pour qu'il soit flexible. Étant donné que je n'ai que très peu pratiqué sur cette techno, il fallait que j'apprenne rapidement la syntaxe de l'orienté objet en js.