@@ -325,105 +325,70 @@ jobs:
325325 return issues;
326326 }
327327
328- // Helper function to find issue by AIRA number (REST API fallback )
328+ // Helper function to find issue by AIRA number (REST API primary )
329329 async function findIssueByAiraNumber(airaNumber) {
330330 try {
331- // First try GraphQL search
332- console.log(` 🔍 Searching for AIRA-${airaNumber} using GraphQL ...`);
331+ // Use REST API as primary method ( GraphQL search has been problematic)
332+ console.log(` 🔍 Searching for AIRA-${airaNumber} using REST API ...`);
333333
334- const query = `
335- query($searchQuery: String!) {
336- search(query: $searchQuery, type: ISSUE, first: 10) {
337- nodes {
338- ... on Issue {
339- number
340- title
341- state
342- id
343- }
344- }
345- }
346- }
347- `;
348-
349- const searchQuery = `repo:${context.repo.owner}/${context.repo.repo} AIRA-${airaNumber} in:title`;
350- console.log(` 🔍 GraphQL search query: ${searchQuery}`);
351-
352- const result = await github.graphql(query, {
353- searchQuery
334+ const searchResponse = await github.rest.search.issuesAndPullRequests({
335+ q: `repo:${context.repo.owner}/${context.repo.repo} AIRA-${airaNumber} in:title type:issue`,
336+ per_page: 10
354337 });
355338
356- const issues = result.search.nodes.filter(node =>
357- node.title.includes(`AIRA-${airaNumber}`)
358- );
339+ console.log(` 🔍 REST API found ${searchResponse.data.total_count} results`);
359340
360- if (issues.length > 0) {
361- console.log(` ✅ Found issue via GraphQL: #${issues[0].number} - ${issues[0].title}`);
362- return issues[0];
341+ if (searchResponse.data.items && searchResponse.data.items.length > 0) {
342+ const matchingIssues = searchResponse.data.items.filter(issue =>
343+ issue.title && issue.title.includes(`AIRA-${airaNumber}`)
344+ );
345+
346+ if (matchingIssues.length > 0) {
347+ const issue = matchingIssues[0];
348+ console.log(` ✅ Found issue via REST API: #${issue.number} - ${issue.title} (State: ${issue.state})`);
349+ return {
350+ number: issue.number,
351+ title: issue.title,
352+ state: issue.state,
353+ id: issue.node_id
354+ };
355+ }
363356 }
364357
365- console.log(` ❌ No results from GraphQL search, trying REST API... `);
358+ console.log(` ❌ No matching issues found in search results `);
366359
367- } catch (graphqlError) {
368- console.log(` ❌ GraphQL search failed: ${graphqlError.message}`);
369- console.log(` 🔄 Falling back to REST API search...`);
360+ } catch (restError) {
361+ console.log(` ❌ REST API search failed: ${restError.message}`);
370362 }
371363
372364 try {
373- // Fallback to REST API search
374- const searchResponse = await github.rest.search.issuesAndPullRequests({
375- q: `repo:${context.repo.owner}/${context.repo.repo} AIRA-${airaNumber} in:title type:issue`,
376- per_page: 10
377- });
365+ // Fallback: Direct lookup if AIRA number matches issue number
366+ console.log(` 🔄 Fallback: checking if AIRA-${airaNumber} corresponds to issue #${airaNumber}...`);
378367
379- console.log(` 🔍 REST API found ${searchResponse.data.total_count} results`);
380-
381- const matchingIssues = searchResponse.data.items.filter(issue =>
382- issue.title.includes(`AIRA-${ airaNumber}`)
383- );
368+ const issueResponse = await github.rest.issues.get({
369+ owner: context.repo.owner,
370+ repo: context.repo.repo,
371+ issue_number: airaNumber
372+ } );
384373
385- if (matchingIssues.length > 0) {
386- const issue = matchingIssues[0];
387- console.log(` ✅ Found issue via REST API: #${issue.number} - ${issue.title}`);
374+ if (issueResponse.data.title && issueResponse.data.title.includes(`AIRA-${airaNumber}`)) {
375+ console.log(` ✅ Found by direct lookup: #${issueResponse.data.number} - ${issueResponse.data.title} (State: ${issueResponse.data.state})`);
388376 return {
389- number: issue .number,
390- title: issue .title,
391- state: issue .state,
392- id: issue .node_id
377+ number: issueResponse.data .number,
378+ title: issueResponse.data .title,
379+ state: issueResponse.data .state,
380+ id: issueResponse.data .node_id
393381 };
394382 } else {
395- console.log(` ❌ No matching issues found for AIRA-${airaNumber}`);
396- return null;
383+ console.log(` ❌ Issue #${airaNumber} exists but doesn't match AIRA-${airaNumber}`);
397384 }
398385
399- } catch (restError) {
400- console.log(` ❌ REST API search also failed: ${restError.message}`);
401-
402- // Last resort: try to find by issue number if AIRA number matches
403- try {
404- console.log(` 🔄 Last resort: checking if AIRA-${airaNumber} corresponds to issue #${airaNumber}...`);
405-
406- const issueResponse = await github.rest.issues.get({
407- owner: context.repo.owner,
408- repo: context.repo.repo,
409- issue_number: airaNumber
410- });
411-
412- if (issueResponse.data.title.includes(`AIRA-${airaNumber}`)) {
413- console.log(` ✅ Found by direct lookup: #${issueResponse.data.number} - ${issueResponse.data.title}`);
414- return {
415- number: issueResponse.data.number,
416- title: issueResponse.data.title,
417- state: issueResponse.data.state,
418- id: issueResponse.data.node_id
419- };
420- }
421- } catch (directError) {
422- console.log(` ❌ Direct lookup failed: ${directError.message}`);
423- }
424-
425- return null;
386+ } catch (directError) {
387+ console.log(` ❌ Direct lookup failed: ${directError.message}`);
426388 }
389+
390+ console.log(` ❌ Could not find issue for AIRA-${airaNumber}`);
391+ return null;
427392 }
428393
429394 // Main automation logic
@@ -534,7 +499,16 @@ jobs:
534499 // Find the actual GitHub issue
535500 const issue = await findIssueByAiraNumber(airaNumber);
536501
537- if (issue && issue.state === 'open') {
502+ if (!issue) {
503+ console.log(` ❌ Could not find GitHub issue for AIRA-${airaNumber}`);
504+ continue;
505+ }
506+
507+ console.log(` 📋 Found issue #${issue.number}: "${issue.title}" (State: ${issue.state})`);
508+
509+ if (issue.state === 'open') {
510+ console.log(` 🔄 Issue is open, proceeding to close it...`);
511+
538512 // Close the issue
539513 await github.rest.issues.update({
540514 owner: context.repo.owner,
@@ -543,20 +517,50 @@ jobs:
543517 state: 'closed'
544518 });
545519
520+ console.log(` ✅ Closed issue #${issue.number}`);
521+
546522 // Move to Done in project
547523 let linkedItemId = await getProjectItemId(issue.id);
548524
549525 if (!linkedItemId) {
526+ console.log(` 🔄 Adding issue to project...`);
550527 linkedItemId = await addToProject(issue.id);
551528 }
552529
553530 if (linkedItemId) {
554531 await updateItemStatus(linkedItemId, 'Done');
532+ console.log(` ✅ Moved issue to Done in project`);
533+ } else {
534+ console.log(` ❌ Could not add issue to project`);
555535 }
556536
557537 console.log(`✅ Auto-closed and moved AIRA-${airaNumber} (issue #${issue.number}) to Done`);
558- } else if (issue) {
559- console.log(`ℹ️ Issue AIRA-${airaNumber} already closed`);
538+
539+ } else if (issue.state === 'closed') {
540+ console.log(` ℹ️ Issue AIRA-${airaNumber} (issue #${issue.number}) is already closed, skipping closure`);
541+
542+ // Still move to Done in project if not already there
543+ let linkedItemId = await getProjectItemId(issue.id);
544+
545+ if (!linkedItemId) {
546+ console.log(` 🔄 Adding closed issue to project...`);
547+ linkedItemId = await addToProject(issue.id);
548+ }
549+
550+ if (linkedItemId) {
551+ const currentStatus = await getCurrentItemStatus(linkedItemId);
552+ if (currentStatus && currentStatus.toLowerCase() !== 'done') {
553+ await updateItemStatus(linkedItemId, 'Done');
554+ console.log(` ✅ Moved already-closed issue to Done in project`);
555+ } else {
556+ console.log(` ℹ️ Issue already in Done status`);
557+ }
558+ }
559+
560+ console.log(`✅ Verified AIRA-${airaNumber} (issue #${issue.number}) is closed and in Done status`);
561+
562+ } else {
563+ console.log(` ⚠️ Issue AIRA-${airaNumber} has unexpected state: ${issue.state}`);
560564 }
561565 } catch (error) {
562566 console.log(`❌ Failed to process AIRA-${airaNumber}:`, error.message);
0 commit comments