/
notification.go
134 lines (115 loc) · 5.67 KB
/
notification.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
package fcm
import (
"errors"
"strings"
)
var (
// ErrInvalidMessage occurs if push notitication message is nil.
ErrInvalidMessage = errors.New("message is invalid")
// ErrInvalidTarget occurs if message topic is empty.
ErrInvalidTarget = errors.New("topic is invalid or registration ids are not set")
)
// Message represents list of targets, options, and payload for HTTP JSON
// messages.
// See https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#resource:-message
// easyjson:json
type Message struct {
Name string `json:"name,omitempty"`
Data map[string]string `json:"data,omitempty"`
Notification *Notification `json:"notification,omitempty"`
Android *AndroidConfig `json:"android,omitempty"`
// one of
Token string `json:"token,omitempty"`
Topic string `json:"topic,omitempty"`
Condition string `json:"condition,omitempty"`
}
// Validate returns an error if the message is not well-formed.
func (msg *Message) Validate() error {
if msg == nil {
return ErrInvalidMessage
}
// validate target identifier: `to` or `condition`, or `registration_ids`
opCnt := strings.Count(msg.Condition, "&&") + strings.Count(msg.Condition, "||")
if msg.Token == "" && (msg.Condition == "" || opCnt > 2) && len(msg.Topic) == 0 {
return ErrInvalidTarget
}
return nil
}
// See https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#Notification
type Notification struct {
Title string `json:"title,omitempty"`
Body string `json:"body,omitempty"`
Image string `json:"image,omitempty"`
}
// See https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#AndroidConfig
type AndroidConfig struct {
CollapseKey string `json:"collapse_key,omitempty"`
Priority AndroidMessagePriority `json:"priority,omitempty"`
Ttl string `json:"ttl,omitempty"`
RestrictedPackageName string `json:"restricted_package_name,omitempty"`
Data map[string]string `json:"data,omitempty"`
Notification *AndroidNotification `json:"notification,omitempty"`
FCMOptions *AndroidFCMOptions `json:"fcm_options,omitempty"`
DirectBootOk bool `json:"direct_boot_ok,omitempty"`
}
// Notification specifies the predefined, user-visible key-value pairs of the
// notification payload.
// See https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#AndroidNotification
type AndroidNotification struct {
Title string `json:"title,omitempty"`
Body string `json:"body,omitempty"`
Icon string `json:"icon,omitempty"`
Color string `json:"color,omitempty"`
Sound string `json:"sound,omitempty"`
Tag string `json:"tag,omitempty"`
ClickAction string `json:"click_action,omitempty"`
BodyLocKey string `json:"body_loc_key,omitempty"`
BodyLocArgs []string `json:"body_loc_args,omitempty"`
TitleLocKey string `json:"title_loc_key,omitempty"`
TitleLocArgs []string `json:"title_loc_args,omitempty"`
ChannelId string `json:"channel_id,omitempty"`
Ticker string `json:"ticker,omitempty"`
Sticky bool `json:"sticky,omitempty"`
EventName string `json:"event_name,omitempty"`
LocalOnly bool `json:"local_only,omitempty"`
NotificationPriority NotificationPriority `json:"notification_priority,omitempty"`
DefaultSound bool `json:"default_sound,omitempty"`
DefaultVibrateTimings bool `json:"default_vibrate_timings,omitempty"`
DefaultLightSettings bool `json:"default_light_settings,omitempty"`
VibrateTimings []string `json:"vibrate_timings,omitempty"`
Visibility Visibility `json:"visibility,omitempty"`
NotificationCount int `json:"notification_count,omitempty"`
LightSettings *LightSettings `json:"light_settings,omitempty"`
Image string `json:"image,omitempty"`
}
type Color struct {
Red float32 `json:"red,omitempty"`
Green float32 `json:"green,omitempty"`
Blue float32 `json:"blue,omitempty"`
Alpha float32 `json:"alpha,omitempty"`
}
type LightSettings struct {
Color Color `json:"color"`
LightOnDuration string `json:"light_on_duration,omitempty"`
LightOffDuration string `json:"light_off_duration,omitempty"`
}
type AndroidMessagePriority string
type Visibility string
type NotificationPriority string
const (
NotificationPriorityUnspecified NotificationPriority = "PRIORITY_UNSPECIFIED"
NotificationPriorityMin NotificationPriority = "PRIORITY_MIN"
NotificationPriorityLow NotificationPriority = "PRIORITY_LOW"
NotificationPriorityDefault NotificationPriority = "PRIORITY_DEFAULT"
NotificationPriorityHigh NotificationPriority = "PRIORITY_HIGH"
NotificationPriorityMax NotificationPriority = "PRIORITY_MAX"
VisibilityPrivate Visibility = "PRIVATE"
VisibilityPublic Visibility = "PUBLIC"
VisibilitySecret Visibility = "SECRET"
AndroidMessagePriorityNormal AndroidMessagePriority = "NORMAL"
AndroidMessagePriorityHigh AndroidMessagePriority = "HIGH"
)
// AndroidFCMOptions contains additional options for features provided by the FCM Android SDK.
type AndroidFCMOptions struct {
AnalyticsLabel string `json:"analytics_label,omitempty"`
}