package ktmtrainbot import ( "errors" "net/http" "git.samuelpua.com/telboon/ktm-train-bot/backend/internal/common" "git.samuelpua.com/telboon/ktm-train-bot/backend/internal/user" "github.com/go-chi/chi" "github.com/go-chi/render" "github.com/go-playground/validator/v10" ) // Get All Bookings // @Summary Get All Booking // @Description Description // @Tags ktmtrainbot Booking // @Accept json // @Produce json // @Success 200 {object} []BookingResponse // @Failure 400 {object} common.ErrResponse // @Router /api/v1/ktmtrainbot/booking [get] func (env *Env) getBookingRoute(w http.ResponseWriter, r *http.Request) { ctx := r.Context() currUser, ok := ctx.Value(user.UserContextKey).(*user.User) if !ok { err := errors.New("user not logged in") render.Render(w, r, common.ErrInternalError(err)) return } _ = currUser booking, err := env.getAllBooking(currUser) if err != nil { render.Render(w, r, common.ErrInvalidRequest(err)) return } render.Render(w, r, env.NewBookingListResponse(booking)) } // Create New Booking // @Summary Create New Booking // @Description Description // @Tags ktmtrainbot Booking // @Accept json // @Produce json // @Param user body BookingCreateRequest true "Booking Create Request" // @Success 200 {object} BookingResponse // @Failure 400 {object} common.ErrResponse // @Router /api/v1/ktmtrainbot/booking [post] func (env *Env) createBookingRoute(w http.ResponseWriter, r *http.Request) { ctx := r.Context() currUser, ok := ctx.Value(user.UserContextKey).(*user.User) if !ok { err := errors.New("user not logged in") render.Render(w, r, common.ErrInternalError(err)) return } _ = currUser data := &BookingCreateRequest{} err := render.DecodeJSON(r.Body, data) if err != nil { render.Render(w, r, common.ErrInvalidRequest(err)) return } err = validator.New().Struct(data) if err != nil { render.Render(w, r, common.ErrValidationError(err)) return } booking, err := env.createBooking( currUser, data.TravelDate, data.TimeCode, data.Name, data.Gender, data.Passport, data.PassportExpiry, data.Contact, data.BackToSg, ) if err != nil { render.Render(w, r, common.ErrInvalidRequest(err)) return } render.Render(w, r, env.NewBookingResponse(booking)) } // Delete booking // @Summary Delete booking // @Description Description // @Tags ktmtrainbot Booking // @Accept json // @Produce json // @Param bookingID path string true "Booking ID" // @Success 200 {object} BookingResponse // @Failure 400 {object} common.ErrResponse // @Router /api/v1/ktmtrainbot/booking/{bookingID} [delete] func (env *Env) deleteBookingRoute(w http.ResponseWriter, r *http.Request) { ctx := r.Context() currUser, ok := ctx.Value(user.UserContextKey).(*user.User) if !ok { err := errors.New("user not logged in") render.Render(w, r, common.ErrInternalError(err)) return } _ = currUser bookingID := chi.URLParam(r, "bookingID") booking, err := env.deleteBooking(currUser, bookingID) if err != nil { render.Render(w, r, common.ErrInvalidRequest(err)) return } render.Render(w, r, env.NewBookingResponse(booking)) }