admin-push-notification-supplier #1
|
@ -0,0 +1,7 @@
|
||||||
|
package notification
|
||||||
|
|
||||||
|
const (
|
||||||
|
SortOrderDesc = "-order"
|
||||||
|
SortOrderAsc = "order"
|
||||||
|
SortDefault = "-lastPushAt"
|
||||||
|
)
|
|
@ -24,37 +24,37 @@ func main() {
|
||||||
|
|
||||||
userID := "61a499ad8d5770f8872b03d8"
|
userID := "61a499ad8d5770f8872b03d8"
|
||||||
requestID, err := c.PushToUsers(notification.PushRequest{
|
requestID, err := c.PushToUsers(notification.PushRequest{
|
||||||
Title: "Notification 1",
|
Title: "Notification campaign 111",
|
||||||
Body: "nats stream view notification",
|
Body: "Notification campaign 11",
|
||||||
Data: "{}",
|
Data: "{}",
|
||||||
Users: []string{userID},
|
Users: []string{userID},
|
||||||
Label: "tracking-label",
|
Label: "tracking-campaign",
|
||||||
Category: "order",
|
Category: "campaign",
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Push err: ", err)
|
fmt.Println("Push err: ", err)
|
||||||
}
|
}
|
||||||
fmt.Println("Request id: ", requestID)
|
fmt.Println("Request id: ", requestID)
|
||||||
|
|
||||||
total, err := c.CountUnread(notification.CountUnread{
|
unread, err := c.CountUnread(notification.CountUnread{
|
||||||
User: userID,
|
User: userID,
|
||||||
Category: "order",
|
Category: "", // count all if not specify category
|
||||||
})
|
})
|
||||||
fmt.Println("Count: ", total, err)
|
fmt.Println("Count: ", unread, err)
|
||||||
|
|
||||||
res, err := c.Query(notification.Query{
|
res, err := c.Query(notification.Query{
|
||||||
User: userID,
|
User: userID,
|
||||||
Category: "order",
|
|
||||||
Page: 0,
|
Page: 0,
|
||||||
Limit: 20,
|
Limit: 20,
|
||||||
|
Category: "", // get all if not specify category
|
||||||
})
|
})
|
||||||
fmt.Println("Query : ", res, err)
|
fmt.Println("Query : ", res, err)
|
||||||
|
|
||||||
total, err = c.CountUnread(notification.CountUnread{
|
unread, err = c.CountUnread(notification.CountUnread{
|
||||||
User: userID,
|
User: userID,
|
||||||
Category: "order",
|
Category: "",
|
||||||
})
|
})
|
||||||
fmt.Println("Count: 2", total, err)
|
fmt.Printf("Count: 2 %+v, %v\n", unread, err)
|
||||||
|
|
||||||
err = c.Subscribe("test", []string{
|
err = c.Subscribe("test", []string{
|
||||||
"eX1gEc7WokSHh-zJ3WR5Hn:APA91bFZDuzkjjFFL6TNpMg0ot93a0wsypWi4aCdm7M2x6AihgjS_QWsbKSFCT4hNhv_d8wKGy-DG6_3e8OlwPiWiJB4R33xLbbUekgxKcfCiiFooIC1E1OE3XWkvUtn4egn8aLG5jqv",
|
"eX1gEc7WokSHh-zJ3WR5Hn:APA91bFZDuzkjjFFL6TNpMg0ot93a0wsypWi4aCdm7M2x6AihgjS_QWsbKSFCT4hNhv_d8wKGy-DG6_3e8OlwPiWiJB4R33xLbbUekgxKcfCiiFooIC1E1OE3XWkvUtn4egn8aLG5jqv",
|
||||||
|
|
61
model.go
61
model.go
|
@ -10,14 +10,16 @@ type Config struct {
|
||||||
|
|
||||||
// PushRequest ...
|
// PushRequest ...
|
||||||
type PushRequest struct {
|
type PushRequest struct {
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
Body string `json:"body"`
|
Body string `json:"body"`
|
||||||
Data string `json:"data"`
|
Data string `json:"data"`
|
||||||
Users []string `json:"users"`
|
Users []string `json:"users"`
|
||||||
Label string `json:"label,omitempty"`
|
Label string `json:"label,omitempty"`
|
||||||
Category string `json:"category,omitempty"`
|
Category string `json:"category,omitempty"`
|
||||||
Sound *Sound `json:"sound,omitempty"`
|
Sound *Sound `json:"sound,omitempty"`
|
||||||
Link string `json:"link"` // for webpush
|
Link string `json:"link"` // for webpush
|
||||||
|
Order int `json:"order"` // for sort
|
||||||
|
DisplayUntil int64 `json:"displayUntil"` // time.Unix
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sound ...
|
// Sound ...
|
||||||
|
@ -32,34 +34,25 @@ type PushResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type pushRequest struct {
|
type pushRequest struct {
|
||||||
Version string `json:"version"`
|
PushRequest
|
||||||
APIKey string `json:"apiKey"`
|
Version string `json:"version"`
|
||||||
Title string `json:"title"`
|
APIKey string `json:"apiKey"`
|
||||||
Body string `json:"body"`
|
SendBy string `json:"sendBy"`
|
||||||
Data string `json:"data"`
|
|
||||||
SendBy string `json:"sendBy"`
|
|
||||||
Users []string `json:"users"`
|
|
||||||
Topic string `json:"topic"`
|
|
||||||
Label string `json:"label"`
|
|
||||||
Category string `json:"category"`
|
|
||||||
Sound *Sound `json:"sound,omitempty"`
|
|
||||||
Link string `json:"link"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query ...
|
// Query ...
|
||||||
type Query struct {
|
type Query struct {
|
||||||
User string `json:"user"`
|
User string `json:"user"`
|
||||||
Category string `json:"category,omitempty"`
|
Category string `json:"category,omitempty"`
|
||||||
|
Status string `json:"status"`
|
||||||
Page int64 `json:"page,omitempty"`
|
Page int64 `json:"page,omitempty"`
|
||||||
Limit int64 `json:"limit,omitempty"`
|
Limit int64 `json:"limit,omitempty"`
|
||||||
|
Sort string `json:"sort,omitempty"` // SortDefault, SortOrderDesc, SortOrderAsc
|
||||||
}
|
}
|
||||||
|
|
||||||
type query struct {
|
type query struct {
|
||||||
APIKey string `json:"apiKey"`
|
APIKey string `json:"apiKey"`
|
||||||
User string `json:"user"`
|
Query
|
||||||
Category string `json:"category,omitempty"`
|
|
||||||
Page int64 `json:"page,omitempty"`
|
|
||||||
Limit int64 `json:"limit,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notification ...
|
// Notification ...
|
||||||
|
@ -99,13 +92,17 @@ type CountUnread struct {
|
||||||
|
|
||||||
// CountUnreadResponse ...
|
// CountUnreadResponse ...
|
||||||
type CountUnreadResponse struct {
|
type CountUnreadResponse struct {
|
||||||
Total int64 `json:"total"`
|
List []CategoryCount `json:"list"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CategoryCount struct {
|
||||||
|
Category string `json:"category"`
|
||||||
|
TotalUnread int64 `json:"totalUnread"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type countUnread struct {
|
type countUnread struct {
|
||||||
APIKey string `json:"apiKey"`
|
CountUnread
|
||||||
User string `json:"user"`
|
APIKey string `json:"apiKey"`
|
||||||
Category string `json:"category"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommonError ...
|
// CommonError ...
|
||||||
|
@ -123,3 +120,9 @@ type subscribe struct {
|
||||||
Subscribe
|
Subscribe
|
||||||
APIKey string `json:"apiKey"`
|
APIKey string `json:"apiKey"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadAll ...
|
||||||
|
type ReadAll struct {
|
||||||
|
User string `json:"user"`
|
||||||
|
Category string `json:"category,omitempty"`
|
||||||
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// version specify current version of client
|
// version specify current version of client
|
||||||
const version = "1.0.2"
|
const version = "1.0.3"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
SendByTopic = "topic"
|
SendByTopic = "topic"
|
||||||
|
@ -20,6 +20,7 @@ const (
|
||||||
SubjectPushNotification = "push_notification"
|
SubjectPushNotification = "push_notification"
|
||||||
SubjectGetNotification = "get_notification"
|
SubjectGetNotification = "get_notification"
|
||||||
SubjectReadNotification = "read_notification"
|
SubjectReadNotification = "read_notification"
|
||||||
|
SubjectReadAllNotification = "read_all_notification"
|
||||||
SubjectCountUnreadNotification = "count_unread_notification"
|
SubjectCountUnreadNotification = "count_unread_notification"
|
||||||
SubjectSubscribeTopic = "subscribe_topic"
|
SubjectSubscribeTopic = "subscribe_topic"
|
||||||
SubjectUnsubscribeTopic = "unsubscribe_topic"
|
SubjectUnsubscribeTopic = "unsubscribe_topic"
|
||||||
|
@ -56,17 +57,10 @@ func NewClient(cfg Config) (*Client, error) {
|
||||||
// PushToUsers push notification to list user id
|
// PushToUsers push notification to list user id
|
||||||
func (c *Client) PushToUsers(payload PushRequest) (requestID string, err error) {
|
func (c *Client) PushToUsers(payload PushRequest) (requestID string, err error) {
|
||||||
p := pushRequest{
|
p := pushRequest{
|
||||||
Version: version,
|
Version: version,
|
||||||
APIKey: c.Config.APIKey,
|
APIKey: c.Config.APIKey,
|
||||||
Title: payload.Title,
|
SendBy: SendByUsers,
|
||||||
Body: payload.Body,
|
PushRequest: payload,
|
||||||
Data: payload.Data,
|
|
||||||
SendBy: SendByUsers,
|
|
||||||
Users: payload.Users,
|
|
||||||
Label: payload.Label,
|
|
||||||
Category: payload.Category,
|
|
||||||
Sound: payload.Sound,
|
|
||||||
Link: payload.Link,
|
|
||||||
}
|
}
|
||||||
msg, err := c.natsServer.Request(SubjectPushNotification, toBytes(p))
|
msg, err := c.natsServer.Request(SubjectPushNotification, toBytes(p))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -88,11 +82,8 @@ func (c *Client) PushToUsers(payload PushRequest) (requestID string, err error)
|
||||||
// Query get list notification by user id
|
// Query get list notification by user id
|
||||||
func (c *Client) Query(q Query) (ListNotificationResponse, error) {
|
func (c *Client) Query(q Query) (ListNotificationResponse, error) {
|
||||||
p := query{
|
p := query{
|
||||||
APIKey: c.Config.APIKey,
|
APIKey: c.Config.APIKey,
|
||||||
User: q.User,
|
Query: q,
|
||||||
Category: q.Category,
|
|
||||||
Page: q.Page,
|
|
||||||
Limit: q.Limit,
|
|
||||||
}
|
}
|
||||||
msg, err := c.natsServer.Request(SubjectGetNotification, toBytes(p))
|
msg, err := c.natsServer.Request(SubjectGetNotification, toBytes(p))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -112,27 +103,26 @@ func (c *Client) Query(q Query) (ListNotificationResponse, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// CountUnread count total unread notification
|
// CountUnread count total unread notification
|
||||||
func (c *Client) CountUnread(q CountUnread) (int64, error) {
|
func (c *Client) CountUnread(q CountUnread) ([]CategoryCount, error) {
|
||||||
p := countUnread{
|
p := countUnread{
|
||||||
APIKey: c.Config.APIKey,
|
APIKey: c.Config.APIKey,
|
||||||
User: q.User,
|
CountUnread: q,
|
||||||
Category: q.Category,
|
|
||||||
}
|
}
|
||||||
msg, err := c.natsServer.Request(SubjectCountUnreadNotification, toBytes(p))
|
msg, err := c.natsServer.Request(SubjectCountUnreadNotification, toBytes(p))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var res struct {
|
var res struct {
|
||||||
Data CountUnreadResponse `json:"data"`
|
Data CountUnreadResponse `json:"data"`
|
||||||
Error string `json:"error"`
|
Error string `json:"error"`
|
||||||
}
|
}
|
||||||
if err := json.Unmarshal(msg.Data, &res); err != nil {
|
if err = json.Unmarshal(msg.Data, &res); err != nil {
|
||||||
return 0, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if res.Error != "" {
|
if res.Error != "" {
|
||||||
return 0, errors.New(res.Error)
|
return nil, errors.New(res.Error)
|
||||||
}
|
}
|
||||||
return res.Data.Total, nil
|
return res.Data.List, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read mark notification as read
|
// Read mark notification as read
|
||||||
|
@ -155,6 +145,29 @@ func (c *Client) Read(notificationID string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadAll mark notification as read
|
||||||
|
func (c *Client) ReadAll(r ReadAll) error {
|
||||||
|
p := struct {
|
||||||
|
ReadAll
|
||||||
|
APIKey string `json:"apiKey"`
|
||||||
|
}{
|
||||||
|
ReadAll: r,
|
||||||
|
APIKey: c.Config.APIKey,
|
||||||
|
}
|
||||||
|
msg, err := c.natsServer.Request(SubjectReadAllNotification, toBytes(p))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var res CommonError
|
||||||
|
if err := json.Unmarshal(msg.Data, &res); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if res.Error != "" {
|
||||||
|
err = errors.New(res.Error)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Subscribe tokens to topic
|
// Subscribe tokens to topic
|
||||||
func (c *Client) Subscribe(topic string, tokens []string) error {
|
func (c *Client) Subscribe(topic string, tokens []string) error {
|
||||||
p := subscribe{
|
p := subscribe{
|
||||||
|
|
Loading…
Reference in New Issue