Cette semaine, c'est Loïc qui vous propose un #KataOfTheWeek : Design pattern : valider des règles

Briefing du Kata : Si tu aimes les collections, tu dois forcément connaitre LebonCoinCoin.fr. LeBonCoinCoin, c'est le fameux site de petites annonces permettant de vendre et acheter de superbes canards en plastique, comme celui-ci :

SuperCanarde

Oui. Je sais. Toi aussi tu le veux.

Moi, je m'appelle Patrick, mais mes amis m'appellent Pato (les hispaniques comprendront). Je collectionne les canards en plastique depuis 17,73 années.

J'en ai exactement 42 123, et je suis toujours à la recherche de LA nouveauté.

Comme LeBonCoinCoin est assez réputé et que je ne veux jamais manquer une bonne occasion, j'ai voulu créer un petit crawler qui tourne et qui filtre les annonces pour trouver celles susceptibles de m'intéresser.

Lorsque je crawl un article, j'ai créé le modèle suivant :

  • title Le titre de l'annonce
  • description La description de l'annonce
  • price le prix de vente
  • deliveryMethods le type d'échange permis. Choix possibles : "irl", "delivery", "relay", "teletransporation"
  • ref Une référence du canard
  • make La marque du canard
  • condition l'état du canard : "with-blister", "good-as-new", "excellent", "good", "used"
  • email l'email du vendeur
  • sellerName le nom affiché du vendeur
  • zipCode le code postal du vendeur }

Voici un petit exemple :

Article :

{
  "title": "Vend canard SuperWoman flambant neuf cause séparation",
  "description": "Bonjour à tous, comme je sors un peu de l'univers DC Comics, je vends mon canard SuperWoman (référence Duck Inc 14234) pour la modique somme de 10 €. J'accepte aussi de l'échanger pour un canard Iron Man ou Hulk.",
  "price": 10.0,
  "deliveryMethods": ["irl", "delivery", "relay"],
  "ref": 14234,
  "make": "DuckInc",
  "condition": "good-as-new"
  "email": "superduck@collection.co",
  "sellerName": "Harry Covaire",
  "zipCode": "75014"
}

Comme je ne suis pas le dernier caneton, j'ai imposé un certain nombre de règles pour être certain qu'une annonce m'intéresserait :

  • La description ne doit pas mentionner l'expression "Western Union"
  • Le prix de vente doit être inférieur à 20 €, sauf s'il est encore sous blister ("with-blister"), dans ce cas là j'accepte de monter à 35 €.
  • Il existe aussi des super-canards (en édition limitée). Leur numéro de référence est toujours < 100. Pour ceux là, je peux monter jusqu'à 120 €. Quand on aime, on ne compte pas.
  • Je ne suis pas intéressé par les canards génériques, seulement ceux issus de DuckInc.
  • Je n'accepte pas les articles de condition en dessous de "good-as-new".
  • L'article doit pouvoir être envoyé, sauf si le vendeur habite dans le même département que moi (75).
  • Je n'accepte aucun canard des gens qui s'appellent Kévin (email ou sellerName). Question de religion.

Trouvez une manière élégante de valider l'ensemble des règles dans une fonction qui prend en paramètre un Article et qui renverra soit un Objet {"valid" : true} soit {"valid": false, "reasons": [...]}.

Saurez-vous résoudre le problème ?

Bon courage ! Retrouvez la solution dans cet article 😉