Bon
Le développement avançant, j'ai tenté de mettre en place une des idées qui me tient le plus à cœur avec cette ZEP : une gestion "plus intelligente" des versions.
Je m'explique : actuellement, on a une sorte de ligne du temps dans lequel les "jalons" sont les commits effectués par les auteurs. Pour chacun de ces commits, on a une arborescence, qui varie d'une fois à l'autre, et un "manifest.json", qui est le fichier qui reprend tout ça et qui change lui aussi à chaque version. D'autre part, toujours actuellement, on tente de faire coller chaque "objet" à une représentation en base de donnée (les Chapitres, Parties, Extraits et s'en suis).
Problème selon moi avec ça, c'est qu'une base de donnée n'est pas versionnée, ce qui signifie que si entre la version "publiée" et "brouillon" du tutoriel, une partie à changé de titre, impossible de régénérer l'URL de la version "publiée" à partir des informations en base de donnée (qui correspondent TOUJOURS à la version "brouillon"), ça ne marchera pas. Ce qu'on fait actuelement, c'est d'aller rechercher dans l'historique du tutoriel la version correspondante avec le bon titre, et on est sauvé.
Dès lors, après réflexion, je me suis dit que ça ne servait absolument plus à rien de stocker ces objets en base de donnée: puisque c'est quand même pour aller choper dans l'historique git à chaque fois, autant ne pas se casser la tête avec des trucs en base de donnée. J'ai donc codé une PR relativement importante qui met en place cette histoire. Si je simplifie, voilà comment ça se passe:
- On a un objet qui d'une part correspond à une ligne de table. Cette table reprend les informations non-versionnées (actuelement) et liées à d'autres éléments eux-même en base de donnée, telle que les auteurs, les catégories, les notes, et ainsi de suite. Cette base de donnée reprend également les hash de chacune des versions que compte le tuto (brouillon, bêta, validation, publique). Pour chaque opération qu'on cherche à faire, ce objet est de toute façon récupéré (c'est déjà le cas actuellement).
- D'autre part, on a tout les objets que cet ZEP prétend mettre en place (Conteneur et Extrait). Dès lors pour une version donnée ("brouillon", par exemple), on récupère le "manifest.json" correspondant, on génère toute la structure et on travaille là dessus. Dès lors, les informations contenues dans ces données correspondent aux informations de la version ! Plus de problème de modification de titre ou quoique ce soit, il suffit de travailler avec la bonne version. Et pas besoin de stocker tout ça en base de donnée.
Dès lors, la base de donnée n'est modifiée que si on touche à une de ces informations en relation avec d'autres éléments en base de donnée ou quand on change un des hash.
En fait, ça marche assez bien. En codant tout ça, j'ai fait différents tests et ça se comporte assez bien, je pense réellement qu'on peut gagner en stabilité et en mobilité avec ça (entre autre, c'est une ÉNORME simplification pour la ZEP-08, parce que tout ce qui est "tripoter des versions" se retrouve beaucoup plus localisé qu'avant).
Mais si je viens discuter ici, c'est d'une part pour recueillir votre approbation, d'autre part pour énoncer le point que j'ai soigneusement évité d'aborder jusqu'ici parce que je sais qu'il va faire débat (parce qu'il a déjà fait débat) : puisqu'on ne stocke plus les objets en base de donnée, ils n'ont plus de clé uniques (le fameux pk). Je vais tout de même modérer cette affirmation, puisque le "containeur principal" (aka l'article ou le tuto, dans le langage de la ZEP-12) conserve un pk, puisque certaines de ces informations restent conservée en base de donnée, et je ne compte pas que ça change. Reste donc le cas des sous-conteneurs (partie, chapitre) et des (extraits), qui n'en ont plus.
Dans l'implémentation que j'en ai fait, je les conserve : on en a besoin pour la rétro-compatibilité des urls (qui s'annonce relativement plus simple que je ne l'aurait cru) et tout simplement parce qu'il faut éviter que deux extraits ayant le même slug ne s'écrasent mutuellement, ce pourquoi ils sont dans les urls et les noms de fichier. Ce que j'apelle pk revient alors à une clé nominale qui se veut être unique. "Problème", puisqu'on fait pas appel à la base de donnée, il faut ruser pour que ça soit effectivement le cas.
Bref,
- Est ce qu'à part le problème de clé nominale, quelqu'un voit l'intérêt de continuer à stocker les objets en BDD ? Si oui, pourquoi ?
- Dans le cas contraire, comment faire en sorte que la clé nominale le soit effectivement bien sans se prendre la tête ? (un sujet qui tient énormément à coeur Firm1 )
Pour plus d'informations, voir la PR correspondante sur le dépot d'artragis