73 lines
1.9 KiB
JavaScript
73 lines
1.9 KiB
JavaScript
const _ = require("lodash");
|
|
const queries = require("../graphql-client/queries");
|
|
|
|
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 = {};
|
|
|
|
for (let jobId in transitionsByJobId) {
|
|
groupedTransitions[jobId] = {
|
|
lifecycle: transitionsByJobId[jobId],
|
|
durations: calculateStatusDuration(transitionsByJobId[jobId])
|
|
};
|
|
}
|
|
|
|
return res.status(200).json({
|
|
jobIDs,
|
|
transition: groupedTransitions,
|
|
});
|
|
}
|
|
|
|
|
|
module.exports = jobLifecycle; |