-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathquestorganization.go
161 lines (129 loc) · 4.84 KB
/
questorganization.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package kanka
import (
"bytes"
"encoding/json"
"fmt"
"time"
)
// QuestOrganization contains information about a specific quest organization.
// For more information, visit: https://kanka.io/en-US/docs/1.0/quests#quest-organisations
type QuestOrganization struct {
SimpleQuestOrganization
ID int `json:"id"`
CreatedAt time.Time `json:"created_at"`
CreatedBy int `json:"created_by"`
UpdatedAt time.Time `json:"updated_at"`
UpdatedBy int `json:"updated_by"`
}
// SimpleQuestOrganization contains only the simple information about a quest organization.
// SimpleQuestOrganization is primarily used to create new quest organizations for posting to Kanka.
type SimpleQuestOrganization struct {
QuestID int `json:"quest_id"`
OrganizationID int `json:"organisation_id"`
Description string `json:"description,omitempty"`
Role string `json:"role,omitempty"`
IsPrivate bool `json:"is_private,omitempty"`
}
// QuestOrganizationService handles communication with the QuestOrganization endpoint.
type QuestOrganizationService service
// Index returns the list of all QuestOrganizations for the quest associated with
// qstID in the Campaign associated with campID.
// If a non-nil time is provided, Index will only return QuestOrganizations that have
// been changed since that time.
func (qs *QuestOrganizationService) Index(campID int, qstID int, sync *time.Time) ([]*QuestOrganization, error) {
var err error
end := EndpointCampaign
if end, err = end.id(campID); err != nil {
return nil, fmt.Errorf("invalid Campaign ID: %w", err)
}
end = end.concat(EndpointQuest)
if end, err = end.id(qstID); err != nil {
return nil, fmt.Errorf("invalid Quest ID: %w", err)
}
end = end.concat(qs.end)
if sync != nil {
end = end.sync(*sync)
}
var wrap struct {
Data []*QuestOrganization `json:"data"`
}
if err = qs.client.get(end, &wrap); err != nil {
return nil, fmt.Errorf("cannot get QuestOrganization Index from Campaign (ID: %d): %w", campID, err)
}
return wrap.Data, nil
}
// Get returns the QuestOrganization associated with orgID for the quest associated
// with qstID from the Campaign associated with campID.
func (qs *QuestOrganizationService) Get(campID int, qstID int, orgID int) (*QuestOrganization, error) {
var err error
end := EndpointCampaign
if end, err = end.id(campID); err != nil {
return nil, fmt.Errorf("invalid Campaign ID: %w", err)
}
end = end.concat(EndpointQuest)
if end, err = end.id(qstID); err != nil {
return nil, fmt.Errorf("invalid Quest ID: %w", err)
}
end = end.concat(qs.end)
if end, err = end.id(orgID); err != nil {
return nil, fmt.Errorf("invalid QuestOrganization ID: %w", err)
}
var wrap struct {
Data *QuestOrganization `json:"data"`
}
if err = qs.client.get(end, &wrap); err != nil {
return nil, fmt.Errorf("cannot get QuestOrganization (ID: %d) from Campaign (ID: %d): %w", orgID, campID, err)
}
return wrap.Data, nil
}
// Update updates an existing QuestOrganization associated with orgID for the quest
// associated with qstID from the Campaign associated with campID using the
// provided SimpleQuestOrganization data.
// Update returns the newly updated QuestOrganization.
func (qs *QuestOrganizationService) Update(campID int, qstID int, orgID int, org SimpleQuestOrganization) (*QuestOrganization, error) {
var err error
end := EndpointCampaign
if end, err = end.id(campID); err != nil {
return nil, fmt.Errorf("invalid Campaign ID: %w", err)
}
end = end.concat(EndpointQuest)
if end, err = end.id(qstID); err != nil {
return nil, fmt.Errorf("invalid Quest ID: %w", err)
}
end = end.concat(qs.end)
if end, err = end.id(orgID); err != nil {
return nil, fmt.Errorf("invalid QuestOrganization ID: %w", err)
}
b, err := json.Marshal(org)
if err != nil {
return nil, fmt.Errorf("cannot marshal SimpleQuestOrganization: %w", err)
}
var wrap struct {
Data *QuestOrganization `json:"data"`
}
if err = qs.client.put(end, bytes.NewReader(b), &wrap); err != nil {
return nil, fmt.Errorf("cannot update QuestOrganization for Campaign (ID: %d): '%w'", campID, err)
}
return wrap.Data, nil
}
// Delete deletes an existing QuestOrganization associated with orgID from the
// Campaign associated with campID.
func (qs *QuestOrganizationService) Delete(campID int, qstID int, orgID int) error {
var err error
end := EndpointCampaign
if end, err = end.id(campID); err != nil {
return fmt.Errorf("invalid Campaign ID: %w", err)
}
end = end.concat(EndpointQuest)
if end, err = end.id(qstID); err != nil {
return fmt.Errorf("invalid Quest ID: %w", err)
}
end = end.concat(qs.end)
if end, err = end.id(orgID); err != nil {
return fmt.Errorf("invalid QuestOrganization ID: %w", err)
}
if err = qs.client.delete(end); err != nil {
return fmt.Errorf("cannot delete QuestOrganization (ID: %d) for Campaign (ID: %d): %w", orgID, campID, err)
}
return nil
}