@@ -14,21 +14,34 @@ defmodule CodeCorps.GitHub.API.Installation do
1414 @ doc """
1515 List repositories that are accessible to the authenticated installation.
1616
17+ All pages of records are retrieved.
18+
1719 https://developer.github.com/v3/apps/installations/#list-repositories
1820 """
1921 @ spec repositories ( GithubAppInstallation . t ) :: { :ok , list ( map ) } | { :error , GitHub . api_error_struct }
2022 def repositories ( % GithubAppInstallation { } = installation ) do
2123 with { :ok , access_token } <- installation |> get_access_token ( ) ,
22- { :ok , % { "repositories" => repositories } } <- fetch_repositories ( access_token ) do
23-
24+ { :ok , responses } <- fetch_repositories ( access_token ) ,
25+ repositories <- extract_repositories ( responses ) do
2426 { :ok , repositories }
2527 else
2628 { :error , error } -> { :error , error }
2729 end
2830 end
2931
3032 defp fetch_repositories ( access_token ) do
31- GitHub . request ( :get , "installation/repositories" , % { } , % { } , [ access_token: access_token ] )
33+ "installation/repositories"
34+ |> GitHub . get_all ( % { } , [ access_token: access_token , params: [ per_page: 100 ] ] )
35+ |> ( & { :ok , & 1 } ) . ( )
36+ end
37+
38+ defp extract_repositories ( responses ) do
39+ responses
40+ |> Enum . reduce ( [ ] , & merge_repositories / 2 )
41+ end
42+
43+ defp merge_repositories ( response , acc ) do
44+ acc |> Enum . concat ( response |> Map . get ( "repositories" ) )
3245 end
3346
3447 @ doc """
0 commit comments