@warp-works/warpjs-survey-tool-plugin
Version:
Plugin to set up survey
131 lines (111 loc) • 6.7 kB
JavaScript
// const debug = require('debug')('W2:plugin:survey-tool:root/get-all-questionnaires');
const _ = require('lodash');
const Promise = require('bluebird');
const RoutesInfo = require('@quoin/expressjs-routes-info');
const warpjsUtils = require('@warp-works/warpjs-utils');
const constants = require('./../../lib/constants');
// const middlewares = require('./middlewares');
const ResultSet = require('./../../lib/models/result-set');
const utils = require('./../utils');
module.exports = (req, res) => warpjsUtils.wrapWith406(res, {
html: () => {
warpjsUtils.sendIndex(req, res, RoutesInfo, 'Ipt',
[
`${req.app.get('base-url')}/assets/${constants.assets.aggregatedRsFeedback}`
],
`${req.app.get('base-url')}/assets/${constants.assets.css}`
);
},
[warpjsUtils.constants.HAL_CONTENT_TYPE]: async () => {
const { surveyId, typeId } = req.params;
const pluginInfo = utils.getPluginInfo(req);
const resource = warpjsUtils.createResource(req, {
domain: pluginInfo.domain,
typeId
});
const Persistence = require(pluginInfo.config.persistence.module);
const persistence = new Persistence(pluginInfo.config.persistence.host, pluginInfo.domain);
try {
const domainModel = await pluginInfo.warpCore.getDomainByName(pluginInfo.domain);
const typeEntity = await domainModel.getEntityByName(pluginInfo.config.schema.resultSet);
const typeInstance = await typeEntity.getInstance(pluginInfo.persistence, typeId);
const typeModel = new ResultSet();
await typeModel.fromPersistence(Promise, pluginInfo, typeEntity, typeInstance);
const typeHAL = await typeModel.toHal(warpjsUtils, RoutesInfo, constants.routes, pluginInfo.domain, surveyId);
const questionnaireEntity = await domainModel.getEntityByName(pluginInfo.config.schema.questionnaire);
const questionnaireDocument = await questionnaireEntity.getDocuments(persistence, { _id: surveyId }, true);
const feedbackRelationship = await questionnaireEntity.getRelationshipByName(pluginInfo.config.schema.surveyToolFeedback);
const feedbackDocuments = await feedbackRelationship.getDocuments(persistence, questionnaireDocument[0]);
const getFeedbackByThumbDirection = (thumbDirection, result, question) => {
const filteredFeedback = _.filter(feedbackDocuments, (feedbackDocument) => {
const matchesThumbDirection = feedbackDocument.ThumbDirection === thumbDirection;
const matchesAssociations = feedbackDocument.associations && feedbackDocument.associations.length === 3 && feedbackDocument.associations[0].data[0]._id === result.id && feedbackDocument.associations[1].data[0]._id === typeHAL.id && feedbackDocument.associations[2].data[0]._id === question.id;
return matchesThumbDirection && matchesAssociations;
});
question.embed(thumbDirection, filteredFeedback.map((feedback) => {
const date = new Date(feedback.lastUpdated);
const feedbackResource = warpjsUtils.createResource('', {
id: feedback.id,
comment: feedback.Comment,
thumbDirection: feedback.ThumbDirection,
typeID: feedback.typeID,
parentID: feedback.parentID,
date: date.toString()
});
return feedbackResource;
}));
question[thumbDirection] = filteredFeedback.length;
};
const getResultFeedbackByThumbDirection = (thumbDirection, result) => {
const filteredFeedback = _.filter(feedbackDocuments, (feedbackDocument) => {
const matchesThumbDirection = feedbackDocument.ThumbDirection === thumbDirection;
const matchesAssociations = feedbackDocument.associations && feedbackDocument.associations.length === 2 && feedbackDocument.FeedbackType === 'result' && feedbackDocument.associations[0].data[0]._id === result.id && feedbackDocument.associations[1].data[0]._id === typeHAL.id;
return matchesThumbDirection && matchesAssociations;
});
result.embed(thumbDirection, filteredFeedback.map((feedback) => {
const date = new Date(feedback.lastUpdated);
const feedbackResource = warpjsUtils.createResource('', {
id: feedback.id,
comment: feedback.Comment,
thumbDirection: feedback.ThumbDirection,
typeID: feedback.typeID,
parentID: feedback.parentID,
date: date.toString()
});
return feedbackResource;
}));
result[thumbDirection] = filteredFeedback.length;
};
const thumbResult = (thumbsUp, thumbsDown) => {
let result = 'neutral';
if (thumbsUp !== 0 || thumbsDown !== 0) {
if (thumbsUp - thumbsDown === 0) {
result = 'tie';
} else if (thumbsUp - thumbsDown > 0) {
result = 'positive';
} else {
result = 'negative';
}
}
return result;
};
_.each(typeHAL._embedded.results, (result) => {
getResultFeedbackByThumbDirection('ThumbsUp', result);
getResultFeedbackByThumbDirection('ThumbsDown', result);
result.commentResult = thumbResult(parseInt(result.ThumbsUp, 10), parseInt(result.ThumbsDown, 10));
_.each(result._embedded.relevantQuestions, (question) => {
getFeedbackByThumbDirection('ThumbsUp', result, question);
getFeedbackByThumbDirection('ThumbsDown', result, question);
question.commentResult = thumbResult(parseInt(question.ThumbsUp, 10), parseInt(question.ThumbsDown, 10));
});
});
resource.embed('items', typeHAL);
await utils.sendHal(req, res, resource);
} catch (err) {
console.error("server/root/get-types: err:", err);
await utils.sendErrorHal(req, res, resource, err);
} finally {
await pluginInfo.persistence.close();
}
}
});