Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'use strict';
- const {Unit} = require('../../../models/units');
- const {BadRequest} = require('../../_shared/errors');
- // ----------------------------------------------------------------------------
- /**
- * @param {*} req
- * @return {promise}
- */
- async function getContextFields(req) {
- if (!req.query.displayType) throw new BadRequest('displayType');
- let aggregate = buildAggregateQuery(req);
- const aggregateResult = await Unit.aggregate(aggregate).exec();
- if (aggregateResult[0].measurements.length === 0) throw new BadRequest('displayType');
- if (aggregateResult[0].influxTables.length === 0) throw new BadRequest('displayType');
- let tableSet = new Set(aggregateResult[0].influxTables);
- aggregateResult[0].influxTables = [...tableSet];
- return aggregateResult[0];
- }
- /**
- * @param {*} req
- * @return {*}
- */
- function buildAggregateQuery(req) {
- const match = buildMatch(req);
- const filterProject = buildFilterProject(req);
- const formatProject = buildFormatProject();
- return [match, filterProject, formatProject];
- }
- /**
- * @param {*} req
- * @return {Object}
- */
- function buildMatch(req) {
- return {$match: {'_id': req.unit._id}};
- }
- /**
- * @param {*} req
- * @return {Object}
- */
- function buildFilterProject(req) {
- const displayType = req.query.displayType;
- let filterProject = {
- $project: {
- measurements: {
- $filter: {
- input: '$measurements',
- as: 'measurements',
- cond: {$and: [{$eq: [`$$measurements.displayTypes.${displayType}`, true]}]},
- },
- },
- _id: false,
- },
- };
- // Find a better way to do that (like with array as query parameter)
- let queryFields = [];
- if (req.query.field1) queryFields.push(req.query.field1);
- if (req.query.field2) queryFields.push(req.query.field2);
- if (req.query.field3) queryFields.push(req.query.field3);
- if (req.query.field4) queryFields.push(req.query.field4);
- if (queryFields.length > 0) {
- const condition = {$in: [`$$measurements.name`, queryFields]};
- filterProject.$project.measurements.$filter.cond.$and.push(condition);
- }
- return filterProject;
- }
- /**
- * @return {Object}
- */
- function buildFormatProject() {
- const formatProject = {
- $project: {
- measurements: '$measurements',
- influxTables: '$measurements.influxTable',
- },
- };
- return formatProject;
- }
- module.exports = {getContextFields};
Add Comment
Please, Sign In to add comment