11import Resolver from "@forge/resolver" ;
22import forge from "@forge/api" ;
3- import { storage } from "@forge/api" ;
3+ import { route , storage } from "@forge/api" ;
44
55const resolver = new Resolver ( ) ;
66
@@ -14,7 +14,7 @@ resolver.define("getGithubRepos", async ({ payload }) => {
1414
1515 // https://supabase.com/docs/guides/api/sql-to-rest
1616 const queryParams = new URLSearchParams ( {
17- select : "* " ,
17+ select : "github_owner_name,github_repo_name,github_owner_id " ,
1818 jira_site_id : `eq.${ cloudId } ` ,
1919 jira_project_id : `eq.${ projectId } ` ,
2020 } ) . toString ( ) ;
@@ -51,26 +51,99 @@ resolver.define("storeRepo", async ({ payload }) => {
5151 return await storage . set ( key , value ) ;
5252} ) ;
5353
54+ // Trigger GitAuto by calling the FastAPI endpoint
5455resolver . define ( "triggerGitAuto" , async ( { payload } ) => {
55- const { cloudId, projectId, issueId, selectedRepo } = payload ;
56-
57- // Determine the API endpoint based on environment
58- const endpoint = process . env . GITAUTO_URL + "/webhook" ;
59- console . log ( "Endpoint" , endpoint ) ;
56+ const endpoint = process . env . GITAUTO_URL + "/jira-webhook" ;
6057 const response = await forge . fetch ( endpoint , {
6158 method : "POST" ,
6259 headers : { "Content-Type" : "application/json" } ,
63- body : JSON . stringify ( {
64- cloudId,
65- projectId,
66- issueId,
67- repository : selectedRepo ,
68- } ) ,
60+ body : JSON . stringify ( { ...payload } ) ,
6961 } ) ;
70-
7162 if ( ! response . ok ) throw new Error ( `Failed to trigger GitAuto: ${ response . status } ` ) ;
72-
7363 return await response . json ( ) ;
7464} ) ;
7565
66+ // Convert Atlassian Document Format to Markdown
67+ const adfToMarkdown = ( adf ) => {
68+ if ( ! adf || ! adf . content ) return "" ;
69+
70+ return adf . content
71+ . map ( ( block ) => {
72+ switch ( block . type ) {
73+ case "paragraph" :
74+ return block . content ?. map ( ( item ) => item . text || "" ) . join ( "" ) + "\n\n" ;
75+ case "heading" :
76+ const level = block . attrs ?. level || 1 ;
77+ const hashes = "#" . repeat ( level ) ;
78+ return `${ hashes } ${ block . content ?. map ( ( item ) => item . text || "" ) . join ( "" ) } \n\n` ;
79+ case "bulletList" :
80+ return (
81+ block . content
82+ ?. map ( ( item ) => `- ${ item . content ?. map ( ( subItem ) => subItem . text || "" ) . join ( "" ) } ` )
83+ . join ( "\n" ) + "\n\n"
84+ ) ;
85+ case "orderedList" :
86+ return (
87+ block . content
88+ ?. map (
89+ ( item , index ) =>
90+ `${ index + 1 } . ${ item . content ?. map ( ( subItem ) => subItem . text || "" ) . join ( "" ) } `
91+ )
92+ . join ( "\n" ) + "\n\n"
93+ ) ;
94+ case "codeBlock" :
95+ return `\`\`\`\n${ block . content ?. map ( ( item ) => item . text || "" ) . join ( "" ) } \n\`\`\`\n\n` ;
96+ default :
97+ return "" ;
98+ }
99+ } )
100+ . join ( "" )
101+ . trim ( ) ;
102+ } ;
103+
104+ // Get issue details from Jira
105+ // https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-issueidorkey-get
106+ resolver . define ( "getIssueDetails" , async ( { payload } ) => {
107+ const { issueId } = payload ;
108+ const response = await forge . asApp ( ) . requestJira ( route `/rest/api/3/issue/${ issueId } ` , {
109+ method : "GET" ,
110+ headers : { "Content-Type" : "application/json" } ,
111+ } ) ;
112+ if ( ! response . ok ) throw new Error ( `Failed to fetch issue details: ${ response . status } ` ) ;
113+ const data = await response . json ( ) ;
114+ // console.log("Jira issue details:", data);
115+
116+ // Format comments into readable text list
117+ const comments =
118+ data . fields . comment ?. comments ?. map ( ( comment ) => {
119+ const timestamp = new Date ( comment . created ) . toLocaleString ( ) ;
120+ return `${ comment . author . displayName } (${ timestamp } ):\n${ adfToMarkdown ( comment . body ) } ` ;
121+ } ) || [ ] ;
122+
123+ return {
124+ // project: {
125+ // id: data.fields.project.id,
126+ // key: data.fields.project.key,
127+ // name: data.fields.project.name,
128+ // },
129+ issue : {
130+ id : data . id ,
131+ key : data . key ,
132+ title : data . fields . summary ,
133+ body : adfToMarkdown ( data . fields . description ) ,
134+ comments : comments ,
135+ } ,
136+ creator : {
137+ id : data . fields . creator . accountId ,
138+ displayName : data . fields . creator . displayName ,
139+ email : data . fields . creator . emailAddress ,
140+ } ,
141+ reporter : {
142+ id : data . fields . reporter . accountId ,
143+ displayName : data . fields . reporter . displayName ,
144+ email : data . fields . reporter . emailAddress ,
145+ } ,
146+ } ;
147+ } ) ;
148+
76149export const handler = resolver . getDefinitions ( ) ;
0 commit comments