jira-worklog-manager
Version:
A CLI tool for registering work logs on Jira
93 lines (81 loc) • 2.98 kB
JavaScript
require('moment-duration-format')
const axios = require('axios')
const moment = require('moment-timezone')
const { getIntervalAsSeconds } = require('../helpers/timeCalc')
const { DEFAULT_START_TIME = '09:00' } = process.env
module.exports = class JiraIntegrationService {
constructor (url, token) {
if (!url || !token) {
throw new Error('ERROR: Jira credentials are not valid.')
}
this.url = url
this.token = token
this.jiraService = axios.create({
baseURL: `${url}/rest/api/2/`,
headers: {
'Authorization': `Basic ${token}`
},
})
}
retrieveWorklogsFromIssue (issue) {
return this.jiraService.get(`issue/${issue}`)
}
async retrieveWorklogs (date) {
const worklogDate = date ? moment(date, 'DD/MM/YYYY') : moment()
const queryDate = worklogDate.format('YYYY-MM-DD')
const { data: myselfData } = await this.jiraService.get('myself')
const jiraAccountId = myselfData.accountId
let { data: rawSearch } = await this.jiraService.get(
'search?' +
[
'startIndex=0',
'maxResults=1000',
`jql=worklogAuthor=${jiraAccountId}+and+worklogDate=${queryDate}`
].join('&')
)
let issueKeys = rawSearch.issues.map(e => e.key)
let worklogs = await Promise.all(
issueKeys.map(issueKey => {
return this.jiraService.get(`issue/${issueKey}/worklog`)
.then(({ data: worklogsData }) => {
if (worklogsData.total === 0) return []
return { issueKey, worklogs: worklogsData.worklogs }
})
})
)
worklogs = worklogs.reduce((acc, { issueKey, worklogs }) => {
acc[issueKey] = worklogs
return acc
}, {})
return rawSearch.issues.length > 0
? rawSearch.issues.reduce((acc, issue) => {
const issueKey = issue.key
const userWorklogs = worklogs[issueKey]
.filter(e => {
return e.author.accountId === jiraAccountId
&& moment(e.started).format('YYYY-MM-DD') === queryDate
})
.map(e => {
e.issueKey = issueKey
return e
})
acc.push(...userWorklogs)
return acc
}, [])
: null
}
registerWorklog ({ issue, start, end, date, duration, comment }) {
const actualStart = start || moment(DEFAULT_START_TIME, 'HH:mm').format('HH:mm')
const actualEnd = end || moment(actualStart, 'HH:mm').add(duration, 'minutes').format('HH:mm')
const finalDate = date
? moment(`${date} ${actualStart}`, 'DD/MM HH:mm')
: moment()
const startTime = moment.tz(finalDate, moment.tz.guess())
const payload = {
started: startTime.format(`${moment.HTML5_FMT.DATETIME_LOCAL_MS}ZZ`),
timeSpentSeconds: duration ? duration * 60 : getIntervalAsSeconds(actualStart, actualEnd)
}
if (comment) payload.comment = comment
return this.jiraService.post(`issue/${issue}/worklog`, payload)
}
}