- Clean architecture
- MVVM for the presentation layer
- RxSwift
- Dependency Injection with Swinject
- Moya for the Network layer
- Unit Tests with XCTest, Cuckoo (Mocks), RxTest, RxBlocking
Il était une fois, une collection de cinq livres racontant les histoires d’un formidable héro nommé Henri Potier. Tous les enfants du monde trouvaient les histoires de cet adolescent fantastiques. L’éditeur de cette collection, dans un immense élan de générosité (mais aussi pour booster ses ventes 😉), décida de mettre en place des offres commerciales aussi aléatoires que l’issue des sorts de Ron Weasley.
L’éditeur vous demande de développer une application mobile Android ou iOS comprenant deux interfaces :
- La première permet d’afficher les livres que l’on souhaite acheter ;
- La seconde récapitule le panier sur lequel sera appliqué la meilleure offre commerciale.
Sachez que l’éditeur attachera une attention toute particulière à la qualité des développements.
La liste des livres Henri Potier est accessible à l’adresse http://henri-potier.xebia.fr/books
en GET
.
Les offres commerciales associées sont disponibles en GET
à l’adresse suivante : http://henri-potier.xebia.fr/books/{ISBN1, ISBN2, ...}/commercialOffers
Pour deux livres (respectivement à 35€ et 30€), la requête ressemblera à : http://henri-potier.xebia.fr/books/c8fabf68-8374-48fe-a7ea-a00ccd07afff,a460afed-e5e7-4e39-a39d-c885c05db861/commercialOffers
Le service renverra les offres applicables à ce panier en JSON
:
{
"offers": [
{ "type": "percentage", "value": 5 },
{ "type": "minus", "value": 15 },
{ "type": "slice", "sliceValue": 100, "value": 12 }
]
}
Dans cet exemple, la promotion la plus intéressante pour le client est la promotion de type minus
, le prix du panier attendu est donc de 65€ - 15€
, soit 50€
.
-
La première offre identifiée par un type
percentage
est une réduction s’appliquant sur le prix de l’ensemble des livres. Le montant de la réduction est dansvalue
; -
La deuxième offre identifiée par un type
minus
est une déduction directement applicable en caisse d’un montant devalue
; -
La troisième offre identifiée par un type
slice
est un remboursement par tranche d’achat. Dans cet exemple, on rembourse 12€ par tranche de 100€ d’achat.
Au-delà de « l’exercice imposé », toute idée originale supplémentaire sera appréciée.
Run pod install
to install dependencies
- Add the ability to select a quantity for each book
- Add a book's details screen (to display synopsis etc.)
- Add an other implementation of
CartRepository
which persists theCart
(withUserDefaults
for instance) and manageCart
restoration when relaunching the app