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