const sensemap = require("../apiHandler/opensensemap/main"); const ttnantennas = require("../apiHandler/ttnantennas/main"); const autobahn = require("../apiHandler/autobahn/main"); const libs = require("../libs/metaHandler.lib.js"); const mods = [sensemap, ttnantennas, autobahn]; // Provided by main.ts in a real env. const jsonData = { filters: [ ["tag", "webcam"], ["country", "DEU"], ], conjunction: "AND", }; // Provided by request in a real env const uMods = mods.filter(function (elm) { // Loops through all elements in a list and lets you decide if weather to keep 'em or not let amount = 0; for (fId in jsonData.filters) { // Do this is each provided filter const fi = jsonData.filters[fId]; // Gets the current filters name switch (fi[0]) { case "tag": if (jsonData.conjunction == "OR") { if (libs.returnTags(elm).includes(fi[1])) { return elm; } else { break; } } else { if (libs.returnTags(elm).includes(fi[1])) { amount++; } break; } case "country": if (jsonData.conjunction == "OR") { if (libs.returnCountries(elm).includes(fi[1])) { return elm; } else { break; } } else { if (libs.returnCountries(elm).includes(fi[1])) { amount++; } break; } } } if (jsonData.conjunction == "AND") { if (amount == jsonData.filters.length) { return elm; } } }); console.log(uMods); /** * This things is sorting all given modules by a JSON array. * You can supply the ˋfilterˋ array with a list of filters * They are made up of ["metaData", "metaValue"] * Another argument is ˋconjunctionˋ it can be either AND or OR * OR means that any of the given filters should apply * AND means that all filter HAVE to apply * * Current state * This things can already handle OR requests, AND requests * are not supported yet. I also use the /libs/metaHandler lib, * at least I finnaly found a usecase for that waste of space. * * This is a small prototype which will be added into /routes/api.route.js * at some point. But what I was doing before was almost production testing. * Not good. I will need to test this further and throw some edge cases at it. */