package handlers import ( "net/http" "github.com/breakpilot/consent-service/internal/middleware" "github.com/breakpilot/consent-service/internal/services" "github.com/gin-gonic/gin" "github.com/google/uuid" ) // DeadlineHandler handles deadline-related requests type DeadlineHandler struct { deadlineService *services.DeadlineService } // NewDeadlineHandler creates a new deadline handler func NewDeadlineHandler(deadlineService *services.DeadlineService) *DeadlineHandler { return &DeadlineHandler{ deadlineService: deadlineService, } } // GetPendingDeadlines returns all pending consent deadlines for the current user func (h *DeadlineHandler) GetPendingDeadlines(c *gin.Context) { userID, err := middleware.GetUserID(c) if err != nil || userID == uuid.Nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid user"}) return } deadlines, err := h.deadlineService.GetPendingDeadlines(c.Request.Context(), userID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch deadlines"}) return } c.JSON(http.StatusOK, gin.H{ "deadlines": deadlines, "count": len(deadlines), }) } // GetSuspensionStatus returns the current suspension status for a user func (h *DeadlineHandler) GetSuspensionStatus(c *gin.Context) { userID, err := middleware.GetUserID(c) if err != nil || userID == uuid.Nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid user"}) return } suspended, err := h.deadlineService.IsUserSuspended(c.Request.Context(), userID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to check suspension status"}) return } response := gin.H{ "suspended": suspended, } if suspended { suspension, err := h.deadlineService.GetAccountSuspension(c.Request.Context(), userID) if err == nil && suspension != nil { response["reason"] = suspension.Reason response["suspended_at"] = suspension.SuspendedAt response["details"] = suspension.Details } deadlines, err := h.deadlineService.GetPendingDeadlines(c.Request.Context(), userID) if err == nil { response["pending_deadlines"] = deadlines } } c.JSON(http.StatusOK, response) } // TriggerDeadlineProcessing manually triggers deadline processing (admin only) func (h *DeadlineHandler) TriggerDeadlineProcessing(c *gin.Context) { if !middleware.IsAdmin(c) { c.JSON(http.StatusForbidden, gin.H{"error": "Admin access required"}) return } if err := h.deadlineService.ProcessDailyDeadlines(c.Request.Context()); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to process deadlines"}) return } c.JSON(http.StatusOK, gin.H{"message": "Deadline processing completed"}) }