const _ = require("lodash"); const queries = require("../graphql-client/queries"); const moment = require("moment"); const durationToHumanReadable = require("../utils/durationToHumanReadable"); const calculateStatusDuration = require("../utils/calculateStatusDuration"); const jobLifecycle = async (req, res) => { // Grab the jobids and statuses from the request body const { jobids, statuses } = req.body; if (!jobids) { return res.status(400).json({ error: "Missing jobids" }); } 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) { let lifecycle = transitionsByJobId[jobId].map(transition => { 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; }); groupedTransitions[jobId] = { lifecycle: lifecycle, durations: calculateStatusDuration(lifecycle, statuses), }; } return res.status(200).json({ jobIDs, transition: groupedTransitions, }); } module.exports = jobLifecycle;