87 lines
2.4 KiB
JavaScript
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; |