# SAÉ S4.A02. : Web Backend

[TOC]


### Objectif:

Savoir réaliser et mettre en place une architecture REST.
Cette SAÉ ne met en oeuvre que les compétences REST.


## Base de données

La base de données est une base de données relationnelle. Elle est composée de 5 tables:
- **`ingredients`** : contient tout les ingrédients qui commposent les pizzas (id, name, price)
- **`pizzas`** : contient les pizzas (nom, pate, prixbase)
- **`pizzas_ingredients`** : contient les ingrédients qui composent les pizzas (nom, id) nom est le nom de la pizza et id est l'id de l'ingrédient 

- **`commandes`** : contient les commandes (id, nom, date)
- **`commande_detail`** : contient les pizzas commandées (id,  nom) id est l'id de la commande et nom est le nom de la pizza commandée 

## API Ingredients

### GET /ingredients

Renvoie la liste des ingrédients présents dans la base de données

```json
[
    {
        "id": 1,
        "name": "pomme de terre",
        "price": 1
    },
    {
        "id": 2,
        "name": "crème",
        "price": 2
    }
]
```
Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement


### GET /ingredients/{id}

Renvoie l'ingrédient correspondant à l'id passé en paramètre

```json
{
    "id": 1,
    "name": "pomme de terre",
    "price": 1
}
```

Status | Description
------------ | -------------
302 FOUND | La requête s'est effectuée correctement
404 NOT FOUND | L'ingrédient n'existe pas

### GET /ingredients/{id}/name

Renvoie le nom de l'ingrédient correspondant à l'id passé en paramètre

```json
{
    "name": "pomme de terre"
}
```
Status | Description
------------ | -------------
302 FOUND | La requête s'est effectuée correctement
404 NOT FOUND | L'ingrédient n'existe pas

### POST /ingredients

Ajoute un ingrédient à la base de données avec les informations passées en paramètre au format JSON.

Body:
```json
{   
    "id": 1,
    "name": "pomme de terre",
    "price": 1
}
```
et renvoie l'ingrédient ajouté

```json
{   
    "id": 1,
    "name": "pomme de terre",
    "price": 1
}
```
Status | Description
------------ | -------------
201 CREATED | La requête s'est effectuée correctement
409 CONFLICT | L'ingrédient existe déjà
500 INTERNAL SERVER ERROR | Erreur interne

### DELETE /ingredients/{id}

Supprime l'ingrédient correspondant à l'id passé en paramètre et ne renvoie rien


Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement
404 NOT FOUND| L'ingrédient n'existe pas

### PUT /ingredients

Modifie l'ingrédient avec les informations passées en paramètre au format JSON.

Body:
```json
{   
    "id": 1,
    "name": "truffe",
    "price": 10
}
```
et renvoie l'ingrédient modifié

```json
{   
    "id": 1,
    "name": "truffe",
    "price": 10
}
```
Status | Description
------------ | -------------
 200 OK | La requête s'est effectuée correctement
 404 NOT FOUND |L'ingrédient n'existe pas

### PATCH /ingredients/{id}

Modifie l'ingrédient correspondant à l'id passé en paramètre avec les informations passées en paramètre au format JSON.

Body:
```json
{   
    "price": 5.5
}
```
et renvoie l'ingrédient modifié

```json
{   
    "id": 1,
    "name": "pomme de terre",
    "price": 5.5
}
```
Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement
404  NOT FOUND |L'ingrédient n'existe pas
500 INTERNAL SERVER ERROR | Erreur interne

## API Pizzas

### GET /pizzas

Renvoie la liste des pizzas présentes dans la base de données

```json
[
    {
        "nom": "4 fromages",
        "pate": "fine",
        "prixbase": 10
    },
    {
        "nom": "reine",
        "pate": "fine",
        "prixbase": 12
    }
]
```
Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement

### GET /pizzas/{nom}

Renvoie la pizza correspondant au nom passé en paramètre et les ingrédients qui la composent

```json
{
    "nom": "4 fromages",
    "pate": "fine",
    "prixbase": 10,
    "ingredients": [
        {
            "id": 1,
            "name": "pomme de terre",
            "price": 1
        },
        {
            "id": 2,
            "name": "crème",
            "price": 2
        }
    ]
}
```
Status | Description
------------ | -------------
302 FOUND | La requête s'est effectuée correctement
404 NOT FOUND | La pizza n'existe pas

### GET /pizzas/{nom}/prixfinal

Renvoie le prix final de la pizza correspondant au nom passé en paramètre

```json
{
    13
}
```

Status | Description
------------ | -------------
302 FOUND | La requête s'est effectuée correctement
404 NOT FOUND | La pizza n'existe pas

