VICE / ModuleTests / Azure / JiraModule.js
JiraModule.js
Raw
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)));
    }
}