Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 12 additions & 29 deletions actions/setup/js/assign_to_user.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
const { processItems } = require("./safe_output_processor.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");
const { resolveTargetRepoConfig, resolveAndValidateRepo } = require("./repo_helpers.cjs");
const { resolveIssueNumber, extractAssignees } = require("./safe_output_helpers.cjs");

/** @type {string} Safe output type handled by this module */
const HANDLER_TYPE = "assign_to_user";
Expand Down Expand Up @@ -67,37 +68,19 @@ async function main(config = {}) {

const assignItem = message;

// Determine issue number
let issueNumber;
if (assignItem.issue_number !== undefined) {
issueNumber = parseInt(String(assignItem.issue_number), 10);
if (isNaN(issueNumber)) {
core.warning(`Invalid issue_number: ${assignItem.issue_number}`);
return {
success: false,
error: `Invalid issue_number: ${assignItem.issue_number}`,
};
}
} else {
// Use context issue if available
const contextIssue = context.payload?.issue?.number;
if (!contextIssue) {
core.warning("No issue_number provided and not in issue context");
return {
success: false,
error: "No issue number available",
};
}
issueNumber = contextIssue;
// Determine issue number using shared helper
const issueResult = resolveIssueNumber(assignItem);
if (!issueResult.success) {
core.warning(`Skipping assign_to_user: ${issueResult.error}`);
return {
success: false,
error: issueResult.error,
};
}
const issueNumber = issueResult.issueNumber;

// Support both singular "assignee" and plural "assignees" for flexibility
let requestedAssignees = [];
if (assignItem.assignees && Array.isArray(assignItem.assignees)) {
requestedAssignees = assignItem.assignees;
} else if (assignItem.assignee) {
requestedAssignees = [assignItem.assignee];
}
// Extract assignees using shared helper
const requestedAssignees = extractAssignees(assignItem);

core.info(`Requested assignees: ${JSON.stringify(requestedAssignees)}`);

Expand Down
52 changes: 52 additions & 0 deletions actions/setup/js/safe_output_helpers.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -257,9 +257,61 @@ function loadCustomSafeOutputJobTypes() {
}
}

/**
* Determine issue number from message or context
* @param {Object} message - Message object that may contain issue_number
* @returns {{success: true, issueNumber: number} | {success: false, error: string}}
*/
function resolveIssueNumber(message) {
// Determine issue number
let issueNumber;
if (message.issue_number !== undefined) {
issueNumber = parseInt(String(message.issue_number), 10);
if (isNaN(issueNumber)) {
return {
success: false,
error: `Invalid issue_number: ${message.issue_number}`,
};
}
} else {
// Use context issue if available
const contextIssue = context.payload?.issue?.number;
if (!contextIssue) {
return {
success: false,
error: "No issue number available",
};
}
issueNumber = contextIssue;
}

return {
success: true,
issueNumber: issueNumber,
};
}

/**
* Extract assignees from message supporting both singular and plural forms
* @param {Object} message - Message object that may contain assignee or assignees
* @returns {string[]} Array of assignee usernames
*/
function extractAssignees(message) {
// Support both singular "assignee" and plural "assignees" for flexibility
let requestedAssignees = [];
if (message.assignees && Array.isArray(message.assignees)) {
requestedAssignees = message.assignees;
} else if (message.assignee) {
requestedAssignees = [message.assignee];
}
return requestedAssignees;
}
Comment on lines +265 to +308
Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The newly added helper functions resolveIssueNumber and extractAssignees lack test coverage. The existing test file safe_output_helpers.test.cjs has comprehensive tests for other helper functions like parseAllowedItems, parseMaxCount, resolveTarget, and loadCustomSafeOutputJobTypes. These new functions should have similar test coverage to ensure they handle edge cases correctly (e.g., invalid issue numbers, missing context, various assignee field formats).

Copilot uses AI. Check for mistakes.

module.exports = {
parseAllowedItems,
parseMaxCount,
resolveTarget,
loadCustomSafeOutputJobTypes,
resolveIssueNumber,
extractAssignees,
};
41 changes: 12 additions & 29 deletions actions/setup/js/unassign_from_user.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
const { processItems } = require("./safe_output_processor.cjs");
const { getErrorMessage } = require("./error_helpers.cjs");
const { resolveTargetRepoConfig, resolveAndValidateRepo } = require("./repo_helpers.cjs");
const { resolveIssueNumber, extractAssignees } = require("./safe_output_helpers.cjs");

/** @type {string} Safe output type handled by this module */
const HANDLER_TYPE = "unassign_from_user";
Expand Down Expand Up @@ -57,37 +58,19 @@ async function main(config = {}) {

const unassignItem = message;

// Determine issue number
let issueNumber;
if (unassignItem.issue_number !== undefined) {
issueNumber = parseInt(String(unassignItem.issue_number), 10);
if (isNaN(issueNumber)) {
core.warning(`Invalid issue_number: ${unassignItem.issue_number}`);
return {
success: false,
error: `Invalid issue_number: ${unassignItem.issue_number}`,
};
}
} else {
// Use context issue if available
const contextIssue = context.payload?.issue?.number;
if (!contextIssue) {
core.warning("No issue_number provided and not in issue context");
return {
success: false,
error: "No issue number available",
};
}
issueNumber = contextIssue;
// Determine issue number using shared helper
const issueResult = resolveIssueNumber(unassignItem);
if (!issueResult.success) {
core.warning(`Skipping unassign_from_user: ${issueResult.error}`);
return {
success: false,
error: issueResult.error,
};
}
const issueNumber = issueResult.issueNumber;

// Support both singular "assignee" and plural "assignees" for flexibility
let requestedAssignees = [];
if (unassignItem.assignees && Array.isArray(unassignItem.assignees)) {
requestedAssignees = unassignItem.assignees;
} else if (unassignItem.assignee) {
requestedAssignees = [unassignItem.assignee];
}
// Extract assignees using shared helper
const requestedAssignees = extractAssignees(unassignItem);

core.info(`Requested assignees to unassign: ${JSON.stringify(requestedAssignees)}`);

Expand Down
Loading