mirror of
https://github.com/warmbly/warmbly.git
synced 2026-08-19 08:01:16 +00:00
70 lines
1.9 KiB
Go
70 lines
1.9 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
"regexp"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"github.com/warmbly/warmbly/internal/errx"
|
|
"github.com/warmbly/warmbly/internal/models"
|
|
)
|
|
|
|
// APNs tokens are hex; allow generous length for future formats.
|
|
var deviceTokenPattern = regexp.MustCompile(`^[0-9a-fA-F]{16,512}$`)
|
|
|
|
// RegisterDeviceToken stores an APNs device token for the caller. Upserts, so
|
|
// retries and re-registrations on app launch are naturally safe.
|
|
func (h *Handler) RegisterDeviceToken(c *gin.Context) {
|
|
uid, ok := notifActor(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
var req models.RegisterDeviceTokenRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
errx.JSON(c, errx.New(errx.BadRequest, "invalid payload"))
|
|
return
|
|
}
|
|
if !deviceTokenPattern.MatchString(req.Token) {
|
|
errx.JSON(c, errx.New(errx.BadRequest, "invalid device token"))
|
|
return
|
|
}
|
|
if req.Platform == "" {
|
|
req.Platform = "ios"
|
|
}
|
|
if req.Platform != "ios" {
|
|
errx.JSON(c, errx.New(errx.BadRequest, "unsupported platform"))
|
|
return
|
|
}
|
|
if req.Environment == "" {
|
|
req.Environment = "production"
|
|
}
|
|
if req.Environment != "production" && req.Environment != "development" {
|
|
errx.JSON(c, errx.New(errx.BadRequest, "invalid environment"))
|
|
return
|
|
}
|
|
if err := h.NotificationService.RegisterDevice(c.Request.Context(), uid, req.Platform, req.Token, req.Environment); err != nil {
|
|
errx.JSON(c, errx.InternalError())
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"ok": true})
|
|
}
|
|
|
|
// DeleteDeviceToken removes one of the caller's device tokens (sign-out).
|
|
func (h *Handler) DeleteDeviceToken(c *gin.Context) {
|
|
uid, ok := notifActor(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
token := c.Param("token")
|
|
if !deviceTokenPattern.MatchString(token) {
|
|
errx.JSON(c, errx.New(errx.BadRequest, "invalid device token"))
|
|
return
|
|
}
|
|
if err := h.NotificationService.UnregisterDevice(c.Request.Context(), uid, token); err != nil {
|
|
errx.JSON(c, errx.InternalError())
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"ok": true})
|
|
}
|