BigSamu / OpenSearch_Changelog_Workflow

A reusable workflow for automating changelog and release notes generation processes for OpenSearch repos
Apache License 2.0
0 stars 4 forks source link

Simplify and Modularize util function updatePRLabel #28

Closed BigSamu closed 7 months ago

BigSamu commented 7 months ago

@JohnathonBowers,

What do you think about simplifying and modularizing the uopdatePRLabel function from:

export const updatePRLabel = async (owner, repo, prNumber, label, addLabel) => {
  // Initialize Octokit client with the GitHub token
  const octokit = github.getOctokit(GITHUB_TOKEN);
  try {
    if (addLabel) {
      // Add the label to the pull request
      await octokit.rest.issues.addLabels({
        owner,
        repo,
        issue_number: prNumber,
        labels: [label],
      });
      console.log(`Label "${label}" added to PR #${prNumber}`);
    } else {
      // Get the current labels on the pull request
      const { data: currentLabels } =
        await octokit.rest.issues.listLabelsOnIssue({
          owner,
          repo,
          issue_number: prNumber,
        });

      // Check to see if the label is already on the pull request
      if (currentLabels.some((element) => element.name === label)) {
        // Remove the label from the pull request
        await octokit.rest.issues.removeLabel({
          owner,
          repo,
          issue_number: prNumber,
          name: label,
        });
        console.log(`Label "${label}" removed from PR #${prNumber}`);
      } else {
        console.log(
          `Label "${label}" not present on PR #${prNumber}. No action taken.`
        );
      }
    }
  } catch (error) {
    console.error(
      `Error updating label "${label}" for PR #${prNumber}: ${error.message}`
    );
    throw error;
  }
};

to:

/**
 * Adds or removes a label from a GitHub pull request.
 * @param {string} owner - Owner of the repository.
 * @param {string} repo - Repository name.
 * @param {number} prNumber - Pull request number.
 * @param {string} label - Label to be added or removed.
 * @param {boolean} addLabel - Flag to add or remove the label.
 * 
 * @returns {Promise<void>} A promise that resolves when the label is added or removed.
 * 
 * @throws {Error} Throws an error if the label cannot be added or removed.
 */
export const updatePRLabel = async (owner, repo, prNumber, label, addLabel) => {
  const octokit = github.getOctokit(GITHUB_TOKEN);

  try {
    if (addLabel) {
      await addLabelToPR(octokit, owner, repo, prNumber, label);
    } else {
      await removeLabelFromPR(octokit, owner, repo, prNumber, label);
    }
  } catch (error) {
    console.error(`Error updating label "${label}" for PR #${prNumber}: ${error.message}`);
    throw error;
  }
};

const addLabelToPR = async (octokit, owner, repo, prNumber, label) => {
  await octokit.rest.issues.addLabels({
    owner,
    repo,
    issue_number: prNumber,
    labels: [label],
  });
  console.log(`Label "${label}" added to PR #${prNumber}`);
};

const removeLabelFromPR = async (octokit, owner, repo, prNumber, label) => {
  try {
    await octokit.rest.issues.removeLabel({
      owner,
      repo,
      issue_number: prNumber,
      name: label,
    });
    console.log(`Label "${label}" removed from PR #${prNumber}`);
  } catch (error) {
    if (error.status === 404) {
      console.log(`Label "${label}" not present on PR #${prNumber}. No action taken.`);
    } else {
      throw error;
    }
  }
};
BigSamu commented 7 months ago

Logic of the function was changed for the following. This logic is entirely tested and better reflects the functionality required for the function. Further modularization can be done in later stages of the project

**
 * Adds or removes a label from a GitHub pull request using Octokit instance.
 *
 * @param {InstanceType<typeof GitHub>} octokit - An Octokit instance initialized with a GitHub token.
 * @param {string} owner - Owner of the repository.
 * @param {string} repo - Repository name.
 * @param {number} prNumber - Pull request number.
 * @param {string} label - Label to be added or removed.
 * @param {boolean} addLabel - Flag to add or remove the label.
 * @throws {UpdatePRLabelError} If unable to add or remove label.
 */
export const updatePRLabel = async (
  octokit,
  owner,
  repo,
  prNumber,
  label,
  addLabel
) => {
  try {
    // Get the current labels on the pull request
    const { data: currentLabels } = await octokit.rest.issues.listLabelsOnIssue(
      {
        owner,
        repo,
        issue_number: prNumber,
      }
    );

    // Check to see if the label is already on the pull request
    const labelExists = currentLabels.some((element) => element.name === label);

    if (addLabel && !labelExists) {
      // Add the label to the pull request
      await octokit.rest.issues.addLabels({
        owner,
        repo,
        issue_number: prNumber,
        labels: [label],
      });
      console.log(`Label "${label}" added to PR #${prNumber}`);
    } else if (!addLabel && labelExists) {
      // Remove the label from the pull request
      await octokit.rest.issues.removeLabel({
        owner,
        repo,
        issue_number: prNumber,
        name: label,
      });
      console.log(`Label "${label}" removed from PR #${prNumber}`);
    } else {
      console.log(
        `Label "${label}" is already ${
          addLabel ? "present" : "absent"
        } on PR #${prNumber}. No action taken.`
      );
    }
  } catch (error) {
    console.error(
      `Error updating label "${label}" for PR #${prNumber}: ${error.message}`
    );
    throw new UpdatePRLabelError();
  }
};