/
Arsinenko
/
CompClubAPI_Go
Обзор
Документация
Войти
/
Arsinenko
/
CompClubAPI_Go
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
internal/handlers/booking_handler.go
178 строк
6 KB
Arsinenko
Update
08 ноя 2025, 13:12
08 ноя 2025, 13:12
2f36b0f
Код
Авторство
О чём код?
package handlers import ( "CompClubAPI/internal/middleware" "CompClubAPI/internal/services" "net/http" "strconv" "github.com/gin-gonic/gin" ) // StartBookingHandler godoc // @Summary Start a new booking // @Description Creates a new booking for a user at a computer station // @Tags bookings // @Accept json // @Produce json // @Param request body services.StartBookingRequest true "Booking start request" // @Success 200 {object} map[string]interface{} "Booking created successfully" // @Failure 400 {object} map[string]string "Invalid request body" // @Failure 500 {object} map[string]string "Internal server error" // @Router /bookings/ [post] func StartBookingHandler(s services.BookingService) gin.HandlerFunc { return func(c *gin.Context) { var request services.StartBookingRequest if err := c.ShouldBindJSON(&request); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } booking, err := s.StartBooking(request) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"booking": booking}) } } // StopBookingHandler godoc // @Summary Stop an active booking // @Description Stops a booking by its ID // @Tags bookings // @Produce json // @Param id path int true "Booking ID" // @Success 204 {object} nil "Booking stopped successfully" // @Failure 400 {object} map[string]string "Invalid or missing ID" // @Failure 404 {object} map[string]string "Booking not found" // @Failure 500 {object} map[string]string "Internal server error" // @Router /bookings/{id} [put] func StopBookingHandler(s services.BookingService) gin.HandlerFunc { return func(c *gin.Context) { idStr := c.Param("id") if idStr == "" { c.JSON(http.StatusBadRequest, gin.H{"error": "id is required"}) return } id, err := strconv.Atoi(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid id"}) return } err = s.StopBooking(int32(id)) if err != nil { if err.Error() == "booking not found" { c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) return } c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.Status(http.StatusNoContent) } } // GetBookingsHandler godoc // @Summary Get all bookings // @Description Retrieves a list of all bookings // @Tags bookings // @Produce json // @Success 200 {object} map[string]interface{} "List of bookings" // @Failure 404 {object} map[string]string "No bookings found" // @Failure 500 {object} map[string]string "Internal server error" // @Router /bookings/ [get] func GetBookingsHandler(s services.BookingService) gin.HandlerFunc { return func(c *gin.Context) { bookings, err := s.GetBookings() if err != nil { if err.Error() == "booking not found" { c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) return } c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"bookings": bookings}) } } // GetUserBookingsHandler godoc // @Summary Get bookings by user // @Description Retrieves all bookings associated with a specific user // @Tags bookings // @Produce json // @Param user path string true "Username" // @Success 200 {object} map[string]interface{} "List of user bookings" // @Failure 400 {object} map[string]string "User parameter missing" // @Failure 404 {object} map[string]string "Bookings not found for user" // @Failure 500 {object} map[string]string "Internal server error" // @Router /bookings/{user} [get] func GetUserBookingsHandler(s services.BookingService) gin.HandlerFunc { return func(c *gin.Context) { user := c.Param("user") if user == "" { c.JSON(http.StatusBadRequest, gin.H{"error": "user is required"}) return } bookings, err := s.GetUserBookings(user) if err != nil { if err.Error() == "bookings not found" { c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) return } c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"bookings": bookings}) } } // DeleteBookingHandler godoc // @Summary Delete a booking // @Description Deletes a booking by its ID // @Tags bookings // @Produce json // @Param id path int true "Booking ID" // @Success 204 {object} nil "Booking deleted successfully" // @Failure 400 {object} map[string]string "Invalid or missing ID / Booking not found" // @Failure 500 {object} map[string]string "Internal server error" // @Router /bookings/{id} [delete] func DeleteBookingHandler(s services.BookingService) gin.HandlerFunc { return func(c *gin.Context) { idStr := c.Param("id") if idStr == "" { c.JSON(http.StatusBadRequest, gin.H{"error": "id is required"}) return } id, err := strconv.Atoi(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid id"}) return } err = s.DeleteBooking(int32(id)) if err != nil { if err.Error() == "booking not found" { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.Status(http.StatusNoContent) } } // InitBookingRouters initializes booking-related routes // Note: Swag annotations are placed directly on handler functions above, // so no extra annotations are needed here. func InitBookingRouters(r *gin.RouterGroup, s services.BookingService) { jwtMiddleware := middleware.NewJwtMiddleware() r.Use(middleware.AdminMiddleware(jwtMiddleware)) r.POST("/", StartBookingHandler(s)) r.PUT("/:id", StopBookingHandler(s)) // Fixed: was PUT "/" — should be PUT "/:id" r.GET("/", GetBookingsHandler(s)) r.GET("/:user", GetUserBookingsHandler(s)) r.DELETE("/:id", DeleteBookingHandler(s)) }