package event import ( "net/http" "strconv" "time" "github.com/gin-gonic/gin" "furtuna-be/internal/common/errors" "furtuna-be/internal/entity" "furtuna-be/internal/handlers/request" "furtuna-be/internal/handlers/response" "furtuna-be/internal/services" ) type Handler struct { service services.Event } func (h *Handler) Route(group *gin.RouterGroup, jwt gin.HandlerFunc) { route := group.Group("/event") route.POST("/", jwt, h.Create) route.GET("/list", jwt, h.GetAll) route.PUT("/:id", jwt, h.Update) route.GET("/:id", jwt, h.GetByID) route.DELETE("/:id", jwt, h.Delete) } func NewHandler(service services.Event) *Handler { return &Handler{ service: service, } } func (h *Handler) Create(c *gin.Context) { var req request.Event if err := c.ShouldBindJSON(&req); err != nil { response.ErrorWrapper(c, errors.ErrorBadRequest) return } if err := req.Validate(); err != nil { response.ErrorWrapper(c, errors.ErrorInvalidRequest) return } res, err := h.service.Create(c.Request.Context(), req.ToEntity()) if err != nil { response.ErrorWrapper(c, err) return } c.JSON(http.StatusOK, response.BaseResponse{ Success: true, Status: http.StatusOK, Data: h.toEventResponse(res), }) } func (h *Handler) Update(c *gin.Context) { id := c.Param("id") eventID, err := strconv.ParseInt(id, 10, 64) if err != nil { response.ErrorWrapper(c, errors.ErrorBadRequest) return } var req request.Event if err := c.ShouldBindJSON(&req); err != nil { response.ErrorWrapper(c, errors.ErrorBadRequest) return } if err := req.Validate(); err != nil { response.ErrorWrapper(c, errors.ErrorBadRequest) return } updatedEvent, err := h.service.Update(c.Request.Context(), eventID, req.ToEntity()) if err != nil { response.ErrorWrapper(c, err) return } c.JSON(http.StatusOK, response.BaseResponse{ Success: true, Status: http.StatusOK, Data: h.toEventResponse(updatedEvent), }) } func (h *Handler) GetAll(c *gin.Context) { var req request.EventParam if err := c.ShouldBindQuery(&req); err != nil { response.ErrorWrapper(c, errors.ErrorBadRequest) return } events, total, err := h.service.GetAll(c.Request.Context(), req.ToEntity()) if err != nil { response.ErrorWrapper(c, err) return } c.JSON(http.StatusOK, response.BaseResponse{ Success: true, Status: http.StatusOK, Data: h.toEventResponseList(events, int64(total), req), }) } func (h *Handler) Delete(c *gin.Context) { id := c.Param("id") // Parse the ID into a uint eventID, err := strconv.ParseInt(id, 10, 64) if err != nil { response.ErrorWrapper(c, errors.ErrorBadRequest) return } err = h.service.Delete(c.Request.Context(), eventID) if err != nil { c.JSON(http.StatusInternalServerError, response.BaseResponse{ Success: false, Status: http.StatusInternalServerError, Message: err.Error(), Data: nil, }) return } c.JSON(http.StatusOK, response.BaseResponse{ Success: true, Status: http.StatusOK, Data: nil, }) } func (h *Handler) GetByID(c *gin.Context) { id := c.Param("id") // Parse the ID into a uint eventID, err := strconv.ParseInt(id, 10, 64) if err != nil { response.ErrorWrapper(c, errors.ErrorBadRequest) return } res, err := h.service.GetByID(c.Request.Context(), eventID) if err != nil { c.JSON(http.StatusInternalServerError, response.BaseResponse{ Success: false, Status: http.StatusInternalServerError, Message: err.Error(), Data: nil, }) return } c.JSON(http.StatusOK, response.BaseResponse{ Success: true, Status: http.StatusOK, Data: h.toEventResponse(res), }) } func (h *Handler) toEventResponse(resp *entity.Event) response.Event { return response.Event{ ID: resp.ID, Name: resp.Name, Description: resp.Description, StartDate: resp.StartDate.Format("2006-01-02"), EndDate: resp.EndDate.Format("2006-01-02"), StartTime: resp.StartDate.Format("15:04:05"), EndTime: resp.EndDate.Format("15:04:05"), Location: resp.Location, Level: resp.Level, Included: resp.Included, Price: resp.Price, Paid: resp.Paid, LocationID: resp.LocationID, CreatedAt: resp.CreatedAt.Format(time.RFC3339), UpdatedAt: resp.CreatedAt.Format(time.RFC3339), Status: string(resp.Status), } } func (h *Handler) toEventResponseList(resp []*entity.Event, total int64, req request.EventParam) response.EventList { var events []response.Event for _, evt := range resp { events = append(events, h.toEventResponse(evt)) } return response.EventList{ Events: events, Total: total, Limit: req.Limit, Offset: req.Offset, } }