| package proxy |
| |
| import ( |
| "fmt" |
| |
| "github.com/fweikert/go-buildkite/buildkite" |
| ) |
| |
| type Pipeline struct { |
| *buildkite.Pipeline |
| Details *PipelineAccessAndSchedules |
| } |
| |
| type Proxy struct { |
| org string |
| apiToken string |
| restClient *RestClient |
| graphQlClient *GraphQlClient |
| } |
| |
| func CreateProxy(org, apiToken string, debug bool) (*Proxy, error) { |
| restClient, err := CreateRestClient(org, apiToken, debug) |
| |
| if err != nil { |
| return nil, fmt.Errorf("Cannot get client config: %s", err) |
| } |
| |
| graphqlClient := CreateGraphQlClient(org, apiToken, debug) |
| return &Proxy{org: org, restClient: restClient, graphQlClient: graphqlClient}, nil |
| } |
| |
| func (proxy *Proxy) GetPipelines() ([]*Pipeline, error) { |
| basicSettings, err := proxy.restClient.GetBasicSettings() |
| if err != nil { |
| return nil, fmt.Errorf("Cannot retrieve pipelines for org '%s' from the REST API: %s", proxy.org, err) |
| } |
| |
| accessAndSchedules, err := proxy.graphQlClient.GetAccessAndSchedules() |
| if err != nil { |
| return nil, fmt.Errorf("Cannot retrieve pipelines for org '%s' from the GraphQL API: %s", proxy.org, err) |
| } |
| |
| return proxy.mergeData(basicSettings, accessAndSchedules) |
| } |
| |
| func (proxy *Proxy) mergeData(basicSettings []buildkite.Pipeline, accessAndSchedules []*PipelineAccessAndSchedules) ([]*Pipeline, error) { |
| restCount := len(basicSettings) |
| graphQlCount := len(accessAndSchedules) |
| if restCount != graphQlCount { |
| return nil, fmt.Errorf("Buildkite API returned %d pipelines for org '%s', but the GraphQL API returned %d.", restCount, proxy.org, graphQlCount) |
| } |
| |
| index := make(map[string]*buildkite.Pipeline) |
| for i, bs := range basicSettings { |
| index[*bs.Name] = &basicSettings[i] |
| } |
| |
| mergedData := make([]*Pipeline, restCount) |
| for i, aas := range accessAndSchedules { |
| if bs, ok := index[aas.Name]; !ok { |
| return nil, fmt.Errorf("GraphQL API returned pipeline '%s', which was not returned by the REST API.", aas.Name) |
| } else { |
| mergedData[i] = &Pipeline{bs, aas} |
| } |
| } |
| |
| return mergedData, nil |
| } |