Skip to content

Commit

Permalink
[GraphQL] Gracefully handle failed type assertions (#1650)
Browse files Browse the repository at this point in the history
Signed-off-by: James Phillips <jamesdphillips@gmail.com>
  • Loading branch information
jamesdphillips committed Jul 18, 2018
1 parent 2dee6be commit b1d1305
Show file tree
Hide file tree
Showing 22 changed files with 1,102 additions and 201 deletions.
46 changes: 18 additions & 28 deletions backend/apid/graphql/environment.go
Expand Up @@ -64,7 +64,6 @@ func (r *envImpl) Description(p graphql.ResolveParams) (string, error) {
func (r *envImpl) ColourID(p graphql.ResolveParams) (schema.MutedColour, error) {
env := p.Source.(*types.Environment)
num := env.Name[0] % 7
logger.WithField("name", env.Name).WithField("num", num).Info("finding colour")
switch num {
case 0:
return schema.MutedColours.BLUE, nil
Expand Down Expand Up @@ -92,11 +91,12 @@ func (r *envImpl) Organization(p graphql.ResolveParams) (interface{}, error) {

// Checks implements response to request for 'checks' field.
func (r *envImpl) Checks(p schema.EnvironmentChecksFieldResolverParams) (interface{}, error) {
res := newOffsetContainer(p.Args.Offset, p.Args.Limit)
env := p.Source.(*types.Environment)
ctx := types.SetContextFromResource(p.Context, env)
records, err := r.checksCtrl.Query(ctx)
if err != nil {
return nil, err
return res, err
}

// apply filters
Expand Down Expand Up @@ -127,16 +127,14 @@ func (r *envImpl) Checks(p schema.EnvironmentChecksFieldResolverParams) (interfa

// paginate
l, h := clampSlice(p.Args.Offset, p.Args.Offset+p.Args.Limit, len(filteredChecks))
return newOffsetContainer(
filteredChecks[l:h],
len(filteredChecks),
p.Args.Offset,
p.Args.Limit,
), nil
res.Nodes = filteredChecks[l:h]
res.PageInfo.totalCount = len(filteredChecks)
return res, nil
}

// Silences implements response to request for 'silences' field.
func (r *envImpl) Silences(p schema.EnvironmentSilencesFieldResolverParams) (interface{}, error) {
res := newOffsetContainer(p.Args.Offset, p.Args.Limit)
env := p.Source.(*types.Environment)

// finds all records
Expand Down Expand Up @@ -179,18 +177,15 @@ func (r *envImpl) Silences(p schema.EnvironmentSilencesFieldResolverParams) (int
sort.Sort(types.SortSilencedByID(filteredSilences))
}

// paginate
l, h := clampSlice(p.Args.Offset, p.Args.Offset+p.Args.Limit, len(filteredSilences))
return newOffsetContainer(
filteredSilences[l:h],
len(filteredSilences),
p.Args.Offset,
p.Args.Limit,
), nil
res.Nodes = filteredSilences[l:h]
res.PageInfo.totalCount = len(filteredSilences)
return res, nil
}

// Entities implements response to request for 'entities' field.
func (r *envImpl) Entities(p schema.EnvironmentEntitiesFieldResolverParams) (interface{}, error) {
res := newOffsetContainer(p.Args.Offset, p.Args.Limit)
env := p.Source.(*types.Environment)
ctx := types.SetContextFromResource(p.Context, env)
records, err := r.entityCtrl.Query(ctx)
Expand Down Expand Up @@ -231,21 +226,19 @@ func (r *envImpl) Entities(p schema.EnvironmentEntitiesFieldResolverParams) (int

// paginate
l, h := clampSlice(p.Args.Offset, p.Args.Offset+p.Args.Limit, len(filteredEntities))
return newOffsetContainer(
filteredEntities[l:h],
len(filteredEntities),
p.Args.Offset,
p.Args.Limit,
), nil
res.Nodes = filteredEntities[l:h]
res.PageInfo.totalCount = len(filteredEntities)
return res, nil
}

// Events implements response to request for 'events' field.
func (r *envImpl) Events(p schema.EnvironmentEventsFieldResolverParams) (interface{}, error) {
res := newOffsetContainer(p.Args.Offset, p.Args.Limit)
env := p.Source.(*types.Environment)
ctx := types.SetContextFromResource(p.Context, env)
records, err := r.eventQuerier.Query(ctx, "", "")
if err != nil {
return nil, err
return res, err
}

// apply filters
Expand Down Expand Up @@ -280,12 +273,9 @@ func (r *envImpl) Events(p schema.EnvironmentEventsFieldResolverParams) (interfa

// pagination
l, h := clampSlice(p.Args.Offset, p.Args.Offset+p.Args.Limit, len(filteredEvents))
return newOffsetContainer(
filteredEvents[l:h],
len(filteredEvents),
p.Args.Offset,
p.Args.Limit,
), nil
res.Nodes = filteredEvents[l:h]
res.PageInfo.totalCount = len(filteredEvents)
return res, nil
}

// CheckHistory implements response to request for 'checkHistory' field.
Expand Down
5 changes: 2 additions & 3 deletions backend/apid/graphql/pagination.go
Expand Up @@ -20,10 +20,9 @@ type offsetPageInfo struct {
totalCount int
}

func newOffsetContainer(nodes interface{}, totalCount, offset, limit int) offsetContainer {
func newOffsetContainer(offset, limit int) offsetContainer {
container := offsetContainer{}
container.Nodes = nodes
container.PageInfo.totalCount = totalCount
container.Nodes = make([]interface{}, 0)
container.PageInfo.offset = offset
container.PageInfo.limit = limit
return container
Expand Down
42 changes: 36 additions & 6 deletions backend/apid/graphql/schema/asset.gql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit b1d1305

Please sign in to comment.