func respondWith(obj interface{}, info information, status int, w http.ResponseWriter, r *http.Request, marshalers map[string]ContentMarshaler) error { data, err := jsonapi.MarshalWithURLs(obj, info) if err != nil { return err } return marshalResponse(data, w, status, r, marshalers) }
func (res *resource) handleReadRelation(r Request, relation jsonapi.Reference) response { id := r.Params.ByName("id") obj, err := res.source.FindOne(id, r) if err != nil { return response{Error: err} } internalError := response{ Error: NewHTTPError(nil, "Internal server error, invalid object structure", http.StatusInternalServerError), } marshalled, err := jsonapi.MarshalWithURLs(obj.Result(), res.api.info) data, ok := marshalled["data"] if !ok { return internalError } relationships, ok := data.(map[string]interface{})["relationships"] if !ok { return internalError } rel, ok := relationships.(map[string]map[string]interface{})[relation.Name] if !ok { return response{ Error: NewHTTPError(nil, fmt.Sprintf("There is no relation with the name %s", relation.Name), http.StatusNotFound), } } links, ok := rel["links"].(map[string]string) if !ok { return internalError } self, ok := links["self"] if !ok { return internalError } related, ok := links["related"] if !ok { return internalError } relationData, ok := rel["data"] if !ok { return internalError } result := map[string]interface{}{} result["links"] = map[string]interface{}{ "self": self, "related": related, } result["data"] = relationData meta := obj.Metadata() if len(meta) > 0 { result["meta"] = meta } return response{Status: http.StatusOK, Data: result} }
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 } internalError := NewHTTPError(nil, "Internal server error, invalid object structure", http.StatusInternalServerError) marshalled, err := jsonapi.MarshalWithURLs(obj.Result(), info) data, ok := marshalled["data"] if !ok { return internalError } relationships, ok := data.(map[string]interface{})["relationships"] if !ok { return internalError } rel, ok := relationships.(map[string]map[string]interface{})[relation.Name] if !ok { return NewHTTPError(nil, fmt.Sprintf("There is no relation with the name %s", relation.Name), http.StatusNotFound) } links, ok := rel["links"].(map[string]string) if !ok { return internalError } self, ok := links["self"] if !ok { return internalError } related, ok := links["related"] if !ok { return internalError } relationData, ok := rel["data"] if !ok { return internalError } result := map[string]interface{}{} result["links"] = map[string]interface{}{ "self": self, "related": related, } result["data"] = relationData meta := obj.Metadata() if len(meta) > 0 { result["meta"] = meta } return marshalResponse(result, w, http.StatusOK, r, res.marshalers) }
func (res *resource) buildResponse(obj Responder, links map[string]string, status int) response { data, err := jsonapi.MarshalWithURLs(obj.Result(), res.api.info) if err != nil { return response{Error: err} } if links != nil { data["links"] = links } return response{Data: data, Status: status, Meta: obj.Metadata()} }
func respondWith(obj Responder, info information, status int, w http.ResponseWriter, r *http.Request, marshalers map[string]ContentMarshaler) error { data, err := jsonapi.MarshalWithURLs(obj.Result(), info) if err != nil { return err } meta := obj.Metadata() if len(meta) > 0 { data["meta"] = meta } return marshalResponse(data, w, status, r, marshalers) }