Spaces:
Sleeping
Sleeping
| 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}) | |
| } | |