func (res *resource) handleReadRelation(c APIContexter, w http.ResponseWriter, r *http.Request, params map[string]string, info information, relation jsonapi.Reference) error { id := params["id"] obj, err := res.source.FindOne(id, buildRequest(c, r)) if err != nil { return err } document, err := jsonapi.MarshalToStruct(obj.Result(), info) if err != nil { return err } rel, ok := document.Data.DataObject.Relationships[relation.Name] if !ok { return NewHTTPError(nil, fmt.Sprintf("There is no relation with the name %s", relation.Name), http.StatusNotFound) } meta := obj.Metadata() if len(meta) > 0 { rel.Meta = meta } return res.marshalResponse(rel, w, http.StatusOK, r) }
func MarshalToStructWrapper(data interface{}, ep jsonapi.ServerInformation) (*jsonapi.Document, error) { jst, err := jsonapi.MarshalToStruct(data, ep) if err != nil { return jst, err } if len(jst.Data.DataArray) > 0 { //array resource objects // picking first element both from the generated and given typed structures elem := jst.Data.DataArray[0] value := reflect.ValueOf(data).Index(0).Interface() // link for the array resource itself jst.Links = &jsonapi.Links{Self: generateMultiResourceLink(&elem, ep)} for i, d := range jst.Data.DataArray { // link for individual resource jst.Data.DataArray[i].Links = &jsonapi.Links{Self: generateSingleResourceLink(&d, ep)} // Add relationships to every member r := generateRelationshipLinks(value, &d, ep) jst.Data.DataArray[i].Relationships = r } } else { jst.Links = &jsonapi.Links{Self: generateSingleResourceLink(jst.Data.DataObject, ep)} relationships := generateRelationshipLinks(data, jst.Data.DataObject, ep) if len(relationships) > 0 { jst.Data.DataObject.Relationships = relationships } } return jst, nil }
func (res *resource) respondWith(obj Responder, info information, status int, w http.ResponseWriter, r *http.Request) error { data, err := jsonapi.MarshalToStruct(obj.Result(), info) if err != nil { return err } meta := obj.Metadata() if len(meta) > 0 { data.Meta = meta } return res.marshalResponse(data, w, status, r) }