Files
bodyshop/server/job/job-lifecycle.js
Dave Richer 5de4ef5d83 - human readable dates
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-01-23 12:54:38 -05:00

87 lines
2.4 KiB
JavaScript

const _ = require("lodash");
const queries = require("../graphql-client/queries");
const moment = require("moment");
const calculateStatusDuration = (transitions) => {
let statusDuration = {};
transitions.forEach((transition, index) => {
let duration = transition.duration;
// If there is no prev_value, it is the first transition
if (!transition.prev_value) {
statusDuration[transition.value] = duration;
}
// If there is no next_value, it is the last transition (the active one)
else if (!transition.next_value) {
if (statusDuration[transition.value]) {
statusDuration[transition.value] += duration;
} else {
statusDuration[transition.value] = duration;
}
}
// For all other transitions
else {
if (statusDuration[transition.value]) {
statusDuration[transition.value] += duration;
} else {
statusDuration[transition.value] = duration;
}
}
});
return statusDuration;
}
const jobLifecycle = async (req, res) => {
const {jobids} = req.body;
const jobIDs = _.isArray(jobids) ? jobids : [jobids];
const client = req.userGraphQLClient;
const resp = await client.request(queries.QUERY_TRANSITIONS_BY_JOBID, {jobids: jobIDs,});
const transitions = resp.transitions;
if (!transitions) {
return res.status(200).json({
jobIDs,
transitions: []
});
}
const transitionsByJobId = _.groupBy(resp.transitions, 'jobid');
const groupedTransitions = {};
moment.relativeTimeThreshold('m', 30)
for (let jobId in transitionsByJobId) {
let lifecycle = transitionsByJobId[jobId].map(transition => {
if (transition.start) {
transition.start_readable = moment(transition.start).fromNow();
}
if (transition.end) {
transition.end_readable = moment(transition.end).fromNow();
}
return transition;
});
groupedTransitions[jobId] = {
lifecycle: lifecycle,
durations: calculateStatusDuration(lifecycle)
};
}
console.dir(groupedTransitions, {depth: null});
return res.status(200).json({
jobIDs,
transition: groupedTransitions,
});
}
module.exports = jobLifecycle;