Cet article a pour but de faire un retour d’expérience sur la migration de notre API REST vers GraphQL, ainsi que la présentation du plan d’action qui a été mis en place.

Bien que nous utilisons Ruby avec Ruby On Rails, ce plan d’action est valide pour d’autres framework !

Motivations

Pourquoi passer de REST à GraphQL ?

Plusieurs raisons me viennent en tête, la première d’entre-elles : la flexibilité.

Tout d’abord un peu de contexte : nous étions, au moment de la migration, une petite équipe de développeur : 2 développeurs frontend, 1 développeur backend, 1 lead dev full-stack. Nous avions à notre charge plusieurs applications front qui consommaient une API ( notre backend ).

REST est tout à fait adapté pour ce type de projet, cependant, pour notre petite équipe, il arrivait que nos développeurs frontend soient bloqués par un endpoint API manquant, en cours de développement, pour réaliser/finaliser une fonctionnalité.

Une autre raison invoquée est le cas d’utilisation même de GraphQL : cela offre une flexibilité qui permet aux développeur frontend de décrire les réponses et formats de données souhaités.

Une certaine liberté est alors offerte aux développeurs frontend au cours de leur développement, ils peuvent alors exprimer des requêtes qui sont spécifiquement taillées pour leurs interfaces.

Est-ce que REST est périmé ?

Non ! Je pense que REST demeure une bonne approche, certaines complexités back introduites par GraphQL (notamment le cache serveur) possèdent des solutions simples avec une approche REST. Il n’empêche que la popularité grandissante de GraphQL laisse penser que son adoption est réelle, et finira à terme par cohabiter avec des API REST.

Je suis intéressé, dis m’en plus

Je te propose le plan d’action que nous avons mis en place pour offrir une continuité de service pour les applications et clients qui consomment la version REST de notre service, tout en créant une version GraphQL de notre API.

Plan d’action

Travail préparatoire

  • Répertorier les controllers & actions qui seront présent sur la version GraphQL de l’API.
  • Extraire les actions des controllers en objet (s'inspirer du Design Pattern "command").
  • Mettre à jour la couverture de test.

Configuration du routing

  • Mettre en place la strategie de routing : filtrage et routing par header “accept”.

Installation et configuration de GraphQL

  • Installer GraphQL.
  • Créer les modèles GraphQL spécifiques aux modèles ActiveRecord.
  • Créer les différentes queries & mutations.

Conclusion & retour d’expérience

Tout d’abord, la phase préparatoire nous a permis de faire un bon tri dans notre code base: nous avons pu identifier le code non-utilisé, refactoriser et optimiser le code qui méritait de l’être, ainsi qu’améliorer notre couverture de test globale.

Ensuite, nous avons mis en place une stratégie de routing par header “Accept” nous a permis de faire cohabiter les deux versions d’API, permettant une continuité de service pour les différents consommateurs de notre API.

Pour finir, GraphQL est relativement bien intégré à l’écosystème Ruby on Rails. Nombre d’article et de tutoriels sont disponibles sur le net. Certaines notions importantes comme l’offuscation de schema, la création de types personnalisés, les autorisations, etc… sont très bien expliqués.

En ce qui concerne l’utilisation au quotidien côté frontend, passé le temps de setup et de migration ( axios → appolo ), l’utilisation de GraphQL nous a permis de faire gagner en autonomie et en productivité nos développeurs frontend.

Selon moi cette décision fut la bonne pour notre équipe, cela nous a permis d’avoir une valeur ajoutée à notre API, en termes de fonctionnalité mais également en terme de robustesse grâce aux différents refactors et à l’amélioration de notre couverture de test.

La suite ?

Je vais réaliser une série d’articles qui rentrera plus spécifiquement dans les détails de quelques étapes clés présentées dans le plan d’action.

En attendant, je vous laisse quelque liens utiles, en rapport avec la thématique du billet.

Liens

Refactor & test unitaire

Ruby on rails / API / GraphQL