forked from mfcochauxlaberge/jsonapi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutil.go
More file actions
130 lines (107 loc) · 2.49 KB
/
util.go
File metadata and controls
130 lines (107 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package jsonapi
import "encoding/json"
// marshalResource ...
func marshalResource(r Resource, prepath string, fields []string, relData map[string][]string) ([]byte, error) {
mapPl := map[string]interface{}{}
// ID and type
mapPl["id"] = r.GetID()
mapPl["type"] = r.GetType()
// Attributes
attrs := map[string]interface{}{}
for _, attr := range r.Attrs() {
if len(fields) == 0 {
attrs[attr.Name] = r.Get(attr.Name)
} else {
for _, field := range fields {
if field == attr.Name {
attrs[attr.Name] = r.Get(attr.Name)
break
}
}
}
}
mapPl["attributes"] = attrs
// Relationships
rels := map[string]*json.RawMessage{}
for _, rel := range r.Rels() {
include := false
if len(fields) == 0 {
include = true
} else {
for _, field := range fields {
if field == rel.Name {
include = true
break
}
}
}
if include {
if rel.ToOne {
var raw json.RawMessage
s := map[string]map[string]string{
"links": buildRelationshipLinks(r, prepath, rel.Name),
}
for n := range relData {
if n == rel.Name {
id := r.GetToOne(rel.Name)
if id != "" {
s["data"] = map[string]string{
"id": r.GetToOne(rel.Name),
"type": rel.Type,
}
} else {
s["data"] = nil
}
break
}
}
// var links map[string]string{}
raw, _ = json.Marshal(s)
rels[rel.Name] = &raw
} else {
var raw json.RawMessage
s := map[string]interface{}{
"links": buildRelationshipLinks(r, prepath, rel.Name),
}
for n := range relData {
if n == rel.Name {
data := []map[string]string{}
for _, id := range r.GetToMany(rel.Name) {
data = append(data, map[string]string{
"id": id,
"type": rel.Type,
})
}
s["data"] = data
break
}
}
raw, _ = json.Marshal(s)
rels[rel.Name] = &raw
}
}
}
mapPl["relationships"] = rels
// Links
mapPl["links"] = map[string]string{
"self": buildSelfLink(r, prepath), // TODO
}
return json.Marshal(mapPl)
}
// marshalCollection ...
func marshalCollection(c Collection, prepath string, fields []string, relData map[string][]string) ([]byte, error) {
var raws []*json.RawMessage
if c.Len() == 0 {
return []byte("[]"), nil
}
for i := 0; i < c.Len(); i++ {
r := c.Elem(i)
var raw json.RawMessage
raw, err := marshalResource(r, prepath, fields, relData)
if err != nil {
return []byte{}, err
}
raws = append(raws, &raw)
}
return json.Marshal(raws)
}