JIRA REST APIで任意の課題（JQLで指定）にグループメンバーをウォッチャーとして割り当てる。

#はじめに
* JIRAの一括変更でグループメンバーへのウォッチャー割り当てができなかったためREST APIで実装してみました。

#実施環境
* 実施環境、事前準備は[JIRA REST APIで課題情報を取得（jira-client-npm を使用）](https://qiita.com/UC-SADA/items/1824aa5d5f3b2b21afef)を参考にして下さい。

# 作業の流れ
1. getUsersInGroup関数を使ってメンバーのaccount_idの抽出
2. searchJira関数を使って未ウォッチタスクの抽出
3. addWatcher関数を使ってウォッチャーの割り当て
4. mainでそれぞれの関数をasync/awaitで同期処理。
 
## getUsersInGroup
* グループ内のaccount_idの抽出
* 同期処理をするためにPromiseを用意しておく。

```index.js
// グループメンバーの抽出
function getUsersInGroup(groupName) {
  return new Promise((resolve, reject) => {
    var watcher =[];
      jira.getUsersInGroup(groupName) //getUsersInGroup(groupname: string, startAt: integer, maxResults: integer)
      .then(function(issue){
        console.log("getUsersInGroup:")
          for (  var i = 0;  i < issue.users.items.length;  i++  ) {
            if(issue.users.items[i].accountType == "atlassian"){
              watcher.push({id:issue.users.items[i].accountId,name:issue.users.items[i].displayName});
            }
          }
        console.log(watcher)
        return resolve(watcher);
      })
      .catch(function(err) {
        console.error(err);
      });
  });
}

```

## searchJira
* 未ウォッチタスクの抽出
* `wwatcher not in (" + user_id + ")`だけではウォッチャーなしのタスクを抽出できなかったためorで `watcher is EMPTY`も接続しました。

```index.js
// 未ウォッチタスクの検索
function searchNotWatch(issueKey,user_id) {
  return new Promise((resolve, reject) => {
    var jql_notWatch = jql + " and (watcher is EMPTY OR watcher not in (" + user_id + ")) "
    jira.searchJira(jql_notWatch,{maxResults: 1000}) //searchJira(searchString: string, optional: object): 
    .then(function(issue){
      for (var i = 0;i < issue.issues.length; i++){
        issueKey[i] = issue.issues[i].key
        console.dir(issueKey[i])
      }
      return resolve(issueKey);
    })
  });
}
```

## addWatcher
* ウォッチャーの割り当て

```index.js
// ウォッチャー割り当て
function addWatcher(issueKey,user_id) {
  return new Promise((resolve, reject) => {
    jira.addWatcher(issueKey,user_id)
    .then(function(issue){
      console.dir(issueKey + "にウォッチャー割り当て")
      return resolve();
    })
  });
}
```

## main
* 各関数を同期処理

```index.js
// main
async function main() {
  var watcher =[];
  console.log('start');
  watcher = await getUsersInGroup(group_name)
  console.log(watcher.length);
  for(var i = 0;i<watcher.length;i++){
    var issue_key = [];
    console.log(watcher[i].name+"さんの未ウォッチタスクは")
    issue_key = await searchNotWatch(issue_key,watcher[i].id);
    console.log(watcher[i].name+"さんにウォッチャー割り当て実行")
    for(var j =0;j<issue_key.length;j++){
      await addWatcher(issue_key[j],watcher[i].id)
    }		
  }	
  console.log('done');
}
```

#つなげると
* 一連の流れをつなげるとこんな感じになります。

```index.js
//任意の課題（JQLで指定）にグループメンバーをウォッチャーとして割り当てる。

const JiraApi = require('jira-client');
const config = require('config');

const jql = "project = TEST_project" ; //任意のフィルターをJQLで指定。
const group_name = "TEST_group"; //割り当てたいグループを指定

// Setting
const jira = new JiraApi({
  protocol: config.protocol,
  host: config.host,
  username: config.username,
  password: config.password,
  apiVersion: config.apiVersion,
  strictSSL: config.strictSSL
})
// グループメンバーの抽出
function getUsersInGroup(groupName) {
  return new Promise((resolve, reject) => {
    var watcher =[];
      jira.getUsersInGroup(groupName) //getUsersInGroup(groupname: string, startAt: integer, maxResults: integer)
      .then(function(issue){
        console.log("getUsersInGroup:")
          for (  var i = 0;  i < issue.users.items.length;  i++  ) {
            if(issue.users.items[i].accountType == "atlassian"){
              watcher.push({id:issue.users.items[i].accountId,name:issue.users.items[i].displayName});
            }
          }
        console.log(watcher)
        return resolve(watcher);
      })
      .catch(function(err) {
        console.error(err);
      });
  });
}

// 未ウォッチタスクの検索
function searchNotWatch(issueKey,user_id) {
  return new Promise((resolve, reject) => {
    var jql_notWatch = jql + " and (watcher is EMPTY OR watcher not in (" + user_id + ")) "
    jira.searchJira(jql_notWatch,{maxResults: 1000}) //searchJira(searchString: string, optional: object): 
    .then(function(issue){
      for (var i = 0;i < issue.issues.length; i++){
        issueKey[i] = issue.issues[i].key
        console.dir(issueKey[i])
      }
      return resolve(issueKey);
    })
  });
}

// ウォッチャー割り当て
function addWatcher(issueKey,user_id) {
  return new Promise((resolve, reject) => {
    jira.addWatcher(issueKey,user_id)
    .then(function(issue){
      console.dir(issueKey + "にウォッチャー割り当て")
      return resolve();
    })
  });
}
// main
async function main() {
  var watcher =[];
  console.log('start');
  watcher = await getUsersInGroup(group_name)
  console.log(watcher.length);
  for(var i = 0;i<watcher.length;i++){
    var issue_key = [];
    console.log(watcher[i].name+"さんの未ウォッチタスクは")
    issue_key = await searchNotWatch(issue_key,watcher[i].id);
    console.log(watcher[i].name+"さんにウォッチャー割り当て実行")
    for(var j =0;j<issue_key.length;j++){
      await addWatcher(issue_key[j],watcher[i].id)
    }		
  }	
  console.log('done');
}

main();
```

#終わりに
* これで、タスクの検索　→　内容の変更　を一連の作業として行えるので、応用すればその他の修正作業も行えるはず。