1
1
import Resolver from "@forge/resolver" ;
2
2
import forge from "@forge/api" ;
3
- import { storage } from "@forge/api" ;
3
+ import { route , storage } from "@forge/api" ;
4
4
5
5
const resolver = new Resolver ( ) ;
6
6
@@ -14,7 +14,7 @@ resolver.define("getGithubRepos", async ({ payload }) => {
14
14
15
15
// https://supabase.com/docs/guides/api/sql-to-rest
16
16
const queryParams = new URLSearchParams ( {
17
- select : "* " ,
17
+ select : "github_owner_name,github_repo_name,github_owner_id " ,
18
18
jira_site_id : `eq.${ cloudId } ` ,
19
19
jira_project_id : `eq.${ projectId } ` ,
20
20
} ) . toString ( ) ;
@@ -51,26 +51,99 @@ resolver.define("storeRepo", async ({ payload }) => {
51
51
return await storage . set ( key , value ) ;
52
52
} ) ;
53
53
54
+ // Trigger GitAuto by calling the FastAPI endpoint
54
55
resolver . 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" ;
60
57
const response = await forge . fetch ( endpoint , {
61
58
method : "POST" ,
62
59
headers : { "Content-Type" : "application/json" } ,
63
- body : JSON . stringify ( {
64
- cloudId,
65
- projectId,
66
- issueId,
67
- repository : selectedRepo ,
68
- } ) ,
60
+ body : JSON . stringify ( { ...payload } ) ,
69
61
} ) ;
70
-
71
62
if ( ! response . ok ) throw new Error ( `Failed to trigger GitAuto: ${ response . status } ` ) ;
72
-
73
63
return await response . json ( ) ;
74
64
} ) ;
75
65
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
+
76
149
export const handler = resolver . getDefinitions ( ) ;
0 commit comments