Cela va faire 2 ans (3 maintenant?) que je travaille sur Wavve avec un rythme totalement irrégulier, qui me permet de gérer mes ambiances de parties de jeu de rôle comme un petit orchestre en herbe.
Récemment (chômage oblige) j’ai pu passer beaucoup plus de temps a développer de nouvelles fonctionnalités, mettre a jour mes paquets npm, et surtout a revoir l’architecture du projet !
Entre aujourd’hui et le début du projet, beaucoup de choses ont changées dans le monde de l’IT. React est devenu un “framework” qui ne s’occupe pas que de l’UI mais aussi et surtout de Datas, l’IA est devenu le quotidien dans nos vies (Claude et Cline sont mes deux nouveaux meilleurs amis), TypeScript va être ré-écrit entièrement, le boss de Vercel fait des selfies avec le premier ministre Israélien, et moi je peux faire énormément plus de jeu de rôle qu’avant ! (oui ça n’a rien a voir avec le dev)
Tout ça ajouté a la complexité grandissante de ce projet m’a poussé a m’intéresser a des sujets d’architecture fullstack, ou a minima backend, auquel je ne prêtais pas attention jusqu’à présent. Mes composants sont rendus côté serveur pour la plupart, j’ai plein de nouvelles routes API dans mon Next.js, et mes interactions entre toutes mes entités sont de plus en plus nombreuses, alors il m’a fallu revoir pas mal de choses!
Et pas mal de travail a déjà été fait : mes useEffect ont presque tous disparus, la logique métier n’est plus directement dans mes routes mais est devenu un ensemble de Services qui interagissent avec des Modèles, et retournent la data nécessaire aux réponses de Endpoints.
Tout va a été agrémenté par de nombreuses mises a jour de mon fichier schema.prisma!
- Des nouveaux modèles pour aler avec les Shuffles (un groupement de sons joués aléatoirement)
- De nouvelles contraintes sur les entités, ou d’autres qui ont été enlevées.
- Etc…
A force de bidouiller a gauche et a droite, je me suis tombé sur une erreur 500 sur Wavve lorsque j’ai voulu ajouter un nouveau son de ma Librairie !
Plus exactement : duplicate key identifier
Aie
Retour en arrière, je cherche la clé du son que j’ai voulu ajouter (disons ABC123 pour l’exemple, j’ai pas d’imagination), c’est un qon qui était déjà dans une Scène, puis que j’ai supprimé !
Et je découvre que, bien que le son n’aie plus d’association avec la Scène dans laquelle je veux le rajouter, cette dernière avait encore ce Son relié! Quelque chose ne tournait pas rond dans ma relation many-to-many sur MongoDB (et les plus connaisseu.se.r.s tiquent déjà).
Faisons avance rapide : il s’avère que pendant mes bidouilles j’ai commenté la portion de code qui mettait a jour les Scènes dans les suppression de Son !
Et là je me suis dit : comment ça se fait que j’ai pu faire ça sans que ma DB crash? Ah bah oui c’est vrai !
J’utilise MongoDB.
Alors que mes entités ont clairement des relations contraignantes entre elles, et que j’ai besoin que mon serveur m’engueule quand j’essaie de faire des choses qui sentent pas bon. Alors que je n’utilise pas spécialement les outils des bases de données par documents comme MongoDB, que je n’ai pas besoin de scale avec 10M d’utilisateur, et de repartir tout ça dans des Shards.
Quand j’ai lancé ce projet, je voulais juste me faire kiffer a essayer des technos que je ne maîtrisais pas. Aujourd’hui je ne peux pas dire que je maîtrise MongoDB, mais j’en ai capté l’essentiel. J’en ai suffisamment compris pour arriver a la conclusion que je n’ai pas besoin de MongoDB. J’ai besoin d’une base de données relationnelle.
Alors que faire maintenant ? Eh bien la suite des événements va être de pouvoir transférer toutes mes données entre MongoDB et une base SQl, et je vais probablement partir sur PostgreSQL d’ailleurs, parce que c’est l’une des BDD les plus adaptées a PrismaDB, et que j’aime bien PrismaDB ♥️
Je vais prendre des notes tout au long de cette migration, et reviendrait sûrement écrire un article par ici pour résumer tout ce travail !