jira-cli
Version:
A JIRA Command Line Interface
231 lines (196 loc) • 7.52 kB
JavaScript
/*global requirejs,console,define,fs*/
module.exports = function () {
var program = require('commander');
var sslRequest = require('../../lib/ssl_request');;
var Table = require('cli-table');
var config = require('../../lib/config');
var getRapidBoardID = function getRapidBoardID(rapidBoardID, cb) {
if (typeof rapidBoardID !== 'string') {
rapidBoardID = undefined;
}
sslRequest.get(config.auth.url + 'rest/greenhopper/latest/rapidviews/list').end((err, res) => {
try {
if (!res.ok) {
console.log('Error getting rapid boards. HTTP Status Code: ' + res.status);
return;
}
} catch(e) {
if (err && err.message) {
return cb(`A connection error occurred: Error Number: ${err.errno} | Message: ${err.message}`)
}
return cb(e);
}
displayRapidBoards(rapidBoardID, res.body, cb);
});
};
var displayRapidBoards = function displayRapidBoards(rapidBoardID, data, cb) {
var table = new Table({
head: ['Key', 'Name']
});
var pushTable = [];
for (i = 0; i < data.views.length; i++) {
var item = data.views[i];
if (rapidBoardID !== undefined) {
if (item.name.toLowerCase() == rapidBoardID.toLowerCase()) {
pushTable = [[item.id, item.name]];
break;
}
if (item.name.toLowerCase().indexOf(rapidBoardID.toLowerCase()) === -1) {
continue;
}
}
pushTable.push([item.id, item.name]);
}
table.push.apply(table, pushTable);
if (table.length === 0) {
if (rapidBoardID === undefined) {
console.log('No rapid boards found in your Jira instance');
} else {
console.log('No rapid boards found matching term in your Jira instance: ' + rapidBoardID);
}
} else if (table.length === 1) {
console.log('****Found Rapid Board: ' + table[0][1]);
cb(table[0][0]);
} else {
console.log('\nMatching Rapid Boards:');
console.log('=========================================\n');
console.log(table.toString());
}
};
var getSprintID = function getSprintID(rapidBoardID, sprintID, cb) {
if (typeof sprintID !== 'string') {
sprintID = undefined;
}
sslRequest.get(config.auth.url + 'rest/greenhopper/latest/sprintquery/' + rapidBoardID).end((err, res) => {
try {
if (!res.ok) {
console.log('Error getting sprints. HTTP Status Code: ' + res.status);
return;
}
} catch(e) {
if (err && err.message) {
return cb(`A connection error occurred: Error Number: ${err.errno} | Message: ${err.message}`)
}
return cb(e);
}
displaySprints(rapidBoardID, sprintID, res.body, cb);
});
};
var displaySprints = function displaySprints(rapidBoardID, sprintID, data, cb) {
var table = new Table({
head: ['Key', 'Name', 'Status']
});
var pushTable = [];
for (i = 0; i < data.sprints.length; i++) {
var item = data.sprints[i];
if (sprintID !== undefined) {
if (item.name.toLowerCase() == sprintID.toLowerCase()) {
pushTable = [[item.id, item.name, item.state]];
break;
}
if (item.state !== 'ACTIVE') {
continue;
}
if (item.name.toLowerCase().indexOf(sprintID.toLowerCase()) === -1) {
continue;
}
}
pushTable.push([item.id, item.name, item.state]);
}
table.push.apply(table, pushTable);
if (table.length == 0) {
if (sprintID === undefined) {
console.log('No sprints found in rapid board ' + rapidBoardID);
} else {
console.log('No sprints found matching term in rapid board ' + rapidBoardID + ': ' + sprintID);
}
} else if (table.length === 1) {
console.log('****Found Sprint: ' + table[0][1]);
cb(table[0][0]);
} else {
console.log('\nMatching Sprints:');
console.log('=========================================\n');
console.log(table.toString());
return cb(pushTable[pushTable.length - 1][0], pushTable); //picks the last sprint
}
};
var getSprintIssues = function getSprintIssues(rapidBoardID, sprintID, cb) {
var qParams = 'rapidViewId=' + rapidBoardID;
if (sprintID) {
qParams += '&sprintId=' + sprintID;
}
sslRequest.get(config.auth.url + 'rest/greenhopper/latest/rapid/charts/sprintreport?' + qParams).end((err, res) => {
try {
if (!res.ok) {
console.log('Error getting sprint data. HTTP Status Code: ' + res.status);
console.dir(res.body);
return;
}
} catch(e) {
if (err && err.message) {
return cb(`A connection error occurred: Error Number: ${err.errno} | Message: ${err.message}`)
}
return cb(e);
}
cb(res.body);
});
};
var displaySprintIssues = function displaySprintIssues(rapidBoardID, sprintID, data) {
var sprint = new Table({
head: ['Key', 'Name', 'Status', 'Start Date', 'End Date']
});
var completed = new Table({
head: ['Key', 'Type', 'Assignee', 'Priority', 'Status', 'Summary']
});
var incompleted = new Table({
head: ['Key', 'Type', 'Assignee', 'Priority', 'Status', 'Summary']
});
var punted = new Table({
head: ['Key', 'Type', 'Assignee', 'Priority', 'Status', 'Summary']
});
var pushIssues = function pushIssues(issues, table) {
if (!issues) return;
issues.forEach(function (issue) {
var priority = issue.priorityName || 'Unknown',
summary = issue.summary.length > 45 ? issue.summary.substr(0, 42) + '...' : issue.summary,
status = issue.statusName || 'Unknown',
assignee = issue.assignee || 'None',
key = issue.key || 'Unknown',
type = issue.typeName || 'Unknown';
table.push([key, type, assignee, priority, status, summary]);
});
};
pushIssues(data.contents.completedIssues, completed);
pushIssues(data.contents.issuesNotCompletedInCurrentSprint, incompleted);
pushIssues(data.contents.puntedIssues, punted);
sprint.push([data.sprint.id, data.sprint.name, data.sprint.state, data.sprint.startDate, data.sprint.endDate]);
var displayTable = function displayTable(msg, table) {
if (table.length > 0) {
console.log(msg);
console.log(table.toString());
console.log('\n==============================================================\n');
}
};
console.log('\n==============================================================');
console.log('==== SPRINT ====');
console.log('==============================================================\n');
displayTable('Sprint:', sprint);
displayTable('Completed Issues:', completed);
displayTable('Punted Issues:', punted);
displayTable('Incompleted Issues:', incompleted);
};
return function sprint(userRapidBoardID, userSprintID, cb) {
getRapidBoardID(userRapidBoardID, function (rapidBoardID) {
getSprintID(rapidBoardID, userSprintID, function (sprintID, allSprints) {
getSprintIssues(rapidBoardID, sprintID, function (data) {
if (cb) {
displaySprintIssues(rapidBoardID, sprintID, data);
return cb(allSprints);
} else {
displaySprintIssues(rapidBoardID, sprintID, data);
}
});
});
});
};
}();