RSV - Réserver sa table

En tant que client, je peux réserver une table pour une date en précisant mes restrictions alimentaires.

Le restaurant lunaire en question, propulsé par la TEAM (Terriens et Extraterrestres Amateurs de Manger) qui se recycle suite à son cuisant échec pour le Glow-4002, profitera à tous et offrira une sélection incroyable de nourriture. La TEAM est le vendeur et le client pour ce projet. Il ne faut pas oublier que ce moment de l’année est la saison haute pour la location et la réservation de tables de restauration compte tenu des événements de 2020.

Chaque réservation doit être créée à l’aide d’un seul appel, car le serveur ne pourrait pas recevoir autant de requêtes en même temps.

Pour l’activité d’ouverture, le grand Hoppening, le restaurant fonctionnera seulement du 20 juillet 2150 au 30 juillet 2150.

Restrictions Prix (CAD$)
Aucune 1000
Végétarienne +500
Végétalienne +1000
Allergie +0
Maladie +0

Conditions de succès

Condition Description
RSV 1 Chaque réservation se voit être attribuée un numéro unique.
RSV 2 Le code du vendeur doit être indiqué lors de l’achat.
RSV 3 Le prix de la réservation est retourné arrondi à 2 décimales. (3,328 => 3,33 et 3,324 => 3,32)
RSV 4 Il est possible de créer une réservation entre le 1er janvier 2150 à 00:00:00 GMT et le 16 juillet 2150 à 23:59:59 GMT inclusivement.
RSV 5 Il est possible de réserver une seule journée entre le 20 juillet 2150 à 00:00:00 GMT et le 30 juillet 2150 à 23:59:59 GMT inclusivement.
RSV 6 Plusieurs restrictions peuvent être données pour un même client.
RSV 7 Il est possible de réserver plusieurs tables et plusieurs clients en même temps.

Note: Il est possible de faire des réservations qui ne sont pas en ordre chronologique. Par exemple, faire une requête avec une date de commande du 24 juin 2150, puis ensuite une commande en date du 15 février 2150, etc. En fait, la date de réservation est modifiable par l’API et non pas générée par le serveur.

Note: Les temps sont donnés selon GMT.

Note: Si une même restriction est donnée plus qu’une fois pour un même client, l’API agit comme si elle avait été donnée une seule fois.

API

Création

Requête

POST /reservations

{
  "vendorCode": "TEAM"::string,
  "dinnerDate": "2150-07-21T15:23:20.142Z"::string,
  "from": {
    "country": {
        "code": "CA"::string,
        "fullname": "CANADA"::string,
        "currency": "CAD"::string,
    },
    "reservationDate": "2150-05-21T15:23:20.142Z"::string
  },
  "tables": [
    {
         "customers": [
            { "name": "John", "restrictions": [] },
            { "name": "Jane", "restrictions": ["vegetarian"] }
         ]
      },
      {
         "customers": [
            { "name": "Roger", "restrictions": ["allergies"] },
            { "name": "Rogette", "restrictions": ["vegetarian", "illness"] }
         ]
      },
      ...
  ]
}

Réponses

HTTP 201 Created

Headers

Location: /reservations/<reservationNumber::long>

HTTP 400 Bad Request

Si la date d’achat est en dehors de la période d’achat (1er janvier 2150 au 16 juillet 2150 inclusivement).

{
  "error": "INVALID_RESERVATION_DATE"::string,
  "description" : "Reservation date should be between January 1 2150 and July 16 2150"::string
} 

HTTP 400 Bad Request

Si la date du repas est en dehors du grand Hoppening (20 juillet 2150 au 30 juillet 2150 inclusivement).

{
  "error": "INVALID_DINNER_DATE"::string,
  "description" : "Dinner date should be between July 20 2150 and July 30 2150"::string
} 

HTTP 400 Bad request

Dans le cas où la liste de tables ou leurs clients sont vides, cette erreur est lancée.

{
  "error": "INVALID_RESERVATION_QUANTITY"::string,
  "description": "Reservations must include tables and customers"::string
} 

HTTP 400 Bad request

Si un champ est manquant et pour les autres erreurs (ex. restrictions qui est invalide, etc.)

{
  "error": "INVALID_FORMAT"::string,
  "description": "Invalid Format"::string
} 

Demande

Requête

GET /reservations/<reservationNumber::long>

Réponses

HTTP 200 Ok

{
    "reservationPrice": 0.00::float,
    "dinnerDate": "2150-07-21T15:23:20.142Z"::string,
    "customers": [
          { "name": "Luce", "restrictions": ["allergies"] }, ...
    ]
}

HTTP 404 Not found

Si la réservation n’existe pas.

{
  "error": "RESERVATION_NOT_FOUND"::string,
  "description": "Reservation with number XX not found"::string
} 

Précisions

Les restrictions alimentaires dans le cadre du Hoppening:

Français Hoppening
Végétarien vegetarian
Végétalien vegan
Allergies allergies
Maladies illness

02-09-2020:

  • Tous les champs doivent être remplis lors de la création. Par exemple, il ne peut pas y avoir une réservation sans table ou de tables sans client. Dans ce cas précis, l’API renvoie une erreur de format invalide. Le seul champ qui pourrait donc être une liste vide, c’est restrictions.
  • Objet de retour des clients corrigé
  • Un même client peut avoir plusieurs restrictions, il peut même toutes les avoir, malheureusement pour lui. Cependant, dans le cas où la requête envoie des doublons (exemple: deux fois vegan pour un même client), l’API fait en sorte que la restriction est considérée seulement une fois.
  • Lors d’un GET, le prix que je m’attends à recevoir est, pour le moment, en CAD.

07-09-2020

  • Ajout de l’erreur dans le cas d’une dinnerDate invalide.

15-09-2020

  • Correction d’un typo dans les restrictions alimentaires du Hoppening.