Объедините две очень похожие функции, которые содержат четкие различия - PullRequest
0 голосов
/ 16 октября 2018

В моем приложении Node.js есть две функции:

retrieveIssues: function(githubAppId, pemFilePath, repoOrg, repoName, callback) {
  const octokit = require('@octokit/rest')();
  let data = null;
  gitInstallationAccessToken.genInstallationAccessToken(githubAppId, pemFilePath, (installationAccessToken) => {

  octokit.authenticate({
    type: 'app',
    token: `${installationAccessToken}`
  });

  async function paginate(method) {
    let response = await method({
      q: "repo:" + repoOrg + "/" + repoName + " is:issue" + " state:open",
    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);
    });
  });
}

retrieveEnerpriseIssues: function(repoOrg, repoName, callback) { 
  const octokit = require('@octokit/rest')({
    baseUrl: config.githubEnterprise.baseUrl
  });
  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" + " label:sdk" + " state:open",
      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);
    });
  }
}

Первый обращается к общедоступному GitHub, второй - к частному Github.Хотя есть некоторые очень четкие различия (тип аутентификации и количество передаваемых параметров и т. Д.), Они очень похожи.Мне было интересно, могут ли они быть преобразованы в одну функцию или это даже хорошая идея.Если это возможно и может улучшить мой код, как это сделать?

1 Ответ

0 голосов
/ 31 октября 2018

Можно, и с учетом количества дубликатов, вероятно, следует провести рефакторинг.Это было немного сложно без каких-либо тестов и без возможности запуска кода, но, возможно, это бы сработало?

retrieve: function({repoOrg, repoName, callback, octoKitArgs, octoKitAuthArgs}) {
  const octokit = require('@octokit/rest')(octoKitArgs);
  let data = null;

  octokit.authenticate(octoKitAuthArgs);

  async function paginate(method) {
    let response = await method({
      q: "repo:" + repoOrg + "/" + repoName + " is:issue" + " label:sdk" + " state:open",
      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);
    });
}

// call as private github
retrieve({
  repoOrg: "",
  reportName: "",
  callback: () => {},
  octoKitArgs: {baseUrl: config.githubEnterprise.baseUrl},
  octoKitAuthArgs: {type: 'basic', username: config.githubEnterprise.username, password: config.githubEnterprise.token},
});

// call as public github
gitInstallationAccessToken.genInstallationAccessToken(githubAppId, pemFilePath, (installationAccessToken) =>
  retrieve({
    repoOrg: "",
    reportName: "",
    callback: () => {},
    octoKitArgs: undefined,
    octoKitAuthArgs: {type: 'app', token: `${installationAccessToken}`},
  })
);

Дайте мне знать, как это выглядит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...