Skip to content

Commit a5fd634

Browse files
List repos by authorization
Co-Authored-By: Trong Huu Nguyen <[email protected]>
1 parent 58d0ffc commit a5fd634

9 files changed

+330
-179
lines changed

internal/database/gensql/mock_querier.go

+59
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/database/gensql/querier.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/database/gensql/repository_authorizations.sql.go

+37
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/database/mock_database.go

+60
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/database/queries/repository_authorizations.sql

+12
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,15 @@ WHERE
1919
AND github_repository = @github_repository
2020
ORDER BY
2121
repository_authorization;
22+
23+
24+
-- name: ListRepositoriesByAuthorization :many
25+
SELECT
26+
github_repository
27+
FROM
28+
repository_authorizations
29+
WHERE
30+
team_slug = @team_slug
31+
AND repository_authorization = @repository_authorization
32+
ORDER BY -- The linter requires order by to be upper cased, lol
33+
github_repository;

internal/database/repository_authorization.go

+8
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ type RepositoryAuthorizationRepo interface {
1111
CreateRepositoryAuthorization(ctx context.Context, teamSlug slug.Slug, repoName string, authorization gensql.RepositoryAuthorizationEnum) error
1212
GetRepositoryAuthorizations(ctx context.Context, teamSlug slug.Slug, repoName string) ([]gensql.RepositoryAuthorizationEnum, error)
1313
RemoveRepositoryAuthorization(ctx context.Context, teamSlug slug.Slug, repoName string, authorization gensql.RepositoryAuthorizationEnum) error
14+
ListRepositoriesByAuthorization(ctx context.Context, teamSlug slug.Slug, authorization gensql.RepositoryAuthorizationEnum) ([]string, error)
1415
}
1516

1617
func (d *database) CreateRepositoryAuthorization(ctx context.Context, teamSlug slug.Slug, repoName string, authorization gensql.RepositoryAuthorizationEnum) error {
@@ -35,3 +36,10 @@ func (d *database) GetRepositoryAuthorizations(ctx context.Context, teamSlug slu
3536
GithubRepository: repoName,
3637
})
3738
}
39+
40+
func (d *database) ListRepositoriesByAuthorization(ctx context.Context, teamSlug slug.Slug, authorization gensql.RepositoryAuthorizationEnum) ([]string, error) {
41+
return d.querier.ListRepositoriesByAuthorization(ctx, gensql.ListRepositoriesByAuthorizationParams{
42+
TeamSlug: teamSlug,
43+
RepositoryAuthorization: authorization,
44+
})
45+
}

internal/grpc/teams.go

+5-31
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package grpc
22

33
import (
44
"context"
5-
"encoding/json"
5+
"fmt"
66

77
"github.com/google/uuid"
88
"github.com/nais/api/internal/database"
@@ -151,40 +151,14 @@ func (t *TeamsServer) Environments(ctx context.Context, req *protoapi.ListTeamEn
151151
}
152152

153153
func (t *TeamsServer) ListAuthorizedRepositories(ctx context.Context, req *protoapi.ListAuthorizedRepositoriesRequest) (*protoapi.ListAuthorizedRepositoriesResponse, error) {
154-
teamSlug := slug.Slug(req.Slug)
155-
156-
// get all repositories for team
157-
res, err := t.db.GetReconcilerStateForTeam(ctx, "github:team", teamSlug)
158-
if err != nil {
159-
return nil, status.Errorf(codes.Internal, "fetching github repositories for team: %s", err)
160-
}
161-
162-
var state struct {
163-
Repos []struct {
164-
Name string `json:"name"`
165-
} `json:"repositories"`
166-
}
167-
168-
err = json.Unmarshal(res.Value, &state)
154+
teamSlug := slug.Slug(req.TeamSlug)
155+
repositories, err := t.db.ListRepositoriesByAuthorization(ctx, teamSlug, gensql.RepositoryAuthorizationEnumDeploy)
169156
if err != nil {
170-
return nil, err
171-
}
172-
173-
// filter out repositories without authorizations
174-
filtered := make([]string, 0)
175-
for _, repo := range state.Repos {
176-
authorizations, err := t.db.GetRepositoryAuthorizations(ctx, teamSlug, repo.Name)
177-
if err != nil {
178-
return nil, status.Errorf(codes.Internal, "fetching authorization for repository: %s", err)
179-
}
180-
181-
if len(authorizations) > 0 {
182-
filtered = append(filtered, repo.Name)
183-
}
157+
return nil, fmt.Errorf("list repositories by authorization: %w", err)
184158
}
185159

186160
return &protoapi.ListAuthorizedRepositoriesResponse{
187-
GithubRepositories: filtered,
161+
GithubRepositories: repositories,
188162
}, nil
189163
}
190164

pkg/protoapi/schema/teams.proto

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ message Team {
1616
}
1717

1818
message ListAuthorizedRepositoriesRequest {
19-
string slug = 1;
19+
string teamSlug = 1;
2020
}
2121

2222
message ListAuthorizedRepositoriesResponse {

0 commit comments

Comments
 (0)