Transmettre la `scope:` dans un arbre de serializers : faut-il le faire, ou pas ?

Les sérialiseurs peuvent être fournis avec un paramètre scope: destiné à fournir le contexte des permissions pour le sérialiseur. Dans le code de Discourse, le scope fourni est un Guardian, et il semble que chaque sérialiseur est censé recevoir un Guardian comme son scope. ApplicationController (la classe de base de tous les contrôleurs) maintient un Guardian et dispose de plusieurs mécanismes pour tenter de garantir que Guardian est injecté comme scope: pour tous les sérialiseurs.

Cependant, tous les scénarios ne sont pas couverts par ces mécanismes. Chaque fois qu’un sérialiseur est explicitement construit, par exemple, des appels à ActiveModel::ArraySerializer.new(...), le scope doit être injecté manuellement. En effet, la plupart des instances de XxxxSerializer.new(...) ont un scope: scope ou scope: guardian dans la liste des arguments. Mais, pas toutes.

Alors, ma question : quelle est la philosophie de développement ici ? Est-ce :

  1. Le scope doit simplement toujours être transmis (sauf s’il y a une raison spécifique de ne pas le faire) ; si quelqu’un a oublié de le faire, c’est un bug en attente et il devrait être corrigé avec un scope: ... approprié ajouté ; OU
  2. Oui, c’est bien ; quelqu’un peut corriger ces endroits au fur et à mesure qu’ils cassent quelque chose pour quelqu’un.

Dans mon cas, j’ai ajouté une utilisation de scope à BasicUserSerializer… et j’ai ensuite été très perplexe lorsque j’ai découvert que cela avait cassé des choses dans Chat… ce que j’ai finalement réalisé (après trop de recherches) était le résultat d’un sérialiseur enfoui dans une chaîne XxxSerializer -> YyySerializer -> ... -> BasicUserSerializer ne transmettant pas le scope !

1 « J'aime »