### POST /pizzas

Ajoute une pizza à la base de données avec les informations passées en paramètre au format JSON

Body:
```json
{   
    "nom": "4 fromages",
    "pate": "fine",
    "prixbase": 10
    "ingredients": [
        {
            "id": 1,
        },
        {
            "id": 2,
            "name": "crème",
        }
    ]
}
```

et renvoie la pizza ajoutée

```json
{   
    "nom": "4 fromages",
    "pate": "fine",
    "prixbase": 10
    "ingredients": [
        {
            "id": 1,
            "name": "pomme de terre",
            "price": 1
        },
        {
            "id": 2,
            "name": "crème",
            "price": 2
        }
    ]
}
```
Status | Description
------------ | -------------
201 CREATED | La requête s'est effectuée correctement
409 CONFLICT | La pizza existe déjà
500 INTERNAL SERVER ERROR | Erreur interne

### DELETE /pizzas/{nom}

Supprime la pizza correspondant au nom passé en paramètre et ne renvoie rien

Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement
404 NOT FOUND | La pizza n'existe pas

### DELETE /pizzas/{nom}/{id}

Supprime la relation entre la pizza correspondant au nom passé en paramètre et l'ingrédient correspondant à l'id passé en paramètre et ne renvoie rien

Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement
404 NOT FOUND | La pizza ou l'ingrédient n'existe pas

### PUT /pizzas/{nom}

Modifie la pizza correspondant au nom passé en paramètre avec les informations passées en paramètre au format JSON

Body:
```json
{   
    "nom": "hawaienne",
    "pate": "fine",
    "prixbase": 10
    "ingredients": [
        {
            "id": 1,
        },
        {
            "id": 10,
            "name": "ananas",
        },
        {
            "id": 5,
            "name":" sauce tomate"
        }
    ]
}
```


Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement
404 NOT FOUND | La pizza n'existe pas
500 INTERNAL SERVER ERROR | Erreur interne

### PATCH /pizzas/{nom}

Modifie la pizza correspondant au nom passé en paramètre avec les informations passées en paramètre au format JSON. 

Body:
```json
{   
    "prixbase": 15
}
```
qui modifie le prix de la pizza correspondant au nom passé en paramètre et renvoie la pizza modifiée  et renvoie la pizza modifiée

```json
{   
    "nom": "4 fromages",
    "pate": "fine",
    "prixbase": 15
    "ingredients": [
        {
            "id": 1,
            "name": "pomme de terre",
            "price": 1
        },
        {
            "id": 2,
            "name": "crème",
            "price": 2
        }
    ]
}
```
ou 

Body:

```json
{   
    "ingredients": [
        {
            "id": 1,
        },
        {
            "id": 10,

        }
    ]
}
```
qui modifie les ingrédients de la pizza correspondant au nom passé en paramètre et renvoie la pizza modifiée

```json
{   
    "nom": "4 fromages",
    "pate": "fine",
    "prixbase": 10
    "ingredients": [
        {
            "id": 1,
            "name": "pomme de terre",
            "price": 1
        },
        {
            "id": 10,
            "name": "ananas",
            "price": 3
        }
    ]
}
```

Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement
404 NOT FOUND | La pizza n'existe pas
500 INTERNAL SERVER ERROR | Erreur interne

## API Commandes

### GET /commandes

Renvoie la liste des commandes présentes dans la base de données

```json
[
    {
        "id": 1,
        "nom": "commande1",
        "date": "2021-03-01"
    },
    {
        "id": 2,
        "nom": "commande2",
        "date": "2021-03-02"
    }
]
```

Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement

### GET /commandes/{id}

Renvoie la commande correspondant à l'id passé en paramètre et les pizzas commandées

```json
{
    "id": 1,
    "nom": "commande1",
    "date": "2024-03-01",
    "pizzas": [
        {
            "nom": "4 fromages",
            "pate": "fine",
            "prixbase": 10
            "ingredients": [
                {
                    "id": 1,
                    "name": "pomme de terre",
                    "price": 1
                },
                {
                    "id": 2,
                    "name": "crème",
                    "price": 2
                }
            ]
        },
        {
            "nom": "reine",
            "pate": "fine",
            "prixbase": 12
            "ingredients": [
                {
                    "id": 1,
                    "name": "pomme de terre",
                    "price": 1
                },
                {
                    "id": 2,
                    "name": "crème",
                    "price": 2
                }
            ]
        }
    ]
}
```

Status | Description
------------ | -------------
302 FOUND | La requête s'est effectuée correctement
404 NOT FOUND | La commande n'existe pas

