// getObjectType returns a graphql object type definition from a REST layer schema func (t types) getObjectType(idx resource.Index, r *resource.Resource) *graphql.Object { // Memoize types by their name so we don't create several instance of the same resource name := r.Name() o := t[name] if o == nil { o = graphql.NewObject(graphql.ObjectConfig{ Name: name, Description: r.Schema().Description, Fields: getFields(idx, r.Schema()), }) t[name] = o t.addConnections(o, idx, r) } return o }
func (t types) getGetQuery(idx resource.Index, r *resource.Resource) *graphql.Field { return &graphql.Field{ Description: fmt.Sprintf("Get %s by id", r.Name()), Type: t.getObjectType(idx, r), Args: graphql.FieldConfigArgument{ "id": &graphql.ArgumentConfig{ Type: graphql.String, }, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { id, ok := p.Args["id"].(string) if !ok { return nil, nil } item, err := r.Get(p.Context, id) if err != nil { return nil, err } return item.Payload, nil }, } }
func (t types) getListQuery(idx resource.Index, r *resource.Resource, params url.Values) *graphql.Field { return &graphql.Field{ Description: fmt.Sprintf("Get a list of %s", r.Name()), Type: graphql.NewList(t.getObjectType(idx, r)), Args: listArgs, Resolve: func(p graphql.ResolveParams) (interface{}, error) { lookup, page, perPage, err := listParamResolver(r, p, params) if err != nil { return nil, err } list, err := r.Find(p.Context, lookup, page, perPage) if err != nil { return nil, err } result := make([]map[string]interface{}, len(list.Items)) for i, item := range list.Items { result[i] = item.Payload } return result, nil }, } }