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