Spaces:
Sleeping
Sleeping
File size: 4,326 Bytes
9591a68 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | package controllers
import (
"net/http"
"strconv"
"dinacom-11.0-backend/models/dto"
"dinacom-11.0-backend/services"
"dinacom-11.0-backend/utils"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
type NotificationController interface {
GetNotifications(ctx *gin.Context)
MarkAsRead(ctx *gin.Context)
MarkAllAsRead(ctx *gin.Context)
GetUnreadCount(ctx *gin.Context)
}
type notificationController struct {
notifService services.NotificationService
}
func NewNotificationController(notifService services.NotificationService) NotificationController {
return ¬ificationController{notifService: notifService}
}
// @Summary Get User Notifications
// @Description Get paginated notifications for authenticated user
// @Tags Notification
// @Produce json
// @Security BearerAuth
// @Param page query int false "Page number (default: 1)"
// @Param limit query int false "Items per page (default: 20)"
// @Success 200 {object} dto.NotificationListResponse
// @Failure 401 {object} map[string]string
// @Router /api/user/notifications [get]
func (c *notificationController) GetNotifications(ctx *gin.Context) {
userIDVal, exists := ctx.Get("user_id")
if !exists {
utils.SendErrorResponse(ctx, http.StatusUnauthorized, "Unauthorized")
return
}
userID := userIDVal.(uuid.UUID)
page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
limit, _ := strconv.Atoi(ctx.DefaultQuery("limit", "20"))
if page < 1 {
page = 1
}
if limit < 1 || limit > 50 {
limit = 20
}
response, err := c.notifService.GetUserNotifications(userID, page, limit)
if err != nil {
utils.SendErrorResponse(ctx, http.StatusInternalServerError, err.Error())
return
}
utils.SendSuccessResponse(ctx, "Notifications retrieved", response)
}
// @Summary Mark Notification as Read
// @Description Mark a specific notification as read
// @Tags Notification
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param request body dto.MarkNotificationReadRequest true "Notification ID"
// @Success 200 {object} map[string]string
// @Failure 400 {object} map[string]string
// @Router /api/user/notifications/read [patch]
func (c *notificationController) MarkAsRead(ctx *gin.Context) {
userIDVal, exists := ctx.Get("user_id")
if !exists {
utils.SendErrorResponse(ctx, http.StatusUnauthorized, "Unauthorized")
return
}
userID := userIDVal.(uuid.UUID)
var req dto.MarkNotificationReadRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
utils.SendErrorResponse(ctx, http.StatusBadRequest, err.Error())
return
}
if err := c.notifService.MarkAsRead(userID, req.NotificationID); err != nil {
utils.SendErrorResponse(ctx, http.StatusBadRequest, err.Error())
return
}
utils.SendSuccessResponse(ctx, "Notification marked as read", nil)
}
// @Summary Mark All Notifications as Read
// @Description Mark all notifications as read for authenticated user
// @Tags Notification
// @Produce json
// @Security BearerAuth
// @Success 200 {object} map[string]string
// @Failure 401 {object} map[string]string
// @Router /api/user/notifications/read-all [patch]
func (c *notificationController) MarkAllAsRead(ctx *gin.Context) {
userIDVal, exists := ctx.Get("user_id")
if !exists {
utils.SendErrorResponse(ctx, http.StatusUnauthorized, "Unauthorized")
return
}
userID := userIDVal.(uuid.UUID)
if err := c.notifService.MarkAllAsRead(userID); err != nil {
utils.SendErrorResponse(ctx, http.StatusInternalServerError, err.Error())
return
}
utils.SendSuccessResponse(ctx, "All notifications marked as read", nil)
}
// @Summary Get Unread Count
// @Description Get count of unread notifications
// @Tags Notification
// @Produce json
// @Security BearerAuth
// @Success 200 {object} map[string]int64
// @Failure 401 {object} map[string]string
// @Router /api/user/notifications/unread-count [get]
func (c *notificationController) GetUnreadCount(ctx *gin.Context) {
userIDVal, exists := ctx.Get("user_id")
if !exists {
utils.SendErrorResponse(ctx, http.StatusUnauthorized, "Unauthorized")
return
}
userID := userIDVal.(uuid.UUID)
count, err := c.notifService.GetUnreadCount(userID)
if err != nil {
utils.SendErrorResponse(ctx, http.StatusInternalServerError, err.Error())
return
}
utils.SendSuccessResponse(ctx, "Unread count retrieved", map[string]int64{"unread_count": count})
}
|