-
Notifications
You must be signed in to change notification settings - Fork 2
Analyse technique apidb
L'API contient des points de terminaisons pour les utilisateurs et les voitures Les Points de terminaison suivant déclenchent des requêtes vers la base de données. Dans le cas d'un problème, L'API renvoie une erreur 400. Ci-dessus les différents points de terminaison
Cette API se base sur les principes de nommage et les conventions décrit dans cette article
Tous les utilisateurs inscris ou non inscris pourra visualiser la liste de toutes les voitures disponibles dans la base de données.
Le point de terminaison suivant déclenche une requête allant chercher toutes les voitures dans la DB et sera utilisé lors du chargement de la page /cars.
Get /api/cars
| Name | Type | Dans | Description |
|---|---|---|---|
accept |
string | headers | Application/json |
startDate |
date | query | Date de début de location d'une voiture, Permet à l'utilisateur de visualiser les véhicules disponible à partir de cette date |
startHours |
date | query | Heure de début de location d'une voiture. Permet à l'utilisateur de mentionner l'heure à partir de laquelle il souhaite réserver la voiture |
endDate |
date | query | Date de fin de location d'une voiture. Permet à l'utilisateur de visualiser les véhicules disponible jusqu'à cette date |
endHours |
date | query | Heure de fin de location d'une voiture; Permet à l'utilisateur de mentionner l'heure à partir de laquelle il souhaite rendre la voiture |
brand |
string | query | Marque entré par l'utilisateur lors du filtre |
model |
string | query | Modèle entré par l'utilisateur lors du filtre |
Frontend (@Axios)
Axios.get("https://localhost:3001/api/cars",
{
params:{
startDate : "2022-04-12",
startHours : "11:15",
endDate : "2022-04-13",
endHours : "12:20"
}},
{
headers : {
"Content-Type": 'Application/json'
}
}).then((res)=>{
console.log(res)
}).catch((err)=>{
console.err(err)
}) curl \
-H "Accept: application/json" \
http://localhost:3001/api/cars/ \
-d '{startDate : "2022-04-12" , startHours : "11:15", endDate : "2022-04-13" , endHours : "12:20"}'Réponse
Status: 200 OK
[
{
"id": 1,
"name": "test",
"price": 5,
"id_brand": 1,
"color": "Rouge",
"doors": 5,
"boot_size": 5,
"type": "SUV",
"energy": "Essence",
"is_automatic": true,
"passengers": 5,
"air_conditioning": true,
"description": "5",
"brand": "Mercedes",
"model": "Classe A"
},
{
"id": 2,
"name": "badass",
"price": 5,
"id_brand": 1,
"color": "Rouge",
"doors": 5,
"boot_size": 5,
"type": "SUV",
"energy": "Essence",
"is_automatic": true,
"passengers": 5,
"air_conditioning": true,
"description": "5",
"brand": "Mercedes",
"model": "Classe A"
},
]Ressource introuvable
Status: 404 Not Found
L'insertion des voitures n'est effectué que par l'administrateur du site
Le point de terminaison suivant déclenche une requête inserant une voiture dans la DB et sera utilisé lors du clique sur le bouton de soumission du formulaire d'insertion dans la la page /addCars visible que par l'administrateur.
POST /api/cars
| Name | Type | Dans | Description |
|---|---|---|---|
accept |
string | headers | Le type de contenu qu'accepte la requête Application/json |
name |
string | body | Nom descriptif du véhicule |
price |
float | body | obligatoire Prix de location par jour |
brand |
string | body | obligatoire Marque du véhicule |
model |
string | body | obligatoire Modèle du véhicule |
color |
string | body | obligatoire Coloration du véhicule |
doors |
integer | body | obligatoire Nombre de porte du véhicule |
boot_size |
integer | body | obligatoire La taille du coffre de la voiture en kg |
type |
string | body | obligatoire Ex : SUV, Electrique , etc.. |
energy |
string | body | obligatoire Le type d'energie que consomme le vehicule (Essence, diesel, ...) |
is_automatic |
boolean | body | obligatoire Permet de spécifier si la voiture est automatique ou manuel |
passengers |
integer | body | obligatoire Nombre de passager que peut supporter le véhicule |
air_conditionning |
boolean | body | obligatoire Spécifie si le véhicule est doté d'une air conditionné |
description |
string | body | Texte permettant de décrire brievement le véhicule a rajouter |
Frontend
axios.post('http://localhost/api/cars', data, {
headers : {
"Content-Type": multipart/form-data'
}
})
.then((response)=> {
console.log(response);
})
.catch((error)=> {
console.log(error);
}); curl \
-X POST \
-H "Accept: multipart/form-data" \
http://localhost:3001/api/cars/ \
-d dataRéponse
Status: 200 OK
{
"id" : 5
}Ressource introuvable
Status: 404 Not Found
L'insertion des images de véhicules n'est effectué que par l'administrateur du site
Le point de terminaison suivant déclenche une requête inserant des images de véhicules dans la table des images et sera utilisé lors du clique sur le bouton de soumission du formulaire d'insertion dans la la page /addCars visible que par l'administrateur.
POST /api/cars/{id}/images
| Name | Type | Dans | Description |
|---|---|---|---|
accept |
string | headers | Le type de contenu qu'accepte la requête multipart/form-Data |
id |
number | path | Identifiant de la voiture. Sert de référence pour les images de celle-ci |
name |
array | body | Les différents images du véhicules sous forme de tableau |
Frontend
axios.post('/api/cars/images',
{
name : ["http://localhost:3001/images/BMW.jpg1648290460097.jpg" ,
"http://localhost:3001/images/logo.png1648302520855.png"]
},
{
headers : {
"Content-Type":'application/json'
}
}).then((response)=> {
console.log(response);
}).catch((error)=> {
console.log(error);
}); curl \
-X POST \
-H "Accept: application/json" \
https://localhost:3001/api/cars/5/images \
-d '{ name : ["http://localhost:3001/images/BMW.jpg1648290460097.jpg" , "http://localhost:3001/images/logo.png1648302520855.png"]}'Réponse
Status: 200 OK
Ressource introuvable
Status: 404 Not Found
PUT /api/cars/:id
| Name | Type | Dans | Description |
|---|---|---|---|
accept |
application/json | headers | |
id |
number | params | Identifiant de la voiture qui va subir les changements |
Frontend
Axios.put("https://localhost:3001/api/cars/3").then((res)=>{
console.log(res)
}).catch((err)=>{
console.err(err)
}) curl \
-X PUT \
-H "Accept: application/json" \
https://localhost:3001/api/cars/ \Réponse
Lien vers la liste des endpoints documentés
-
Thunder Client Extension vscode permettant d'effectuer des requêtes vers des endpoints et de visualiser la réponse
-
Pour l'écriture des tests pour notre API nous utilisons Postman vous pouvez retrouver les liens vers l'API en suivant ce lien

