Fetch directly from db instead of API
This commit is contained in:
1 parent
2319f8d698
commit
db900622a0
7 files changed
+423
-407
No files matched your search
+66
-23
@@ -1,43 +1,75 @@
|
||||
"use strict";
|
||||
|
||||
const MongoClient = require("mongodb").MongoClient;
|
||||
const mongodb = require("mongodb");
|
||||
const config = require("./config");
|
||||
const apiFunctions = require("./api-functions");
|
||||
const mongodbFunctions = require("./mongodb-functions");
|
||||
const expression = require("../common/expression");
|
||||
|
||||
let _client = null;
|
||||
const _client = {};
|
||||
|
||||
function getClient() {
|
||||
if (_client) return Promise.resolve(_client);
|
||||
const RESOURCE_DB = {
|
||||
devices: "genieacs",
|
||||
faults: "genieacs",
|
||||
tasks: "genieacs",
|
||||
presets: "genieacs",
|
||||
provisions: "genieacs",
|
||||
files: "genieacs"
|
||||
};
|
||||
|
||||
function getClient(db) {
|
||||
if (_client[db]) return Promise.resolve(_client[db]);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const CONNECTION_URL = config.server.mongodbConnectionUrl;
|
||||
MongoClient.connect(CONNECTION_URL, (err, client) => {
|
||||
mongodb.MongoClient.connect(CONNECTION_URL, (err, client) => {
|
||||
if (err) return reject(err);
|
||||
resolve((_client = client.db("genieacs-ui")));
|
||||
resolve((_client[db] = client.db(db)));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function query(resource, filter, limit, skip, callback) {
|
||||
function query(resource, filter, options, callback) {
|
||||
options = options || {};
|
||||
let q;
|
||||
if (Array.isArray(filter)) q = apiFunctions.filterToMongoQuery(filter);
|
||||
else if (filter != null && !filter) return Promise.resolve([]);
|
||||
filter = expression.evaluate(filter, null, null, Date.now());
|
||||
|
||||
if (Array.isArray(filter)) {
|
||||
if (resource === "devices")
|
||||
filter = mongodbFunctions.processDeviceFilter(filter);
|
||||
else if (resource === "tasks")
|
||||
filter = mongodbFunctions.processTasksFilter(filter);
|
||||
else if (resource === "faults")
|
||||
filter = mongodbFunctions.processFaultsFilter(filter);
|
||||
q = mongodbFunctions.filterToMongoQuery(filter);
|
||||
} else if (filter != null && !filter) {
|
||||
return Promise.resolve([]);
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
getClient().then(client => {
|
||||
getClient(RESOURCE_DB[resource]).then(client => {
|
||||
const collection = client.collection(resource);
|
||||
let cursor = collection.find(
|
||||
q,
|
||||
resource === "Devices"
|
||||
? mongodbFunctions.processDeviceProjection(options.projection)
|
||||
: options.projection
|
||||
);
|
||||
if (options.skip) cursor = cursor.skip(options.skip);
|
||||
if (options.limit) cursor = cursor.limit(options.limit);
|
||||
cursor = cursor.sort({ _id: 1 });
|
||||
|
||||
if (!callback)
|
||||
collection
|
||||
.find(q)
|
||||
.skip(skip || 0)
|
||||
.limit(limit || 0)
|
||||
.toArray((err, docs) => {
|
||||
if (err) return reject(err);
|
||||
return resolve(docs);
|
||||
});
|
||||
cursor.toArray((err, docs) => {
|
||||
if (err) return reject(err);
|
||||
if (resource === "devices")
|
||||
docs = docs.map(d => mongodbFunctions.flattenDevice(d));
|
||||
return resolve(docs);
|
||||
});
|
||||
else
|
||||
collection.find(q).forEach(
|
||||
cursor.forEach(
|
||||
doc => {
|
||||
if (resource === "devices")
|
||||
doc = mongodbFunctions.flattenDevice(doc);
|
||||
callback(doc);
|
||||
},
|
||||
err => {
|
||||
@@ -51,11 +83,22 @@ function query(resource, filter, limit, skip, callback) {
|
||||
|
||||
function count(resource, filter) {
|
||||
let q;
|
||||
if (Array.isArray(filter)) q = apiFunctions.filterToMongoQuery(filter);
|
||||
else if (filter != null && !filter) return Promise.resolve([]);
|
||||
filter = expression.evaluate(filter, null, null, Date.now());
|
||||
|
||||
if (Array.isArray(filter)) {
|
||||
if (resource === "devices")
|
||||
filter = mongodbFunctions.processDeviceFilter(filter);
|
||||
else if (resource === "tasks")
|
||||
filter = mongodbFunctions.processTasksFilter(filter);
|
||||
else if (resource === "faults")
|
||||
filter = mongodbFunctions.processFaultsFilter(filter);
|
||||
q = mongodbFunctions.filterToMongoQuery(filter);
|
||||
} else if (filter != null && !filter) {
|
||||
return Promise.resolve([]);
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
getClient().then(client => {
|
||||
getClient(RESOURCE_DB[resource]).then(client => {
|
||||
const collection = client.collection(resource);
|
||||
collection.find(q).count((err, c) => {
|
||||
if (err) reject(err);
|
||||
|
||||
Reference in new issue
Block a user