You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

124 lines
3.0 KiB

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,
)
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))
}