Fetch directly from db instead of API

This commit is contained in:
Zaid Abdulla committed 2018-12-26 00:22:07 -08:00
1 parent 2319f8d698
commit db900622a0
7 files changed
+423 -407

No files matched your search

+66 -23
View File
@@ -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);