import fs from 'fs' import http from 'http' import path from 'path' import fetch from 'node-fetch' import { createRequire } from "module"; const require = createRequire(import.meta.url); const jiraReq = require("./JiraInput.json"); export class JiraTools{ constructor(domain_name, board_id){ this.domain_name = domain_name; this.board_id = board_id; this.url_string= `https://${domain_name}.atlassian.net/rest/api/latest/search?jql=project=${board_id}`; } //get all issues on the board async get_all_issues(){ console.log("Getting new issues\n\n"); let issues = []; let response = await fetch(this.url_string, { method: 'GET', authorization: jiraReq.authStr, headers: { 'Authorization': jiraReq.authStr, 'Accept': 'application/json', 'Content-Type': 'application/json' } }); console.log(`Response: ${response.status}`); let text = await response.text(); //console.log(text) const obj = JSON.parse(text); const issues_length = obj.issues.length; for(let i = 0; i < issues_length; i++) { //console.log(obj.issues[i].key); //console.log(obj.issues[i].fields.description); issues.unshift({"id":obj.issues[i].key, "description":obj.issues[i].fields.summary, "status": obj.issues[i].fields.status.name, "closed": obj.issues[i].fields.resolutiondate}); } //console.log({"issues":issues}); return await issues; } //get issue by issue ID / issue key get_issue(issueID){ console.log(`Getting issue: ${issueID}\n\n`); fetch(`https://${this.domain_name}.atlassian.net/rest/api/latest/issue/${issueID}`, { method: 'GET', authorization: jiraReq.authStr, headers: { 'Authorization': jiraReq.authStr, 'Accept': 'application/json', 'Content-Type': 'application/json' } }) .then(response => { console.log(`Response: ${response.status}`); return response.text(); }) .then(text => { const obj = JSON.parse(text); const issue_key = obj.key; const issue_type = obj.fields.issuetype.name; const issue_status = obj.fields.status.name; const issue_desc = obj.fields.description; console.log(`Issue Key: ${issue_key}\n Issue Type: ${issue_type}\n Issue Status: ${issue_status}\n Issue Description: ${issue_desc}\n`) return {issue_key, issue_type, issue_status, issue_desc}; }) .catch(err => console.error(err)); } //create new issue with variable description create_issue(issue_desc, issue_type){ console.log(`Creating issue: ${issue_desc} ~ ${issue_type}\n\n`); const bodyData = `{ "fields": { "issuetype": { "name": "${issue_type}" }, "project": { "key": "${this.board_id}" }, "summary": "Creating Issue with REST API", "description": { "type": "doc", "version": 1, "content": [ { "type": "paragraph", "content": [ { "type": "text", "text": "${issue_desc}" } ] } ] } } }`; fetch(`https://${this.domain_name}.atlassian.net/rest/api/3/issue`, { method: 'POST', headers: { 'Authorization': jiraReq.authStr, 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }) .then(response => { console.log(`Response: ${response.status} ${response.statusText}`); return response.text(); }) .then(text => console.log(text)) .catch(err => console.error(err)); } //set an issue status (if issue exists) set_issue_status(issueID, newStatus){ // console.log(`Updating issue ${issueID} status to: ${newStatus}\n\n`); var transitions_dict = {}; fetch(`https://${this.domain_name}.atlassian.net/rest/api/3/issue/${issueID}/transitions`, { method: 'GET', authorization: jiraReq.authStr, headers: { 'Authorization': jiraReq.authStr, 'Accept': 'application/json', 'Content-Type': 'application/json' } }) .then(response => { console.log( `Response: ${response.status}` ); return response.text(); }) .then(text => { //console.log(text) const obj = JSON.parse(text); const transitionID_length = obj.transitions.length; for(let i = 0; i < transitionID_length; i++){ transitions_dict[obj.transitions[i].name] = obj.transitions[i].id; console.log(obj.transitions[i].id); } const statusID = transitions_dict[newStatus]; return statusID; }) .then(statusID =>{ console.log(`New Status set to \nKey: ${newStatus}\nID: ${statusID}`); const bodyData = `{ "update": { "comment": [ { "add": { "body": { "type": "doc", "version": 1, "content": [ { "type": "paragraph", "content": [ { "text": "Issue has been fixed", "type": "text" } ] } ] } } } ] }, "transition": { "id": "${statusID}" } }`; return bodyData; }) .then(bodyData => fetch(`https://${this.domain_name}.atlassian.net/rest/api/3/issue/${issueID}/transitions`, { method: 'POST', headers: { 'Authorization': jiraReq.authStr, 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }) .then(response => { console.log(`Response: ${response.status} ${response.statusText}`); return response.text(); }) .then(text => console.log(text)) .catch(err => console.error(err))); } }