package handlers import ( "net/http" "github.com/breakpilot/school-service/internal/models" "github.com/gin-gonic/gin" ) // Class- and Room-constraint HTTP handlers. // ---------- Class Max Hours / Day ---------- func (h *Handler) CreateClassMaxHoursDay(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } var req models.CreateClassMaxHoursDayRequest if err := c.ShouldBindJSON(&req); err != nil { respondError(c, http.StatusBadRequest, "Invalid request: "+err.Error()) return } out, err := h.timetableService.CreateClassMaxHoursDay(c.Request.Context(), uid, &req) if err != nil { respondError(c, http.StatusInternalServerError, "Failed to create constraint: "+err.Error()) return } respondCreated(c, out) } func (h *Handler) ListClassMaxHoursDay(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } out, err := h.timetableService.ListClassMaxHoursDay(c.Request.Context(), uid) if err != nil { respondError(c, http.StatusInternalServerError, "Failed to list constraints: "+err.Error()) return } respondSuccess(c, out) } func (h *Handler) DeleteClassMaxHoursDay(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } if err := h.timetableService.DeleteClassMaxHoursDay(c.Request.Context(), c.Param("id"), uid); err != nil { respondError(c, http.StatusInternalServerError, "Failed to delete constraint: "+err.Error()) return } c.JSON(http.StatusOK, gin.H{"message": "Constraint deleted"}) } // ---------- Class No Gaps ---------- func (h *Handler) CreateClassNoGaps(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } var req models.CreateClassNoGapsRequest if err := c.ShouldBindJSON(&req); err != nil { respondError(c, http.StatusBadRequest, "Invalid request: "+err.Error()) return } out, err := h.timetableService.CreateClassNoGaps(c.Request.Context(), uid, &req) if err != nil { respondError(c, http.StatusInternalServerError, "Failed to create constraint: "+err.Error()) return } respondCreated(c, out) } func (h *Handler) ListClassNoGaps(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } out, err := h.timetableService.ListClassNoGaps(c.Request.Context(), uid) if err != nil { respondError(c, http.StatusInternalServerError, "Failed to list constraints: "+err.Error()) return } respondSuccess(c, out) } func (h *Handler) DeleteClassNoGaps(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } if err := h.timetableService.DeleteClassNoGaps(c.Request.Context(), c.Param("id"), uid); err != nil { respondError(c, http.StatusInternalServerError, "Failed to delete constraint: "+err.Error()) return } c.JSON(http.StatusOK, gin.H{"message": "Constraint deleted"}) } // ---------- Room Requires Type ---------- func (h *Handler) CreateRoomRequiresType(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } var req models.CreateRoomRequiresTypeRequest if err := c.ShouldBindJSON(&req); err != nil { respondError(c, http.StatusBadRequest, "Invalid request: "+err.Error()) return } out, err := h.timetableService.CreateRoomRequiresType(c.Request.Context(), uid, &req) if err != nil { respondError(c, http.StatusInternalServerError, "Failed to create constraint: "+err.Error()) return } respondCreated(c, out) } func (h *Handler) ListRoomRequiresTypes(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } out, err := h.timetableService.ListRoomRequiresTypes(c.Request.Context(), uid) if err != nil { respondError(c, http.StatusInternalServerError, "Failed to list constraints: "+err.Error()) return } respondSuccess(c, out) } func (h *Handler) DeleteRoomRequiresType(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } if err := h.timetableService.DeleteRoomRequiresType(c.Request.Context(), c.Param("id"), uid); err != nil { respondError(c, http.StatusInternalServerError, "Failed to delete constraint: "+err.Error()) return } c.JSON(http.StatusOK, gin.H{"message": "Constraint deleted"}) } // ---------- Room Unavailable ---------- func (h *Handler) CreateRoomUnavailable(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } var req models.CreateRoomUnavailableRequest if err := c.ShouldBindJSON(&req); err != nil { respondError(c, http.StatusBadRequest, "Invalid request: "+err.Error()) return } out, err := h.timetableService.CreateRoomUnavailable(c.Request.Context(), uid, &req) if err != nil { respondError(c, http.StatusInternalServerError, "Failed to create constraint: "+err.Error()) return } respondCreated(c, out) } func (h *Handler) ListRoomUnavailable(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } out, err := h.timetableService.ListRoomUnavailable(c.Request.Context(), uid) if err != nil { respondError(c, http.StatusInternalServerError, "Failed to list constraints: "+err.Error()) return } respondSuccess(c, out) } func (h *Handler) DeleteRoomUnavailable(c *gin.Context) { uid := getUserID(c) if uid == "" { respondError(c, http.StatusUnauthorized, "User not authenticated") return } if err := h.timetableService.DeleteRoomUnavailable(c.Request.Context(), c.Param("id"), uid); err != nil { respondError(c, http.StatusInternalServerError, "Failed to delete constraint: "+err.Error()) return } c.JSON(http.StatusOK, gin.H{"message": "Constraint deleted"}) }