@@ -518,8 +518,8 @@ exports.QUERY_PAYMENTS_FOR_EXPORT = `
|
||||
}
|
||||
}`;
|
||||
|
||||
exports.QUERY_TRANSITIONS_BY_JOBID = `query QUERY_TRANSITIONS_BY_JOBID($jobid: uuid!) {
|
||||
transitions(where: {jobid: {_eq: $jobid}}, order_by: {id: asc}) {
|
||||
exports.QUERY_TRANSITIONS_BY_JOBID = `query QUERY_TRANSITIONS_BY_JOBID($jobids: [uuid!]!) {
|
||||
transitions(where: {jobid: {_in: $jobids}}, order_by: {created_at: asc}) {
|
||||
start
|
||||
end
|
||||
value
|
||||
@@ -529,6 +529,7 @@ exports.QUERY_TRANSITIONS_BY_JOBID = `query QUERY_TRANSITIONS_BY_JOBID($jobid: u
|
||||
type
|
||||
created_at
|
||||
updated_at
|
||||
jobid
|
||||
}
|
||||
}`;
|
||||
|
||||
|
||||
@@ -1,28 +1,73 @@
|
||||
const _ = require("lodash");
|
||||
const queries = require("../graphql-client/queries");
|
||||
const jobLifecycle = (req, res) => {
|
||||
|
||||
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;
|
||||
|
||||
return _.isArray(jobids) ?
|
||||
handleMultipleJobs(jobids, req, res) :
|
||||
handleSingleJob(jobids, req, res);
|
||||
};
|
||||
const jobIDs = _.isArray(jobids) ? jobids : [jobids];
|
||||
|
||||
const handleMultipleJobs = (jobIDs, req, res) => {
|
||||
return res.status(200).send(jobIDs);
|
||||
}
|
||||
|
||||
const handleSingleJob = async (jobIds, req, res) => {
|
||||
const client = req.userGraphQLClient;
|
||||
|
||||
const resp = await client.request(queries.QUERY_TRANSITIONS_BY_JOBID, {jobid: jobIds,});
|
||||
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 response = {
|
||||
jobIds,
|
||||
data: resp
|
||||
}
|
||||
|
||||
return res.status(200).json(response);
|
||||
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;
|
||||
Reference in New Issue
Block a user