### GET /commandes/{id}/prixfinal

Renvoie le prix final de la commande correspondant à l'id passé en paramètre

```json
{
    25
}
``` 

Status | Description
------------ | -------------
302 FOUND | La requête s'est effectuée correctement
404 NOT FOUND | La commande n'existe pas

### POST /commandes

Ajoute une commande à la base de données avec les informations passées en paramètre au format JSON

Body:
```json
{   
    "id": 1,
    "nom": "commande1",
    "date": "2024-03-01",
    "pizzas": [
        {
            "nom": "4 fromages",
        },
        {
            "nom": "reine",
        }
    ]
}
```

et renvoie la commande ajoutée

```json
{   
    "id": 1,
    "nom": "commande1",
    "date": "2024-03-01",
    "pizzas": [
        {
            "nom": "4 fromages",
            "pate": "fine",
            "prixbase": 10
            "ingredients": [
                {
                    "id": 1,
                    "name": "pomme de terre",
                    "price": 1
                },
                {
                    "id": 2,
                    "name": "crème",
                    "price": 2
                }
            ]
        },
        {
            "nom": "reine",
            "pate": "fine",
            "prixbase": 12
            "ingredients": [
                {
                    "id": 1,
                    "name": "pomme de terre",
                    "price": 1
                },
                {
                    "id": 2,
                    "name": "crème",
                    "price": 2
                }
            ]
        }
    ]
}
```

Status | Description
------------ | -------------
201 CREATED | La requête s'est effectuée correctement
409 CONFLICT | La commande existe déjà
500 INTERNAL SERVER ERROR | Erreur interne

### DELETE /commandes/{id}

Supprime la commande correspondant à l'id passé en paramètre et ne renvoie rien

Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement
404 NOT FOUND | La commande n'existe pas

### DELETE /commandes/{id}/{nom}

Supprime la relation entre la commande correspondant à l'id passé en paramètre et la pizza correspondant au nom passé en paramètre et ne renvoie rien

Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement
404 NOT FOUND | La commande ou la pizza n'existe pas

### PUT /commandes/{id}

Modifie la commande correspondant à l'id passé en paramètre avec les informations passées en paramètre au format JSON

Body:
```json
{   
    "id": 1,
    "nom": "commande1",
    "date": "2024-03-01",
    "pizzas": [
        {
            "nom": "4 fromages",
        },
        {
            "nom": "reine",
        }
    ]
}
```
et renvoie la commande modifiée

```json
{   
    "id": 1,
    "nom": "commande1",
    "date": "2024-03-01",
    "pizzas": [
        {
            "nom": "4 fromages",
            "pate": "fine",
            "prixbase": 10
            "ingredients": [
                {
                    "id": 1,
                    "name": "pomme de terre",
                    "price": 1
                },
                {
                    "id": 2,
                    "name": "crème",
                    "price": 2
                }
            ]
        },
        {
            "nom": "reine",
            "pate": "fine",
            "prixbase": 12
            "ingredients": [
                {
                    "id": 1,
                    "name": "pomme de terre",
                    "price": 1
                },
                {
                    "id": 2,
                    "name": "crème",
                    "price": 2
                }
            ]
        }
    ]
}
```

Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement
404 NOT FOUND | La commande n'existe pas
500 INTERNAL SERVER ERROR | Erreur interne

### PATCH /commandes/{id}

Modifie la commande correspondant à l'id passé en paramètre avec les informations passées en paramètre au format JSON

Body:
```json
{   
    "date": "2024-03-02"
    "pizzas": [
        {
            "nom": "4 fromages",
        }
    ]
}
```

et renvoie la commande modifiée

```json
{   
    "id": 1,
    "nom": "commande1",
    "date": "2024-03-02",
    "pizzas": [
        {
            "nom": "4 fromages",
            "pate": "fine",
            "prixbase": 10
            "ingredients": [
                {
                    "id": 1,
                    "name": "pomme de terre",
                    "price": 1
                },
                {
                    "id": 2,
                    "name": "crème",
                    "price": 2
                }
            ]
        }
    ]
}
```

Status | Description
------------ | -------------
200 OK | La requête s'est effectuée correctement
404 NOT FOUND | La commande n'existe pas
500 INTERNAL SERVER ERROR | Erreur interne


## Restrictions d'accès

La partie restriction d'accès n'est pas implémentée par manque de temps.


## Bruno

Bruno est organisé de façon à pouvoir lancer le runnner de l'application sans avoir d'erreur.

- Ingredients
- ingredientsFail
- Pizzas
- PizzasFail
- Commandes
- CommandesFail