-
Notifications
You must be signed in to change notification settings - Fork 0
/
sources.go
116 lines (105 loc) · 3.86 KB
/
sources.go
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
package gofamilysearch
import (
"fmt"
"strings"
)
type sourcesResponse struct {
Persons []*sourceRefsContainer `json:"persons"`
Relationships []*sourceRefsContainer `json:"relationships"`
ChildAndParentsRelationships []*sourceRefsContainer `json:"childAndParentsRelationships"`
SourceDescriptions []*SourceDescription `json:"sourceDescriptions"`
}
type sourceRefsContainer struct {
Sources []*SourceRef `json:"sources"`
}
// Sources contains SourceRefs and SourceDescriptions attached to a person, couple, or child-and-parents relationship
type Sources struct {
Refs []*SourceRef `json:"sources"`
Descriptions []*SourceDescription `json:"sourceDescriptions"`
}
// GetSourceDescription returns the SourceDescription for the specified SourceRef.Description
func (sources *Sources) GetSourceDescription(description string) *SourceDescription {
if strings.HasPrefix(description, "#") {
description = description[1:]
}
for _, sd := range sources.Descriptions {
if sd.ID == description {
return sd
}
}
return nil
}
// SourceDescription contains information about a source description
type SourceDescription struct {
ID string `json:"id"`
About string `json:"about"`
Attribution Attribution `json:"attribution"`
Citations []*FSValue `json:"citations"`
Titles []*FSValue `json:"titles"`
Notes []*FSText `json:"notes"`
}
// SourceRef contains a reference to a SourceDescription; Description is the link to the SourceDescription
type SourceRef struct {
ID string `json:"id"`
Attribution Attribution `json:"attribution"`
Description string `json:"description"`
Tags []*Tag `json:"tags"`
}
// Tag contains a Resource that is http://gedcomx.org/Name, Gender, Birth, Christening, Death, or Burial
type Tag struct {
Resource string `json:"resource"`
}
// GetPersonSources https://familysearch.org/developers/docs/api/tree/Person_Sources_Query_resource
func (c *Client) GetPersonSources(pid string) (*Sources, error) {
u, err := c.GetURL("person-sources-query-template", map[string]string{"pid": pid})
if err != nil {
return nil, err
}
sourcesResponse := &sourcesResponse{}
if err = c.Get(u, nil, nil, sourcesResponse); err != nil {
return nil, err
}
if len(sourcesResponse.Persons) != 1 {
return nil, fmt.Errorf("Invalid response")
}
return &Sources{
Refs: sourcesResponse.Persons[0].Sources,
Descriptions: sourcesResponse.SourceDescriptions,
}, nil
}
// GetCoupleSources https://familysearch.org/developers/docs/api/tree/Couple_Relationship_Sources_Query_resource
func (c *Client) GetCoupleSources(crid string) (*Sources, error) {
u, err := c.GetURL("couple-relationship-sources-query-template", map[string]string{"crid": crid})
if err != nil {
return nil, err
}
sourcesResponse := &sourcesResponse{}
if err = c.Get(u, nil, nil, sourcesResponse); err != nil {
return nil, err
}
if len(sourcesResponse.Relationships) != 1 {
return nil, fmt.Errorf("Invalid response")
}
return &Sources{
Refs: sourcesResponse.Relationships[0].Sources,
Descriptions: sourcesResponse.SourceDescriptions,
}, nil
}
// GetChildAndParentsSources https://familysearch.org/developers/docs/api/tree/Child-and-Parents_Relationship_Sources_Query_resource
func (c *Client) GetChildAndParentsSources(caprid string) (*Sources, error) {
u, err := c.GetURL("child-and-parents-relationship-sources-template", map[string]string{"caprid": caprid})
if err != nil {
return nil, err
}
sourcesResponse := &sourcesResponse{}
if err = c.Get(u, nil, nil, sourcesResponse); err != nil {
return nil, err
}
if len(sourcesResponse.ChildAndParentsRelationships) != 1 {
return nil, fmt.Errorf("Invalid response")
}
return &Sources{
Refs: sourcesResponse.ChildAndParentsRelationships[0].Sources,
Descriptions: sourcesResponse.SourceDescriptions,
}, nil
}