@fto-consult/common
Version:
Un ensemble de bibliothèques et d'utilistaires communs pour le développement d'applications javascript
89 lines (88 loc) • 4.73 kB
JavaScript
import {defaultObj,defaultStr,isObj} from "$cutils";
import getAllDB from "../dataFileManager/getAllDB";
/*** retourne le liste des données dans un tableau d'objet, récupérée via les bases de données spécifiées
* @param object options : {
* databases [] La liste des données dans laquelle puiser les données,
* dataFilter {function}, la fonction à appliquer sur chaque données récupérée
* dataMutator {function}, la fonction permettant de faire une mutation sur les données trouvées en base de données
* dataFileFilter {function}, la fonction à appliquer pour limiter les bases de données à récupérer
* dataFileType {string}, le type particulier des fichiers de données pour lesquels l'on veut récupérer la base de données
* server {string}, l'adresse du serveur où on veut aller chercher les données
* fetchOptions {object|function}, les options à appliquer au plugin find de pouchdb
* ...fetchOptions, les options à passer à la fonction getData, pour la récupération des dites données
* : voir pouchdb-find
* }
*
* @return : objet de la forme :
* {
* [dabase-code]//database = nom de la bd, et code == nom du code de la données demandée dans la requête
* db1-code1 : {
* database {string}, le nom de la bd
* countData {number} : le nombre d'éléments dans la base database
* //le tableau contenant les différents données se trouvant dans chaque base,
* ....data {object}, les données en elles même
* * },
db1-code2 : {
* database {string}, le nom de la bd
* countData {number} : le nombre d'éléments dans la base database
* //le tableau contenant les différents données se trouvant dans chaque base,
* ....data {object}, les données en elles même
* * },
....
dbn-coden : {
* database {string}, le nom de la bd
* countData {number} : le nombre d'éléments dans la base database
* //le tableau contenant les différents données se trouvant dans chaque base,
* ....data {object}, les données en elles même
* * },
* }
* @param {function} dataMutator : La fonction de rappel appelée lors du parcours en boucle de l'ensemble des données
* Cette fonction prend en paramètre :
* {
db:L'instance pouchdb associé à la bd
dbName : Le nom de la bd,
server : Le nom du serveur,
data : La données courante
allData : L'ensemble des données,
count : Le nombre de donnés trouvée dans la base db, pour la requête
* }
*/
export default function getAllData(options,dataMutator){
let {dataFileType,dataFilter,dataFileFilter,loop,fetchOptions,...rest} = defaultObj(options);
dataMutator = typeof dataMutator ==='function'? dataMutator : ({data})=>(data);
dataFileFilter = typeof dataFileFilter =='function'? dataFileFilter : x=>true;
dataFilter = typeof dataFilter =='function'? dataFilter : x=> true;
dataFileType = defaultStr(dataFileType).trim().toLowerCase();
return new Promise((resolve,reject)=>{
return getAllDB({...rest,filter : (dF,dFCode)=>{
const dFType = dF.type.toLowerCase().trim();
if(dataFileType && dFType !== dataFileType) return false;
if(dataFileFilter(dF,dFCode) === false) return false;
return true;
}}).then((databases)=>{
const promises = [],results = [];
for(let i in databases){
const dbArgs = databases[i];
if(dbArgs.db.infos?.isDataFileManager) continue;
const {db} = dbArgs;
const fOptions = typeof fetchOptions ==='function'? defaultObj(fetchOptions(dbArgs)) : defaultObj(fetchOptions);
promises.push(db.find(fOptions).then((r)=>{
r.docs.map((doc)=>{
if(!isObj(doc)) return null;
doc.dbId = defaultStr(doc.dbId,db.infos?.name,db.infos?.code);
doc = dataMutator({data:doc,allData:results,allFetchedData:r,db,dbName:doc.dbId});
if(!isObj(doc)) return null;
results.push(doc);
})
return null;
}));
return Promise.all(promises).then(resolve).catch((e)=>{
throw e;
})
}
}).catch((e)=>{
console.log(e,' getting all data');
reject(e);
});
});
}