forked from Mirrors/jsonapi
Initial commit
This commit is contained in:
commit
0aa225cfcc
|
@ -0,0 +1 @@
|
||||||
|
/bin/
|
|
@ -0,0 +1,80 @@
|
||||||
|
package jsonapi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type JsonApiNodeWrapper struct {
|
||||||
|
Data *JsonApiNode `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type JsonApiNode struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Id string `json:"id"`
|
||||||
|
Attributes map[string]interface{} `json:"attributes,omitempty"`
|
||||||
|
Relationships map[string]interface{} `json:"realtionships,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type JsonApiResponse struct {
|
||||||
|
Data *JsonApiNode `json:"data"`
|
||||||
|
Included []*JsonApiNode `json:"included"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateJsonApiResponse(model interface{}) (*JsonApiResponse, error) {
|
||||||
|
rootNode := new(JsonApiNode)
|
||||||
|
jsonApiResponse := &JsonApiResponse{Data: rootNode}
|
||||||
|
|
||||||
|
primaryKeyType := reflect.TypeOf(model)
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
primaryKeyType.FieldByNameFunc(func(name string) bool {
|
||||||
|
field, found := primaryKeyType.FieldByName(name)
|
||||||
|
|
||||||
|
if found {
|
||||||
|
fieldValue := reflect.ValueOf(model).FieldByName(name)
|
||||||
|
tag := field.Tag.Get("jsonapi")
|
||||||
|
args := strings.Split(tag, ",")
|
||||||
|
if len(args) >= 1 && args[0] != "" {
|
||||||
|
annotation := args[0]
|
||||||
|
|
||||||
|
if annotation == "primary" {
|
||||||
|
if len(args) >= 2 {
|
||||||
|
rootNode.Id = fmt.Sprintf("%v", fieldValue.Interface())
|
||||||
|
rootNode.Type = args[1]
|
||||||
|
} else {
|
||||||
|
err = errors.New("'type' as second argument required for 'primary'")
|
||||||
|
}
|
||||||
|
} else if annotation == "attr" {
|
||||||
|
if rootNode.Attributes == nil {
|
||||||
|
rootNode.Attributes = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(args) >= 2 {
|
||||||
|
rootNode.Attributes[args[1]] = fieldValue.Interface()
|
||||||
|
} else {
|
||||||
|
err = errors.New("'type' as second argument required for 'primary'")
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
err = errors.New("Unsupported jsonapi tag annotation")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonApiResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleField(field reflect.StructField) {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package jsonapi
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
type Blog struct {
|
||||||
|
Id int `json:"id" jsonapi:"primary,blogs"`
|
||||||
|
Title string `json:"title" jsonapi:"attr,title"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHasPrimaryAnnotation(t *testing.T) {
|
||||||
|
testModel := Blog{
|
||||||
|
Id: 5,
|
||||||
|
Title: "Title 1",
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := CreateJsonApiResponse(testModel)
|
||||||
|
response := resp.Data
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.Type != "blogs" {
|
||||||
|
t.Fatalf("type should have been blogs")
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.Id != "5" {
|
||||||
|
t.Fatalf("Id not transfered")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSupportsAttributes(t *testing.T) {
|
||||||
|
testModel := Blog{
|
||||||
|
Id: 5,
|
||||||
|
Title: "Title 1",
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := CreateJsonApiResponse(testModel)
|
||||||
|
response := resp.Data
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.Attributes == nil || len(response.Attributes) != 1 {
|
||||||
|
t.Fatalf("Expected 1 Attributes")
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.Attributes["title"] != "Title 1" {
|
||||||
|
t.Fatalf("Attributes hash not populated using tags correctly")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue