| package proxy | |
| import ( | |
| "context" | |
| "fmt" | |
| "log" | |
| "github.com/machinebox/graphql" | |
| ) | |
| const defaultEndpoint = "https://graphql.buildkite.com/v1" | |
| // TODO(fwe): support paging once we have more than 500 pipelines | |
| const pipelineQuery = ` | |
| query ($org: ID!){ | |
| organization(slug: $org) { | |
| pipelines(first: 500) { | |
| edges { | |
| node { | |
| name | |
| public | |
| teams(first: 500) { | |
| edges { | |
| node { | |
| team { | |
| slug | |
| } | |
| accessLevel | |
| } | |
| } | |
| } | |
| schedules { | |
| edges { | |
| node { | |
| env | |
| enabled | |
| id | |
| label | |
| cronline | |
| branch | |
| commit | |
| message | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| ` | |
| type response struct { | |
| Organization struct { | |
| Pipelines struct { | |
| Edges []struct { | |
| Node struct { | |
| Name string `json:"name"` | |
| Public bool `json:"public"` | |
| Teams struct { | |
| Edges []struct { | |
| Node struct { | |
| Team struct { | |
| Slug string `json:"slug"` | |
| } `json:"team"` | |
| AccessLevel string `json:"accessLevel"` | |
| } `json:"node"` | |
| } `json:"edges"` | |
| } `json:"teams"` | |
| Schedules struct { | |
| Edges []struct { | |
| Node struct { | |
| Id string `json:"id"` | |
| Label string `json:"label"` | |
| Cronline string `json:"cronline"` | |
| Branch string `json:"branch"` | |
| Commit string `json:"commit"` | |
| Env []string `json:"env"` | |
| Enabled bool `json:"enabled"` | |
| Message string `json:"message"` | |
| } `json:"node"` | |
| } `json:"edges"` | |
| } `json:"schedules"` | |
| } `json:"node"` | |
| } `json:"edges"` | |
| } `json:"pipelines"` | |
| } `json:"organization"` | |
| } | |
| type Access struct { | |
| TeamSlug string | |
| AccessLevel string | |
| } | |
| type Schedule struct { | |
| Id string | |
| Label string | |
| Cronline string | |
| Branch string | |
| Commit string | |
| Env []string | |
| Enabled bool | |
| Message string | |
| } | |
| type PipelineAccessAndSchedules struct { | |
| Name string | |
| Public bool | |
| Access []Access | |
| Schedules []Schedule | |
| } | |
| type GraphQlClient struct { | |
| org string | |
| graphqlClient *graphql.Client | |
| request *graphql.Request | |
| } | |
| func CreateGraphQlClient(org string, apiToken string, debug bool) *GraphQlClient { | |
| graphqlClient := graphql.NewClient(defaultEndpoint) | |
| if debug { | |
| graphqlClient.Log = func(s string) { log.Println(s) } | |
| } | |
| request := graphql.NewRequest(pipelineQuery) | |
| request.Var("org", org) | |
| request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiToken)) | |
| return &GraphQlClient{org: org, graphqlClient: graphqlClient, request: request} | |
| } | |
| func (client *GraphQlClient) GetAccessAndSchedules() ([]*PipelineAccessAndSchedules, error) { | |
| ctx := context.Background() | |
| var resp response | |
| if err := client.graphqlClient.Run(ctx, client.request, &resp); err != nil { | |
| return nil, err | |
| } | |
| return extractAccessAndSchedulesFromResponse(resp), nil | |
| } | |
| func extractAccessAndSchedulesFromResponse(resp response) []*PipelineAccessAndSchedules { | |
| edges := resp.Organization.Pipelines.Edges | |
| result := make([]*PipelineAccessAndSchedules, len(edges)) | |
| for i, e := range edges { | |
| access := make([]Access, len(e.Node.Teams.Edges)) | |
| for ia, a := range e.Node.Teams.Edges { | |
| access[ia] = Access{ | |
| TeamSlug: a.Node.Team.Slug, | |
| AccessLevel: a.Node.AccessLevel} | |
| } | |
| schedules := make([]Schedule, len(e.Node.Schedules.Edges)) | |
| for is, s := range e.Node.Schedules.Edges { | |
| schedules[is] = Schedule{ | |
| Id: s.Node.Id, | |
| Label: s.Node.Label, | |
| Cronline: s.Node.Cronline, | |
| Branch: s.Node.Branch, | |
| Commit: s.Node.Commit, | |
| Env: s.Node.Env, | |
| Enabled: s.Node.Enabled, | |
| Message: s.Node.Message} | |
| } | |
| result[i] = &PipelineAccessAndSchedules{ | |
| Name: e.Node.Name, | |
| Public: e.Node.Public, | |
| Access: access, | |
| Schedules: schedules} | |
| } | |
| return result | |
| } |