From 3827780244f652cf97263095ae02b5b43bddcc4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20R=C3=BCtten?= Date: Fri, 25 Jan 2019 17:07:32 +0100 Subject: [PATCH] add new verbose mode + fix caching issue --- src/commands/listActivityCommand.ts | 20 +++++++----- src/index.ts | 1 + src/jira.ts | 49 +++++++++++++++++++++++------ src/print.ts | 3 +- 4 files changed, 54 insertions(+), 19 deletions(-) diff --git a/src/commands/listActivityCommand.ts b/src/commands/listActivityCommand.ts index 9a0e72a..3cc0f32 100644 --- a/src/commands/listActivityCommand.ts +++ b/src/commands/listActivityCommand.ts @@ -16,6 +16,7 @@ export const listActivityCommand = async (command: any) => { const username = command.username || settingsStore.value('settings.username') const maxResults = command.max || 500 const filter = command.filter + const verbose = command.verbose if (filter) { if (!['week', 'month'].includes(filter)) { @@ -24,6 +25,10 @@ export const listActivityCommand = async (command: any) => { } } + if (verbose) { + console.log('Running in "verbose" mode.') + } + if (!hostname || !username) { console.info('Please specify your username and hostname either per command options or defaults.') console.info('jira-activity --help') @@ -37,17 +42,16 @@ export const listActivityCommand = async (command: any) => { name: 'password' }) as any - const jiraSettings: JiraSettings = { - username, - password, - hostname - } + const jiraSettings: JiraSettings = { username, password, hostname } - spinner.start() + if (!verbose) { + spinner.start() + } try { const activities = await getActivities( jiraSettings, maxResults, + verbose, filter ? moment().startOf(filter).unix() * 1000 : undefined ) print(activities) @@ -55,7 +59,9 @@ export const listActivityCommand = async (command: any) => { console.log(`\nOps, something went wrong: "${error.message}"`) } - spinner.stop(true) + if (!verbose) { + spinner.stop(true) + } } process.exit(0) diff --git a/src/index.ts b/src/index.ts index 1199fc6..029b5e5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,6 +18,7 @@ program .option('-h, --hostname ', 'specifies the hostname which is used') .option('-u, --username ', 'specifies the username which is used') .option('-f, --filter ', 'filters the list to the current week or month [type: week or month]') + .option('-v, --verbose', 'run in verbose mode') .option('-m, --max ', 'specifies the number of max results. The default is: 500', parseInt) .description('Loads your activity and lists the parent issues you have worked on grouped by day') diff --git a/src/jira.ts b/src/jira.ts index f6b27d2..a10b871 100644 --- a/src/jira.ts +++ b/src/jira.ts @@ -28,39 +28,64 @@ export interface GroupedActivities { } } -export const getActivities = async (jiraSettings: JiraSettings, maxResults: number, fromDate?: number): Promise => { +export const getActivities = async (jiraSettings: JiraSettings, maxResults: number, verbose: boolean, fromDate?: number): Promise => { const fromDateFilter = fromDate ? `&streams=update-date+AFTER+${fromDate}` : '' const url = `activity?maxResults=${maxResults}&streams=user+IS+${encodeURIComponent(jiraSettings.username)}${fromDateFilter}&os_authType=basic` - const response = await requestWithCredentials(jiraSettings, url).buffer(true) + const response = await requestWithCredentials(jiraSettings, url, verbose).buffer(true) + + if (verbose) { + console.log('\nStart converting the XML response to JS') + } + const body = await xml2js(response.text) + if (verbose) { + console.log('\nStart mapping the entries') + } + const activities = body.feed.entry.map((entry: any) => convertToActivityEntry(entry)) const result: GroupedActivities = {} for (let activity of activities) { if (activity) { - const parent = await getParentIssue(jiraSettings, activity) + const parent = await getIssue(jiraSettings, activity, verbose) - addToResult(result, parent || activity, activity.date) + addToResult(result, parent, activity.date) } } return result } -const getParentIssue = async (jiraSettings: JiraSettings, activity: ActivityEntry): Promise => { - const parentIssue = settingsStore.value(`issues.${activity.id}`) - if (parentIssue) { - return parentIssue +const getIssue = async (jiraSettings: JiraSettings, activity: ActivityEntry, verbose = false): Promise => { + const issueFromCache = settingsStore.value(`issues.${activity.id}`) + if (issueFromCache) { + if (verbose) { + console.log(`\nCache hit found for issue ${activity.id}`) + } + return issueFromCache + } + + if (verbose) { + console.log(`\nSearching the parent issue for ${activity.id} in jira`) } const parentIssueFromJira = await getParentIssueFromJira(jiraSettings, activity) if (parentIssueFromJira) { + if (verbose) { + console.log(`\nParent issue found for ${activity.id} > ${parentIssueFromJira.id}`) + } + settingsStore.setValue(`issues.${activity.id}`, parentIssueFromJira) return parentIssueFromJira } - return undefined + if (verbose) { + console.log(`\nSaving the result into the cache for issue ${activity.id}`) + } + + settingsStore.setValue(`issues.${activity.id}`, activity) + return activity } const getParentIssueFromJira = async (jiraSettings: JiraSettings, activity: ActivityEntry): Promise => { @@ -111,7 +136,11 @@ const addToResult = async (result: GroupedActivities, entry: CachedEntry, date: } } -const requestWithCredentials = (jiraSettings: JiraSettings, path: string) => { +const requestWithCredentials = (jiraSettings: JiraSettings, path: string, verbose = false) => { + if (verbose) { + console.log(`\nGET https://${jiraSettings.hostname}/${path}`) + } + return request .get(`https://${jiraSettings.hostname}/${path}`) .auth(jiraSettings.username, jiraSettings.password) diff --git a/src/print.ts b/src/print.ts index b152038..1256de2 100644 --- a/src/print.ts +++ b/src/print.ts @@ -2,10 +2,9 @@ import { GroupedActivities } from './jira' export const print = (activities: GroupedActivities) => { for (let [ date, entries ] of Object.entries(activities).sort()) { - console.log(`${date}:`) + console.log(`\n${date}:`) for (let [ issueKey, title ] of Object.entries(entries)) { console.log(`${issueKey} - ${title}`) } - console.log('\n') } }