Back

TD5: Le carpaccio d'API

Lors de ce TP vous allez devoir livrer plusieurs versions successives d'une API de calcul de prix.

Première livraison (v1.0.0)

/id (requête GET) doit retourner l'id de votre API qui est le nom de votre dépôt GitHub sour la forme { "id" : "it340-foo" }

Deuxième livraison (v1.1.0)

/bill (requête POST) doit permettre de calculer un prix en fonction d'un objet de paramètres envoyé à l'API en JSON dans le body de la requête. L'objet est de la forme { "prices" : [10, 20], "quantities" : [1, 2] }. L'API doit retourner le prix total sous la forme { "total" : 50 }.

En cas de problème, il est nécessaire de renvoyer un code d'erreur ainsi qu'un objet erreur de la forme { "error" : "error message" }.

Troisième livraison (v2.0.0)

Nous allons maintenant gérer la TVA. Les reqêtes vers la route /bill doivent donc maintenant obligatoirement contenir un paramètre country qui représente le code du pays, de la forme { "prices" : [15.99, 11.99], "quantities" : [1, 2], "country" : "ES" }.

Pour le calcul du prix, il faut appliquer la TVA dont le taux est indiqué dans le tableau ci-après.

Country Code Tax
Germany DE 20%
United Kingdom UK 21%
France FR 20%
Italy IT 25%
Spain ES 19%
Poland PL 21%
Romania RO 20%
Netherlands NL 20%
Belgium BE 24%
Greece EL 20%
Czech Republic CZ 19%
Portugal PT 23%
Hungary HU 27%
Sweden SE 23%
Austria AT 22%
Bulgaria BG 21%
Denmark DK 21%
Finland FI 17%
Slovakia SK 18%
Ireland IE 21%
Croatia HR 23%
Lithuania LT 23%
Slovenia SI 24%
Latvia LV 20%
Estonia EE 22%
Cyprus CY 21%
Luxembourg LU 25%
Malta MT 20%

Quatrième livraison (v2.1.0)

Il faut mettre à jour le endpoint /bill pour que l'on puisse appliquer une réduction qui dépend du prix total TTC. Le schéma de reduction est envoyé via l'objet de paramètres comme ceci : { "prices" : [15.99], "quantities" : [1], "country" : "ES", "discount" : "NO_DISCOUNT" }. L'API doit retourner le prix total sous la même forme que précédemment : { "total" : 100.12 }.

Il est à noter que pour assurer la rétro-compatibilité il doit être possible d'omettre le paramètre discount et d'envoyer une requête de la forme { "prices" : [15.99, 11.99], "quantities" : [1, 2], "country" : "ES" } comme précédemment, tout en obtenant le même résultat.

Voici les différents schémas de réduction.

NO_DISCOUNT

0% de réduction.

PROGRESSIVE_DISCOUNT

|----------------+-------------|

Total Reduction
>= 50 000 EUR 15 %
>= 10 000 EUR 10 %
>= 7 000 EUR 7 %
>= 5 000 EUR 5 %
>= 1 000 EUR 3 %
----------------+-------------

FLAT_DISCOUNT

30 % quelque soit le prix total.

FIXED_DISCOUNT

Cinquième livraison (v2.2.0)

Pour cette quatrième livraison on doit pouvoir spécifier dans quelle devise on veut payer, et votre API doit utiliser une API de calcul des cours pour calculer le prix dans la devise spécifiée. Voici un example de requête:

{ "prices" : [15.99, 11.99], "quantities" : [1, 2], "country" : "ES", "discount" : "NO_DISCOUNT", currency: "CAD" }.

Encore une fois, il est à noter que pour assurer la rétro-compatibilité il doit être possible d'omettre le paramètre currency et d'envoyer une requête de la forme { "prices" : [15.99, 11.99], "quantities" : [1, 2], "country" : "ES" } ou { "prices" : [15.99, 11.99], "quantities" : [1, 2], "country" : "ES" } comme précédemment, tout en obtenant le même résultat.