En tant que Terrien, je peux m’acheter une ou des passes afin d’assister au festival Glow-4002 sur la planète Ulavalogy. La TEAM (Terriens et Extraterrestres Amateurs de Musique) est responsable de la vente des passes. Il est possible d’acheter des passes du 1er janvier 2060 au 16 juillet 2060. Le festival a lieu du 17 juillet 2060 au 24 juillet 2060.

Il existe trois catégories de passes:

  • VIP
  • Premium
  • Standard

Chaque catégorie de passes est disponible selon deux options:

  • Forfait: qui donne accès à tous les jours du festival
  • Passe journalière: qui donne accès à une journée du festival

Tableau des prix

VIP Premium Standard
Forfait 700 000$ 500 000$ 250 000$
Passe journalière 150 000$ /passe 100 000$/passe sauf si quantité >=5 alors prix devient 90 000$/passe 50 000$/passe sauf si quantité > 3 alors rabais de 10% sur la commande totale

Conditions de succès

:warning: Attention! Dans le cadre du cours, le système démarre avec un et un seul festival de déjà configurées avec les dates données. Cependant, votre système devrait pouvoir facilement supporter un autre festival (dates différentes), et même éventuellement plusieurs festivals (même si cela demanderait des changements à l’API). Votre API doit être exactement celui décrit dans les stories pour l’instant, mais votre domaine et votre application ne devraient pas avoir à être modifié significativement -> ceci comptera dans l’évaluation de votre design.

Condition Description
COS 1 Chaque commande se voit attribuer un numéro unique.
COS 2 Chaque passe se voit attribuer un numéro unique.
COS 3 Le code du vendeur de passes doit être indiqué lors de l’achat. Pour l’instant, le code est toujours “TEAM”
COS 4 Le prix de la commande est retourné arrondi à 2 décimales. (3,328 => 3,33 et 3,324 => 3,32)
COS 5 Il est possible d’acheter des passes entre le 1er janvier 2060 à 00:00:00 GMT et le 16 juillet 2060 à 23:59:59 GMT inclusivement. (Attention au timezone GMT!)
COS 6 Les dates des événements doivent être entre le 17 juillet 2060 au 24 juillet 2060 inclusivement.
COS 7 L’attribut ‘eventDate’ doit être présent si l’option passe journalière est choisie. Il doit être null (ou non présent) si l’option forfait est choisie.
COS 8 L’attribut ‘eventDates’ dans la description de la commande (GET) doit contenir toutes les dates. Si c’est une passe journalière, il n’y a qu’une seule date. Dans le cas d’un forfait, c’est toutes les dates du festival (les énumérer), recalculé à chaque fois au cas où les dates du festival changent

Note: Il est possible de faire des commandes qui ne sont pas en ordre chronologique. Par exemple, faire une requête avec une date de commande du 24 juin 2060, puis ensuite une commande en date du 15 février 2060, etc.

Note 2 : On assume que l’on peut acheter pour un ami dans une même commande, donc on supporte d’acheter plusieurs passes journalières pour une même date, ou de mélanger des passes journalières et des forfaits.

:warning: Attention aux typos ex. eventDate et eventDates

API

Requête: Création d’une commande

POST /orders

{
  "orderDate": "2060-05-21T15:23:20.142Z"::string(datetime),
  "vendorCode": "TEAM"::string,
  "passes": [
              {
                "passCategory": "Standard"::string(VIP | Premium | Standard),
                "passOption": "passe_journaliere"::string(forfait | passe_journaliere),
                "eventDate": "2060-07-17":string(date)
              },
              {
                "passCategory": "Premium"::string(VIP | Premium | Standard),
                "passOption": "passe_journaliere"::string(forfait | passe_journaliere),
                "eventDate": "2060-07-18":string(date)
              },
              {
                "passCategory": "VIP"::string(VIP | Premium | Standard),
                "passOption": "forfait"::string(forfait | passe_journaliere),
                "eventDate": null # null ou non présent, doit supporté les 2
              },
              ...
            ]
}

Réponses

HTTP 201 Created

Headers

Location: /orders/<orderNumber::long>

HTTP 400 Bad Request

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

{
  "error": "INVALID_ORDER_DATE"::string,
  "description" : "order date should be between January 1 2060 and July 16 2060"::string
} 

HTTP 400 Bad Request

Si une date (dans eventDate) pour laquelle on veut acheter une passe est en dehors de la durée du festival (17 juillet 2060 au 24 juillet 2060 inclusivement).

{
  "error": "INVALID_EVENT_DATE"::string,
  "description" : "event date should be between July 17 2060 and July 24 2060"::string
} 

HTTP 400 Bad request

Pour les autres erreurs (ex. passCategory qui est invalide, si le champ eventDates est présent alors qu’un package est acheté, etc.)

{
  "error": "INVALID_FORMAT"::string,
  "description": "invalid format"::string
} 

Requête: Obtenir les détails d’une réponse

GET /orders/<orderNumber::long>

Réponses

{
    "orderPrice": 0.00::float,
    "passes": [
                  {
                    "passNumber": 0::long,
                    "passCategory": "VIP" || "Premium" || "Standard",
                    "passOption": "forfait" || "passe_journaliere",
                    "eventDates": ["2017-07-01"]::string(date)[]
                  }, ...
              ]
}

HTTP 404 Not found

Si la commande n’existe pas

{
  "error": "ORDER_NOT_FOUND"::string,
  "description": "order with number XX not found"::string
}