230 lines
6.2 KiB
Go
230 lines
6.2 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"eslogad-be/internal/contract"
|
|
"eslogad-be/internal/service"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type NotificationHandler struct {
|
|
notificationService service.NotificationService
|
|
}
|
|
|
|
func NewNotificationHandler(notificationService service.NotificationService) *NotificationHandler {
|
|
return &NotificationHandler{
|
|
notificationService: notificationService,
|
|
}
|
|
}
|
|
|
|
// TriggerNotification handles single notification trigger
|
|
func (h *NotificationHandler) TriggerNotification(c *gin.Context) {
|
|
var req contract.TriggerNotificationRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
resp, err := h.notificationService.TriggerNotification(c.Request.Context(), &req)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
if !resp.Success {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"success": false,
|
|
"message": resp.Message,
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, resp)
|
|
}
|
|
|
|
// BulkTriggerNotification handles bulk notification trigger
|
|
func (h *NotificationHandler) BulkTriggerNotification(c *gin.Context) {
|
|
var req contract.BulkTriggerNotificationRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
resp, err := h.notificationService.BulkTriggerNotification(c.Request.Context(), &req)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, resp)
|
|
}
|
|
|
|
// GetSubscriber retrieves subscriber information
|
|
func (h *NotificationHandler) GetSubscriber(c *gin.Context) {
|
|
userIDStr := c.Param("userId")
|
|
userID, err := uuid.Parse(userIDStr)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid user ID"})
|
|
return
|
|
}
|
|
|
|
resp, err := h.notificationService.GetSubscriber(c.Request.Context(), userID)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, resp)
|
|
}
|
|
|
|
// UpdateSubscriberChannel updates subscriber channel credentials
|
|
func (h *NotificationHandler) UpdateSubscriberChannel(c *gin.Context) {
|
|
var req contract.UpdateSubscriberChannelRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
resp, err := h.notificationService.UpdateSubscriberChannel(c.Request.Context(), &req)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
if !resp.Success {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"success": false,
|
|
"message": resp.Message,
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, resp)
|
|
}
|
|
|
|
// TriggerNotificationForCurrentUser triggers notification for the authenticated user
|
|
func (h *NotificationHandler) TriggerNotificationForCurrentUser(c *gin.Context) {
|
|
// Get current user ID from context (set by auth middleware)
|
|
userIDInterface, exists := c.Get("user_id")
|
|
if !exists {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "user not authenticated"})
|
|
return
|
|
}
|
|
|
|
userID, ok := userIDInterface.(uuid.UUID)
|
|
if !ok {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "invalid user ID in context"})
|
|
return
|
|
}
|
|
|
|
var req struct {
|
|
TemplateID string `json:"template_id" validate:"required"`
|
|
TemplateData map[string]interface{} `json:"template_data,omitempty"`
|
|
Overrides *contract.NotificationOverrides `json:"overrides,omitempty"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
// Create trigger request with current user ID
|
|
triggerReq := &contract.TriggerNotificationRequest{
|
|
UserID: userID,
|
|
TemplateID: req.TemplateID,
|
|
TemplateData: req.TemplateData,
|
|
Overrides: req.Overrides,
|
|
}
|
|
|
|
resp, err := h.notificationService.TriggerNotification(c.Request.Context(), triggerReq)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
if !resp.Success {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"success": false,
|
|
"message": resp.Message,
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, resp)
|
|
}
|
|
|
|
// GetCurrentUserSubscriber retrieves subscriber information for the authenticated user
|
|
func (h *NotificationHandler) GetCurrentUserSubscriber(c *gin.Context) {
|
|
// Get current user ID from context (set by auth middleware)
|
|
userIDInterface, exists := c.Get("user_id")
|
|
if !exists {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "user not authenticated"})
|
|
return
|
|
}
|
|
|
|
userID, ok := userIDInterface.(uuid.UUID)
|
|
if !ok {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "invalid user ID in context"})
|
|
return
|
|
}
|
|
|
|
resp, err := h.notificationService.GetSubscriber(c.Request.Context(), userID)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, resp)
|
|
}
|
|
|
|
// UpdateCurrentUserSubscriberChannel updates channel credentials for the authenticated user
|
|
func (h *NotificationHandler) UpdateCurrentUserSubscriberChannel(c *gin.Context) {
|
|
// Get current user ID from context (set by auth middleware)
|
|
userIDInterface, exists := c.Get("user_id")
|
|
if !exists {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "user not authenticated"})
|
|
return
|
|
}
|
|
|
|
userID, ok := userIDInterface.(uuid.UUID)
|
|
if !ok {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "invalid user ID in context"})
|
|
return
|
|
}
|
|
|
|
var req struct {
|
|
Channel string `json:"channel" validate:"required,oneof=email sms push chat in_app"`
|
|
Credentials map[string]interface{} `json:"credentials" validate:"required"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
// Create update request with current user ID
|
|
updateReq := &contract.UpdateSubscriberChannelRequest{
|
|
UserID: userID,
|
|
Channel: req.Channel,
|
|
Credentials: req.Credentials,
|
|
}
|
|
|
|
resp, err := h.notificationService.UpdateSubscriberChannel(c.Request.Context(), updateReq)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
if !resp.Success {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"success": false,
|
|
"message": resp.Message,
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, resp)
|
|
} |