@@ -519,7 +519,7 @@ exports.QUERY_PAYMENTS_FOR_EXPORT = `
|
||||
}`;
|
||||
|
||||
exports.QUERY_TRANSITIONS_BY_JOBID = `query QUERY_TRANSITIONS_BY_JOBID($jobids: [uuid!]!) {
|
||||
transitions(where: {jobid: {_in: $jobids}}, order_by: {created_at: asc}) {
|
||||
transitions(where: {jobid: {_in: $jobids}}, order_by: {end: desc}) {
|
||||
start
|
||||
end
|
||||
value
|
||||
|
||||
@@ -1,57 +1,14 @@
|
||||
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_minutes;
|
||||
|
||||
// If there is no prev_value, it is the first transition
|
||||
if (!transition.prev_value) {
|
||||
statusDuration[transition.value] = {
|
||||
value: duration,
|
||||
humanReadable: transition.duration_readable
|
||||
};
|
||||
}
|
||||
// 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].value += duration;
|
||||
statusDuration[transition.value].humanReadable = transition.duration_readable;
|
||||
} else {
|
||||
statusDuration[transition.value] = {
|
||||
value: duration,
|
||||
humanReadable: transition.duration_readable
|
||||
};
|
||||
}
|
||||
}
|
||||
// For all other transitions
|
||||
else {
|
||||
if (statusDuration[transition.value]) {
|
||||
statusDuration[transition.value].value += duration;
|
||||
statusDuration[transition.value].humanReadable = transition.duration_readable;
|
||||
} else {
|
||||
statusDuration[transition.value] = {
|
||||
value: duration,
|
||||
humanReadable: transition.duration_readable
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return statusDuration;
|
||||
}
|
||||
|
||||
const durationToHumanReadable = require("../utils/durationToHumanReadable");
|
||||
const calculateStatusDuration = require("../utils/calculateStatusDuration");
|
||||
|
||||
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;
|
||||
@@ -67,19 +24,21 @@ const jobLifecycle = async (req, res) => {
|
||||
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();
|
||||
}
|
||||
if(transition.duration){
|
||||
transition.duration_seconds = Math.round(transition.duration / 1000);
|
||||
transition.duration_minutes = Math.round(transition.duration_seconds / 60);
|
||||
transition.duration_readable = moment.duration(transition.duration).humanize();
|
||||
transition.start_readable = transition.start ? moment(transition.start).fromNow() : 'N/A';
|
||||
transition.end_readable = transition.end ? moment(transition.end).fromNow() : 'N/A';
|
||||
|
||||
if (transition.duration) {
|
||||
transition.duration_seconds = Math.round(transition.duration / 1000);
|
||||
transition.duration_minutes = Math.round(transition.duration_seconds / 60);
|
||||
let duration = moment.duration(transition.duration);
|
||||
transition.duration_readable = durationToHumanReadable(duration);
|
||||
} else {
|
||||
transition.duration_seconds = 0;
|
||||
transition.duration_minutes = 0;
|
||||
transition.duration_readable = 'N/A';
|
||||
}
|
||||
return transition;
|
||||
});
|
||||
@@ -90,13 +49,10 @@ const jobLifecycle = async (req, res) => {
|
||||
};
|
||||
}
|
||||
|
||||
console.dir(groupedTransitions, {depth: null})
|
||||
|
||||
return res.status(200).json({
|
||||
jobIDs,
|
||||
transition: groupedTransitions,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
module.exports = jobLifecycle;
|
||||
59
server/utils/calculateStatusDuration.js
Normal file
59
server/utils/calculateStatusDuration.js
Normal file
@@ -0,0 +1,59 @@
|
||||
const moment = require('moment');
|
||||
const durationToHumanReadable = require("./durationToHumanReadable");
|
||||
/**
|
||||
* Calculate the duration of each status of a job
|
||||
* @param transitions
|
||||
* @returns {{}}
|
||||
*/
|
||||
const calculateStatusDuration = (transitions) => {
|
||||
let statusDuration = {};
|
||||
let totalDuration = 0;
|
||||
let summations = [];
|
||||
|
||||
transitions.forEach((transition, index) => {
|
||||
let duration = transition.duration;
|
||||
totalDuration += duration;
|
||||
|
||||
if (!transition.prev_value) {
|
||||
statusDuration[transition.value] = {
|
||||
value: duration,
|
||||
humanReadable: transition.duration_readable
|
||||
};
|
||||
} else if (!transition.next_value) {
|
||||
if (statusDuration[transition.value]) {
|
||||
statusDuration[transition.value].value += duration;
|
||||
statusDuration[transition.value].humanReadable = transition.duration_readable;
|
||||
} else {
|
||||
statusDuration[transition.value] = {
|
||||
value: duration,
|
||||
humanReadable: transition.duration_readable
|
||||
};
|
||||
}
|
||||
} else {
|
||||
if (statusDuration[transition.value]) {
|
||||
statusDuration[transition.value].value += duration;
|
||||
statusDuration[transition.value].humanReadable = transition.duration_readable;
|
||||
} else {
|
||||
statusDuration[transition.value] = {
|
||||
value: duration,
|
||||
humanReadable: transition.duration_readable
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
for (let [status, {value, humanReadable}] of Object.entries(statusDuration)) {
|
||||
if (status !== 'total') {
|
||||
summations.push({status, value, humanReadable});
|
||||
}
|
||||
}
|
||||
|
||||
const humanReadableTotal = durationToHumanReadable(moment.duration(totalDuration));
|
||||
|
||||
return {
|
||||
summations,
|
||||
total: totalDuration,
|
||||
humanReadableTotal
|
||||
};
|
||||
}
|
||||
module.exports = calculateStatusDuration;
|
||||
22
server/utils/durationToHumanReadable.js
Normal file
22
server/utils/durationToHumanReadable.js
Normal file
@@ -0,0 +1,22 @@
|
||||
const durationToHumanReadable = (duration) => {
|
||||
if (!duration) return 'N/A';
|
||||
|
||||
let parts = [];
|
||||
|
||||
let years = duration.years();
|
||||
let months = duration.months();
|
||||
let days = duration.days();
|
||||
let hours = duration.hours();
|
||||
let minutes = duration.minutes();
|
||||
let seconds = duration.seconds();
|
||||
|
||||
if (years) parts.push(years + ' year' + (years > 1 ? 's' : ''));
|
||||
if (months) parts.push(months + ' month' + (months > 1 ? 's' : ''));
|
||||
if (days) parts.push(days + ' day' + (days > 1 ? 's' : ''));
|
||||
if (hours) parts.push(hours + ' hour' + (hours > 1 ? 's' : ''));
|
||||
if (minutes) parts.push(minutes + ' minute' + (minutes > 1 ? 's' : ''));
|
||||
if (!minutes && !hours && !days && !months && !years && seconds) parts.push(seconds + ' second' + (seconds > 1 ? 's' : ''));
|
||||
|
||||
return parts.join(', ');
|
||||
}
|
||||
module.exports = durationToHumanReadable;
|
||||
Reference in New Issue
Block a user