databag/net/repeater/internal/api_notify.go
2024-09-16 04:31:02 +00:00

62 lines
1.6 KiB
Go

package repeater
import (
"encoding/json"
"log"
"net/http"
"os"
"runtime"
"strings"
"fmt"
"firebase.google.com/go/v4/messaging"
)
func ParseRequest(r *http.Request, w http.ResponseWriter, obj interface{}) error {
r.Body = http.MaxBytesReader(w, r.Body, 1024)
dec := json.NewDecoder(r.Body)
return dec.Decode(&obj)
}
func WriteResponse(w http.ResponseWriter, v interface{}) {
body, err := json.Marshal(v)
if err != nil {
_, file, line, _ := runtime.Caller(1)
p, _ := os.Getwd()
log.Printf("%s:%d %s", strings.TrimPrefix(file, p), line, err.Error())
w.WriteHeader(http.StatusInternalServerError)
} else {
w.Header().Set("Content-Type", "application/json")
w.Write(body)
}
}
//Notify proxies push notification to device
func Notify(w http.ResponseWriter, r *http.Request) {
var msg PushMessage
if err := ParseRequest(r, w, &msg); err != nil {
ErrResponse(w, http.StatusBadRequest, err)
return
}
// See documentation on defining a message payload.
notification := &messaging.Notification{ Title: msg.Title, Body: msg.Body }
message := &messaging.Message{
Notification : notification,
Token: msg.Token,
}
// Send a message to the device corresponding to the provided
// registration token.
response, err := FCMClient.Send(FCMContext, message)
if err != nil {
ErrResponse(w, http.StatusBadRequest, err)
return
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)
res := &PushResponse{ Message: response }
WriteResponse(w, res);
}