- DB Relationnelle : Puisque les données doivent être ordonnées et structurées et que des relations doivent exister entre les différentes données, il est essentiel d’utiliser une base de données SQL afin de garantir l’organisation de ces dernières.
Ainsi nous avons dû choisir entre MySQL et PostgreSQL, ce sont les deux BDD relationnelles les plus utilisées, nous avons fini par choisir PostgreSQL pour les raisons suivantes:
- Type de données avancé : PostgreSQL supporte les types MySQL et ajoute des types plus avancés tels que JSON, Array, ... Alors que pour avoir une relation 1-N, on devrait normalement créer une table supplémentaire.
- Réplication : PostgreSQL permet d'avoir 2 ou plusieurs bases de données répliquées, pour avoir le Load-Balancing et la redondance.
- Performance en concurrence: PostgreSQL est optimisée pour les requêtes parallèles, notamment la lecture par index. Étant donné que sur une application web on aurait des connexions simultanées pour chaque utilisateur, cette optimisation est nécessaire.
- Légèreté & performance : une base de données légère convient plus à notre hébergement client et mutualisé. PostgreSQL est moins vorace que ses concurrents, tant pour la RAM que pour le CPU. Malgré sa faible consommation de RAM, il demeure très performant par rapport à MySQL. Source
- Odoo l'utilise ;)
PostgreSQL jouit d’une solide réputation en matière de fiabilité, de robustesse des fonctionnalités et des performances.
Schéma de notre base de données :

- Un administrateur est lié à un client, donc la relation admins-customers est de 1-1 car un administrateur DOIT posséder 1 et 1 seul id_client.
- Un client PEUT (n'est pas obligé) être administrateur donc la relation est de 0-1.
- Un client PEUT (n'est pas obligé) avoir plusieurs commandes à son id donc la relation Customers-Orders est de 0-n.
- Une commande ne correspond que a 1 et 1 seul client donc la relation Orders-Customers est de 1-1.
- Une commande correspond a 1 et 1 seule voiture donc la relation orders-cars est de 1-1.
- Une voiture n'est pas obligée d'être commandée mais elle peut l'être plusieurs fois, la relation cars-orders est donc de 0-n.
- Une voiture DOIT avoir 1 et 1 seule tableau d'images donc la relation Cars-Images est de 1-1.
- Un tableau de pathname (contient les chemins vers les images) correspond à 1 et 1 seule voiture donc la relation Images-Cars est de 1-1.
- Une voiture DOIT posséder une et une seule marque, la relation cars-cars_brands est donc de 1-1.
- Une marque n'est pas obligée d'être attribuéemais elle peut l'être plusieurs fois, la relation cars_brands-cars est donc de 0-n.
- Diagrammes
[Schémas EA / Relationnel de la DB] [Texte expliquant les diagrammes et justifiant les choix de conception]