@@ -46,19 +46,32 @@ func getRequest(url string, initFlags domain.InitFlags) ([]byte, error) {
4646 return body , nil
4747}
4848
49- // handlePaginationGeneric fetches all paginated results of type T using a provided fetchPage function.
49+ // GetPage fetches a single page of results from the API and returns the data and next cursor
50+ func GetPage [T any ](
51+ url string ,
52+ initFlags domain.InitFlags ,
53+ parser func ([]byte ) ([]T , string , error ),
54+ ) ([]T , string , error ) {
55+ response , err := getRequest (url , initFlags )
56+ if err != nil {
57+ return nil , "" , fmt .Errorf ("failed to get page: %w" , err )
58+ }
59+ return parser (response )
60+ }
61+
62+ // getAllPages fetches all pages of results from a paginated API endpoint
5063// - baseURL: the base URL for the paginated API
51- // - initialCursor : the initial cursor (empty string for first page)
52- // - fetchPage : a function that fetches a page and returns ([]T, nextCursor, error)
64+ // - initFlags : the API token and other flags for authentication
65+ // - parser : a function that parses the response body into the desired type and returns ([]T, nextCursor, error)
5366//
5467// Returns a slice of all results of type T and any error encountered.
55- func handlePaginationGeneric [T any ](
68+ func getAllPages [T any ](
5669 baseURL string ,
57- initialCursor string ,
58- fetchPage func (url string ) ([]T , string , error ),
70+ initFlags domain. InitFlags ,
71+ parser func ([] byte ) ([]T , string , error ),
5972) ([]T , error ) {
6073 var allResults []T
61- cursor := initialCursor
74+ cursor := ""
6275 firstRequest := true
6376
6477 for {
@@ -75,7 +88,7 @@ func handlePaginationGeneric[T any](
7588 }
7689 firstRequest = false
7790
78- results , nextCursor , err := fetchPage (pageURL )
91+ results , nextCursor , err := GetPage [ T ] (pageURL , initFlags , parser )
7992 if err != nil {
8093 return nil , err
8194 }
@@ -90,43 +103,48 @@ func handlePaginationGeneric[T any](
90103 return allResults , nil
91104}
92105
93- func GetDefaultToolPatternsConfig (initFlags domain.InitFlags , toolUUID string ) ([]domain.PatternConfiguration , error ) {
94- baseURL := fmt .Sprintf ("%s/api/v3/tools/%s/patterns?enabled=true" , CodacyApiBase , toolUUID )
95-
96- fetchPage := func (url string ) ([]domain.PatternConfiguration , string , error ) {
97- response , err := getRequest (url , initFlags )
98- if err != nil {
99- return nil , "" , fmt .Errorf ("failed to get patterns page: %w" , err )
100- }
106+ // parsePatternConfigurations parses the response body into pattern configurations
107+ func parsePatternConfigurations (response []byte ) ([]domain.PatternConfiguration , string , error ) {
108+ var objmap map [string ]json.RawMessage
109+ if err := json .Unmarshal (response , & objmap ); err != nil {
110+ return nil , "" , fmt .Errorf ("failed to unmarshal response: %w" , err )
111+ }
101112
102- var objmap map [ string ]json. RawMessage
103- if err := json .Unmarshal (response , & objmap ); err != nil {
104- return nil , "" , fmt .Errorf ("failed to unmarshal response : %w" , err )
105- }
113+ var patterns []domain. PatternDefinition
114+ if err := json .Unmarshal (objmap [ "data" ] , & patterns ); err != nil {
115+ return nil , "" , fmt .Errorf ("failed to unmarshal patterns : %w" , err )
116+ }
106117
107- var patterns []domain.PatternDefinition
108- if err := json .Unmarshal (objmap ["data" ], & patterns ); err != nil {
109- return nil , "" , fmt .Errorf ("failed to unmarshal patterns: %w" , err )
118+ patternConfigurations := make ([]domain.PatternConfiguration , len (patterns ))
119+ for i , pattern := range patterns {
120+ patternConfigurations [i ] = domain.PatternConfiguration {
121+ PatternDefinition : pattern ,
122+ Parameters : pattern .Parameters ,
123+ Enabled : pattern .Enabled ,
110124 }
125+ }
111126
112- patternConfigurations := make ([]domain.PatternConfiguration , len (patterns ))
113- for i , pattern := range patterns {
114- patternConfigurations [i ] = domain.PatternConfiguration {
115- PatternDefinition : pattern ,
116- Parameters : pattern .Parameters ,
117- Enabled : pattern .Enabled ,
118- }
127+ var pagination domain.Pagination
128+ if objmap ["pagination" ] != nil {
129+ if err := json .Unmarshal (objmap ["pagination" ], & pagination ); err != nil {
130+ return nil , "" , fmt .Errorf ("failed to unmarshal pagination: %w" , err )
119131 }
132+ }
120133
121- var pagination domain.Pagination
122- if objmap ["pagination" ] != nil {
123- if err := json .Unmarshal (objmap ["pagination" ], & pagination ); err != nil {
124- return nil , "" , fmt .Errorf ("failed to unmarshal pagination: %w" , err )
125- }
126- }
134+ return patternConfigurations , pagination .Cursor , nil
135+ }
127136
128- return patternConfigurations , pagination .Cursor , nil
129- }
137+ func GetDefaultToolPatternsConfig (initFlags domain.InitFlags , toolUUID string ) ([]domain.PatternConfiguration , error ) {
138+ baseURL := fmt .Sprintf ("%s/api/v3/tools/%s/patterns?enabled=true" , CodacyApiBase , toolUUID )
139+ return getAllPages (baseURL , initFlags , parsePatternConfigurations )
140+ }
130141
131- return handlePaginationGeneric (baseURL , "" , fetchPage )
142+ func GetRepositoryToolPatterns (initFlags domain.InitFlags , toolUUID string ) ([]domain.PatternConfiguration , error ) {
143+ baseURL := fmt .Sprintf ("%s/api/v3/analysis/organizations/%s/%s/repositories/%s/tools/%s/patterns?enabled=true" ,
144+ CodacyApiBase ,
145+ initFlags .Provider ,
146+ initFlags .Organization ,
147+ initFlags .Repository ,
148+ toolUUID )
149+ return getAllPages (baseURL , initFlags , parsePatternConfigurations )
132150}
0 commit comments