diff --git a/src/commands/deployment/testservers/status/status.ts b/src/commands/deployment/testservers/status/status.ts index ba1dfc0..ff8aed7 100644 --- a/src/commands/deployment/testservers/status/status.ts +++ b/src/commands/deployment/testservers/status/status.ts @@ -1,7 +1,8 @@ import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu'; import chalk = require('chalk'); -import { defaultMenuSettings } from '../../../../globals'; +import { defaultMenuSettings, getSettings } from '../../../../globals'; import { getTestStacksInfo } from '../../../../common/testservers'; +import { getIssueFromRepo } from '../../../../services/github_rest'; const tto = require('terminal-table-output').create(); module.exports = { @@ -10,6 +11,13 @@ module.exports = { description: 'Show status for available testservers (s)', hidden: false, run: async (toolbox: GluegunMenuToolbox) => { + // Load settings + const config = await getSettings(toolbox); + if (!config) { + await toolbox.menu.showMenu('setup', defaultMenuSettings); + return; + } + const testStacks = await getTestStacksInfo(toolbox); const status = (status: string) => { switch (status) { @@ -28,6 +36,42 @@ module.exports = { } }; + const getStatusIcon = (status: string): string => { + switch (status) { + case 'open': + return '✅'; + case 'closed': + return '❌'; + case 'null': + return '❔'; + } + }; + + const getIssueStatus = async (issueNumber: string) => { + if (!issueNumber) return getStatusIcon('null'); // GUARD + + const issueData = await getIssueFromRepo( + toolbox, + config.gh_token, + 'photowall', + issueNumber + ); + return { + issue: issueNumber, + status: getStatusIcon(issueData ? issueData.state : 'null') + }; + }; + + const printIssueStatus = ( + issueStatuses: { issue: string; status: string }[], + issueNumber: string + ) => { + const issueStatus = issueStatuses.find( + issueStatus => issueStatus.issue === issueNumber + ); + return issueStatus ? issueStatus.status : getStatusIcon('null'); + }; + const stackUrl = (stackname: string) => { return `https://test-${ stackname.split('photowall-test-')[1] @@ -73,7 +117,14 @@ module.exports = { tto.line('-'); tto - .pushrow(['| status', 'stack', 'branch', 'time since update', 'url']) + .pushrow([ + '| status', + 'stack', + 'branch', + 'status', + 'time since update', + 'url' + ]) .line('-'); // Sort on stackname testStacks.sort((a, b) => { @@ -81,12 +132,31 @@ module.exports = { if (a.name > b.name) return 1; return 0; }); + + // Get issue status + const issueStatusPromises = []; for (const stack of testStacks) { + const regex = /^(\d+)/; + const match = stack.branch.match(regex); + const branchIssueNumber = match ? match[1] : null; + + if (branchIssueNumber) { + issueStatusPromises.push(getIssueStatus(branchIssueNumber)); + } + } + const issueStatuses = await Promise.all(issueStatusPromises); + + for (const stack of testStacks) { + const regex = /^(\d+)/; + const match = stack.branch.match(regex); + const branchIssueNumber = match ? match[1] : null; + const t = new Date(stack.updated); tto.pushrow([ status(stack.status), stack.name, ellipsis(stack.branch, 24), + printIssueStatus(issueStatuses, branchIssueNumber), !isNaN(t.getTime()) ? timeSince(t.getTime()) : timeSince(new Date(stack.created).getTime()),