assemblee-virtuelle / archipelago

Fostering interconnections between communities by creating synergies between their platforms
Apache License 2.0
14 stars 6 forks source link

Feat: Add a dbMigration service #141

Closed mguihal closed 11 months ago

mguihal commented 11 months ago

Hello,

Cette PR fait suite au bug remonté sur Semapps https://github.com/assemblee-virtuelle/semapps/issues/1185.
La conclusion de la discussion étant qu'il était trop tôt d'intégrer un service de migrations dans Semapps, je me permets donc de proposer un service équivalent ici.

Contexte

Le service s'inspire des autres solutions de migration de base de données existants (tels que https://db-migrate.readthedocs.io/en/latest/, https://knexjs.org/guide/migrations.html#migration-cli or https://phinx.org/).

Le principe est qu'à chaque opération de migration nécessaire en base de données, on crée un fichier de migration, qui contient les opérations pour migrer (up), ainsi que les opérations pour revenir à l'état précédent (down). Chaque migration appliqué est sauvegardé en base de données pour savoir l'état actuel d'exécution des migrations.

Proposition

Un service dbMigrations créé ici reprend ce principe, en s'interfaçant avec Moleculer et le TriplestoreService.
Les fichiers de migrations sont stockés dans le répertoire middleware/migrations.
L'état des migrations est sauvegardé dans la base de données dans un nouveau graph nommé http://semapps.org/migrations. Un CLI nommé dbMigrate a été ajouté répliquant les actions du service dbMigrations mais pouvant être lancé en parallèle ou indépendamment du middleware.

Création d'une nouvelle migration

Pour créer une nouvelle migration, on peut utiliser la commande yarn run dbMigrate --name <nomDeLaMigration>. Celle-ci va créer un nouveau fichier js dans le dossier de migrations, préfixé par un timestamp pour pouvoir ordonner les migrations dans l'ordre chronologique.

Le contenu du fichier créé correspond à ceci :

module.exports = {
  up: async ({ query, insert, update }) => {
    /*
     * You can use 'query', 'insert' and 'update' actions from triplestore service
     * Documentation for these methods can be found here: https://semapps.org/docs/middleware/triplestore
     * Example:
     *
     * const queryResult = await query({
     *   query: `
     *     SELECT ?s ?p ?o
     *     WHERE {
     *       ?subject ?predicate ?object
     *     }
     *   `,
     * });
     */

  },
  down: async ({ query, insert, update }) => {
    /*
     * This function must undo what is done in the above "up" function.
     * If things are not undoable, it must ensure that the database will be in a coherent working state
     */

  },
};

Lister le statut des migrations

On peut lister le statut des migrations via la commande yarn run dbMigrate status. Celle-ci affiche un tableau avec le nom de chaque migration trouvée (dans les fichiers et/ou dans la base de données), leur statut (Not applied ou Applied) et leur éventuelle date d'exécution pour celles appliquées.

Capture d’écran 2023-10-30 à 22 55 35

Appliquer une migration

On peut appliquer une migration via la commande yarn run dbMigrate up.

Capture d’écran 2023-10-30 à 23 02 57

Rollback une migration

On peut rollback une migration via la commande yarn run dbMigrate down.

Première migration ajoutée

J'ai aussi profité de cette PR pour ajouter la première migration archipelago-updateFilesType pour permettre de migrer le type des fichiers uploadés avant la version 0.6.0.