Фильтрация данных, полученных через GitHub API - PullRequest
0 голосов
/ 13 сентября 2018

Я создал эту функцию для получения проблем GitHub:

retrieveEnerpriseIssues: function(repoOrg, repoName, callback) { 
  let data = null;

  // token auth
  octokit.authenticate({
    type: 'basic',
    username: config.githubEnterprise.username,
    password: config.githubEnterprise.token
  });

  async function paginate(method) {
    let response = await method({
      q: "repo:" + repoOrg + "/" + repoName + " is:issue",
      per_page: 100
    });
    data = response.data.items;
    var count = 0;
    while (octokit.hasNextPage(response)) {
      count++;
      console.log(`request n°${count}`);
      response = await octokit.getNextPage(response);
      data = data.concat(response.data.items);
    }
    return data;
  }

  paginate(octokit.search.issues)
    .then(data => {
      callback(data);
    })
    .catch(error => {
      console.log(error);
    });
  }

Она вызывается в этой функции, которая решает проблемы, отфильтровывает все ненужные ключи в формате json и помещает их в мою базу данных.

extractToDb: function() {
  let gitIssues = null;
  for(var i = 0; i < config.githubEnterprise.orgs.length; i++) {
    for(var j = 0; j < config.githubEnterprise.orgs[i].repos.length; j++) {
      gitHubService.retrieveEnerpriseIssues(
        config.githubEnterprise.orgs[i].owner,
        config.githubEnterprise.orgs[i].repos[j].repoName,
        function(data, err) {
          if(err) {
            console.log('err: ', err);
          } else {
            gitIssues = data;
          }
          gitIssues = JSON.stringify(gitIssues);
          gitIssues = JSON.parse(gitIssues);
          let issueFormatForDb = null;
          for(var i = 0; i < gitIssues.length; i++) {
            issueFormatForDb = gitIssues[i];
            const body = '{' +
              '"github_id": "' + issueFormatForDb.id + '",' +
              '"issue_title": "' + issueFormatForDb.title + '",' +
              '"issue_number": "' + issueFormatForDb.number + '",' +
              '"issue_url": "' + issueFormatForDb.url + '",' +
              '"issue_state": "' + issueFormatForDb.state + '"' +  
          '}';
          console.log('Body: ', body);
          getGitHubIssues.postToDb(body);
        }
      });
    }
  }
}

Я бы хотел сделать еще один шаг, отфильтровывая все проблемы, когда состояние закрыто. Как это сделать и нужно ли это обрабатывать в моей retrieveEnerpriseIssues функции или в extractToDb?

Возможное решение Я попробовал это в моей extractToDb функции:

gitIssues = JSON.parse(gitIssues);
gitIssues = _.where(gitIssues, {state: "open"});
let issueFormatForDb = null;

Это лучшее решение или есть лучший способ?

1 Ответ

0 голосов
/ 13 сентября 2018

Как сказал @givehug:

Лучше использовать _.filter, или собственный метод фильтрации, такой как

gitIssues = gitIssues.filter(i => i.state === 'open')

Я думаю. В более поздних версиях lodash github устаревший.ком / lodash / lodash / вики / Устаревшие .В остальном это прекрасно.

Я только что понял, что могу отфильтровать состояние в моей функции paginate следующим образом:

let response = await method({
    q: "repo:" + repoOrg + "/" + repoName + " is:issue" + " label:issue_label" + " state:open",
    per_page: 100
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...