55import { generateGitHubAppToken , getGitHubHeaders } from "./github.js" ;
66
77/**
8- * PR의 Week 값 조회 (GraphQL)
8+ * PR의 프로젝트 필드 값 조회 (Week, Status 등)
9+ * @returns {Promise<{week: string|null, status: string|null}> }
910 */
10- export async function getWeekValue ( repoOwner , repoName , prNumber , appToken ) {
11- const weekQuery = `
11+ export async function getProjectFields ( repoOwner , repoName , prNumber , appToken ) {
12+ const query = `
1213 query {
1314 repository(owner: "${ repoOwner } ", name: "${ repoName } ") {
1415 pullRequest(number: ${ prNumber } ) {
@@ -25,6 +26,14 @@ export async function getWeekValue(repoOwner, repoName, prNumber, appToken) {
2526 }
2627 }
2728 }
29+ ... on ProjectV2ItemFieldSingleSelectValue {
30+ name
31+ field {
32+ ... on ProjectV2FieldCommon {
33+ name
34+ }
35+ }
36+ }
2837 }
2938 }
3039 }
@@ -37,26 +46,45 @@ export async function getWeekValue(repoOwner, repoName, prNumber, appToken) {
3746 const response = await fetch ( "https://api.github.com/graphql" , {
3847 method : "POST" ,
3948 headers : { ...getGitHubHeaders ( appToken ) , "Content-Type" : "application/json" } ,
40- body : JSON . stringify ( { query : weekQuery } ) ,
49+ body : JSON . stringify ( { query } ) ,
4150 } ) ;
4251
4352 const data = await response . json ( ) ;
4453 const projectItems =
4554 data . data ?. repository ?. pullRequest ?. projectItems ?. nodes || [ ] ;
4655
56+ const result = { week : null , status : null } ;
57+
4758 for ( const item of projectItems ) {
4859 const fieldValues = item . fieldValues ?. nodes || [ ] ;
4960 for ( const field of fieldValues ) {
61+ // Week 필드 (Iteration 타입)
5062 if (
5163 field . __typename === "ProjectV2ItemFieldIterationValue" &&
5264 field . field ?. name === "Week"
5365 ) {
54- return field . title ;
66+ result . week = field . title ;
67+ }
68+ // Status 필드 (SingleSelect 타입)
69+ if (
70+ field . __typename === "ProjectV2ItemFieldSingleSelectValue" &&
71+ field . field ?. name === "Status"
72+ ) {
73+ result . status = field . name ;
5574 }
5675 }
5776 }
5877
59- return null ;
78+ return result ;
79+ }
80+
81+ /**
82+ * PR의 Week 값 조회 (GraphQL)
83+ * @deprecated Use getProjectFields() for better performance
84+ */
85+ export async function getWeekValue ( repoOwner , repoName , prNumber , appToken ) {
86+ const fields = await getProjectFields ( repoOwner , repoName , prNumber , appToken ) ;
87+ return fields . week ;
6088}
6189
6290/**
@@ -172,7 +200,8 @@ export async function removeWarningComment(repoOwner, repoName, prNumber, env) {
172200 * @returns {Promise<string|null> } Week 값 또는 null
173201 */
174202export async function handleWeekComment ( repoOwner , repoName , prNumber , env , appToken ) {
175- const weekValue = await getWeekValue ( repoOwner , repoName , prNumber , appToken ) ;
203+ const fields = await getProjectFields ( repoOwner , repoName , prNumber , appToken ) ;
204+ const weekValue = fields . week ;
176205
177206 if ( ! weekValue ) {
178207 await ensureWarningComment ( repoOwner , repoName , prNumber , env ) ;
0 commit comments