From 8779bd02d2825f909728ce74386cfa8f38b1a8d8 Mon Sep 17 00:00:00 2001 From: julienmalard Date: Mon, 2 Oct 2023 21:01:30 +0200 Subject: [PATCH 1/4] =?UTF-8?q?Progr=C3=A8s=20migration=20vers=20Set=20et?= =?UTF-8?q?=20OrderedKeyValue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "src/acc\303\250s/cntrlConstellation.ts" | 8 +- .../acc\303\250s/gestionnaireUtilisateurs.ts" | 6 +- src/automatisation.ts | 48 ++-- src/bds.ts | 119 ++++---- src/client.ts | 147 +++------- src/composanteClient.ts | 14 +- src/epingles.ts | 2 +- src/motsClefs.ts | 11 +- "src/nu\303\251e.ts" | 37 +-- src/profil.ts | 23 +- src/projets.ts | 40 ++- src/tableaux.ts | 266 ++++++++++-------- src/valid.ts | 72 +---- src/variables.ts | 98 +++---- .../acc\303\250s/cntrlConstellation.spec.ts" | 8 +- test/bds.spec.ts | 8 +- test/client.spec.ts | 168 ++++------- "test/nu\303\251e.spec.ts" | 12 +- test/recherche/utils.spec.ts | 6 +- "test/r\303\251seau.spec.ts" | 18 +- test/tableaux.spec.ts | 36 +-- test/valid.spec.ts | 62 ++-- "test/\303\251pingler.spec.ts" | 8 +- 23 files changed, 516 insertions(+), 701 deletions(-) diff --git "a/src/acc\303\250s/cntrlConstellation.ts" "b/src/acc\303\250s/cntrlConstellation.ts" index 39f29df9ea..a0efb3b012 100644 --- "a/src/acc\303\250s/cntrlConstellation.ts" +++ "b/src/acc\303\250s/cntrlConstellation.ts" @@ -21,7 +21,7 @@ import GestionnaireAccès, { import { MODÉRATEUR, MEMBRE, rôles } from "@/accès/consts.js"; import type { élémentBdAccès, infoUtilisateur } from "@/accès/types.js"; import { gestionnaireOrbiteGénéral } from "@/orbite.js"; -import {TypedFeed} from "@constl/bohr-db" +import {TypedSet} from "@constl/bohr-db" import { EventEmitter } from "events"; import ContrôleurAccès from "./cntrlMod.js"; import { pathJoin } from "./utils.js"; @@ -131,7 +131,7 @@ const ContrôleurConstellation = let adresseBdAccès: string; - let bd: TypedFeed<élémentBdAccès>; + let bd: TypedSet<élémentBdAccès>; let fOublierBd: schémaFonctionOublier; if (address) { @@ -150,7 +150,7 @@ const ContrôleurConstellation = }); ({ bd, fOublier: fOublierBd } = await gestionnaireOrbite.ouvrirBdTypée({ id: adresseBdAccès, - type: "feed", + type: "set", schéma: schémaBdAccès, options: { syncAutomatically: true, @@ -159,7 +159,7 @@ const ContrôleurConstellation = } else { ({ bd, fOublier: fOublierBd } = await gestionnaireOrbite.ouvrirBdTypée({ id: nom, // Je pense qu'on peut faire ça, tant que le nom reste unique... - type: "feed", + type: "set", schéma: schémaBdAccès, options: { AccessController: ContrôleurAccès({ write }), diff --git "a/src/acc\303\250s/gestionnaireUtilisateurs.ts" "b/src/acc\303\250s/gestionnaireUtilisateurs.ts" index c2e34bfc29..f1a1cfbf93 100644 --- "a/src/acc\303\250s/gestionnaireUtilisateurs.ts" +++ "b/src/acc\303\250s/gestionnaireUtilisateurs.ts" @@ -12,13 +12,13 @@ import { GestionnaireOrbite, gestionnaireOrbiteGénéral, } from "@/orbite.js"; -import { TypedFeed } from "@constl/bohr-db"; +import { TypedSet } from "@constl/bohr-db"; type ContrôleurConstellation = Awaited< ReturnType> >; export const suivreBdAccès = async ( - bd: TypedFeed<élémentBdAccès>, + bd: TypedSet<élémentBdAccès>, f: schémaFonctionSuivi<élémentBdAccès[]> ): Promise => { const fFinale = async () => { @@ -41,7 +41,7 @@ class AccèsUtilisateur extends EventEmitter { idBd: string; idBdAccès?: string; - bdAccès?: TypedFeed<élémentBdAccès>; + bdAccès?: TypedSet<élémentBdAccès>; fOublierBd?: schémaFonctionOublier; oublierSuivi?: schémaFonctionOublier; autorisés: string[]; diff --git a/src/automatisation.ts b/src/automatisation.ts index c6a26fb315..fe4788f416 100644 --- a/src/automatisation.ts +++ b/src/automatisation.ts @@ -18,7 +18,7 @@ import type { conversionDonnées } from "@/tableaux.js"; import ImportateurFeuilleCalcul from "@/importateur/xlsx.js"; import ImportateurDonnéesJSON, { clefsExtraction } from "@/importateur/json.js"; -import { ComposanteClientListe } from "@/composanteClient.js"; +import { ComposanteClientDic } from "@/composanteClient.js"; import type { JSONSchemaType } from "ajv"; if (isElectronMain || isNode) { @@ -50,8 +50,9 @@ export type SpécificationAutomatisation = | SpécificationExporter | SpécificationImporter; -const schémaSpécificationAutomatisation: JSONSchemaType = - { +const schémaBdAutomatisations: JSONSchemaType<{[id: string]: SpécificationAutomatisation}> = { + type: "object", + additionalProperties: { type: "object", anyOf: [ { @@ -139,7 +140,9 @@ const schémaSpécificationAutomatisation: JSONSchemaType( const verrou = new Semaphore(); -export default class Automatisations extends ComposanteClientListe { +export default class Automatisations extends ComposanteClientDic<{[id: string]: SpécificationAutomatisation}> { automatisations: { [key: string]: AutomatisationActive }; événements: EventEmitter; @@ -897,7 +900,7 @@ export default class Automatisations extends ComposanteClientListe { this.fOublier = await this.suivreBdPrincipale({ - f: (autos) => this.mettreAutosÀJour(autos), + f: (autos) => this.mettreAutosÀJour(Object.values(autos)), }); } @@ -1068,12 +1071,8 @@ export default class Automatisations extends ComposanteClientListe { - const { bd, fOublier } = await this.client.orbite!.ouvrirBdTypée({ - id: await this.obtIdBd(), - type: "feed", - schéma: schémaSpécificationAutomatisation, - }); + const { bd, fOublier } = await this.obtBd(); dispositif = dispositif || this.client.orbite!.identity.id; const id = uuidv4(); @@ -1124,7 +1119,7 @@ export default class Automatisations extends ComposanteClientListe { - const { bd, fOublier } = await this.client.orbite!.ouvrirBdTypée({ - id: await this.obtIdBd(), - type: "feed", - schéma: schémaSpécificationAutomatisation, - }); - await this.client.effacerÉlémentDeBdListe({ - bd, - élément: (é) => é.value.id === id, - }); + const { bd, fOublier } = await this.obtBd(); + await bd.del(id); await fOublier(); } @@ -1169,9 +1157,9 @@ export default class Automatisations extends ComposanteClientListe; idCompte?: string; }): Promise { - const fFinale = async (autos: SpécificationAutomatisation[]) => { + const fFinale = async (autos: {[id: string]: SpécificationAutomatisation}) => { const autosFinales = await Promise.all( - autos.map(async (a) => { + Object.values(autos).map(async (a) => { const autoFinale = deepcopy(a); if ( autoFinale.type === "importation" && diff --git a/src/bds.ts b/src/bds.ts index f43a0e4061..fa25224a71 100644 --- a/src/bds.ts +++ b/src/bds.ts @@ -135,11 +135,6 @@ const schémaStructureBdBd: JSONSchemaType = { ], }; -export type infoTableau = { - clef: string; - position: number; -}; - export type différenceBds = | différenceBDTableauSupplémentaire | différenceBDTableauManquant @@ -166,18 +161,17 @@ export type différenceTableauxBds< différence: T; }; -export type infoTableauAvecId = infoTableau & { id: string }; +export type infoTableauAvecId = { clef: string, id: string }; -export const schémaInfoTableau: JSONSchemaType = { +export const schémaInfoTableau: JSONSchemaType<{clef: string}> = { type: "object", properties: { clef: { type: "string" }, - position: { type: "integer" }, }, - required: ["clef", "position"], + required: ["clef"], }; export const schémaBdTableauxDeBd: JSONSchemaType<{ - [idTableau: string]: infoTableau; + [idTableau: string]: {clef: string}; }> = { type: "object", additionalProperties: schémaInfoTableau, @@ -266,19 +260,19 @@ export default class BDs extends ComposanteClientListe { await bdBD.set("descriptions", idBdDescr); const idBdTableaux = await this.client.créerBdIndépendante({ - type: "keyvalue", + type: "ordered-keyvalue", optionsAccès, }); await bdBD.set("tableaux", idBdTableaux); const idBdMotsClefs = await this.client.créerBdIndépendante({ - type: "feed", + type: "set", optionsAccès, }); await bdBD.set("motsClefs", idBdMotsClefs); const idBdNuées = await this.client.créerBdIndépendante({ - type: "feed", + type: "set", optionsAccès, }); await bdBD.set("nuées", idBdNuées); @@ -289,7 +283,7 @@ export default class BDs extends ComposanteClientListe { const { bd: bdRacine, fOublier: fOublierRacine } = await this.client.orbite!.ouvrirBdTypée({ id: await this.obtIdBd(), - type: "feed", + type: "set", schéma: schémaBdPrincipale, }); await bdRacine.add(idBdBd); @@ -304,7 +298,7 @@ export default class BDs extends ComposanteClientListe { async ajouterÀMesBds({ idBd }: { idBd: string }): Promise { const { bd, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: await this.obtIdBd(), - type: "feed", + type: "set", schéma: schémaBdPrincipale, }); await bd.add(idBd); @@ -314,10 +308,10 @@ export default class BDs extends ComposanteClientListe { async enleverDeMesBds({ idBd }: { idBd: string }): Promise { const { bd, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: await this.obtIdBd(), - type: "feed", + type: "set", schéma: schémaBdPrincipale, }); - await this.client.effacerÉlémentDeBdListe({ bd, élément: idBd }); + await bd.del(idBd); await fOublier(); } @@ -398,7 +392,7 @@ export default class BDs extends ComposanteClientListe { const { bd: bdMotsClefs, fOublier: fOublierBdMotsClefs } = await this.client.orbite!.ouvrirBdTypée({ id: idBdMotsClefs, - type: "feed", + type: "set", schéma: schémaStructureBdMotsClefs, }); const motsClefs = (await bdMotsClefs.all()).map((x) => x.value); @@ -414,7 +408,7 @@ export default class BDs extends ComposanteClientListe { const { bd: bdNuées, fOublier: fOublierBdNuées } = await this.client.orbite!.ouvrirBdTypée({ id: idBdNuées, - type: "feed", + type: "set", schéma: schémaStructureBdNuées, }); const nuées = (await bdNuées.all()).map((x) => x.value); @@ -432,27 +426,27 @@ export default class BDs extends ComposanteClientListe { const { bd: nouvelleBdTableaux, fOublier: fOublierNouvelleTableaux } = await this.client.orbite!.ouvrirBdTypée({ id: idNouvelleBdTableaux, - type: "keyvalue", + type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd, }); if (idBdTableaux) { const { bd: bdTableaux, fOublier: fOublierBdTableaux } = await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, - type: "keyvalue", + type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd, }); - const tableaux = await bdTableaux.allAsJSON(); + const tableaux = await bdTableaux.all(); await fOublierBdTableaux(); - for (const idTableau of Object.keys(tableaux)) { + for (const {key: idTableau, value: tableau} of tableaux) { const idNouveauTableau: string = await this.client.tableaux!.copierTableau({ id: idTableau, idBd: idNouvelleBd, copierDonnées, }); - await nouvelleBdTableaux.set(idNouveauTableau, tableaux[idTableau]); + await nouvelleBdTableaux.set(idNouveauTableau, tableau); } } @@ -895,14 +889,14 @@ export default class BDs extends ComposanteClientListe { schémaBd, idNuéeUnique, clefTableau, - empreintePrécédente, + idÉlément, }: { vals: { [key: string]: élémentsBd | undefined }; schémaBd: schémaSpécificationBd; idNuéeUnique: string; clefTableau: string; - empreintePrécédente: string; - }): Promise { + idÉlément: string; + }): Promise { const idTableau = await uneFois( async (fSuivi: schémaFonctionSuivi) => { return await this.suivreIdTableauParClefDeBdUnique({ @@ -920,7 +914,7 @@ export default class BDs extends ComposanteClientListe { return await this.client.tableaux!.modifierÉlément({ idTableau: idTableau, vals, - empreintePrécédente, + idÉlément, }); } @@ -928,12 +922,12 @@ export default class BDs extends ComposanteClientListe { schémaBd, idNuéeUnique, clefTableau, - empreinte, + idÉlément, }: { schémaBd: schémaSpécificationBd; idNuéeUnique: string; clefTableau: string; - empreinte: string; + idÉlément: string; }): Promise { const idTableau = await uneFois( async (fSuivi: schémaFonctionSuivi) => { @@ -951,7 +945,7 @@ export default class BDs extends ComposanteClientListe { return await this.client.tableaux!.effacerÉlément({ idTableau: idTableau, - empreinte, + id: idÉlément, }); } @@ -1008,14 +1002,14 @@ export default class BDs extends ComposanteClientListe { async modifierÉlémentDeTableauParClef({ idBd, clefTableau, - empreinteÉlément, + idÉlément, vals, }: { idBd: string; clefTableau: string; - empreinteÉlément: string; + idÉlément: string; vals: { [key: string]: élémentsBd | undefined }; - }): Promise { + }): Promise { const idTableau = await uneFois( async (fSuivi: schémaFonctionSuivi) => { return await this.suivreIdTableauParClef({ @@ -1028,18 +1022,18 @@ export default class BDs extends ComposanteClientListe { return await this.client.tableaux!.modifierÉlément({ idTableau, vals, - empreintePrécédente: empreinteÉlément, + idÉlément, }); } async effacerÉlémentDeTableauParClef({ idBd, clefTableau, - empreinteÉlément, + idÉlément, }: { idBd: string; clefTableau: string; - empreinteÉlément: string; + idÉlément: string; }): Promise { const idTableau = await uneFois( async (fSuivi: schémaFonctionSuivi) => { @@ -1052,7 +1046,7 @@ export default class BDs extends ComposanteClientListe { ); this.client.tableaux!.effacerÉlément({ idTableau, - empreinte: empreinteÉlément, + id: idÉlément, }); } @@ -1352,7 +1346,7 @@ export default class BDs extends ComposanteClientListe { const idBdMotsClefs = await this.client.obtIdBd({ nom: "motsClefs", racine: idBd, - type: "feed", + type: "set", }); if (!idBdMotsClefs) { throw new Error(`Permission de modification refusée pour BD ${idBd}.`); @@ -1361,7 +1355,7 @@ export default class BDs extends ComposanteClientListe { const { bd: bdMotsClefs, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdMotsClefs, - type: "feed", + type: "set", schéma: schémaStructureBdMotsClefs, }); for (const id of idsMotsClefs) { @@ -1381,7 +1375,7 @@ export default class BDs extends ComposanteClientListe { const idBdMotsClefs = await this.client.obtIdBd({ nom: "motsClefs", racine: idBd, - type: "feed", + type: "set", }); if (!idBdMotsClefs) { throw new Error(`Permission de modification refusée pour BD ${idBd}.`); @@ -1390,14 +1384,11 @@ export default class BDs extends ComposanteClientListe { const { bd: bdMotsClefs, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdMotsClefs, - type: "feed", + type: "set", schéma: schémaStructureBdMotsClefs, }); - - await this.client.effacerÉlémentDeBdListe({ - bd: bdMotsClefs, - élément: idMotClef, - }); + + await bdMotsClefs.del(idMotClef); await fOublier(); } @@ -1413,7 +1404,7 @@ export default class BDs extends ComposanteClientListe { const idBdNuées = await this.client.obtIdBd({ nom: "nuées", racine: idBd, - type: "feed", + type: "set", }); if (!idBdNuées) { throw new Error(`Permission de modification refusée pour BD ${idBd}.`); @@ -1421,7 +1412,7 @@ export default class BDs extends ComposanteClientListe { const { bd: bdNuées, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdNuées, - type: "feed", + type: "set", schéma: schémaStructureBdNuées, }); for (const id of idsNuées) { @@ -1441,7 +1432,7 @@ export default class BDs extends ComposanteClientListe { const idBdNuées = await this.client.obtIdBd({ nom: "nuée", racine: idBd, - type: "feed", + type: "set", }); if (!idBdNuées) { throw new Error(`Permission de modification refusée pour BD ${idBd}.`); @@ -1449,14 +1440,11 @@ export default class BDs extends ComposanteClientListe { const { bd: bdNuées, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdNuées, - type: "feed", + type: "set", schéma: schémaStructureBdNuées, }); - await this.client.effacerÉlémentDeBdListe({ - bd: bdNuées, - élément: idNuée, - }); + await bdNuées.del(idNuée); await fOublier(); } @@ -1471,7 +1459,7 @@ export default class BDs extends ComposanteClientListe { const idBdTableaux = await this.client.obtIdBd({ nom: "tableaux", racine: idBd, - type: "keyvalue", + type: "ordered-keyvalue", }); if (!idBdTableaux) { throw new Error(`Permission de modification refusée pour BD ${idBd}.`); @@ -1480,14 +1468,13 @@ export default class BDs extends ComposanteClientListe { const { bd: bdTableaux, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, - type: "keyvalue", + type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd, }); clefTableau = clefTableau || uuidv4(); const idTableau = await this.client.tableaux!.créerTableau({ idBd }); await bdTableaux.set(idTableau, { - position: Object.keys(bdTableaux.all).length, clef: clefTableau, }); @@ -1807,7 +1794,7 @@ export default class BDs extends ComposanteClientListe { idBd: string; f: schémaFonctionSuivi; }): Promise { - const fFinale = async (infos: { [clef: string]: infoTableau }) => { + const fFinale = async (infos: { [id: string]: {clef: string} }) => { const tableaux: infoTableauAvecId[] = Object.entries(infos).map( ([id, info]) => { return { @@ -1972,18 +1959,18 @@ export default class BDs extends ComposanteClientListe { ["numérique", "catégorique"].includes(c.catégorie.catégorie) ); - const déjàVus: { empreinte: string; idColonne: string }[] = []; + const déjàVus: { id: string; idColonne: string }[] = []; const nCellulesÉrronnées = erreurs .map((e) => { return { - empreinte: e.empreinte, + id: e.id, idColonne: e.erreur.règle.colonne, }; }) .filter((x) => { const déjàVu = déjàVus.find( (y) => - y.empreinte === x.empreinte && y.idColonne === x.idColonne + y.id === x.id && y.idColonne === x.idColonne ); if (déjàVu) { return false; @@ -2257,10 +2244,10 @@ export default class BDs extends ComposanteClientListe { // D'abord effacer l'entrée dans notre liste de BDs const { bd: bdRacine, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: await this.obtIdBd(), - type: "feed", + type: "set", schéma: schémaBdPrincipale, }); - await this.client.effacerÉlémentDeBdListe({ bd: bdRacine, élément: idBd }); + await bdRacine.del(idBd); await fOublier(); // Et puis maintenant aussi effacer les données et la BD elle-même @@ -2274,13 +2261,13 @@ export default class BDs extends ComposanteClientListe { const idBdTableaux = await this.client.obtIdBd({ nom: "tableaux", racine: idBd, - type: "keyvalue", + type: "ordered-keyvalue", }); if (idBdTableaux) { const { bd: bdTableaux, fOublier: fOublierTableaux } = await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, - type: "keyvalue", + type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd, }); const tableaux: string[] = Object.keys(bdTableaux.all); diff --git a/src/client.ts b/src/client.ts index 0f9f124fd6..55f500dcfb 100644 --- a/src/client.ts +++ b/src/client.ts @@ -70,11 +70,11 @@ import { préparerOrbite, } from "@/orbite.js"; import { - TypedFeed, - TypedKeyValue + TypedKeyValue, + TypedSet } from "@constl/bohr-db"; import { - FeedDatabaseType + SetDatabaseType } from "@constl/orbit-db-kuiper" import Protocoles from "./protocoles.js"; @@ -723,7 +723,7 @@ export class ClientConstellation extends EventEmitter { return this.idCompte!; } - async copierContenuBdListe({ + async copierContenuBdDic({ bdBase, nouvelleBd, clef, @@ -734,34 +734,34 @@ export class ClientConstellation extends EventEmitter { clef: string; schéma: JSONSchemaType; }): Promise { - const idBdListeInit = await bdBase.get(clef); + const idBdDicInit = await bdBase.get(clef); - if (typeof idBdListeInit !== "string") return; + if (typeof idBdDicInit !== "string") return; - const { bd: bdListeInit, fOublier: fOublierInit } = + const { bd: bdDicInit, fOublier: fOublierInit } = await this.orbite!.ouvrirBdTypée({ - id: idBdListeInit, - type: "feed", + id: idBdDicInit, + type: "keyvalue", schéma, }); - const idNouvelleBdListe = await nouvelleBd.get(clef); - if (!idNouvelleBdListe) throw new Error("La nouvelle BD n'existait pas."); - if (typeof idNouvelleBdListe !== "string") - throw new Error(`${idNouvelleBdListe} n'est pas une adresse Orbite.`); + const idNouvelleBdDic = await nouvelleBd.get(clef); + if (!idNouvelleBdDic) throw new Error("La nouvelle BD n'existait pas."); + if (typeof idNouvelleBdDic !== "string") + throw new Error(`${idNouvelleBdDic} n'est pas une adresse Orbite.`); - const { bd: nouvelleBdListe, fOublier: fOublierNouvelle } = + const { bd: nouvelleBdDic, fOublier: fOublierNouvelle } = await this.orbite!.ouvrirBdTypée({ - id: idNouvelleBdListe, - type: "feed", + id: idNouvelleBdDic, + type: "keyvalue", schéma, }); - const données = (await bdListeInit.all()).map((x) => x.value); + const données = await bdDicInit.all(); await Promise.all( données.map(async (d) => { - await nouvelleBdListe.add(d); + await nouvelleBdDic.put(d.key, d.value); }) ); fOublierInit(); @@ -800,17 +800,17 @@ export class ClientConstellation extends EventEmitter { await fOublier2(); break; } - case "feed": { + case "set": { const { bd: bdBase, fOublier: fOublierBase } = await this.orbite!.ouvrirBd({ id: idBdBase, - type: "feed", + type: "set", }); const { bd: bd2, fOublier: fOublier2 } = await this.orbite!.ouvrirBd({ id: idBd2, - type: "feed", + type: "set", }); - await this.combinerBdsListe({ + await this.combinerBdsEnsemble({ bdBase, bd2, }); @@ -862,31 +862,31 @@ export class ClientConstellation extends EventEmitter { } } - async combinerBdsListe({ + async combinerBdsEnsemble({ bdBase, bd2, }: { - bdBase: TypedFeed | FeedDatabaseType; - bd2: TypedFeed | FeedDatabaseType; + bdBase: TypedSet | SetDatabaseType; + bd2: TypedSet | SetDatabaseType; }): Promise; - async combinerBdsListe({ + async combinerBdsEnsemble({ bdBase, bd2, index, }: { - bdBase: TypedFeed | FeedDatabaseType; - bd2: TypedFeed | FeedDatabaseType; + bdBase: TypedSet | SetDatabaseType; + bd2: TypedSet | SetDatabaseType; index: string[]; }): Promise; - async combinerBdsListe({ + async combinerBdsEnsemble({ bdBase, bd2, index, }: { bdBase: - | TypedFeed<{ [key: string]: élémentsBd } | élémentsBd> - | FeedDatabaseType; - bd2: TypedFeed<{ [key: string]: élémentsBd } | élémentsBd> | FeedDatabaseType; + | TypedSet<{ [key: string]: élémentsBd } | élémentsBd> + | SetDatabaseType; + bd2: TypedSet<{ [key: string]: élémentsBd } | élémentsBd> | SetDatabaseType; index?: string[]; }): Promise { const contenuBdBase = await bdBase.all(); @@ -897,7 +897,7 @@ export class ClientConstellation extends EventEmitter { if (index) { if (typeof valBd2 !== "object") - throw new Error(`Erreur combinaison listes : ${typeof valBd2}`); + throw new Error(`Erreur combinaison ensembles : ${typeof valBd2}`); const existant = contenuBdBase.find( (x) => typeof x.value === "object" && @@ -931,7 +931,7 @@ export class ClientConstellation extends EventEmitter { } } } - await bdBase.remove(existant.hash); + await bdBase.del(existant.value as T); await bdBase.add(combiné); } } @@ -957,7 +957,7 @@ export class ClientConstellation extends EventEmitter { type: "keyvalue"; schéma?: JSONSchemaType; }): Promise; - async suivreBd>({ + async suivreBd>({ id, f, type, @@ -965,7 +965,7 @@ export class ClientConstellation extends EventEmitter { }: { id: string; f: schémaFonctionSuivi; - type: "feed"; + type: "set"; schéma?: JSONSchemaType; }): Promise; async suivreBd({ @@ -983,7 +983,7 @@ export class ClientConstellation extends EventEmitter { }: { id: string; f: schémaFonctionSuivi; - type?: "keyvalue" | "feed"; + type?: "keyvalue" | "set"; schéma?: JSONSchemaType; }): Promise { if (!isValidAddress(id)) throw new Error(`Adresse "${id}" non valide.`); @@ -995,7 +995,7 @@ export class ClientConstellation extends EventEmitter { const lancerSuivi = () => { // Alambiqué, mais apparemment nécessaire pour TypeScript ! const promesseBd = schéma - ? type === "feed" + ? type === "set" ? this.orbite!.ouvrirBdTypée({ id, type, @@ -1301,7 +1301,7 @@ export class ClientConstellation extends EventEmitter { }): Promise { return await this.suivreBd({ id, - type: "feed", + type: "set", schéma, f: async (bd) => { const éléments = renvoyerValeur @@ -1312,51 +1312,6 @@ export class ClientConstellation extends EventEmitter { }); } - async obtÉlémentBdListeSelonEmpreinte({ - bd, - empreinte, - }: { - bd: TypedFeed; - empreinte: string; - }): Promise { - const élément = (await bd.all()).find((e) => e.hash === empreinte); - return élément?.value; - } - - async effacerÉlémentDeBdListe({ - bd, - élément, - }: { - bd: TypedFeed; - élément: T | ((e: { value: T; hash: string }) => boolean); - }): Promise { - const retrouvé = (await bd.all()).find((e) => - typeof élément === "function" ? élément(e) : deepEqual(e.value, élément) - ); - - if (retrouvé) await bd.remove(retrouvé.hash); - } - - async effacerÉlémentsDeBdListe({ - bd, - élément, - }: { - bd: TypedFeed; - élément: T | ((e: { value: T; hash: string }) => boolean); - }): Promise { - const tous = await bd.all(); - await Promise.all( - tous.map(async (e: { value: T; hash: string }) => { - const àEffacer = - typeof élément === "function" - ? élément(e) - : deepEqual(e.value, élément); - if (àEffacer) return await bd.remove(e.hash); - return Promise.resolve(); - }) - ); - } - async suivreTypeObjet({ idObjet, f, @@ -1762,28 +1717,6 @@ export class ClientConstellation extends EventEmitter { }); } - async rechercherBdListe({ - id, - f, - schéma, - }: { - id: string; - f: (e: { value: T; hash: string }) => boolean; - schéma: JSONSchemaType; - }): Promise<{ value: T; hash: string } | undefined> { - const { bd, fOublier } = await this.orbite!.ouvrirBdTypée({ - id, - type: "feed", - schéma, - }); - const élément = (await bd.all()).find((e: { value: T; hash: string }) => - f(e) - ); - - await fOublier(); - return élément; - } - async obtFichierSFIP({ id, max, @@ -2222,7 +2155,7 @@ export class ClientConstellation extends EventEmitter { let fOublierSuiviBd: schémaFonctionOublier; if (type === "keyvalue") { fOublierSuiviBd = await this.suivreBdDic({ id, f: fSuivreBd }); - } else if (type === "feed") { + } else if (type === "set") { fOublierSuiviBd = await this.suivreBdListe({ id, f: fSuivreBd }); } else { fOublierSuiviBd = faisRien; // Rien à suivre mais il faut l'inclure quand même ! diff --git a/src/composanteClient.ts b/src/composanteClient.ts index 40b26db6fc..c5e883ff02 100644 --- a/src/composanteClient.ts +++ b/src/composanteClient.ts @@ -14,7 +14,7 @@ import { cacheSuivi } from "./décorateursCache.js"; import { faisRien, ignorerNonDéfinis } from "@constl/utils-ipa"; import { JSONSchemaType } from "ajv"; -import { TypedFeed, TypedKeyValue } from "@constl/bohr-db"; +import { TypedSet, TypedKeyValue } from "@constl/bohr-db"; // Obtenu de https://stackoverflow.com/a/54520829 type KeysMatching = { @@ -24,7 +24,7 @@ type KeysMatching = { export class ComposanteClient { client: ClientConstellation; clef: KeysMatching; - typeBd: "keyvalue" | "feed"; + typeBd: "keyvalue" | "set"; constructor({ client, @@ -33,7 +33,7 @@ export class ComposanteClient { }: { client: ClientConstellation; clef: KeysMatching; - typeBd: "keyvalue" | "feed"; + typeBd: "keyvalue" | "set"; }) { this.client = client; this.clef = clef; @@ -220,13 +220,13 @@ export class ComposanteClientListe< super({ client, clef, - typeBd: "feed", + typeBd: "set", }); this.schémaBdPrincipale = schémaBdPrincipale; } async obtBd(): Promise<{ - bd: TypedFeed; + bd: TypedSet; fOublier: schémaFonctionOublier; }> { const id = await this.obtIdBd(); @@ -234,7 +234,7 @@ export class ComposanteClientListe< return await this.client.orbite!.ouvrirBdTypée({ id, - type: "feed", + type: "set", schéma: this.schémaBdPrincipale, }); } @@ -290,7 +290,7 @@ export class ComposanteClientListe< const idBd = await this.client.obtIdBd({ nom: this.clef, racine: id, - type: "feed", + type: "set", }); return await fSuivreBd(idBd); }, diff --git a/src/epingles.ts b/src/epingles.ts index 7b7d4d2b57..88427656aa 100644 --- a/src/epingles.ts +++ b/src/epingles.ts @@ -188,7 +188,7 @@ export default class Épingles { f: fSuivre, }); this.fsOublier[id] = fOublierBd; - } else if (bd.type === "feed") { + } else if (bd.type === "set") { const fOublierBd = await this.client.suivreBdListe({ id, f: fSuivre }); this.fsOublier[id] = fOublierBd; } diff --git a/src/motsClefs.ts b/src/motsClefs.ts index 0fb75d1a0e..3f065394f0 100644 --- a/src/motsClefs.ts +++ b/src/motsClefs.ts @@ -113,15 +113,8 @@ export default class MotsClefs extends ComposanteClientListe { }: { idMotClef: string; }): Promise { - const { bd: bdRacine, fOublier } = await this.client.orbite!.ouvrirBdTypée({ - id: await this.obtIdBd(), - type: "feed", - schéma: schémaBdPrincipale, - }); - await this.client.effacerÉlémentDeBdListe({ - bd: bdRacine, - élément: idMotClef, - }); + const { bd: bdRacine, fOublier } = await this.obtBd(); + await bdRacine.del(idMotClef); await fOublier(); } diff --git "a/src/nu\303\251e.ts" "b/src/nu\303\251e.ts" index af01edd92b..d92f8fd968 100644 --- "a/src/nu\303\251e.ts" +++ "b/src/nu\303\251e.ts" @@ -33,7 +33,6 @@ import { type différenceBDTableauSupplémentaire, type différenceTableauxBds, type donnéesBdExportées, - type infoTableau, type infoTableauAvecId, type schémaSpécificationBd, schémaBdTableauxDeBd, @@ -230,7 +229,7 @@ export default class Nuée extends ComposanteClientListe { await bdNuée.set("métadonnées", idBdMétadonnées); const idBdMotsClefs = await this.client.créerBdIndépendante({ - type: "feed", + type: "set", optionsAccès, }); await bdNuée.set("motsClefs", idBdMotsClefs); @@ -252,10 +251,7 @@ export default class Nuée extends ComposanteClientListe { async enleverDeMesNuées({ idNuée }: { idNuée: string }): Promise { const { bd: bdRacine, fOublier } = await this.obtBd(); - await this.client.effacerÉlémentDeBdListe({ - bd: bdRacine, - élément: idNuée, - }); + await bdRacine.del(idNuée); await fOublier(); } @@ -333,7 +329,7 @@ export default class Nuée extends ComposanteClientListe { const { bd: bdMotsClefs, fOublier: fOublierBdMotsClefs } = await this.client.orbite!.ouvrirBdTypée({ id: idBdMotsClefs, - type: "feed", + type: "set", schéma: schémaBdMotsClefsNuée, }); const motsClefs = (await bdMotsClefs.all()).map((x) => x.value); @@ -838,7 +834,7 @@ export default class Nuée extends ComposanteClientListe { const idBdMotsClefs = await this.client.obtIdBd({ nom: "motsClefs", racine: idNuée, - type: "feed", + type: "set", }); if (!idBdMotsClefs) { throw new Error(`Permission de modification refusée pour BD ${idNuée}.`); @@ -847,7 +843,7 @@ export default class Nuée extends ComposanteClientListe { const { bd: bdMotsClefs, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdMotsClefs, - type: "feed", + type: "set", schéma: schémaBdMotsClefsNuée, }); for (const id of idsMotsClefs) { @@ -867,7 +863,7 @@ export default class Nuée extends ComposanteClientListe { const idBdMotsClefs = await this.client.obtIdBd({ nom: "motsClefs", racine: idNuée, - type: "feed", + type: "set", }); if (!idBdMotsClefs) { throw new Error(`Permission de modification refusée pour BD ${idNuée}.`); @@ -876,14 +872,11 @@ export default class Nuée extends ComposanteClientListe { const { bd: bdMotsClefs, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdMotsClefs, - type: "feed", + type: "set", schéma: schémaBdMotsClefsNuée, }); - await this.client.effacerÉlémentDeBdListe({ - bd: bdMotsClefs, - élément: idMotClef, - }); + await bdMotsClefs.del(idMotClef); await fOublier(); } @@ -1327,16 +1320,13 @@ export default class Nuée extends ComposanteClientListe { } const { bd: bdTableaux, fOublier } = - await this.client.orbite!.ouvrirBdTypée<{ - [tbl: string]: infoTableau; - }>({ id: idBdTableaux, type: "keyvalue", schéma: schémaBdTableauxDeBd }); + await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, type: "keyvalue", schéma: schémaBdTableauxDeBd }); clefTableau = clefTableau || uuidv4(); const idTableau = await this.client.tableaux!.créerTableau({ idBd: idNuée, }); await bdTableaux.set(idTableau, { - position: Object.keys(bdTableaux.all).length, clef: clefTableau, }); @@ -1391,7 +1381,7 @@ export default class Nuée extends ComposanteClientListe { id: string, fSuivreBranche: schémaFonctionSuivi ) => { - const fFinaleTableaux = (infos: { [clef: string]: infoTableau }) => { + const fFinaleTableaux = (infos: { [id: string]: {clef: string} }) => { const tableaux: infoTableauAvecId[] = Object.entries(infos).map( ([idTableau, info]) => { return { @@ -2424,7 +2414,7 @@ export default class Nuée extends ComposanteClientListe { idCompte: auteur, élément: d, valid: erreursÉléments.filter( - (e) => e.empreinte == d.empreinte + (e) => e.id == d.id ), }; }) @@ -2844,10 +2834,7 @@ export default class Nuée extends ComposanteClientListe { async effacerNuée({ idNuée }: { idNuée: string }): Promise { // D'abord effacer l'entrée dans notre liste de BDs const { bd: bdRacine, fOublier } = await this.obtBd(); - await this.client.effacerÉlémentDeBdListe({ - bd: bdRacine, - élément: idNuée, - }); + await bdRacine.del(idNuée); await fOublier(); // Et puis maintenant aussi effacer les tableaux et la Nuée elle-même diff --git a/src/profil.ts b/src/profil.ts index aa57035aaf..9afac0256f 100644 --- a/src/profil.ts +++ b/src/profil.ts @@ -111,7 +111,7 @@ export default class Profil extends ComposanteClientDic { const idBdContacts = await this.client.obtIdBd({ nom: "contacts", racine: idBdProfil, - type: "feed", + type: "set", }); if (!idBdContacts) { throw new Error( @@ -121,7 +121,7 @@ export default class Profil extends ComposanteClientDic { const { bd, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdContacts, - type: "feed", + type: "set", schéma: schémaContactProfil, }); await bd.add({ type, contact }); @@ -139,7 +139,7 @@ export default class Profil extends ComposanteClientDic { const idBdContacts = await this.client.obtIdBd({ nom: "contacts", racine: idBdProfil, - type: "feed", + type: "set", }); if (!idBdContacts) { throw new Error( @@ -149,15 +149,18 @@ export default class Profil extends ComposanteClientDic { const { bd, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdContacts, - type: "feed", + type: "set", schéma: schémaContactProfil, }); - this.client.effacerÉlémentsDeBdListe({ - bd, - élément: (x) => - x.value.type === type && - (contact === undefined || x.value.contact === contact), - }); + const tous = await bd.all(); + const àEffacer = tous.filter((x) => + x.value.type === type && + (contact === undefined || x.value.contact === contact) + ) + await Promise.all( + àEffacer.map(async (c) => await bd.del(c.value)) + ); + await fOublier(); } diff --git a/src/projets.ts b/src/projets.ts index c6d8a7ac6e..2947ce13a6 100644 --- a/src/projets.ts +++ b/src/projets.ts @@ -25,7 +25,7 @@ import { traduire, zipper, uneFois } from "@constl/utils-ipa"; import { ComposanteClientListe } from "./composanteClient.js"; import { JSONSchemaType } from "ajv"; import { schémaCopiéDe } from "./bds.js"; -import { TypedFeed, TypedKeyValue } from "@constl/bohr-db"; +import { TypedKeyValue, TypedSet } from "@constl/bohr-db"; import { estUnContrôleurConstellation } from "./accès/utils.js"; const schémaStructureBdMotsClefsdeProjet: JSONSchemaType = { @@ -113,7 +113,7 @@ export default class Projets extends ComposanteClientListe { const { bd: bdRacine, fOublier: fOublierRacine } = await this.client.orbite!.ouvrirBdTypée({ id: await this.obtIdBd(), - type: "feed", + type: "set", schéma: schémaBdPrincipale, }); const idBdProjet = await this.client.créerBdIndépendante({ @@ -152,13 +152,13 @@ export default class Projets extends ComposanteClientListe { await bdProjet.set("descriptions", idBdDescr); const idBdBds = await this.client.créerBdIndépendante({ - type: "feed", + type: "set", optionsAccès, }); await bdProjet.set("bds", idBdBds); const idBdMotsClefs = await this.client.créerBdIndépendante({ - type: "feed", + type: "set", optionsAccès, }); await bdProjet.set("motsClefs", idBdMotsClefs); @@ -221,7 +221,7 @@ export default class Projets extends ComposanteClientListe { const { bd: bdMotsClefs, fOublier: fOublierMotsClefs } = await this.client.orbite!.ouvrirBdTypée({ id: idBdMotsClefs, - type: "feed", + type: "set", schéma: schémaStructureBdMotsClefsdeProjet, }); const idsMotsClefs = (await bdMotsClefs.all()).map((x) => x.value); @@ -237,7 +237,7 @@ export default class Projets extends ComposanteClientListe { const { bd: bdBds, fOublier: fOublierBds } = await this.client.orbite!.ouvrirBdTypée({ id: idBdBds, - type: "feed", + type: "set", schéma: schémaStuctureBdsDeProjet, }); const bds = (await bdBds.all()).map((x) => x.value); @@ -266,7 +266,7 @@ export default class Projets extends ComposanteClientListe { async ajouterÀMesProjets({ idProjet }: { idProjet: string }): Promise { const { bd: bdRacine, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: await this.obtIdBd(), - type: "feed", + type: "set", schéma: schémaBdPrincipale, }); await bdRacine.add(idProjet); @@ -276,13 +276,10 @@ export default class Projets extends ComposanteClientListe { async enleverDeMesProjets({ idProjet }: { idProjet: string }): Promise { const { bd: bdRacine, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: await this.obtIdBd(), - type: "feed", + type: "set", schéma: schémaBdPrincipale, }); - await this.client.effacerÉlémentDeBdListe({ - bd: bdRacine, - élément: idProjet, - }); + await bdRacine.del(idProjet); await fOublier(); } @@ -430,11 +427,11 @@ export default class Projets extends ComposanteClientListe { idProjet, }: { idProjet: string; - }): Promise<{ bd: TypedFeed; fOublier: schémaFonctionOublier }> { + }): Promise<{ bd: TypedSet; fOublier: schémaFonctionOublier }> { const idBdMotsClefs = await this.client.obtIdBd({ nom: "motsClefs", racine: idProjet, - type: "feed", + type: "set", }); if (!idBdMotsClefs) { throw new Error( @@ -444,7 +441,7 @@ export default class Projets extends ComposanteClientListe { return await this.client.orbite!.ouvrirBdTypée({ id: idBdMotsClefs, - type: "feed", + type: "set", schéma: schémaStructureBdMotsClefsdeProjet, }); } @@ -483,10 +480,7 @@ export default class Projets extends ComposanteClientListe { const { bd: bdMotsClefs, fOublier } = await this._obtBdMotsClefs({ idProjet, }); - await this.client.effacerÉlémentDeBdListe({ - bd: bdMotsClefs, - élément: idMotClef, - }); + await bdMotsClefs.del(idMotClef); await fOublier(); } @@ -494,11 +488,11 @@ export default class Projets extends ComposanteClientListe { idProjet, }: { idProjet: string; - }): Promise<{ bd: TypedFeed; fOublier: schémaFonctionOublier }> { + }): Promise<{ bd: TypedSet; fOublier: schémaFonctionOublier }> { const idBdBds = await this.client.obtIdBd({ nom: "bds", racine: idProjet, - type: "feed", + type: "set", }); if (!idBdBds) throw new Error( @@ -507,7 +501,7 @@ export default class Projets extends ComposanteClientListe { return await this.client.orbite!.ouvrirBdTypée({ id: idBdBds, - type: "feed", + type: "set", schéma: schémaStructureBdMotsClefsdeProjet, }); } @@ -534,7 +528,7 @@ export default class Projets extends ComposanteClientListe { const { bd: bdBds, fOublier } = await this._obtBdBds({ idProjet }); // Effacer l'entrée dans notre liste de bds (n'efface pas la BD elle-même) - await this.client.effacerÉlémentDeBdListe({ bd: bdBds, élément: idBd }); + await bdBds.del(idBd); await fOublier(); } diff --git a/src/tableaux.ts b/src/tableaux.ts index 041e020c62..1b2954bee0 100644 --- a/src/tableaux.ts +++ b/src/tableaux.ts @@ -27,7 +27,6 @@ import { erreurRègleBornesVariableNonPrésente, erreurRègleCatégoriqueColonneInexistante, détailsRègleBornesDynamiqueColonne, - schémaRègleColonne, } from "@/valid.js"; import type { catégorieBaseVariables, @@ -50,7 +49,7 @@ export interface élémentDonnées< T extends élémentBdListeDonnées = élémentBdListeDonnées > { données: T; - empreinte: string; + id: string; } export type élémentBdListeDonnées = { @@ -91,37 +90,84 @@ export type conversionDonnéesChaîne = { langue: string; }; -const schémaInfoColAvecCatégorie: JSONSchemaType = { +const schémaBdInfoColAvecCatégorie: JSONSchemaType<{[id: string]: InfoColAvecCatégorie}> = { type: "object", - properties: { - catégorie: { - type: "object", - nullable: true, - properties: { - catégorie: { type: "string" }, - type: { type: "string" }, + additionalProperties: { + type: "object", + properties: { + catégorie: { + type: "object", + nullable: true, + properties: { + catégorie: { type: "string" }, + type: { type: "string" }, + }, + required: ["catégorie", "type"], + }, + id: { type: "string" }, + variable: { + type: "string", + }, + index: { + type: "boolean", + nullable: true, }, - required: ["catégorie", "type"], - }, - id: { type: "string" }, - variable: { - type: "string", }, - index: { - type: "boolean", - nullable: true, + required: ["id", "variable"], + }, + required: [] +}; + +const schémaBdDonnéesTableau: JSONSchemaType<{[id: string]: { [clef: string]: élémentsBd }}> = { + type: "object", + additionalProperties: { + type: "object", + properties: { + id: { type: "string" }, }, + additionalProperties: true, + required: ["id"], }, - required: ["id", "variable"], + required: [], }; -const schémaDonnéesTableau: JSONSchemaType<{ [clef: string]: élémentsBd }> = { + +export const schémaBdRègles: JSONSchemaType<{[idRègle: string]: règleColonne}> = { type: "object", - properties: { - id: { type: "string" }, + additionalProperties: { + type: "object", + properties: { + colonne: { type: "string" }, + source: { + type: "object", + properties: { + id: { type: "string" }, + type: { type: "string" }, + }, + required: ["id", "type"], + }, + règle: { + type: "object", + properties: { + id: { type: "string" }, + règle: { + type: "object", + properties: { + détails: { + type: "object", + required: [], + }, + typeRègle: { type: "string" }, + }, + required: ["détails", "typeRègle"], + }, + }, + required: ["id", "règle"], + }, + }, + required: ["colonne", "règle", "source"], }, - additionalProperties: true, - required: ["id"], + required: [] }; export function élémentsÉgaux( @@ -224,19 +270,19 @@ export default class Tableaux { await bdTableau.set("noms", idBdNoms); const idBdDonnées = await this.client.créerBdIndépendante({ - type: "feed", + type: "keyvalue", optionsAccès, }); await bdTableau.set("données", idBdDonnées); const idBdColonnes = await this.client.créerBdIndépendante({ - type: "feed", + type: "keyvalue", optionsAccès, }); await bdTableau.set("colonnes", idBdColonnes); const idBdRègles = await this.client.créerBdIndépendante({ - type: "feed", + type: "keyvalue", optionsAccès, }); await bdTableau.set("règles", idBdRègles); @@ -283,28 +329,28 @@ export default class Tableaux { } // Copier les colonnes - await this.client.copierContenuBdListe({ + await this.client.copierContenuBdDic({ bdBase, nouvelleBd, clef: "colonnes", - schéma: schémaInfoColAvecCatégorie, + schéma: schémaBdInfoColAvecCatégorie, }); // Copier les règles - await this.client.copierContenuBdListe({ + await this.client.copierContenuBdDic({ bdBase, nouvelleBd, clef: "règles", - schéma: schémaRègleColonne, + schéma: schémaBdRègles, }); if (copierDonnées) { // Copier les données - await this.client.copierContenuBdListe({ + await this.client.copierContenuBdDic({ bdBase, nouvelleBd, clef: "données", - schéma: schémaDonnéesTableau, + schéma: schémaBdDonnéesTableau, }); } @@ -415,7 +461,7 @@ export default class Tableaux { const idBdColonnes = await this.client.obtIdBd({ nom: "colonnes", racine: idTableau, - type: "feed", + type: "keyvalue", }); if (!idBdColonnes) { throw new Error( @@ -426,18 +472,17 @@ export default class Tableaux { const { bd: bdColonnes, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdColonnes, - type: "feed", - schéma: schémaInfoColAvecCatégorie, + type: "keyvalue", + schéma: schémaBdInfoColAvecCatégorie, }); const éléments = await bdColonnes.all(); const élémentCol = éléments.find((x) => x.value.id === idColonne); - // Changer uniquement si la colonne existe et était déjà sous le même statut que `val` + // Changer uniquement si la colonne existe et n'était pas déjà sous le même statut que `val` if (élémentCol && Boolean(élémentCol.value.index) !== val) { const { value } = élémentCol; const nouvelÉlément: InfoCol = Object.assign(value, { index: val }); - await bdColonnes.remove(élémentCol.hash); - await bdColonnes.add(nouvelÉlément); + await bdColonnes.put(idColonne, nouvelÉlément); } await fOublier(); @@ -469,7 +514,7 @@ export default class Tableaux { clefsSelonVariables?: boolean; }): Promise { const info: { - données?: { value: T; hash: string }[]; + données?: {[id: string]: T}; colonnes?: { [key: string]: string }; } = {}; @@ -477,10 +522,8 @@ export default class Tableaux { const { données, colonnes } = info; if (données && colonnes) { - const donnéesFinales: élémentDonnées[] = données.map( - (x): élémentDonnées => { - const empreinte = x.hash; - const élément = x.value; + const donnéesFinales: élémentDonnées[] = Object.entries(données).map( + ([id, élément]): élémentDonnées => { const données: T = clefsSelonVariables ? Object.keys(élément).reduce((acc: T, elem: string) => { @@ -491,7 +534,7 @@ export default class Tableaux { }, {} as T) : élément; - return { données, empreinte }; + return { données, id }; } ); await f(donnéesFinales); @@ -510,16 +553,15 @@ export default class Tableaux { catégories: false, }); - const fSuivreDonnées = async (données: { value: T; hash: string }[]) => { + const fSuivreDonnées = async (données: {[id: string]: T}) => { info.données = données; await fFinale(); }; - const oublierDonnées = await this.client.suivreBdListeDeClef({ + const oublierDonnées = await this.client.suivreBdDicDeClef({ id: idTableau, clef: "données", f: fSuivreDonnées, - schéma: schémaDonnéesTableau, - renvoyerValeur: false, + schéma: schémaBdDonnéesTableau, }); return async () => { @@ -721,7 +763,7 @@ export default class Tableaux { const idBdDonnées = await this.client.obtIdBd({ nom: "données", racine: idTableau, - type: "feed", + type: "keyvalue", }); if (!idBdDonnées) { throw new Error( @@ -732,35 +774,36 @@ export default class Tableaux { const { bd: bdDonnées, fOublier } = await this.client.orbite!.ouvrirBdTypée( { id: idBdDonnées, - type: "feed", - schéma: schémaDonnéesTableau, + type: "keyvalue", + schéma: schémaBdDonnéesTableau, } ); - const empreintes: string[] = []; + const ids: string[] = []; for (const val of vals) { const id = uuidv4(); - empreintes.push(await bdDonnées.add({ ...val, id })); + await bdDonnées.put(id, val) + ids.push(id); } await fOublier(); - return empreintes; + return ids; } async modifierÉlément({ idTableau, vals, - empreintePrécédente, + idÉlément, }: { idTableau: string; vals: { [key: string]: élémentsBd | undefined }; - empreintePrécédente: string; - }): Promise { + idÉlément: string; + }): Promise { const idBdDonnées = await this.client.obtIdBd({ nom: "données", racine: idTableau, - type: "feed", + type: "keyvalue", }); if (!idBdDonnées) { throw new Error( @@ -771,15 +814,13 @@ export default class Tableaux { const { bd: bdDonnées, fOublier } = await this.client.orbite!.ouvrirBdTypée( { id: idBdDonnées, - type: "feed", - schéma: schémaDonnéesTableau, + type: "keyvalue", + schéma: schémaBdDonnéesTableau, } ); - const précédent = (await this.client.obtÉlémentBdListeSelonEmpreinte({ - bd: bdDonnées, - empreinte: empreintePrécédente, - })) as { [key: string]: élémentsBd }; + const précédent = await bdDonnées.get(idÉlément); + if (!précédent) throw new Error(`Id élément ${idÉlément} n'existe pas.`) const élément = Object.assign({}, précédent, vals); @@ -788,16 +829,9 @@ export default class Tableaux { }); if (!élémentsÉgaux(élément, précédent)) { - const résultat = await Promise.all([ - bdDonnées.remove(empreintePrécédente), - bdDonnées.add(élément), - ]); - await fOublier(); - return résultat[1]; - } else { - await fOublier(); - return Promise.resolve(empreintePrécédente); + await bdDonnées.put(idÉlément, élément) } + await fOublier(); } async vérifierClefsÉlément({ @@ -810,7 +844,7 @@ export default class Tableaux { const idBdColonnes = await this.client.obtIdBd({ nom: "colonnes", racine: idTableau, - type: "feed", + type: "keyvalue", }); if (!idBdColonnes) { throw new Error( @@ -821,8 +855,8 @@ export default class Tableaux { const { bd: bdColonnes, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdColonnes, - type: "feed", - schéma: schémaInfoColAvecCatégorie, + type: "keyvalue", + schéma: schémaBdInfoColAvecCatégorie, }); const idsColonnes: string[] = (await bdColonnes.all()).map( (e) => e.value.id @@ -840,15 +874,15 @@ export default class Tableaux { async effacerÉlément({ idTableau, - empreinte, + id, }: { idTableau: string; - empreinte: string; + id: string; }): Promise { const idBdDonnées = await this.client.obtIdBd({ nom: "données", racine: idTableau, - type: "feed", + type: "keyvalue", }); if (!idBdDonnées) { throw new Error( @@ -859,11 +893,11 @@ export default class Tableaux { const { bd: bdDonnées, fOublier } = await this.client.orbite!.ouvrirBdTypée( { id: idBdDonnées, - type: "feed", - schéma: schémaDonnéesTableau, + type: "keyvalue", + schéma: schémaBdDonnéesTableau, } ); - await bdDonnées.remove(empreinte); + await bdDonnées.del(id); await fOublier(); } @@ -933,7 +967,7 @@ export default class Tableaux { if (Object.keys(àAjouter).length) { await this.effacerÉlément({ idTableau: idTableauBase, - empreinte: existant.empreinte, + id: existant.id, }); await this.ajouterÉlément({ idTableau: idTableauBase, @@ -1306,12 +1340,12 @@ export default class Tableaux { const àEffacer: string[] = []; for (const élément of donnéesTableau) { if (!donnéesConverties.some((x) => élémentsÉgaux(x, élément.données))) { - àEffacer.push(élément.empreinte); + àEffacer.push(élément.id); } } - for (const e of àEffacer) { - await this.effacerÉlément({ idTableau, empreinte: e }); + for (const id of àEffacer) { + await this.effacerÉlément({ idTableau, id }); } for (const n of nouveaux) { @@ -1434,7 +1468,7 @@ export default class Tableaux { const idBdColonnes = await this.client.obtIdBd({ nom: "colonnes", racine: idTableau, - type: "feed", + type: "keyvalue", }); if (!idBdColonnes) { throw new Error( @@ -1445,17 +1479,19 @@ export default class Tableaux { const { bd: bdColonnes, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdColonnes, - type: "feed", - schéma: schémaInfoColAvecCatégorie, + type: "keyvalue", + schéma: schémaBdInfoColAvecCatégorie, }); - const entrée: InfoCol = { - id: idColonne || uuidv4(), + + idColonne = idColonne || uuidv4(); + const élément: InfoCol = { + id: idColonne, variable: idVariable, }; - await bdColonnes.add(entrée); + await bdColonnes.put(idColonne, élément); await fOublier(); - return entrée.id; + return idColonne; } async effacerColonneTableau({ @@ -1468,7 +1504,7 @@ export default class Tableaux { const idBdColonnes = await this.client.obtIdBd({ nom: "colonnes", racine: idTableau, - type: "feed", + type: "keyvalue", }); if (!idBdColonnes) { throw new Error( @@ -1479,13 +1515,10 @@ export default class Tableaux { const { bd: bdColonnes, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdColonnes, - type: "feed", - schéma: schémaInfoColAvecCatégorie, + type: "keyvalue", + schéma: schémaBdInfoColAvecCatégorie, }); - await this.client.effacerÉlémentDeBdListe({ - bd: bdColonnes, - élément: (x) => x.value.id === idColonne, - }); + await bdColonnes.del(idColonne); await fOublier(); } @@ -1578,7 +1611,7 @@ export default class Tableaux { return await this.client.suivreBdListeDeClef({ id: idTableau, clef: "colonnes", - schéma: schémaInfoColAvecCatégorie, + schéma: schémaBdInfoColAvecCatégorie, f: fFinale, }); } @@ -1627,7 +1660,7 @@ export default class Tableaux { const idBdRègles = await this.client.obtIdBd({ nom: "règles", racine: idTableau, - type: "feed", + type: "keyvalue", }); if (!idBdRègles) { throw new Error( @@ -1637,8 +1670,8 @@ export default class Tableaux { const { bd: bdRègles, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdRègles, - type: "feed", - schéma: schémaRègleColonne, + type: "keyvalue", + schéma: schémaBdRègles, }); const id = uuidv4(); @@ -1647,12 +1680,12 @@ export default class Tableaux { règle, }; - const entrée: règleColonne = { + const élément: règleColonne = { règle: règleAvecId, source: { type: "tableau", id: idTableau }, colonne: idColonne, }; - await bdRègles.add(entrée); + await bdRègles.put(id, élément); await fOublier(); @@ -1669,7 +1702,7 @@ export default class Tableaux { const idBdRègles = await this.client.obtIdBd({ nom: "règles", racine: idTableau, - type: "feed", + type: "keyvalue", }); if (!idBdRègles) { @@ -1680,14 +1713,11 @@ export default class Tableaux { const { bd: bdRègles, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdRègles, - type: "feed", - schéma: schémaRègleColonne, + type: "keyvalue", + schéma: schémaBdRègles, }); - await this.client.effacerÉlémentDeBdListe({ - bd: bdRègles, - élément: (é) => é.value.règle.id === idRègle, - }); + await bdRègles.del(idRègle); await fOublier(); } @@ -1708,15 +1738,15 @@ export default class Tableaux { }; // Suivre les règles spécifiées dans le tableau - const fFinaleRèglesTableau = async (règles: règleColonne[]) => { - dicRègles.tableau = règles; + const fFinaleRèglesTableau = async (règles: {[id: string]: règleColonne}) => { + dicRègles.tableau = Object.values(règles); return await fFinale(); }; - const oublierRèglesTableau = await this.client.suivreBdListeDeClef({ + const oublierRèglesTableau = await this.client.suivreBdDicDeClef({ id: idTableau, clef: "règles", - schéma: schémaRègleColonne, + schéma: schémaBdRègles, f: fFinaleRèglesTableau, }); diff --git a/src/valid.ts b/src/valid.ts index d6e608f91a..e361dfb4c2 100644 --- a/src/valid.ts +++ b/src/valid.ts @@ -21,26 +21,6 @@ export type règleVariableAvecId = { règle: T; }; -export const schémaRègleVariableAvecId: JSONSchemaType = { - type: "object", - properties: { - id: { type: "string" }, - règle: { - type: "object", - properties: { - typeRègle: { type: "string" }, - détails: { - type: "object", - required: [], - additionalProperties: true, - }, - }, - required: ["détails", "typeRègle"], - }, - }, - required: ["id", "règle"], -}; - export type règleVariable = | règleExiste | règleBornes @@ -58,40 +38,6 @@ export type règleColonne = { colonne: string; }; -export const schémaRègleColonne: JSONSchemaType = { - type: "object", - properties: { - colonne: { type: "string" }, - source: { - type: "object", - properties: { - id: { type: "string" }, - type: { type: "string" }, - }, - required: ["id", "type"], - }, - règle: { - type: "object", - properties: { - id: { type: "string" }, - règle: { - type: "object", - properties: { - détails: { - type: "object", - required: [], - }, - typeRègle: { type: "string" }, - }, - required: ["détails", "typeRègle"], - }, - }, - required: ["id", "règle"], - }, - }, - required: ["colonne", "règle", "source"], -}; - export type détailsRègleVariable = | détailsRègleExiste | détailsRègleBornes @@ -169,7 +115,7 @@ export type Erreur = { }; export type erreurValidation = { - empreinte: string; + id: string; erreur: Erreur; }; @@ -221,9 +167,9 @@ export function générerFonctionRègle< return (vals: élémentDonnées[]): erreurValidation[] => { const nonValides = vals.filter((v) => v.données[colonne] === undefined); return nonValides.map((v: élémentDonnées) => { - const { empreinte } = v; + const { id } = v; const erreur: erreurValidation = { - empreinte, + id, erreur: { règle }, }; return erreur; @@ -239,9 +185,9 @@ export function générerFonctionRègle< (v) => !validerCatégorieVal({ val: v.données[colonne], catégorie }) ); return nonValides.map((v: élémentDonnées) => { - const { empreinte } = v; + const { id } = v; const erreur: erreurValidation = { - empreinte, + id, erreur: { règle }, }; return erreur; @@ -307,9 +253,9 @@ export function générerFonctionRègle< (v) => !validerBorneVal({ val: v, fComp }) ); return nonValides.map((v: élémentDonnées) => { - const { empreinte } = v; + const { id } = v; const erreur: erreurValidation = { - empreinte, + id, erreur: { règle }, }; return erreur; @@ -335,9 +281,9 @@ export function générerFonctionRègle< !options.includes(v.données[colonne]) ); return nonValides.map((v: élémentDonnées) => { - const { empreinte } = v; + const { id } = v; return { - empreinte, + id, colonne, erreur: { règle }, }; diff --git a/src/variables.ts b/src/variables.ts index 5788a471b0..a093d5459d 100644 --- a/src/variables.ts +++ b/src/variables.ts @@ -3,10 +3,9 @@ import { v4 as uuidv4 } from "uuid"; import ClientConstellation from "@/client.js"; import générerContrôleurConstellation from "@/accès/cntrlConstellation.js"; import { - type règleVariableAvecId, type règleVariable, type règleCatégorie, - schémaRègleVariableAvecId, + règleVariableAvecId, } from "@/valid.js"; import type { objRôles } from "@/accès/types.js"; @@ -96,6 +95,24 @@ const schémaStructureBdVariable: JSONSchemaType> = required: [], }; +export type structureBdRèglesVariable = {[idRègle: string]: règleVariable} +export const schémaBdRèglesVariable: JSONSchemaType = { + type: "object", + additionalProperties: { + type: "object", + properties: { + typeRègle: { type: "string" }, + détails: { + type: "object", + required: [], + additionalProperties: true, + }, + }, + required: ["détails", "typeRègle"], + }, + required: [] +}; + export default class Variables extends ComposanteClientListe { constructor({ client }: { client: ClientConstellation }) { super({ client, clef: "variables", schémaBdPrincipale }); @@ -161,7 +178,7 @@ export default class Variables extends ComposanteClientListe { await bdVariable.set("descriptions", idBdDescr); const idBdRègles = await this.client.créerBdIndépendante({ - type: "feed", + type: "keyvalue", optionsAccès, }); await bdVariable.set("règles", idBdRègles); @@ -186,11 +203,7 @@ export default class Variables extends ComposanteClientListe { }: { idVariable: string; }): Promise { - const { bd, fOublier } = await this.client.orbite!.ouvrirBdTypée({ - id: await this.obtIdBd(), - type: "feed", - schéma: schémaBdPrincipale, - }); + const { bd, fOublier } = await this.obtBd(); await bd.add(idVariable); await fOublier(); } @@ -200,15 +213,8 @@ export default class Variables extends ComposanteClientListe { }: { idVariable: string; }): Promise { - const { bd: bdRacine, fOublier } = await this.client.orbite!.ouvrirBdTypée({ - id: await this.obtIdBd(), - type: "feed", - schéma: schémaBdPrincipale, - }); - await this.client.effacerÉlémentDeBdListe({ - bd: bdRacine, - élément: idVariable, - }); + const { bd: bdRacine, fOublier } = await this.obtBd(); + await bdRacine.del(idVariable); await fOublier(); } @@ -272,16 +278,17 @@ export default class Variables extends ComposanteClientListe { const { bd: bdRègles, fOublier: fOublierBdRègles } = await this.client.orbite!.ouvrirBdTypée({ id: idBdRègles, - type: "feed", - schéma: schémaRègleVariableAvecId, + type: "keyvalue", + schéma: schémaBdRèglesVariable, }); - const règles = (await bdRègles.all()).map((x) => x.value); + const règles = await bdRègles.allAsJSON(); await fOublierBdRègles(); await Promise.all( - règles.map(async (r: règleVariableAvecId) => { + Object.entries(règles).map(async ([id, r]) => { await this.ajouterRègleVariable({ idVariable: idNouvelleBd, - règle: r.règle, + règle: r, + idRègle: id, }); }) ); @@ -538,7 +545,7 @@ export default class Variables extends ComposanteClientListe { const idBdRègles = await this.client.obtIdBd({ nom: "règles", racine: idVariable, - type: "feed", + type: "keyvalue", }); if (!idBdRègles) { throw new Error( @@ -547,16 +554,13 @@ export default class Variables extends ComposanteClientListe { } idRègle = idRègle || uuidv4(); - const règleAvecId: règleVariableAvecId = { - id: idRègle, - règle, - }; + const { bd: bdRègles, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdRègles, - type: "feed", - schéma: schémaRègleVariableAvecId, + type: "keyvalue", + schéma: schémaBdRèglesVariable, }); - await bdRègles.add(règleAvecId); + await bdRègles.put(idRègle, règle); await fOublier(); @@ -573,7 +577,7 @@ export default class Variables extends ComposanteClientListe { const idBdRègles = await this.client.obtIdBd({ nom: "règles", racine: idVariable, - type: "feed", + type: "keyvalue", }); if (!idBdRègles) { throw new Error( @@ -582,14 +586,11 @@ export default class Variables extends ComposanteClientListe { } const { bd: bdRègles, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdRègles, - type: "feed", - schéma: schémaRègleVariableAvecId, + type: "keyvalue", + schéma: schémaBdRèglesVariable, }); - await this.client.effacerÉlémentDeBdListe({ - bd: bdRègles, - élément: (é) => é.value.id === idRègle, - }); + await bdRègles.del(idRègle); await fOublier(); } @@ -693,25 +694,24 @@ export default class Variables extends ComposanteClientListe { f: schémaFonctionSuivi; }): Promise { const règles: { - catégorie: règleVariableAvecId[]; - propres: règleVariableAvecId[]; + catégorie: {[id: string]: règleVariable}; + propres: {[id: string]: règleVariable}; } = { - catégorie: [], - propres: [], + catégorie: {}, + propres: {}, }; const fFinale = async () => { - await f([...règles.catégorie, ...règles.propres]); + await f(Object.entries(Object.assign({}, règles.catégorie, règles.propres)).map(([id, r]) => ({id, règle: r}))); }; const fSuivreCatégorie = async (catégorie: catégorieVariables) => { - const règleCat: règleVariableAvecId = { - id: uuidv4(), - règle: { + const règleCat: {[id: string]: règleCatégorie} = { + [uuidv4()] : { typeRègle: "catégorie", détails: { catégorie }, }, }; - règles.catégorie = [règleCat]; + règles.catégorie = règleCat; await fFinale(); }; const fOublierCatégorie = await this.suivreCatégorieVariable({ @@ -719,15 +719,15 @@ export default class Variables extends ComposanteClientListe { f: fSuivreCatégorie, }); - const fSuivreRèglesPropres = async (rgls: règleVariableAvecId[]) => { + const fSuivreRèglesPropres = async (rgls: {[id: string]: règleVariable}) => { règles.propres = rgls; await fFinale(); }; const fOublierRèglesPropres = - await this.client.suivreBdListeDeClef({ + await this.client.suivreBdDicDeClef({ id: idVariable, clef: "règles", - schéma: schémaRègleVariableAvecId, + schéma: schémaBdRèglesVariable, f: fSuivreRèglesPropres, }); diff --git "a/test/acc\303\250s/cntrlConstellation.spec.ts" "b/test/acc\303\250s/cntrlConstellation.spec.ts" index f78b9e5b7a..076859a2c8 100644 --- "a/test/acc\303\250s/cntrlConstellation.spec.ts" +++ "b/test/acc\303\250s/cntrlConstellation.spec.ts" @@ -2,7 +2,7 @@ import { v4 as uuidv4 } from "uuid"; import { MEMBRE, MODÉRATEUR } from "@/accès/consts.js"; -import { useDatabaseType, type OrbitDB } from "@orbitdb/core"; +import { type OrbitDB } from "@orbitdb/core"; import { attendreSync, @@ -15,7 +15,7 @@ import { isNode, isElectronMain } from "wherearewe"; import { expect } from "aegir/chai"; import type { KeyValue } from "@orbitdb/core"; import générerContrôleurConstellation from "@/accès/cntrlConstellation.js"; -import {Feed} from "@constl/orbit-db-kuiper"; +import { registerAll } from "@constl/orbit-db-kuiper"; import { enregistrerContrôleurs } from "@/accès/index.js"; type TypeContrôleurConstellation = Awaited< @@ -49,7 +49,7 @@ describe("Contrôleur Constellation", function () { before(async () => { enregistrerContrôleurs(); - useDatabaseType(Feed); + registerAll(); ({ fOublier: fOublierOrbites, orbites } = await générerOrbites(2)); [orbitdb1, orbitdb2] = orbites; @@ -114,7 +114,7 @@ describe("Contrôleur Constellation", function () { before(async () => { enregistrerContrôleurs(); - useDatabaseType(Feed); + registerAll(); ({ fOublier: fOublierOrbites, orbites } = await générerOrbites(4)); [orbitdb1, orbitdb2, orbitdb3, orbitdb4] = orbites; diff --git a/test/bds.spec.ts b/test/bds.spec.ts index d7fd3082c6..667bd930ee 100644 --- a/test/bds.spec.ts +++ b/test/bds.spec.ts @@ -36,7 +36,7 @@ import { isElectronMain, isNode } from "wherearewe"; import { attente } from "@constl/utils-tests"; typesClients.forEach((type) => { - describe("Client " + type, function () { + describe.only("Client " + type, function () { describe("BDs", function () { let fOublierClients: () => Promise; let clients: ClientConstellation[]; @@ -1167,7 +1167,7 @@ typesClients.forEach((type) => { }); describe("Score validité", function () { - let empreinteÉlément: string; + let idÉlément: string; it("`undefined` pour commencer", async () => { const score = await attenteScore.attendreExiste(); @@ -1175,7 +1175,7 @@ typesClients.forEach((type) => { }); it("Ajout d'éléments", async () => { - empreinteÉlément = ( + idÉlément = ( await client.tableaux!.ajouterÉlément({ idTableau, vals: { @@ -1204,7 +1204,7 @@ typesClients.forEach((type) => { await client.tableaux!.modifierÉlément({ idTableau, vals: { [idColNumérique]: 12 }, - empreintePrécédente: empreinteÉlément, + idÉlément, }); const score = await attenteScore.attendreQue( (s) => !!s.valide && s.valide > 2 / 3 diff --git a/test/client.spec.ts b/test/client.spec.ts index 6cf5e6f803..cd677dfd91 100644 --- a/test/client.spec.ts +++ b/test/client.spec.ts @@ -18,7 +18,7 @@ import { expect } from "aegir/chai"; import { générerClientsInternes } from "./ressources/utils.js"; import { statutDispositif } from "@/reseau.js"; -import { TypedFeed, TypedKeyValue } from "@constl/bohr-db"; +import { TypedKeyValue } from "@constl/bohr-db"; import { JSONSchemaType } from "ajv"; const schémaKVNumérique: JSONSchemaType<{ [clef: string]: number }> = { @@ -574,7 +574,7 @@ if (isNode || isElectronMain) { before(async () => { idBdBase = await client.créerBdIndépendante({ type: "keyvalue" }); - idBd = await client.créerBdIndépendante({ type: "feed" }); + idBd = await client.créerBdIndépendante({ type: "set" }); const fSuivreValeur = (d: number[]) => donnéesValeur.mettreÀJour(d); const fSuivre = (d: { value: number; hash: string }[]) => @@ -621,7 +621,7 @@ if (isNode || isElectronMain) { const { bd, fOublier } = await client.orbite!.ouvrirBdTypée({ id: idBd, - type: "feed", + type: "set", schéma: schémaListeNumérique, }); fsOublier.push(fOublier); @@ -650,7 +650,7 @@ if (isNode || isElectronMain) { const fsOublier: schémaFonctionOublier[] = []; before(async () => { - idBd = await client.créerBdIndépendante({ type: "feed" }); + idBd = await client.créerBdIndépendante({ type: "set" }); const fSuivreValeur = (d: number[]) => attenteDonnéesValeur.mettreÀJour(d); @@ -686,7 +686,7 @@ if (isNode || isElectronMain) { const { bd, fOublier } = await client.orbite!.ouvrirBd({ id: idBd, - type: "feed", + type: "set", }); fsOublier.push(fOublier); @@ -717,8 +717,8 @@ if (isNode || isElectronMain) { before(async () => { idBd = await client.créerBdIndépendante({ type: "keyvalue" }); - idBdListe = await client.créerBdIndépendante({ type: "feed" }); - idBd2 = await client.créerBdIndépendante({ type: "feed" }); + idBdListe = await client.créerBdIndépendante({ type: "set" }); + idBd2 = await client.créerBdIndépendante({ type: "set" }); fOublier = await client.suivreBdsRécursives({ idBd, @@ -769,7 +769,7 @@ if (isNode || isElectronMain) { const { bd: bdListe, fOublier: fOublierBdListe } = await client.orbite!.ouvrirBd({ id: idBdListe, - type: "feed", + type: "set", }); await bdListe.add(idBd2); fOublierBdListe(); @@ -782,10 +782,10 @@ if (isNode || isElectronMain) { const { bd: bdListe, fOublier: fOublierBdListe } = await client.orbite!.ouvrirBdTypée({ id: idBdListe, - type: "feed", + type: "set", schéma: schémaListeChaîne, }); - await client.effacerÉlémentDeBdListe({ bd: bdListe, élément: idBd2 }); + await bdListe.del(idBd2); fOublierBdListe(); const val = await rés.attendreQue((x) => !!x && x.length === 2); @@ -796,7 +796,7 @@ if (isNode || isElectronMain) { const { bd: bdListe, fOublier: fOublierBdListe } = await client.orbite!.ouvrirBd({ id: idBdListe, - type: "feed", + type: "set", }); await bdListe.add({ maBd: idBd2 }); fOublierBdListe(); @@ -824,13 +824,11 @@ if (isNode || isElectronMain) { const { bd: bdListe, fOublier: fOublierBdListe } = await client.orbite!.ouvrirBdTypée({ id: idBdListe, - type: "feed", + type: "set", schéma: schémaListe, }); - await client.effacerÉlémentDeBdListe({ - bd: bdListe, - élément: (x) => typeof x.value !== "string" && x.value.maBd === idBd2, - }); + (await bdListe.all()).find(x=>x.value) + await bdListe.del((await bdListe.all()).find(x=>typeof x.value !== "string" && x.value.maBd === idBd2)!.value); fOublierBdListe(); const val = await rés.attendreQue((x) => !!x && x.length === 2); @@ -874,8 +872,8 @@ if (isNode || isElectronMain) { before(async () => { idBd = await client.créerBdIndépendante({ type: "keyvalue" }); - idBdListe = await client.créerBdIndépendante({ type: "feed" }); - idBd2 = await client.créerBdIndépendante({ type: "feed" }); + idBdListe = await client.créerBdIndépendante({ type: "set" }); + idBd2 = await client.créerBdIndépendante({ type: "set" }); fOublier = await client.suivreEmpreinteTêtesBdRécursive({ idBd, @@ -930,7 +928,7 @@ if (isNode || isElectronMain) { const { bd: bdListe, fOublier: fOublierBdListe } = await client.orbite!.ouvrirBdTypée({ id: idBdListe, - type: "feed", + type: "set", schéma: schémaListeChaîne, }); await bdListe.add(idBd2); @@ -943,7 +941,7 @@ if (isNode || isElectronMain) { const { bd: bd2, fOublier: fOublierBd2 } = await client.orbite!.ouvrirBdTypée({ id: idBd2, - type: "feed", + type: "set", schéma: schémaListeChaîne, }); await bd2.add("abc"); @@ -958,60 +956,16 @@ if (isNode || isElectronMain) { const { bd: bdListe, fOublier: fOublierBdListe } = await client.orbite!.ouvrirBdTypée({ id: idBdListe, - type: "feed", + type: "set", schéma: schémaListeChaîne, }); - await client.effacerÉlémentDeBdListe({ bd: bdListe, élément: idBd2 }); + await bdListe.del(idBd2); fOublierBdListe(); await rés.attendreQue((x) => !!x && x !== empreinteAvant); }); }); - describe("Rechercher élément BD liste selon empreinte", function () { - let idBd: string; - let bd: TypedFeed; - let fOublier: schémaFonctionOublier; - - before(async () => { - idBd = await client.créerBdIndépendante({ type: "feed" }); - ({ bd, fOublier } = await client.orbite!.ouvrirBdTypée({ - id: idBd, - type: "feed", - schéma: schémaListeChaîne, - })); - await bd.add("abc"); - }); - - after(async () => { - if (fOublier) await fOublier(); - }); - - it("On retrouve le bon élément", async () => { - const fRecherche = (e: { value: string; hash: string }): boolean => { - return e.value === "abc"; - }; - const résultat = await client.rechercherBdListe({ - id: idBd, - f: fRecherche, - schéma: schémaListeChaîne, - }); - expect(résultat?.value).to.equal("abc"); - }); - - it("`undefined` est retourné si l'empreinte n'existe pas", async () => { - const fRecherche = (e: { value: string; hash: string }): boolean => { - return e.value === "def"; - }; - const résultat = await client.rechercherBdListe({ - id: idBd, - f: fRecherche, - schéma: schémaListeChaîne, - }); - expect(résultat).to.be.undefined(); - }); - }); - describe("Suivre BDs de BD liste", function () { let idBdListe: string; let idBd1: string; @@ -1023,10 +977,10 @@ if (isNode || isElectronMain) { const fsOublier: schémaFonctionOublier[] = []; before(async () => { - idBdListe = await client.créerBdIndépendante({ type: "feed" }); + idBdListe = await client.créerBdIndépendante({ type: "set" }); const { bd: bdListe, fOublier } = await client.orbite!.ouvrirBdTypée({ id: idBdListe, - type: "feed", + type: "set", schéma: schémaListeChaîne, }); fsOublier.push(fOublier); @@ -1455,7 +1409,7 @@ if (isNode || isElectronMain) { bdRacine = bd; fsOublier.push(fOublier); - idBd = await client.créerBdIndépendante({ type: "feed" }); + idBd = await client.créerBdIndépendante({ type: "set" }); await bdRacine.put("clef", idBd); }); @@ -1467,7 +1421,7 @@ if (isNode || isElectronMain) { const idBdRetrouvée = await client.obtIdBd({ nom: "clef", racine: idRacine, - type: "feed", + type: "set", }); expect(idBdRetrouvée).to.equal(idBd); }); @@ -1494,7 +1448,7 @@ if (isNode || isElectronMain) { const idBdRetrouvée = await client.obtIdBd({ nom: "je n'existe pas encore", racine: bdRacine, - type: "feed", + type: "set", }); expect(isValidAddress(idBdRetrouvée)).to.be.true(); }); @@ -1503,7 +1457,7 @@ if (isNode || isElectronMain) { const idBdRetrouvée = await client2.obtIdBd({ nom: "et moi je n'existerai jamais", racine: bdRacine, - type: "feed", + type: "set", }); expect(idBdRetrouvée).to.be.undefined(); }); @@ -1514,13 +1468,13 @@ if (isNode || isElectronMain) { const idNouvelleBd = await client.obtIdBd({ nom: NOUVELLE_CLEF, racine: idRacine, - type: "feed", + type: "set", }); expect(idNouvelleBd).to.be.a("string"); const { bd, fOublier } = await client.orbite!.ouvrirBd({ id: idNouvelleBd!, - type: "feed", + type: "set", }); fsOublier.push(fOublier); @@ -1529,12 +1483,12 @@ if (isNode || isElectronMain) { // Simulons un autre dispositif qui écrit à la même clef de manière concurrente const idBdConcurrente = await client.créerBdIndépendante({ - type: "feed", + type: "set", }); const { bd: bdConcurrent, fOublier: fOublierConcurrente } = await client.orbite!.ouvrirBdTypée({ id: idBdConcurrente, - type: "feed", + type: "set", schéma: schémaListeChaîne, }); fsOublier.push(fOublierConcurrente); @@ -1546,12 +1500,12 @@ if (isNode || isElectronMain) { const idBdRetrouvée = await client.obtIdBd({ nom: NOUVELLE_CLEF, racine: idRacine, - type: "feed", + type: "set", }); const { bd: bdRetrouvée, fOublier: fOublierRetrouvée } = await client.orbite!.ouvrirBdTypée({ id: idBdRetrouvée!, - type: "feed", + type: "set", schéma: schémaListeChaîne, }); fsOublier.push(fOublierRetrouvée); @@ -1656,19 +1610,19 @@ if (isNode || isElectronMain) { }); it("Combiner BD liste", async () => { - const idBdListe1 = await client.créerBdIndépendante({ type: "feed" }); - const idBdListe2 = await client.créerBdIndépendante({ type: "feed" }); + const idBdListe1 = await client.créerBdIndépendante({ type: "set" }); + const idBdListe2 = await client.créerBdIndépendante({ type: "set" }); const { bd: bdListe1, fOublier: fOublierListe1 } = await client.orbite!.ouvrirBdTypée({ id: idBdListe1, - type: "feed", + type: "set", schéma: schémaListeNumérique, }); const { bd: bdListe2, fOublier: fOublierListe2 } = await client.orbite!.ouvrirBdTypée({ id: idBdListe2, - type: "feed", + type: "set", schéma: schémaListeNumérique, }); @@ -1680,7 +1634,7 @@ if (isNode || isElectronMain) { await bdListe2.add(1); await bdListe2.add(3); - await client.combinerBdsListe({ bdBase: bdListe1, bd2: bdListe2 }); + await client.combinerBdsEnsemble({ bdBase: bdListe1, bd2: bdListe2 }); const données = (await bdListe1.all()).map((x) => x.value); expect(Array.isArray(données)).to.be.true(); @@ -1689,8 +1643,8 @@ if (isNode || isElectronMain) { }); it("Combiner BD liste avec index", async () => { - const idBdListe1 = await client.créerBdIndépendante({ type: "feed" }); - const idBdListe2 = await client.créerBdIndépendante({ type: "feed" }); + const idBdListe1 = await client.créerBdIndépendante({ type: "set" }); + const idBdListe2 = await client.créerBdIndépendante({ type: "set" }); const schéma: JSONSchemaType<{ temps: number; val: number }> = { type: "object", @@ -1701,13 +1655,13 @@ if (isNode || isElectronMain) { const { bd: bdListe1, fOublier: fOublierListe1 } = await client.orbite!.ouvrirBdTypée({ id: idBdListe1, - type: "feed", + type: "set", schéma, }); const { bd: bdListe2, fOublier: fOublierListe2 } = await client.orbite!.ouvrirBdTypée({ id: idBdListe2, - type: "feed", + type: "set", schéma, }); @@ -1719,7 +1673,7 @@ if (isNode || isElectronMain) { await bdListe2.add({ temps: 1, val: 2 }); await bdListe2.add({ temps: 3, val: 3 }); - await client.combinerBdsListe({ + await client.combinerBdsEnsemble({ bdBase: bdListe1, bd2: bdListe2, index: ["temps"], @@ -1755,13 +1709,13 @@ if (isNode || isElectronMain) { fsOublier.push(fOublierDic1); fsOublier.push(fOublierDic2); - const idBdListe1 = await client.créerBdIndépendante({ type: "feed" }); - const idBdListe2 = await client.créerBdIndépendante({ type: "feed" }); + const idBdListe1 = await client.créerBdIndépendante({ type: "set" }); + const idBdListe2 = await client.créerBdIndépendante({ type: "set" }); const { bd: bdListe1, fOublier: fOublierListe1 } = - await client.orbite!.ouvrirBd({ id: idBdListe1, type: "feed" }); + await client.orbite!.ouvrirBd({ id: idBdListe1, type: "set" }); const { bd: bdListe2, fOublier: fOublierListe2 } = - await client.orbite!.ouvrirBd({ id: idBdListe2, type: "feed" }); + await client.orbite!.ouvrirBd({ id: idBdListe2, type: "set" }); fsOublier.push(fOublierListe1); fsOublier.push(fOublierListe2); @@ -1778,7 +1732,7 @@ if (isNode || isElectronMain) { const idBdListeFinale = await bdDic1.get("clef"); if (!idBdListeFinale) throw new Error("idBdListeFinale non définie"); const { bd: bdListeFinale, fOublier: fOublierBdListeFinale } = - await client.orbite!.ouvrirBd({ id: idBdListeFinale, type: "feed" }); + await client.orbite!.ouvrirBd({ id: idBdListeFinale, type: "set" }); fsOublier.push(fOublierBdListeFinale); @@ -1803,32 +1757,32 @@ if (isNode || isElectronMain) { required: ["index", "idBd"], }; - const idBdListe1 = await client.créerBdIndépendante({ type: "feed" }); - const idBdListe2 = await client.créerBdIndépendante({ type: "feed" }); + const idBdListe1 = await client.créerBdIndépendante({ type: "set" }); + const idBdListe2 = await client.créerBdIndépendante({ type: "set" }); const { bd: bdListe1, fOublier: fOublierBdListe1 } = await client.orbite!.ouvrirBdTypée({ id: idBdListe1, - type: "feed", + type: "set", schéma, }); const { bd: bdListe2, fOublier: fOublierBdListe2 } = await client.orbite!.ouvrirBdTypée({ id: idBdListe2, - type: "feed", + type: "set", schéma, }); fsOublier.push(fOublierBdListe1); fsOublier.push(fOublierBdListe2); - const idSubBd1 = await client.créerBdIndépendante({ type: "feed" }); - const idSubBd2 = await client.créerBdIndépendante({ type: "feed" }); + const idSubBd1 = await client.créerBdIndépendante({ type: "set" }); + const idSubBd2 = await client.créerBdIndépendante({ type: "set" }); const { bd: subBd1, fOublier: fOublierSubBd1 } = - await client.orbite!.ouvrirBd({ id: idSubBd1, type: "feed" }); + await client.orbite!.ouvrirBd({ id: idSubBd1, type: "set" }); const { bd: subBd2, fOublier: fOublierSubBd2 } = - await client.orbite!.ouvrirBd({ id: idSubBd2, type: "feed" }); + await client.orbite!.ouvrirBd({ id: idSubBd2, type: "set" }); fsOublier.push(fOublierSubBd1); fsOublier.push(fOublierSubBd2); @@ -1841,7 +1795,7 @@ if (isNode || isElectronMain) { await bdListe1.add({ index: 1, idBd: idSubBd1 }); await bdListe2.add({ index: 1, idBd: idSubBd2 }); - await client.combinerBdsListe({ + await client.combinerBdsEnsemble({ bdBase: bdListe1, bd2: bdListe2, index: ["index"], @@ -1855,7 +1809,7 @@ if (isNode || isElectronMain) { const idBdListeFinale = donnéesBdListe[0]!.idBd; const { bd: subBdFinale, fOublier: fOublierSubBdFinale } = - await client.orbite!.ouvrirBd({ id: idBdListeFinale, type: "feed" }); + await client.orbite!.ouvrirBd({ id: idBdListeFinale, type: "set" }); fsOublier.push(fOublierSubBdFinale); @@ -2067,11 +2021,11 @@ if (isNode || isElectronMain) { fsOublier.push(fOublierKv); - idBdListe = await client.créerBdIndépendante({ type: "feed" }); + idBdListe = await client.créerBdIndépendante({ type: "set" }); const { bd: bdListe, fOublier: fOublierBdListe } = await client.orbite!.ouvrirBd({ id: idBdListe, - type: "feed", + type: "set", }); fsOublier.push(fOublierBdListe); @@ -2095,10 +2049,10 @@ if (isNode || isElectronMain) { it("La BD est épinglée", async () => { expect(client.orbite?._bdsOrbite[idBdKv]).to.exist(); }); - it("Récursion KVStore", async () => { + it("Récursion KeyValueDatabase", async () => { expect(client.orbite?._bdsOrbite[idBdListe]).to.exist(); }); - it("Récursion FeedStore", async () => { + it("Récursion SetDatabase", async () => { expect(client.orbite?._bdsOrbite[idBdKv2]).to.exist(); }); it("Les fichiers SFIP sont également épinglés", async () => { diff --git "a/test/nu\303\251e.spec.ts" "b/test/nu\303\251e.spec.ts" index 24598134c7..f9c5d0238e 100644 --- "a/test/nu\303\251e.spec.ts" +++ "b/test/nu\303\251e.spec.ts" @@ -546,7 +546,7 @@ typesClients.forEach((type) => { describe("Toujours inclure les miennes", function () { let idNuée: string; let idCol: string; - let empreinte: string; + let id: string; const fsOublier: schémaFonctionOublier[] = []; const résultatChezMoi = new utilsTestAttente.AttendreRésultat< @@ -593,7 +593,7 @@ typesClients.forEach((type) => { idNuée, licence: "ODbl-1_0", }); - empreinte = ( + id = ( await clients[1].bds.ajouterÉlémentÀTableauUnique({ schémaBd: schémaNuée, idNuéeUnique: idNuée, @@ -618,7 +618,7 @@ typesClients.forEach((type) => { [idCol]: 3, id: val[0].élément.données["id"], }, - empreinte, + id, }, valid: [], }; @@ -632,7 +632,7 @@ typesClients.forEach((type) => { }); describe("Toujours inclure les miennes - idNuée non rejoignable", function () { - let empreinte: string; + let id: string; const idNuée = "/orbitdb/zdpuAsiATt21PFpiHj8qLX7X7kN3bgozZmhEVswGncZYVHidX"; // tuNeMeTrouverasPas @@ -684,7 +684,7 @@ typesClients.forEach((type) => { }); fsOublier.push(fOublierChezLesAutres); - empreinte = ( + id = ( await clients[1].bds.ajouterÉlémentÀTableauUnique({ schémaBd, idNuéeUnique: idNuée, @@ -709,7 +709,7 @@ typesClients.forEach((type) => { [idCol]: 3, id: val[0].élément.données["id"], }, - empreinte, + id, }, valid: [], }; diff --git a/test/recherche/utils.spec.ts b/test/recherche/utils.spec.ts index 083d685515..230a475c1d 100644 --- a/test/recherche/utils.spec.ts +++ b/test/recherche/utils.spec.ts @@ -285,7 +285,7 @@ describe("Utils recherche", function () { const fsOublier: schémaFonctionOublier[] = []; before(async () => { - idBd = await client.créerBdIndépendante({ type: "feed" }); + idBd = await client.créerBdIndépendante({ type: "set" }); const fListe = async ( fSuivreRacine: (idsVariables: string[]) => void @@ -321,7 +321,7 @@ describe("Utils recherche", function () { it("Ajout variable détecté", async () => { const { bd, fOublier } = await client.orbite!.ouvrirBdTypée({ id: idBd, - type: "feed", + type: "set", schéma: { type: "string" } as JSONSchemaType, }); await bd.add("precipitation"); @@ -353,7 +353,7 @@ describe("Utils recherche", function () { it("Ajout meilleure variable détecté", async () => { const { bd, fOublier } = await client.orbite!.ouvrirBdTypée({ id: idBd, - type: "feed", + type: "set", schéma: { type: "string" } as JSONSchemaType, }); await bd.add("précipitation"); diff --git "a/test/r\303\251seau.spec.ts" "b/test/r\303\251seau.spec.ts" index bd18476c8a..4de966e8aa 100644 --- "a/test/r\303\251seau.spec.ts" +++ "b/test/r\303\251seau.spec.ts" @@ -2331,9 +2331,9 @@ typesClients.forEach((type) => { let idTableau1: string | undefined; let idTableau2: string | undefined; - let empreinte1: string; - let empreinte2: string; - let empreinte3: string; + let id1: string; + let id2: string; + let id3: string; const clefTableau = "tableau trads"; const données1 = { @@ -2448,19 +2448,19 @@ typesClients.forEach((type) => { ).fOublier ); - empreinte1 = ( + id1 = ( await clients[0].tableaux!.ajouterÉlément({ idTableau: idTableau1, vals: données1, }) )[0]; - empreinte2 = ( + id2 = ( await clients[0].tableaux!.ajouterÉlément({ idTableau: idTableau1, vals: données2, }) )[0]; - empreinte3 = ( + id3 = ( await clients[1].tableaux!.ajouterÉlément({ idTableau: idTableau2, vals: données3, @@ -2496,21 +2496,21 @@ typesClients.forEach((type) => { { idCompte: idsBdCompte[0], élément: { - empreinte: empreinte1, + id: id1, données: données1, }, }, { idCompte: idsBdCompte[0], élément: { - empreinte: empreinte2, + id: id2, données: données2, }, }, { idCompte: idsBdCompte[1], élément: { - empreinte: empreinte3, + id: id3, données: données3, }, }, diff --git a/test/tableaux.spec.ts b/test/tableaux.spec.ts index 65b6ca331c..43730cef37 100644 --- a/test/tableaux.spec.ts +++ b/test/tableaux.spec.ts @@ -239,7 +239,7 @@ typesClients.forEach((type) => { expect(valDonnées.length).to.equal(1); const élémentDonnées = valDonnées[0]; - expect(typeof élémentDonnées.empreinte).to.equal("string"); + expect(typeof élémentDonnées.id).to.equal("string"); for (const [cl, v] of Object.entries(élément)) { expect(élémentDonnées.données[cl]).to.equal(v); } @@ -252,7 +252,7 @@ typesClients.forEach((type) => { await client.tableaux!.modifierÉlément({ idTableau, vals: { [idsColonnes[0]]: -123 }, - empreintePrécédente: élémentDonnées.empreinte, + idÉlément: élémentDonnées.id, }); valDonnées = await données.attendreQue((x) => x.length > 0); @@ -270,7 +270,7 @@ typesClients.forEach((type) => { await client.tableaux!.modifierÉlément({ idTableau, vals: { [idsColonnes[0]]: undefined }, - empreintePrécédente: élémentDonnées.empreinte, + idÉlément: élémentDonnées.id, }); valDonnées = await données.attendreQue( @@ -289,7 +289,7 @@ typesClients.forEach((type) => { await client.tableaux!.modifierÉlément({ idTableau, vals: { [idsColonnes[0]]: 123 }, - empreintePrécédente: élémentDonnées.empreinte, + idÉlément: élémentDonnées.id, }); valDonnées = await données.attendreQue( @@ -305,7 +305,7 @@ typesClients.forEach((type) => { await client.tableaux!.effacerÉlément({ idTableau, - empreinte: élémentDonnées.empreinte, + id: élémentDonnées.id, }); valDonnées = await données.attendreQue((x) => x.length === 0); @@ -462,7 +462,7 @@ typesClients.forEach((type) => { }); it("Ajouter des données de catégorie invalide", async () => { - const empreinte = ( + const id = ( await client.tableaux!.ajouterÉlément({ idTableau: idTableauRègles, vals: { @@ -470,7 +470,7 @@ typesClients.forEach((type) => { }, }) )[0]; - expect(typeof empreinte).to.equal("string"); + expect(typeof id).to.equal("string"); const val = await résErreurs.attendreQue((x) => !!x.length); expect(Array.isArray(val)).to.be.true(); expect(val.length).to.equal(1); @@ -681,7 +681,7 @@ typesClients.forEach((type) => { let idRègle1: string; let idRègle2: string; let idRègle3: string; - let empreinte2: string; + let id2: string; const erreursValid = new utilsTestAttente.AttendreRésultat< erreurValidation[] @@ -691,7 +691,7 @@ typesClients.forEach((type) => { >(); const idColonneTempMax = "col temp max"; - let empreintesDonnées: string[] = []; + let idsDonnées: string[] = []; const fsOublier: schémaFonctionOublier[] = []; before(async () => { @@ -726,7 +726,7 @@ typesClients.forEach((type) => { idTableau: idTableauRègles, idVariable: idVariableTempMin, }); - empreintesDonnées = await client.tableaux!.ajouterÉlément({ + idsDonnées = await client.tableaux!.ajouterÉlément({ idTableau: idTableauRègles, vals: Array.from(Array(10).keys()).map((min) => ({ [idColonneTempMin]: min, @@ -789,14 +789,14 @@ typesClients.forEach((type) => { }); it("Ajout éléments colonne réf détecté", async () => { - empreintesDonnées[0] = await client.tableaux!.modifierÉlément({ + await client.tableaux!.modifierÉlément({ idTableau: idTableauRègles, vals: { [idColonneTempMax]: -1 }, - empreintePrécédente: empreintesDonnées[0], + idÉlément: idsDonnées[0], }); const réf: erreurValidation = { - empreinte: empreintesDonnées[0], + id: idsDonnées[0], erreur: { règle: { source: { type: "tableau", id: idTableauRègles }, @@ -817,7 +817,7 @@ typesClients.forEach((type) => { await client.tableaux!.modifierÉlément({ idTableau: idTableauRègles, vals: { [idColonneTempMax]: 6 }, - empreintePrécédente: empreintesDonnées[0], + idÉlément: idsDonnées[0], }); const résValid = await erreursValid.attendreQue( (x) => x.length < 1 @@ -838,7 +838,7 @@ typesClients.forEach((type) => { }); it("Ajout éléments invalides", async () => { - empreinte2 = ( + id2 = ( await client.tableaux!.ajouterÉlément({ idTableau: idTableauRègles, vals: { @@ -849,7 +849,7 @@ typesClients.forEach((type) => { )[0]; const réf: erreurValidation = { - empreinte: empreinte2, + id: id2, erreur: { règle: { source: { type: "tableau", id: idTableauRègles }, @@ -884,7 +884,7 @@ typesClients.forEach((type) => { const réf: erreurValidation[] = [ { - empreinte: empreinte2, + id: id2, erreur: { règle: { source: { type: "tableau", id: idTableauRègles }, @@ -897,7 +897,7 @@ typesClients.forEach((type) => { }, }, { - empreinte: empreinte2, + id: id2, erreur: { règle: { source: { type: "variable", id: idVariableTempMax }, diff --git a/test/valid.spec.ts b/test/valid.spec.ts index 152ce11baa..fdb63cc028 100644 --- a/test/valid.spec.ts +++ b/test/valid.spec.ts @@ -168,13 +168,13 @@ describe("Validation", function () { }, }; const fonc = générerFonctionRègle({ règle, varsÀColonnes: {} }); - const empreinte = uuidv4(); + const id = uuidv4(); it("Valeure existante", () => { const erreurs = fonc([ { données: { "col numérique": 123 }, - empreinte, + id, }, ]); expect(Array.isArray(erreurs)).to.be.true(); @@ -184,12 +184,12 @@ describe("Validation", function () { const erreurs = fonc([ { données: { "une autre colonne": "abc" }, - empreinte, + id, }, ]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(1); - expect(erreurs[0].empreinte).to.equal(empreinte); + expect(erreurs[0].id).to.equal(id); expect(erreurs[0].erreur.règle).to.equal(règle); }); }); @@ -209,13 +209,13 @@ describe("Validation", function () { }, }; const fonc = générerFonctionRègle({ règle, varsÀColonnes: {} }); - const empreinte = uuidv4(); + const id = uuidv4(); it("Catérogie valide", () => { const erreurs = fonc([ { données: { "col numérique": 123 }, - empreinte, + id, }, ]); expect(Array.isArray(erreurs)).to.be.true(); @@ -225,12 +225,12 @@ describe("Validation", function () { const erreurs = fonc([ { données: { "col numérique": "abc" }, - empreinte, + id, }, ]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(1); - expect(erreurs[0].empreinte).to.equal(empreinte); + expect(erreurs[0].id).to.equal(id); expect(erreurs[0].erreur.règle).to.equal(règle); }); }); @@ -253,7 +253,7 @@ describe("Validation", function () { }; const fonc = générerFonctionRègle({ règle, varsÀColonnes: {} }); const erreurs = fonc([ - { données: { "une autre colonne": 1 }, empreinte: uuidv4() }, + { données: { "une autre colonne": 1 }, id: uuidv4() }, ]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(0); @@ -284,14 +284,14 @@ describe("Validation", function () { }, }; const fonc = générerFonctionRègle({ règle, varsÀColonnes: {} }); - const empreinte = uuidv4(); + const id = uuidv4(); op.valides.forEach((v) => { it(`${v}`, () => { const erreurs = fonc([ { données: { "col numérique": v }, - empreinte, + id, }, ]); expect(Array.isArray(erreurs)).to.be.true(); @@ -303,12 +303,12 @@ describe("Validation", function () { const erreurs = fonc([ { données: { "col numérique": v }, - empreinte, + id, }, ]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(1); - expect(erreurs[0].empreinte).to.equal(empreinte); + expect(erreurs[0].id).to.equal(id); expect(erreurs[0].erreur.règle).to.equal(règle); }); }); @@ -337,33 +337,33 @@ describe("Validation", function () { "var temp min": "temp min", }, }); - const empreinte = uuidv4(); // Pas important + const id = uuidv4(); // Pas important it("Pas d'erreur si la colonne n'existe pas", () => { - const erreurs = fonc([{ données: { "temp min": 1 }, empreinte }]); + const erreurs = fonc([{ données: { "temp min": 1 }, id }]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(0); }); it("Pas d'erreur si tout est valide", () => { const erreurs = fonc([ - { données: { "temp min": 10, "temp max": 20 }, empreinte }, + { données: { "temp min": 10, "temp max": 20 }, id }, ]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(0); }); it("Pas d'erreur si la colonne référence n'existe pas", () => { - const erreurs = fonc([{ données: { "temp max": 20 }, empreinte }]); + const erreurs = fonc([{ données: { "temp max": 20 }, id }]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(0); }); it("Erreur si non valide", () => { const erreurs = fonc([ - { données: { "temp max": 20, "temp min": 25 }, empreinte }, + { données: { "temp max": 20, "temp min": 25 }, id }, ]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(1); - expect(erreurs[0].empreinte).to.equal(empreinte); + expect(erreurs[0].id).to.equal(id); expect(erreurs[0].erreur.règle).to.equal(règle); }); }); @@ -387,27 +387,27 @@ describe("Validation", function () { règle, varsÀColonnes: { "var temp min": "temp min" }, }); - const empreinte = uuidv4(); + const id = uuidv4(); it("Pas d'erreur si la colonne n'existe pas", () => { const erreurs = fonc([ - { données: { "une autre colonne": 2 }, empreinte }, + { données: { "une autre colonne": 2 }, id }, ]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(0); }); it("Pas d'erreur si tout valide", () => { - const erreurs = fonc([{ données: { "col chaîne": "a" }, empreinte }]); + const erreurs = fonc([{ données: { "col chaîne": "a" }, id }]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(0); }); it("Erreur si non valide", () => { - const erreurs = fonc([{ données: { "col chaîne": "d" }, empreinte }]); + const erreurs = fonc([{ données: { "col chaîne": "d" }, id }]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(1); - expect(erreurs[0].empreinte).to.equal(empreinte); + expect(erreurs[0].id).to.equal(id); expect(erreurs[0].erreur.règle).to.equal(règle); }); }); @@ -448,13 +448,13 @@ describe("Validation", function () { règle: règleVal, varsÀColonnes: {}, }); - const empreinte = uuidv4(); + const id = uuidv4(); it("Catérogie valide", () => { const erreurs = foncCat([ { données: { "col numérique": [123, 456] }, - empreinte, + id, }, ]); expect(Array.isArray(erreurs)).to.be.true(); @@ -464,19 +464,19 @@ describe("Validation", function () { const erreurs = foncCat([ { données: { "col numérique": [123, "abc"] }, - empreinte, + id, }, ]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(1); - expect(erreurs[0].empreinte).to.equal(empreinte); + expect(erreurs[0].id).to.equal(id); expect(erreurs[0].erreur.règle).to.equal(règleCat); }); it("Valeur valide", () => { const erreurs = foncBorne([ { données: { "col numérique": [123, 456] }, - empreinte, + id, }, ]); expect(Array.isArray(erreurs)).to.be.true(); @@ -486,12 +486,12 @@ describe("Validation", function () { const erreurs = foncBorne([ { données: { "col numérique": [123, -123] }, - empreinte, + id, }, ]); expect(Array.isArray(erreurs)).to.be.true(); expect(erreurs.length).to.equal(1); - expect(erreurs[0].empreinte).to.equal(empreinte); + expect(erreurs[0].id).to.equal(id); expect(erreurs[0].erreur.règle).to.equal(règleVal); }); }); diff --git "a/test/\303\251pingler.spec.ts" "b/test/\303\251pingler.spec.ts" index d8a9827b73..a84e969cd1 100644 --- "a/test/\303\251pingler.spec.ts" +++ "b/test/\303\251pingler.spec.ts" @@ -78,7 +78,7 @@ typesClients.forEach((type) => { await client.épingles!.toutDésépingler(); idBdDic = await client!.créerBdIndépendante({ type: "keyvalue" }); - idBdListe = await client!.créerBdIndépendante({ type: "feed" }); + idBdListe = await client!.créerBdIndépendante({ type: "set" }); idBdDic2 = await client!.créerBdIndépendante({ type: "keyvalue" }); idBdAutre = await client!.créerBdIndépendante({ type: "keyvalue" }); @@ -97,7 +97,7 @@ typesClients.forEach((type) => { const { bd, fOublier } = await client.orbite!.ouvrirBd({ id: idBdListe, - type: "feed", + type: "set", }); await bd.add(idBdAutre); await fOublier(); @@ -168,7 +168,7 @@ typesClients.forEach((type) => { idBd = await client.créerBdIndépendante({ type: "keyvalue" }); idBd2 = await client.créerBdIndépendante({ type: "keyvalue" }); - idBdListe = await client.créerBdIndépendante({ type: "feed" }); + idBdListe = await client.créerBdIndépendante({ type: "set" }); }); it("Fichier non épinglé", async () => { @@ -218,7 +218,7 @@ typesClients.forEach((type) => { const { bd, fOublier } = await client.orbite!.ouvrirBd({ id: idBdListe, - type: "feed", + type: "set", }); await bd.add(idBd); await fOublier(); From d2842abf2ca2c68d2e2ff1b451092cca8ee20742 Mon Sep 17 00:00:00 2001 From: julienmalard Date: Tue, 3 Oct 2023 14:27:17 +0200 Subject: [PATCH 2/4] Changement vers `Set` et `OrderedKeyValue` --- .../autresLangages/introduction.md" | 2 +- docu/src/ipa/bds.md | 22 +-- docu/src/ipa/licences.md | 6 +- "docu/src/ipa/r\303\250gles.md" | 2 +- docu/src/ipa/tableaux.md | 20 +-- package.json | 2 +- pnpm-lock.yaml | 81 +++++++----- src/automatisation.ts | 6 +- src/bds.ts | 33 ++--- src/client.ts | 125 +++++++++++++++++- src/epingles.ts | 6 + src/licences.ts | 6 +- "src/nu\303\251e.ts" | 46 ++++--- src/tableaux.ts | 21 ++- test/automatisation.spec.ts | 10 +- test/bds.spec.ts | 11 +- test/client.spec.ts | 1 - "test/nu\303\251e.spec.ts" | 3 - test/tableaux.spec.ts | 4 +- 19 files changed, 274 insertions(+), 133 deletions(-) diff --git "a/docu/src/avanc\303\251/autresLangages/introduction.md" "b/docu/src/avanc\303\251/autresLangages/introduction.md" index c1fde6e3e7..ab5472a237 100644 --- "a/docu/src/avanc\303\251/autresLangages/introduction.md" +++ "b/docu/src/avanc\303\251/autresLangages/introduction.md" @@ -4,7 +4,7 @@ dans d'autres langages informatiques. Des clients sont disposibles dans les lang * [Python](./python.md) : Fonctionnel * [Julia](./julia.md) : Fonctionnel -* [R](https://github.com/reseau-constellation/client-r) : En progrès. +* [R](./r.md) : Fonctionnel * Autres langages : Si vous développez un client Constellation dans un autre langage, [contactez-nous](mailto:julien.malard@mail.mcgill.ca) et nous l'annoncerons ici. Tous ces clients fonctionnent en ouvrant un serveur WS Constellation local sur votre machine. Le client Python, Julia ou autre communiquera ensuite avec ce serveur local par messages WS et vous permettent d'utiliser Constellation dans le langage de votre choix. diff --git a/docu/src/ipa/bds.md b/docu/src/ipa/bds.md index aa8aaf9438..6438781838 100644 --- a/docu/src/ipa/bds.md +++ b/docu/src/ipa/bds.md @@ -1276,12 +1276,12 @@ Ajoute un élément à un tableau d'une base de données unique. | `schémaBd` | [`schémaSpécificationBd`](#schema-bd) | Le schéma de spécification de la base de données. Il sera utilisé pour créer la base de données si elle n'existe pas encore. | | `idNuéeUnique` | `string` | L'identifiant de la nuée à laquelle une seule base de données par compte peut appartenir. Doit exister dans `schémaBd`. | | `clefTableau` | `string` | La clef du tableau auquel nous voulons ajouter des données. Doit exister dans `schémaBd`. | -| `vals` | [`élémentBdListeDonnées`](./tableaux.md#types-donnees) | Les données à ajouter. | +| `vals` | [`élémentBdListeDonnées | élémentBdListeDonnées`](./tableaux.md#types-donnees) `[]` | Les données à ajouter. | #### Retour | Type | Description | | ---- | ----------- | -| `Promise` | L'empreinte (identifiant unique) de l'élément ajouté. | +| `Promise` | Les identifiants unique des éléments ajoutés. | #### Exemple ```ts @@ -1290,11 +1290,11 @@ Ajoute un élément à un tableau d'une base de données unique. const image = ref() // L'image sera sélectionnée par l'utilisateur dans l'interface const site = ref() // Pareil pour le site de l'observation -const empreinteDonnées = ref(); +const idsÉléments = ref(); const sauvegarderDonnées = async () => { if (!image.value || !site.value) return // Arrêter ici si l'image ou le site n'ont pas encore été sélectionnés - empreinteDonnées.value = await client.bds.ajouterÉlémentÀTableauUnique({ + idsÉléments.value = await client.bds.ajouterÉlémentÀTableauUnique({ schémaBd, idNuéeUnique, clefTableau: CLEF_TABLEAU, @@ -1307,7 +1307,7 @@ const sauvegarderDonnées = async () => { }; ``` -### `client.bds.modifierÉlémentDeTableauUnique({ schémaBd, idNuéeUnique, clefTableau, vals, empreintePrécédente })` +### `client.bds.modifierÉlémentDeTableauUnique({ schémaBd, idNuéeUnique, clefTableau, vals, idÉlément })` Modifie un élément d'un tableau d'une base de données unique. #### Paramètres @@ -1317,12 +1317,12 @@ Modifie un élément d'un tableau d'une base de données unique. | `idNuéeUnique` | `string` | L'identifiant de la nuée à laquelle une seule base de données par compte peut appartenir. Doit exister dans `schémaBd`. | | `clefTableau` | `string` | La clef du tableau dont nous voulons modifier des données. Doit exister dans `schémaBd`. | | `vals` | { [idColonne: string]: [`élémentsBd`](./tableaux.md#types-donnees) \| undefined } | Les données à jour. Si une colonne n'apparaît pas sur `vals`, elle ne sera pas modifiée. Si, au contraire, elle est égale à `undefined`, la valeur correspondante sera effacée. | -| `empreintePrécédente` | `string` | L'empreinte de l'élément à modifier. | +| `idÉlément` | `string` | L'identifiant de l'élément à modifier. | #### Retour | Type | Description | | ---- | ----------- | -| `Promise` | L'empreinte (identifiant unique) de l'élément modifié. | +| `Promise` | L'identifiant de l'élément modifié. | #### Exemple ```ts @@ -1339,12 +1339,12 @@ const modifierImage = async () => { vals: { "image": nouvelleImage.value , }, - empreintePrécédente: empreinteDonnées.value, + idÉlément: idsÉléments.value[0], }); }; ``` -### `client.bds.effacerÉlémentDeTableauUnique({ schémaBd, idNuéeUnique, clefTableau, empreinte })` +### `client.bds.effacerÉlémentDeTableauUnique({ schémaBd, idNuéeUnique, clefTableau, idÉlément })` Efface un élément d'un tableau d'une base de données unique. #### Paramètres @@ -1353,7 +1353,7 @@ Efface un élément d'un tableau d'une base de données unique. | `schémaBd` | [`schémaSpécificationBd`](#schema-bd) | Le schéma de spécification de la base de données. Il sera utilisé pour créer la base de données si elle n'existe pas encore. | | `idNuéeUnique` | `string` | L'identifiant de la nuée à laquelle une seule base de données par compte peut appartenir. Doit exister dans `schémaBd`. | | `clefTableau` | `string` | La clef du tableau dont nous voulons effacer des données. Doit exister dans `schémaBd`. | -| `empreinte` | `string` | L'empreinte de la rangée à effacer. | +| `idÉlément` | `string` | L'identifiant de la rangée à effacer. | #### Exemple ```ts @@ -1364,7 +1364,7 @@ const effacerDonnées = async () => { schémaBd, idNuéeUnique, clefTableau: CLEF_TABLEAU, - empreinte: empreinteDonnées.value, + idÉlément: idsÉléments.value[0], }); }; ``` diff --git a/docu/src/ipa/licences.md b/docu/src/ipa/licences.md index b65c1c1e96..90637d230b 100644 --- a/docu/src/ipa/licences.md +++ b/docu/src/ipa/licences.md @@ -70,13 +70,13 @@ await client.licences.suggérerLicence({ }) ``` -### `client.licences.effacerSuggestionLicence({ empreinte })` +### `client.licences.effacerSuggestionLicence({ idÉlément })` Efface une suggesion de nouvelle licence que vous aviez fait auparavant. #### Paramètres | Nom | Type | Description | | --- | ---- | ----------- | -| `empreinte` | `string` | L'identifiant unique de votre suggestion. | +| `idÉlément` | `string` | L'identifiant unique de votre suggestion. | #### Exemple ```ts @@ -85,7 +85,7 @@ import { générerClient } from "@constl/ipa"; const client = générerClient({}); await client.licences.effacerSuggestionLicence({ - empreinte: "codeDeMaSuggestion" + idÉlément: "codeDeMaSuggestion" }) ``` diff --git "a/docu/src/ipa/r\303\250gles.md" "b/docu/src/ipa/r\303\250gles.md" index 5a7b05983f..7a57bf36b2 100644 --- "a/docu/src/ipa/r\303\250gles.md" +++ "b/docu/src/ipa/r\303\250gles.md" @@ -266,7 +266,7 @@ Ces types sont associés aux erreurs de validation des données et des règles e ```ts type erreurValidation = { - empreinte: string; + id: string; erreur: { règle: règleColonne; }; diff --git a/docu/src/ipa/tableaux.md b/docu/src/ipa/tableaux.md index 66596cf80f..00a0f35da1 100644 --- a/docu/src/ipa/tableaux.md +++ b/docu/src/ipa/tableaux.md @@ -289,7 +289,7 @@ Ajoute un ou plusieurs éléments à un tableau. #### Retour | Type | Description | | ---- | ----------- | -| `Promise` | Les empreintes (identifiants uniques) des éléments ajoutés. | +| `Promise` | Les identifiants uniques des éléments ajoutés. | #### Exemple ```ts @@ -326,7 +326,7 @@ const idColTempérature = await client.tableaux.ajouterColonneTableau({ }); // Enfin, ajouter les données -const empreintesDonnées = await client.tableaux.ajouterÉlément({ +const idsÉléments = await client.tableaux.ajouterÉlément({ schémaBd, idNuéeUnique, clefTableau: CLEF_TABLEAU, @@ -338,7 +338,7 @@ const empreintesDonnées = await client.tableaux.ajouterÉlément({ }); ``` -### `client.tableaux.modifierÉlément({ idTableau, vals, empreintePrécédente })` +### `client.tableaux.modifierÉlément({ idTableau, vals, idÉlément })` Modifie un élément d'un tableau. #### Paramètres @@ -346,12 +346,12 @@ Modifie un élément d'un tableau. | --- | ---- | ----------- | | `idTableau` | `string` | L'identifiant du tableau. | | `vals` | { [idColonne: string]: [`élémentsBd`](./tableaux.md#types-donnees) \| undefined } | Les données à jour. Si une colonne n'apparaît pas sur `vals`, elle ne sera pas modifiée. Si, au contraire, elle est égale à `undefined`, la valeur correspondante sera effacée. | -| `empreintePrécédente` | `string` | L'empreinte de l'élément à modifier. | +| `idÉlément` | `string` | L'identifiant de l'élément à modifier. | #### Retour | Type | Description | | ---- | ----------- | -| `Promise` | L'empreinte (identifiant unique) de l'élément modifié. | +| `Promise` | L'identifiant unique de l'élément modifié. | #### Exemple ```ts @@ -362,25 +362,25 @@ await client.tableaux.modifierÉlément({ vals: { [idColTempérature]: 38.2 , }, - empreintePrécédente: empreinteDonnées, + idsÉléments[0], }); ``` -### `client.tableaux.effacerÉlément({ idTableau, empreinte })` +### `client.tableaux.effacerÉlément({ idTableau, idÉlément })` Efface un élément d'un tableau. #### Paramètres | Nom | Type | Description | | --- | ---- | ----------- | | `idTableau` | `string` | L'identifiant du tableau. | -| `empreinte` | `string` | L'empreinte de la rangée à effacer. | +| `idÉlément` | `string` | L'identifiant de la rangée à effacer. | #### Exemple ```ts // ...continuant de ci-dessus... await client.tableaux.effacerÉlément({ idTableau, - empreinte: empreinteDonnées, + idÉlément: idsÉléments[0], }); ``` @@ -693,7 +693,7 @@ interface élémentDonnées< T extends élémentBdListeDonnées = élémentBdListeDonnées > { données: T; - empreinte: string; // Identifiant unique de la rangé de données + id: string; // Identifiant unique de la rangé de données } type élémentBdListeDonnées = { diff --git a/package.json b/package.json index 7fb9a648ac..db0e4b3111 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "@chainsafe/libp2p-gossipsub": "^7.0.0", "@chainsafe/libp2p-noise": "^11.0.4", "@chriscdn/promise-semaphore": "^2.0.7", - "@constl/bohr-db": "^0.0.2", + "@constl/bohr-db": "^0.0.6", "@constl/electron-webrtc-relay": "^0.2.3", "@constl/mandataire": "^0.1.14", "@constl/orbit-db-kuiper": "^0.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ea318df8a..b5d010bde6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ dependencies: specifier: ^2.0.7 version: 2.0.7 '@constl/bohr-db': - specifier: ^0.0.2 - version: 0.0.2 + specifier: ^0.0.6 + version: 0.0.6 '@constl/electron-webrtc-relay': specifier: ^0.2.3 version: 0.2.3 @@ -1357,10 +1357,10 @@ packages: engines: {node: '>=0.1.90'} dev: true - /@constl/bohr-db@0.0.2: - resolution: {integrity: sha512-aVySVL4jEwrGHJowvJx7W4g2icfbgCcmmfXtf8y89qQw7DGJIRFa65CbjBh/W8tGovfcOCcwQFA8dWjTQEFkuA==} + /@constl/bohr-db@0.0.6: + resolution: {integrity: sha512-DZ0SsKyq1S/1msbq52TGBmz9ELP4MbLFlnFXwVHCVKe/+guZzQeCaeWlJ0YuwcbAAfYdcWCDbQgGZK/tSPgFCQ==} dependencies: - '@constl/orbit-db-kuiper': 0.0.1 + '@constl/orbit-db-kuiper': 0.0.2 '@orbitdb/core': github.com/julienmalard/orbit-db/fbac4ee0b0c1590bf47a2562565ba4ee83158bae ajv: 8.12.0 events: 3.3.0 @@ -1454,20 +1454,6 @@ packages: uuid: 9.0.1 dev: false - /@constl/orbit-db-kuiper@0.0.1: - resolution: {integrity: sha512-L9PnO0dlg8R6pT66N8lFB05337xYviGP31dKSH7jX9jbkZWmPE8Iup397VHKWu3HCeA4Pj15cSJ6qBgrlawLcQ==} - dependencies: - '@orbitdb/core': github.com/julienmalard/orbit-db/fbac4ee0b0c1590bf47a2562565ba4ee83158bae - events: 3.3.0 - ipfs-core: 0.18.1 - uuid: 9.0.1 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - /@constl/orbit-db-kuiper@0.0.2: resolution: {integrity: sha512-kuGJVDe9DYlBx5gwfxeXTeeWmF83mZpKxUVHZiVowiFij8T2124HXku4LfmBgk9sbXRmMLY7LiZPRU9yazlyWw==} dependencies: @@ -2083,12 +2069,12 @@ packages: '@ethersproject/strings': 5.7.0 dev: false - /@grpc/grpc-js@1.9.4: - resolution: {integrity: sha512-oEnzYiDuEsBydZBtP84BkpduLsE1nSAO4KrhTLHRzNrIQE647fhchmosTQsJdCo8X9zBBt+l5+fNk+m/yCFJ/Q==} + /@grpc/grpc-js@1.9.5: + resolution: {integrity: sha512-iouYNlPxRAwZ2XboDT+OfRKHuaKHiqjB5VFYZ0NFrHkbEF+AV3muIUY9olQsp8uxU4VvRCMiRk9ftzFDGb61aw==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.10 - '@types/node': 20.8.0 + '@types/node': 20.8.2 dev: false /@grpc/proto-loader@0.7.10: @@ -2607,6 +2593,14 @@ packages: cborg: 4.0.3 multiformats: 12.1.1 + /@ipld/dag-cbor@9.0.6: + resolution: {integrity: sha512-3kNab5xMppgWw6DVYx2BzmFq8t7I56AGWfp5kaU1fIPkwHVpBRglJJTYsGtbVluCi/s/q97HZM3bC+aDW4sxbQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + cborg: 4.0.3 + multiformats: 12.1.2 + dev: false + /@ipld/dag-json@10.1.4: resolution: {integrity: sha512-Vgm739qPQ7P8cstna60oYx19tzJzep+Uy7yWi80dzIOygibfVaaRZ07M6qbHP+C9BJl81GNFaXy2Plr0y7poBA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} @@ -2614,12 +2608,27 @@ packages: cborg: 4.0.3 multiformats: 12.1.1 + /@ipld/dag-json@10.1.5: + resolution: {integrity: sha512-AIIDRGPgIqVG2K1O42dPDzNOfP0YWV/suGApzpF+YWZLwkwdGVsxjmXcJ/+rwOhRGdjpuq/xQBKPCu1Ao6rdOQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + cborg: 4.0.3 + multiformats: 12.1.2 + dev: false + /@ipld/dag-pb@4.0.5: resolution: {integrity: sha512-El2Jhmv6bWuakhvnw1dl6xOhqLeVhlY8DIAJ06NtZRAoDcOzeGzvOtPzMCszVgCT0EQz+LOctyfgQ5Oszba19A==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: multiformats: 12.1.1 + /@ipld/dag-pb@4.0.6: + resolution: {integrity: sha512-wOij3jfDKZsb9yjhQeHp+TQy0pu1vmUkGv324xciFFZ7xGbDfAGTQW03lSA5aJ/7HBBNYgjEE0nvHmNW1Qjfag==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + multiformats: 12.1.2 + dev: false + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2735,7 +2744,7 @@ packages: '@libp2p/interface': 0.1.2 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 - multiformats: 12.1.1 + multiformats: 12.1.2 node-forge: 1.3.1 protons-runtime: 5.0.2(uint8arraylist@2.4.3) uint8arraylist: 2.4.3 @@ -3303,8 +3312,6 @@ packages: '@libp2p/interface': 0.1.2 multiformats: 12.1.1 uint8arrays: 4.0.6 - transitivePeerDependencies: - - supports-color /@libp2p/peer-record@5.0.4: resolution: {integrity: sha512-e+AArf7pwMLqF24mehTe1OYjr1v0SOKshVrI1E9YH/Cb1F3ZZuK3smyGmnLaS4JlqsarRCMSe3V50tRkqMFY7g==} @@ -4444,8 +4451,8 @@ packages: /@types/node@20.7.0: resolution: {integrity: sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==} - /@types/node@20.8.0: - resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} + /@types/node@20.8.2: + resolution: {integrity: sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==} dev: false /@types/node@8.10.66: @@ -10008,9 +10015,9 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details dependencies: - '@ipld/dag-cbor': 9.0.5 - '@ipld/dag-json': 10.1.4 - '@ipld/dag-pb': 4.0.5 + '@ipld/dag-cbor': 9.0.6 + '@ipld/dag-json': 10.1.5 + '@ipld/dag-pb': 4.0.6 '@libp2p/logger': 2.1.1 '@libp2p/peer-id': 2.0.4 '@multiformats/mafmt': 11.1.2 @@ -10245,7 +10252,7 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details dependencies: - '@grpc/grpc-js': 1.9.4 + '@grpc/grpc-js': 1.9.5 '@libp2p/logger': 2.1.1 '@libp2p/peer-id': 2.0.4 '@multiformats/multiaddr': 11.6.1 @@ -10345,7 +10352,7 @@ packages: '@hapi/boom': 9.1.4 '@hapi/content': 5.0.2 '@hapi/hapi': 20.3.0 - '@ipld/dag-pb': 4.0.5 + '@ipld/dag-pb': 4.0.6 '@libp2p/interface-dht': 2.0.3 '@libp2p/interfaces': 3.3.2 '@libp2p/logger': 2.1.1 @@ -13162,6 +13169,10 @@ packages: resolution: {integrity: sha512-GBSToTmri2vJYs8wqcZQ8kB21dCaeTOzHTIAlr8J06C1eL6UbzqURXFZ5Fl0EYm9GAFz1IlYY8SxGOs9G9NJRg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} + /multiformats@12.1.2: + resolution: {integrity: sha512-6mRIsrZXyw5xNPO31IGBMmxgDXBSgCGDsBAtazkZ02ip4hMwZNrQvfxXZtytRoBSWuzSq5f9VmMnXj76fIz5FQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + /multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} dev: false @@ -13904,8 +13915,8 @@ packages: ipfs: '*' ipfsd-ctl: '*' dependencies: - '@ipld/dag-cbor': 9.0.5 - '@ipld/dag-pb': 4.0.5 + '@ipld/dag-cbor': 9.0.6 + '@ipld/dag-pb': 4.0.6 go-ipfs: 0.22.0 ipfs: 0.66.1 ipfsd-ctl: 13.0.0 @@ -17731,7 +17742,7 @@ packages: it-pipe: 3.0.1 level: 8.0.0 lru: 3.1.0 - multiformats: 12.1.1 + multiformats: 12.1.2 p-queue: 7.4.1 timeout-abort-controller: 3.0.0 uint8arrays: 4.0.6 diff --git a/src/automatisation.ts b/src/automatisation.ts index fe4788f416..b24f39a405 100644 --- a/src/automatisation.ts +++ b/src/automatisation.ts @@ -1220,9 +1220,9 @@ export default class Automatisations extends ComposanteClientDic<{[id: string]: }; } - async fermerAuto(empreinte: string): Promise { - await this.automatisations[empreinte].fermer(); - delete this.automatisations[empreinte]; + async fermerAuto(id: string): Promise { + await this.automatisations[id].fermer(); + delete this.automatisations[id]; } async fermer(): Promise { diff --git a/src/bds.ts b/src/bds.ts index fa25224a71..0a9389833c 100644 --- a/src/bds.ts +++ b/src/bds.ts @@ -945,7 +945,7 @@ export default class BDs extends ComposanteClientListe { return await this.client.tableaux!.effacerÉlément({ idTableau: idTableau, - id: idÉlément, + idÉlément, }); } @@ -1046,7 +1046,7 @@ export default class BDs extends ComposanteClientListe { ); this.client.tableaux!.effacerÉlément({ idTableau, - id: idÉlément, + idÉlément, }); } @@ -1493,7 +1493,7 @@ export default class BDs extends ComposanteClientListe { const idBdTableaux = await this.client.obtIdBd({ nom: "tableaux", racine: idBd, - type: "keyvalue", + type: "ordered-keyvalue", }); if (!idBdTableaux) { throw new Error(`Permission de modification refusée pour BD ${idBd}.`); @@ -1502,7 +1502,7 @@ export default class BDs extends ComposanteClientListe { const { bd: bdTableaux, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, - type: "keyvalue", + type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd, }); await bdTableaux.del(idTableau); @@ -1524,20 +1524,20 @@ export default class BDs extends ComposanteClientListe { const idBdTableaux = await this.client.obtIdBd({ nom: "tableaux", racine: idBd, - type: "keyvalue", + type: "ordered-keyvalue", }); if (!idBdTableaux) throw new Error("Id Bd Tableau non obtenable."); const { bd: bdTableaux, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, - type: "keyvalue", + type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd, }); - const infoExistante = await bdTableaux.get(idTableau); + const infoExistante = await bdTableaux.get(idTableau); if (infoExistante) { - infoExistante.clef = clef; - bdTableaux.set(idTableau, infoExistante); + infoExistante.value.clef = clef; + bdTableaux.set(idTableau, infoExistante.value); } await fOublier(); @@ -1794,18 +1794,21 @@ export default class BDs extends ComposanteClientListe { idBd: string; f: schémaFonctionSuivi; }): Promise { - const fFinale = async (infos: { [id: string]: {clef: string} }) => { - const tableaux: infoTableauAvecId[] = Object.entries(infos).map( - ([id, info]) => { + const fFinale = async (infos: { key: string; value: { clef: string; }; }[]) => { + const tableaux: infoTableauAvecId[] = (infos).map( + (info) => { return { - id, - ...info, + id: info.key, + ...info.value, }; } ); await f(tableaux); }; - return await this.client.suivreBdDicDeClef({ + + return await this.client.suivreBdDicOrdonnéeDeClef<{ + [idTableau: string]: {clef: string}; + }>({ id: idBd, clef: "tableaux", schéma: schémaBdTableauxDeBd, diff --git a/src/client.ts b/src/client.ts index 55f500dcfb..cbd6ce75c1 100644 --- a/src/client.ts +++ b/src/client.ts @@ -71,9 +71,11 @@ import { } from "@/orbite.js"; import { TypedKeyValue, + TypedOrderedKeyValue, TypedSet } from "@constl/bohr-db"; import { + OrderedKeyValueDatabaseType, SetDatabaseType } from "@constl/orbit-db-kuiper" import Protocoles from "./protocoles.js"; @@ -968,6 +970,20 @@ export class ClientConstellation extends EventEmitter { type: "set"; schéma?: JSONSchemaType; }): Promise; + async suivreBd< + U extends { [clef: string]: élémentsBd }, + T = TypedOrderedKeyValue + >({ + id, + f, + type, + schéma, + }: { + id: string; + f: schémaFonctionSuivi; + type: "ordered-keyvalue"; + schéma?: JSONSchemaType; + }): Promise; async suivreBd({ id, f, @@ -983,7 +999,7 @@ export class ClientConstellation extends EventEmitter { }: { id: string; f: schémaFonctionSuivi; - type?: "keyvalue" | "set"; + type?: "keyvalue" | "set" | "ordered-keyvalue"; schéma?: JSONSchemaType; }): Promise { if (!isValidAddress(id)) throw new Error(`Adresse "${id}" non valide.`); @@ -1009,6 +1025,14 @@ export class ClientConstellation extends EventEmitter { Extract >, }) + : type === "ordered-keyvalue" + ? this.orbite!.ouvrirBdTypée({ + id, + type, + schéma: schéma as JSONSchemaType< + Extract + >, + }) : this.orbite!.ouvrirBd({ id, type, @@ -1119,6 +1143,31 @@ export class ClientConstellation extends EventEmitter { return await this.suivreBd({ id, type: "keyvalue", schéma, f: fFinale }); } + async suivreBdDicOrdonnée({ + id, + schéma, + f, + }: { + id: string; + schéma?: JSONSchemaType; + f: schémaFonctionSuivi<{ + key: Extract; + value: T[keyof T]; + hash: string; + }[]>; + }): Promise { + // À faire : différention entre schéma présent ou absent + const fFinale = async (bd: OrderedKeyValueDatabaseType) => { + const valeurs = await bd.all() as { + key: Extract; + value: T[keyof T]; + hash: string; + }[]; + await f(valeurs); + }; + return await this.suivreBd({ id, type: "ordered-keyvalue", schéma, f: fFinale }); + } + async suivreBdDicDeClef({ id, clef, @@ -1150,6 +1199,41 @@ export class ClientConstellation extends EventEmitter { }); } + async suivreBdDicOrdonnéeDeClef({ + id, + clef, + schéma, + f, + }: { + id: string; + clef: string; + schéma: JSONSchemaType; + f: schémaFonctionSuivi<{key: string, value: T[keyof T]}[]>; + }): Promise { + const fFinale = async (valeurs?: {key: string, value: T[keyof T]}[]) => { + await f(valeurs || []); + }; + const fSuivre = async ({ + id, + fSuivreBd, + }: { + id: string; + fSuivreBd: schémaFonctionSuivi<{ + key: string; + value: T[keyof T]; + hash: string; + }[]>; + }) => { + return await this.suivreBdDicOrdonnée({ id, schéma, f: fSuivreBd }); + }; + return await this.suivreBdDeClef({ + id, + clef, + f: fFinale, + fSuivre, + }); + } + async suivreBdListeDeClef({ id, clef, @@ -1447,6 +1531,43 @@ export class ClientConstellation extends EventEmitter { }); } + async suivreBdsDeBdDic({ + id, + f, + fBranche, + fIdBdDeBranche = (b) => b as string, + fRéduction = (branches: U[]) => + [...new Set(branches.flat())] as unknown as V[], + fCode = (é) => é as string, + }: { + id: string; + f: schémaFonctionSuivi; + fBranche: ( + id: string, + f: schémaFonctionSuivi, + branche: T + ) => Promise; + fIdBdDeBranche?: (b: T) => string; + fRéduction?: schémaFonctionRéduction; + fCode?: (é: T) => string; + }): Promise { + const fListe = async ( + fSuivreRacine: (éléments: T[]) => Promise + ): Promise => { + return await this.suivreBd({ id, f: async (bd) => { + return await fSuivreRacine((await bd.all()).map(x=>x.value) as T[]) + } }); + }; + return await this.suivreBdsDeFonctionListe({ + fListe, + f, + fBranche, + fIdBdDeBranche, + fRéduction, + fCode, + }); + } + async suivreBdsDeFonctionListe< T extends élémentsBd, U extends PasNondéfini, @@ -2155,6 +2276,8 @@ export class ClientConstellation extends EventEmitter { let fOublierSuiviBd: schémaFonctionOublier; if (type === "keyvalue") { fOublierSuiviBd = await this.suivreBdDic({ id, f: fSuivreBd }); + } else if (type === "ordered-keyvalue") { + fOublierSuiviBd = await this.suivreBdDicOrdonnée({ id, f: fSuivreBd }); } else if (type === "set") { fOublierSuiviBd = await this.suivreBdListe({ id, f: fSuivreBd }); } else { diff --git a/src/epingles.ts b/src/epingles.ts index 88427656aa..3a43f5a24f 100644 --- a/src/epingles.ts +++ b/src/epingles.ts @@ -188,6 +188,12 @@ export default class Épingles { f: fSuivre, }); this.fsOublier[id] = fOublierBd; + } else if (bd.type === "ordered-keyvalue") { + const fOublierBd = await this.client.suivreBdDicOrdonnée({ + id, + f: fSuivre, + }); + this.fsOublier[id] = fOublierBd; } else if (bd.type === "set") { const fOublierBd = await this.client.suivreBdListe({ id, f: fSuivre }); this.fsOublier[id] = fOublierBd; diff --git a/src/licences.ts b/src/licences.ts index d25cfc6fd1..bcefeb9d41 100644 --- a/src/licences.ts +++ b/src/licences.ts @@ -513,13 +513,13 @@ export default class Licences { } async effacerSuggestionLicence({ - empreinte, + idÉlément, }: { - empreinte: string; + idÉlément: string; }): Promise { await this.attendrePrêt(); if (this.perroquet) { - await this.perroquet.பரிந்துரையை_நீக்கு({ கைரேகை: empreinte }); + await this.perroquet.பரிந்துரையை_நீக்கு({ கைரேகை: idÉlément }); } } diff --git "a/src/nu\303\251e.ts" "b/src/nu\303\251e.ts" index d92f8fd968..56ac755c12 100644 --- "a/src/nu\303\251e.ts" +++ "b/src/nu\303\251e.ts" @@ -217,7 +217,7 @@ export default class Nuée extends ComposanteClientListe { await bdNuée.set("descriptions", idBdDescr); const idBdTableaux = await this.client.créerBdIndépendante({ - type: "keyvalue", + type: "ordered-keyvalue", optionsAccès, }); await bdNuée.set("tableaux", idBdTableaux); @@ -348,24 +348,24 @@ export default class Nuée extends ComposanteClientListe { const { bd: nouvelleBdTableaux, fOublier: fOublierNouvelleTableaux } = await this.client.orbite!.ouvrirBdTypée({ id: idNouvelleBdTableaux, - type: "keyvalue", + type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd, }); const { bd: bdTableaux, fOublier: fOublierBdTableaux } = await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, - type: "keyvalue", + type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd, }); - const tableaux = await bdTableaux.allAsJSON(); + const tableaux = await bdTableaux.all(); await fOublierBdTableaux(); - for (const idTableau of Object.keys(tableaux)) { + for (const tableau of tableaux) { const idNouveauTableau = await this.client.tableaux!.copierTableau({ - id: idTableau, + id: tableau.key, idBd: idNouvelleNuée, copierDonnées: false, }); - await nouvelleBdTableaux.set(idNouveauTableau, tableaux[idTableau]); + await nouvelleBdTableaux.set(idNouveauTableau, tableau.value); } await fOublierNouvelleTableaux(); } @@ -790,7 +790,7 @@ export default class Nuée extends ComposanteClientListe { const { bd, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idNuée, type: "keyvalue", - schéma: schémaStructureBdMétadonnées, + schéma: schémaStructureBdNuée, }); await bd.del("image"); await fOublier(); @@ -1012,7 +1012,6 @@ export default class Nuée extends ComposanteClientListe { const idBdAutorisation = await this.client.créerBdIndépendante({ type: "keyvalue", optionsAccès: { - address: undefined, write: this.client.bdCompte!.address, }, }); @@ -1311,7 +1310,7 @@ export default class Nuée extends ComposanteClientListe { const idBdTableaux = await this.client.obtIdBd({ nom: "tableaux", racine: idNuée, - type: "keyvalue", + type: "ordered-keyvalue", }); if (!idBdTableaux) { throw new Error( @@ -1320,7 +1319,7 @@ export default class Nuée extends ComposanteClientListe { } const { bd: bdTableaux, fOublier } = - await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, type: "keyvalue", schéma: schémaBdTableauxDeBd }); + await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd }); clefTableau = clefTableau || uuidv4(); const idTableau = await this.client.tableaux!.créerTableau({ @@ -1345,7 +1344,7 @@ export default class Nuée extends ComposanteClientListe { const idBdTableaux = await this.client.obtIdBd({ nom: "tableaux", racine: idNuée, - type: "keyvalue", + type: "ordered-keyvalue", }); if (!idBdTableaux) { throw new Error( @@ -1356,7 +1355,7 @@ export default class Nuée extends ComposanteClientListe { const { bd: bdTableaux, fOublier } = await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, - type: "keyvalue", + type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd, }); await bdTableaux.del(idTableau); @@ -1381,18 +1380,23 @@ export default class Nuée extends ComposanteClientListe { id: string, fSuivreBranche: schémaFonctionSuivi ) => { - const fFinaleTableaux = (infos: { [id: string]: {clef: string} }) => { - const tableaux: infoTableauAvecId[] = Object.entries(infos).map( - ([idTableau, info]) => { + const fFinaleTableaux = (infos: { + key: string; + value: { + clef: string; + }; + }[]) => { + const tableaux: infoTableauAvecId[] = infos.map( + (info) => { return { - id: idTableau, - ...info, + id: info.key, + ...info.value, }; } ); fSuivreBranche(tableaux); }; - return await this.client.suivreBdDicDeClef({ + return await this.client.suivreBdDicOrdonnéeDeClef({ id, clef: "tableaux", schéma: schémaBdTableauxDeBd, @@ -2848,13 +2852,13 @@ export default class Nuée extends ComposanteClientListe { const idBdTableaux = await this.client.obtIdBd({ nom: "tableaux", racine: idNuée, - type: "keyvalue", + type: "ordered-keyvalue", }); if (idBdTableaux) { const { bd: bdTableaux, fOublier: fOublierTableaux } = await this.client.orbite!.ouvrirBdTypée({ id: idBdTableaux, - type: "keyvalue", + type: "ordered-keyvalue", schéma: schémaBdTableauxDeBd, }); const tableaux: string[] = Object.keys(bdTableaux.all); diff --git a/src/tableaux.ts b/src/tableaux.ts index 1b2954bee0..5364fd53f9 100644 --- a/src/tableaux.ts +++ b/src/tableaux.ts @@ -122,11 +122,8 @@ const schémaBdDonnéesTableau: JSONSchemaType<{[id: string]: { [clef: string]: type: "object", additionalProperties: { type: "object", - properties: { - id: { type: "string" }, - }, additionalProperties: true, - required: ["id"], + required: [], }, required: [], }; @@ -874,10 +871,10 @@ export default class Tableaux { async effacerÉlément({ idTableau, - id, + idÉlément, }: { idTableau: string; - id: string; + idÉlément: string; }): Promise { const idBdDonnées = await this.client.obtIdBd({ nom: "données", @@ -897,7 +894,7 @@ export default class Tableaux { schéma: schémaBdDonnéesTableau, } ); - await bdDonnées.del(id); + await bdDonnées.del(idÉlément); await fOublier(); } @@ -967,7 +964,7 @@ export default class Tableaux { if (Object.keys(àAjouter).length) { await this.effacerÉlément({ idTableau: idTableauBase, - id: existant.id, + idÉlément: existant.id, }); await this.ajouterÉlément({ idTableau: idTableauBase, @@ -1345,7 +1342,7 @@ export default class Tableaux { } for (const id of àEffacer) { - await this.effacerÉlément({ idTableau, id }); + await this.effacerÉlément({ idTableau, idÉlément: id }); } for (const n of nouveaux) { @@ -1591,7 +1588,7 @@ export default class Tableaux { id: string; fSuivreBd: schémaFonctionSuivi; }): Promise => { - return await this.client.suivreBdsDeBdListe({ + return await this.client.suivreBdsDeBdDic({ id, f: fSuivreBd, fBranche, @@ -1608,11 +1605,11 @@ export default class Tableaux { fSuivre: fSuivreBdColonnes, }); } else { - return await this.client.suivreBdListeDeClef({ + return await this.client.suivreBdDicDeClef({ id: idTableau, clef: "colonnes", schéma: schémaBdInfoColAvecCatégorie, - f: fFinale, + f: async cols => fFinale(Object.values(cols)), }); } } diff --git a/test/automatisation.spec.ts b/test/automatisation.spec.ts index 3a8f4b2774..00dcea4e02 100644 --- a/test/automatisation.spec.ts +++ b/test/automatisation.spec.ts @@ -900,6 +900,7 @@ typesClients.forEach((type) => { fsOublier.push( await client.automatisations!.suivreÉtatAutomatisations({ f: (états) => { + console.log(états) résÉtats.mettreÀJour(états); }, }) @@ -976,7 +977,7 @@ typesClients.forEach((type) => { path.join(dossier, "Ma bd.ods") ); fsOublier.push(() => attendreFichierExiste.annuler()); - + console.log("ici 0") const idAuto = await client.automatisations!.ajouterAutomatisationExporter({ id: idBd, @@ -986,8 +987,11 @@ typesClients.forEach((type) => { dossier, langues: ["fr"], }); + console.log("ici 1", idAuto) await attendreFichierExiste.attendre(); + console.log("ici 2") await résÉtats.attendreQue((x) => !!(x && x[idAuto])); + console.log("ici 3") expect(résÉtats.val![idAuto]).to.deep.equal({ type: "écoute", @@ -995,14 +999,16 @@ typesClients.forEach((type) => { const avantAjout = Date.now(); const attendre = résÉtats.attendreQue( - (x) => !!(x && x[idAuto] && x[idAuto].type === "sync") + (x) => !!(x && x[idAuto]?.type === "sync") ); await client.tableaux!.ajouterÉlément({ idTableau, vals: { [idCol]: 4 }, }); + console.log("ici 4") const { type, depuis } = (await attendre)[idAuto] as ÉtatEnSync; + console.log("ici 5") expect(type).to.equal("sync"); expect(depuis).to.be.greaterThanOrEqual(avantAjout); }); diff --git a/test/bds.spec.ts b/test/bds.spec.ts index 667bd930ee..f1fbb27636 100644 --- a/test/bds.spec.ts +++ b/test/bds.spec.ts @@ -36,7 +36,7 @@ import { isElectronMain, isNode } from "wherearewe"; import { attente } from "@constl/utils-tests"; typesClients.forEach((type) => { - describe.only("Client " + type, function () { + describe("Client " + type, function () { describe("BDs", function () { let fOublierClients: () => Promise; let clients: ClientConstellation[]; @@ -385,7 +385,6 @@ typesClients.forEach((type) => { { id: idTableau, clef: "abc", - position: 0, }, ]); }); @@ -737,13 +736,9 @@ typesClients.forEach((type) => { it("Les données sont copiées", async () => { const val = await données1.attendreQue( (x) => - x.length > 2 && x.every((y) => Object.keys(y.données).length > 2) + x.length > 2 && x.every((y) => Object.keys(y.données).length > 1) ); - const donnéesCombinées = val.map((d) => d.données); - const donnéesSansId = donnéesCombinées.map((d) => { - delete d.id; - return d; - }); + const donnéesSansId = val.map((d) => d.données); expect(Array.isArray(donnéesSansId)).to.be.true(); expect(donnéesSansId.length).to.equal(3); diff --git a/test/client.spec.ts b/test/client.spec.ts index cd677dfd91..334d4f1e28 100644 --- a/test/client.spec.ts +++ b/test/client.spec.ts @@ -1937,7 +1937,6 @@ if (isNode || isElectronMain) { idBd = await client.créerBdIndépendante({ type: "keyvalue", optionsAccès: { - address: undefined, write: client.bdCompte!.address, }, }); diff --git "a/test/nu\303\251e.spec.ts" "b/test/nu\303\251e.spec.ts" index f9c5d0238e..7d95154307 100644 --- "a/test/nu\303\251e.spec.ts" +++ "b/test/nu\303\251e.spec.ts" @@ -388,7 +388,6 @@ typesClients.forEach((type) => { expect(val).to.have.deep.members([ { clef: "abc", - position: 0, id: idTableau, }, ]); @@ -616,7 +615,6 @@ typesClients.forEach((type) => { élément: { données: { [idCol]: 3, - id: val[0].élément.données["id"], }, id, }, @@ -707,7 +705,6 @@ typesClients.forEach((type) => { élément: { données: { [idCol]: 3, - id: val[0].élément.données["id"], }, id, }, diff --git a/test/tableaux.spec.ts b/test/tableaux.spec.ts index 43730cef37..bd126b6ec0 100644 --- a/test/tableaux.spec.ts +++ b/test/tableaux.spec.ts @@ -255,7 +255,7 @@ typesClients.forEach((type) => { idÉlément: élémentDonnées.id, }); - valDonnées = await données.attendreQue((x) => x.length > 0); + valDonnées = await données.attendreQue((x) => x.length > 0 && x[0].données[idsColonnes[0]] !== 123.456); expect(Array.isArray(valDonnées)).to.be.true(); expect(valDonnées.length).to.equal(1); @@ -305,7 +305,7 @@ typesClients.forEach((type) => { await client.tableaux!.effacerÉlément({ idTableau, - id: élémentDonnées.id, + idÉlément: élémentDonnées.id, }); valDonnées = await données.attendreQue((x) => x.length === 0); From 6294d18445f66c0b248573ab7c3ee8775e6ecef3 Mon Sep 17 00:00:00 2001 From: julienmalard Date: Tue, 3 Oct 2023 14:28:50 +0200 Subject: [PATCH 3/4] Tests uniquement sur main --- .github/workflows/tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 43281733fd..db3f9a3468 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,6 +1,8 @@ name: Tests IPA on: push: + branches: + - main paths-ignore: - '**.md' - 'docu/**' From dd7b4eec6843ae4b79b46c2300d59c6173c7bda2 Mon Sep 17 00:00:00 2001 From: julienmalard Date: Tue, 3 Oct 2023 14:30:54 +0200 Subject: [PATCH 4/4] =?UTF-8?q?Sans=20commentaires=20d=C3=A9bogage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/automatisation.spec.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/test/automatisation.spec.ts b/test/automatisation.spec.ts index 00dcea4e02..0fef3c54fe 100644 --- a/test/automatisation.spec.ts +++ b/test/automatisation.spec.ts @@ -900,7 +900,6 @@ typesClients.forEach((type) => { fsOublier.push( await client.automatisations!.suivreÉtatAutomatisations({ f: (états) => { - console.log(états) résÉtats.mettreÀJour(états); }, }) @@ -977,7 +976,6 @@ typesClients.forEach((type) => { path.join(dossier, "Ma bd.ods") ); fsOublier.push(() => attendreFichierExiste.annuler()); - console.log("ici 0") const idAuto = await client.automatisations!.ajouterAutomatisationExporter({ id: idBd, @@ -987,11 +985,8 @@ typesClients.forEach((type) => { dossier, langues: ["fr"], }); - console.log("ici 1", idAuto) await attendreFichierExiste.attendre(); - console.log("ici 2") await résÉtats.attendreQue((x) => !!(x && x[idAuto])); - console.log("ici 3") expect(résÉtats.val![idAuto]).to.deep.equal({ type: "écoute", @@ -1005,10 +1000,8 @@ typesClients.forEach((type) => { idTableau, vals: { [idCol]: 4 }, }); - console.log("ici 4") const { type, depuis } = (await attendre)[idAuto] as ÉtatEnSync; - console.log("ici 5") expect(type).to.equal("sync"); expect(depuis).to.be.greaterThanOrEqual(avantAjout); });