Example #1
0
File: api.go Project: dfeyer/api2go
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)
}
Example #2
0
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}
}
Example #3
0
File: api.go Project: m0dd3r/api2go
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)
}
Example #4
0
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()}
}
Example #5
0
File: api.go Project: m0dd3r/api2go
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)
}