mirror of
https://github.com/pushbits/server.git
synced 2025-04-30 18:57:17 +02:00
74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
package api
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/pushbits/server/internal/authentication"
|
|
"github.com/pushbits/server/internal/model"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// The NotificationDatabase interface for encapsulating database access.
|
|
type NotificationDatabase interface {
|
|
}
|
|
|
|
// The NotificationDispatcher interface for relaying notifications.
|
|
type NotificationDispatcher interface {
|
|
SendNotification(a *model.Application, n *model.Notification) (id string, err error)
|
|
DeleteNotification(a *model.Application, n *model.DeleteNotification) error
|
|
}
|
|
|
|
// NotificationHandler holds information for processing requests about notifications.
|
|
type NotificationHandler struct {
|
|
DB NotificationDatabase
|
|
DP NotificationDispatcher
|
|
}
|
|
|
|
// CreateNotification is used to create a new notification for a user.
|
|
func (h *NotificationHandler) CreateNotification(ctx *gin.Context) {
|
|
var notification model.Notification
|
|
|
|
if err := ctx.Bind(¬ification); err != nil {
|
|
return
|
|
}
|
|
|
|
application := authentication.GetApplication(ctx)
|
|
log.Printf("Sending notification for application %s.", application.Name)
|
|
|
|
notification.ApplicationID = application.ID
|
|
if strings.TrimSpace(notification.Title) == "" {
|
|
notification.Title = application.Name
|
|
}
|
|
notification.Date = time.Now()
|
|
|
|
messageID, err := h.DP.SendNotification(application, ¬ification)
|
|
|
|
if success := successOrAbort(ctx, http.StatusInternalServerError, err); !success {
|
|
return
|
|
}
|
|
|
|
notification.ID = messageID
|
|
|
|
ctx.JSON(http.StatusOK, ¬ification)
|
|
}
|
|
|
|
// DeleteNotification is used to delete (or mark as deleted) a notification for a user
|
|
func (h *NotificationHandler) DeleteNotification(ctx *gin.Context) {
|
|
application := authentication.GetApplication(ctx)
|
|
id, err := getMessageID(ctx)
|
|
|
|
if success := successOrAbort(ctx, http.StatusUnprocessableEntity, err); !success {
|
|
return
|
|
}
|
|
|
|
n := model.DeleteNotification{
|
|
ID: id,
|
|
Date: time.Now(),
|
|
}
|
|
|
|
h.DP.DeleteNotification(application, &n)
|
|
}
|