-
Notifications
You must be signed in to change notification settings - Fork 0
/
subscription.go
92 lines (80 loc) · 2.75 KB
/
subscription.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
package sharefile
import (
"context"
"encoding/json"
"fmt"
"io"
"time"
)
const (
ResourceTypeFile = "File"
ResourceTypeFolder = "Folder"
OperationNameUpload = "Upload"
)
type WebhookSubscription struct {
ID string `json:"Id,omitempty"`
URL string `json:"url,omitempty"`
SubscriptionContext SubscriptionContext `json:",omitempty"`
Events []SubscribedResourceEvent `json:",omitempty"`
WebhookURL string `json:"WebhookUrl,omitempty"`
}
type SubscriptionContext struct {
ResourceType string `json:",omitempty"`
ResourceId string `json:",omitempty"`
}
type SubscribedResourceEvent struct {
ResourceType string `json:",omitempty"`
OperationName string `json:",omitempty"`
}
type WebhookSubscriptionEvent struct {
WebhookSubscriptionID string `json:"WebhookSubscriptionId,omitempty"`
AccountID string `json:"AccountId,omitempty"`
Event SubscriptionEvent `json:",omitempty"`
}
type SubscriptionEvent struct {
Timestamp time.Time `json:",omitempty"`
OperationName string `json:",omitempty"`
ResourceType string `json:",omitempty"`
Resource SubscribedResource `json:",omitempty"`
}
type SubscribedResource struct {
ID string `json:"Id,omitempty"`
Parent *SubscribedResource `json:",omitempty"`
}
func (sf *Login) CreateSubscription(ctx context.Context, toCreate WebhookSubscription) (WebhookSubscription, error) {
result := WebhookSubscription{}
err := sf.doPost(ctx, sf.Account().entityURL("WebhookSubscriptions"), toCreate, &result)
return result, err
}
func (sf *Login) DeleteSubscription(ctx context.Context, subscriptionID string) error {
url := sf.Account().itemURL("WebhookSubscriptions", subscriptionID)
return sf.doDelete(ctx, url)
}
func (sf *Login) Subscribe(ctx context.Context, folder Folder, callbackURL string, eventTypes ...string) (WebhookSubscription, error) {
toCreate := WebhookSubscription{
SubscriptionContext: SubscriptionContext{
ResourceType: ResourceTypeFolder,
ResourceId: folder.ID,
},
WebhookURL: callbackURL,
}
for _, et := range eventTypes {
toCreate.Events = append(toCreate.Events, SubscribedResourceEvent{
ResourceType: ResourceTypeFile,
OperationName: et,
})
toCreate.Events = append(toCreate.Events, SubscribedResourceEvent{
ResourceType: ResourceTypeFolder,
OperationName: et,
})
}
return sf.CreateSubscription(ctx, toCreate)
}
func ParseEvent(rdr io.Reader) (WebhookSubscriptionEvent, error) {
event := WebhookSubscriptionEvent{}
err := json.NewDecoder(rdr).Decode(&event)
if err != nil {
err = fmt.Errorf("Event parsing failed: %v", err)
}
return event, err
}