Skip to content

Analyse technique apidb

Patson edited this page Mar 26, 2022 · 21 revisions

API

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

Point de terminaison pour les voitures

1. Recupérer toutes les voitures

  • Description

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

Frontend (@Axios)

Axios.get("http://localhost:3001/api/cars")
  .then((res)=>{
   console.log(res)
}).catch((err)=>{
   console.err(err)
})
   curl \
  http://localhost:3001/api/cars/ \

Réponse

Status: 200 OK
{
    "name" : "Audi RS3",
    "price" : 500,
    "brand": "Mercedes",
    "model": "Class A",
    "color": "Gray",
    "doors": 4,
    "boot_size": 150,
    "type": "suv",
    "energy": "essence",
    "is_automatic": true,
    "passengers": 5,
    "air_conditioning" : true,
    "description" : "exemple de description de voiture"
}

Ressource introuvable

Status: 404 Not Found

2. Récupérer des voitures sur base de la plage horaire

  • Description

Tous les utilisateurs inscris ou non inscris pourront filter les voitures sur base de la plage horaire de location.

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-slot
Name Type Dans Description
accept application/json headers
startDate date body date de début de réservation
startHours date body Heure de début de réservation
endDate date body date de fin de réservation
endHours date body Heure de fin de réservation

Frontend (@Axios)

Axios.get("https://localhost:3001/api/cars-slot",
 {
  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-slot/ \
  -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

3. Recupérer des voitures sur base de la marque et du modèle

  • Description

Tous les utilisateurs inscris ou non inscris pourront filtrer les voitures sur base de la marque et du modèle de la voiture.

Le point de terminaison suivant déclenche une requête allant filtrer les voitures dans la DB sur base des critères reçus il sera utilisé lors dans la page /cars lorsque seul la marque et le modèle ont été ajuster par l'utilisateur au niveau du pannel des filtres dans la page /cars.

Get /api/cars-brand
Name Type Dans Description
accept application/json headers
brand string body Marque entré pas le user
model string body Modèle en fonction de la marque

Frontend (@Axios)

Axios.get("http://localhost:3001/api/cars-brand",
 {
   brand : "Mercedes", 
   model : "Classe A"
 },
 {
    headers : {
    "Content-Type": 'Application/json'
    }
}).then((res)=>{
   console.log(res)
}).catch((err)=>{
   console.err(err)
})
 curl \
  -X GET \
  -H "Accept: application/json" \
  http://localhost:3001/api/cars-brand/ \
  -d '{brand : "Mercedes" , model: "Classe A"}'

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

4. Recupérer des voitures sur base de la plage horaire, de la marque et du modèle

  • Description

Tous les utilisateurs inscris ou non inscris pourront filtrer les voitures sur base de la plage horaire de location en plus de la marque et du modèle.

Le point de terminaison suivant déclenche une requête filtrant les voitures dans la DB sur base des critères entré par l'utilisateur il sera utilisé lors du clique sur le bouton de filtre dans la page /cars (L'utilisateur ayant ajusté la marque, le modèle et la plage de location).

Get /api/cars-slot-brand
Name Type Dans Description
accept application/json headers
startDate date body date de début de réservation
startHours date body Heure de début de réservation
endDate date body date de fin de réservation
endHours date body Heure de fin de réservation
brand string body Marque entré pas le user
model string body Modèle en fonction de la marque

Frontend (@Axios)

Axios.get("http://localhost:3001/api/cars/getSlotBrandCars" , 
 {
  startDate : "2022-04-12", 
  startHours : "11:15",
  endDate : "2022-04-13", 
  endHours : "12:20",
  brand : "Mercedes", 
  model: "Classe A"
},
{
    headers : {
    "Content-Type": 'Application/json'
    }
}).then((res)=>{
   console.log(res)
}).catch((err)=>{
   console.err(err)
})
 curl \
  -X GET \
  -H "Accept: application/json" \
  http://localhost:3001/api/cars-brand/ \
  -d '{startDate : "2022-04-12" , startHours : "11:15", endDate : "2022-04-13" , endHours : "12:20" ,brand : "Mercedes" , model: "Classe A"}'

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

4. Ajouter une voiture

  • Description

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/car
  • Paramètres

Name Type Dans Description
accept string headers Le type de contenu qu'accepte la requête Application/json
name string query Nom descriptif du véhicule
price float query obligatoire Prix de location par jour
brand string query obligatoire Marque du véhicule
model string query obligatoire Modèle du véhicule
color string query obligatoire Coloration du véhicule
doors integer query obligatoire Nombre de porte du véhicule
boot_size integer query obligatoire La taille du coffre de la voiture en kg
type string query obligatoire Ex : SUV, Electrique , etc..
energy string query obligatoire Le type d'energie que consomme le vehicule (Essence, diesel, ...)
is_automatic boolean query obligatoire Permet de spécifier si la voiture est automatique ou manuel
passengers integer query obligatoire Nombre de passager que peut supporter le véhicule
air_conditionning boolean query obligatoire Spécifie si le véhicule est doté d'une air conditionné
description string query Texte permettant de décrire brievement le véhicule a rajouter

Frontend

axios.post('http://localhost/api/car', 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/car/ \
  -d data

Réponse

Status: 200 OK
{
    "id" : 5
}

Ressource introuvable

Status: 404 Not Found

5. Ajouter des images de véhicule

  • Description

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/car-images/
  • Paramètres

Name Type Dans Description
accept string headers Le type de contenu qu'accepte la requête multipart/form-Data
name array query Nom descriptif du véhicule
id number query Identifiant le la voiture

Frontend

axios.post('/api/car-images', 
{
  id :4 , 
  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/car-images/ \
  -d  '{id :4 , 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

6. Mise à jour d'une voiture dans la base de données

PUT /api/cars/
  • Paramètres

Name Type Dans Description
accept application/json headers

Frontend

Axios.put("https://localhost:3001/api/cars").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

Base de données : PostgreSQL

  1. Justification du choix
  • 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 :

Descriptif des relations dans la base de données:

Relation admin-customers:

  • 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.

Relation customers-orders:

  • 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.

Relation orders-cars:

  • 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.

Relation cars-images:

  • 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.

Relation cars-cars_brands:

  • 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.
  1. Diagrammes

[Schémas EA / Relationnel de la DB] [Texte expliquant les diagrammes et justifiant les choix de conception]

Clone this wiki locally