quzuu-api-dev-v2 / controllers /event_controller.go
lifedebugger's picture
Deploy files from GitHub repository
4542d62
package controllers
import (
"strconv"
"abdanhafidz.com/go-boilerplate/models/dto"
entity "abdanhafidz.com/go-boilerplate/models/entity"
http_error "abdanhafidz.com/go-boilerplate/models/error"
"abdanhafidz.com/go-boilerplate/services"
"abdanhafidz.com/go-boilerplate/utils"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
type EventController interface {
List(ctx *gin.Context)
DetailBySlug(ctx *gin.Context)
Join(ctx *gin.Context)
CreateEvent(ctx *gin.Context)
UpdateEvent(ctx *gin.Context)
DeleteEvent(ctx *gin.Context)
}
type eventController struct {
eventService services.EventService
}
func NewEventController(eventService services.EventService) EventController {
return &eventController{eventService: eventService}
}
func (c *eventController) List(ctx *gin.Context) {
limit, _ := strconv.Atoi(ctx.DefaultQuery("limit", "10"))
page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
search := ctx.DefaultQuery("search", "")
sortBy := ctx.DefaultQuery("sortBy", "")
order := ctx.DefaultQuery("order", "")
var registerStatus *int
if val := ctx.Query("registerStatus"); val != "" {
if i, err := strconv.Atoi(val); err == nil {
registerStatus = &i
}
}
var status *string
if val := ctx.Query("status"); val != "" {
if val == entity.EventStatusUpcoming || val == entity.EventStatusOngoing || val == entity.EventStatusEnded {
status = &val
}
}
if limit < 1 {
limit = 10
} else if limit > 50 {
limit = 50
}
if page < 1 {
page = 1
}
offset := (page - 1) * limit
p := entity.Pagination{Limit: limit, Offset: offset, Search: search, SortBy: sortBy, Order: order, RegisterStatus: registerStatus, Status: status}
accountId := ParseAccountId(ctx)
list, total, err := c.eventService.List(ctx.Request.Context(), accountId, p)
var totalPages int
if total == 0 {
totalPages = 1
} else {
totalPages = int((total + int64(limit) - 1) / int64(limit))
}
if page > totalPages {
page = totalPages
offset = (page - 1) * limit
p.Offset = offset
list, total, err = c.eventService.List(ctx.Request.Context(), accountId, p)
}
meta := gin.H{
"totalItems": total,
"totalPages": totalPages,
"currentPage": page,
}
ResponseJSON(ctx, meta, list, err)
}
func (c *eventController) DetailBySlug(ctx *gin.Context) {
slug := ctx.Param("event_slug")
accountId := ParseAccountId(ctx)
res, err := c.eventService.DetailBySlug(ctx.Request.Context(), slug, accountId)
ResponseJSON(ctx, gin.H{"event_slug": slug, "id_account": accountId}, res, err)
}
func (c *eventController) Join(ctx *gin.Context) {
req := RequestJSON[dto.JoinEventRequest](ctx)
if err := utils.ValidateCode(req.EventCode); err != nil {
ResponseJSON[any, any](ctx, req, nil, err)
return
}
accountId := ParseAccountId(ctx)
res, err := c.eventService.JoinByCode(ctx.Request.Context(), accountId, req.EventCode)
ResponseJSON[any, any](ctx, req, res, err)
}
func (c *eventController) CreateEvent(ctx *gin.Context) {
req := RequestJSON[dto.CreateEventRequest](ctx)
res, err := c.eventService.CreateEvent(ctx.Request.Context(), req)
ResponseJSON(ctx, req, res, err)
}
func (c *eventController) UpdateEvent(ctx *gin.Context) {
id, err := uuid.Parse(ctx.Param("id"))
if err != nil {
ResponseJSON[any, any](ctx, nil, nil, http_error.BAD_REQUEST_ERROR)
return
}
req := RequestJSON[dto.UpdateEventRequest](ctx)
res, err := c.eventService.UpdateEvent(ctx.Request.Context(), id, req)
ResponseJSON(ctx, req, res, err)
}
func (c *eventController) DeleteEvent(ctx *gin.Context) {
id, err := uuid.Parse(ctx.Param("id"))
if err != nil {
ResponseJSON[any, any](ctx, nil, nil, http_error.BAD_REQUEST_ERROR)
return
}
err = c.eventService.DeleteEvent(ctx.Request.Context(), id)
ResponseJSON(ctx, gin.H{"id": id}, gin.H{"deleted": true}, err)
}