DanzApp-BE-Test / controllers /venue_controller.go
lifedebugger's picture
Deploy files from GitHub repository
693b86c
package controllers
import (
"fmt"
"strconv"
"abdanhafidz.com/go-boilerplate/models/dto"
"abdanhafidz.com/go-boilerplate/services"
"github.com/gin-gonic/gin"
)
type VenueController interface {
GetAllVenues(ctx *gin.Context)
GetOwnerVenues(ctx *gin.Context)
GetVenueDetail(ctx *gin.Context)
CreateVenue(ctx *gin.Context)
UpdateVenue(ctx *gin.Context)
DeleteVenue(ctx *gin.Context)
}
type venueController struct {
venueService services.VenueService
}
func NewVenueController(venueService services.VenueService) VenueController {
return &venueController{venueService: venueService}
}
// GetAllVenues godoc
// @Summary Get all venues
// @Description Returns a paginated list of all venues.
// @Tags Venue
// @Produce json
// @Param page query int false "Page number (default: 1)"
// @Param limit query int false "Items per page (default: 10, max: 50)"
// @Success 200 {object} dto.VenueListResponse
// @Failure 500 {object} dto.ErrorResponse
// @Router /api/v1/venues [get]
func (c *venueController) GetAllVenues(ctx *gin.Context) {
page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
limit, _ := strconv.Atoi(ctx.DefaultQuery("limit", "10"))
result, err := c.venueService.GetAllVenues(ctx.Request.Context(), page, limit)
if err != nil {
ResponseJSON(ctx, "", result, err)
return
}
ResponseJSON(ctx, "", result, nil)
}
// GetOwnerVenues godoc
// @Summary Get owner's venues
// @Description Returns a paginated list of venues owned by the current user.
// @Tags Venue
// @Produce json
// @Param page query int false "Page number (default: 1)"
// @Param limit query int false "Items per page (default: 10, max: 50)"
// @Success 200 {object} dto.VenueListResponse
// @Failure 401 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/venues/me [get]
func (c *venueController) GetOwnerVenues(ctx *gin.Context) {
userID := ParseUserId(ctx)
if userID == "" {
return
}
page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
limit, _ := strconv.Atoi(ctx.DefaultQuery("limit", "10"))
result, err := c.venueService.GetOwnerVenues(ctx.Request.Context(), userID, page, limit)
if err != nil {
ResponseJSON(ctx, "", result, err)
return
}
ResponseJSON(ctx, "", result, nil)
}
// GetVenueDetail godoc
// @Summary Get venue detail
// @Description Returns the full detail of a venue by its ID.
// @Tags Venue
// @Produce json
// @Param id path string true "Venue ID"
// @Success 200 {object} dto.VenueDetailResponse
// @Failure 404 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/venues/{id} [get]
func (c *venueController) GetVenueDetail(ctx *gin.Context) {
venueID := ctx.Param("id")
if venueID == "" {
ResponseJSON(ctx, "", dto.VenueDetailResponse{}, nil)
return
}
venue, err := c.venueService.GetVenueDetail(ctx.Request.Context(), venueID)
if err != nil {
ResponseJSON(ctx, "", venue, err)
return
}
ResponseJSON(ctx, "", venue, nil)
}
// CreateVenue godoc
// @Summary Create a new venue
// @Description Submit the Add Venue form with detailed location, facilities, specs, and photos URLs.
// @Tags Venue
// @Accept json
// @Produce json
// @Param request body dto.CreateVenueRequest true "Create Venue Form Data"
// @Success 200 {object} dto.VenueResponse
// @Failure 400 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/venues [post]
func (c *venueController) CreateVenue(ctx *gin.Context) {
userID := ParseUserId(ctx)
if userID == "" {
return // Handled by ParseUserId
}
req, err := RequestJSON[dto.CreateVenueRequest](ctx)
if err != nil {
return
}
res, err := c.venueService.CreateVenue(ctx.Request.Context(), userID, req)
if err != nil {
ResponseJSON(ctx, "", res, err)
return
}
ResponseJSON(ctx, "", res, nil)
}
// UpdateVenue godoc
// @Summary Update an existing venue
// @Description Update the details of an existing venue owned by the current user.
// @Tags Venue
// @Accept json
// @Produce json
// @Param id path string true "Venue ID"
// @Param request body dto.UpdateVenueRequest true "Update Venue Form Data"
// @Success 200 {object} dto.VenueDetailResponse
// @Failure 400 {object} dto.ErrorResponse
// @Failure 401 {object} dto.ErrorResponse
// @Failure 403 {object} dto.ErrorResponse
// @Failure 404 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/venues/{id} [put]
func (c *venueController) UpdateVenue(ctx *gin.Context) {
userID := ParseUserId(ctx)
if userID == "" {
return
}
venueID := ctx.Param("id")
if venueID == "" {
ResponseJSON(ctx, "", dto.VenueDetailResponse{}, fmt.Errorf("venue id is required"))
return
}
req, err := RequestJSON[dto.UpdateVenueRequest](ctx)
if err != nil {
return
}
res, err := c.venueService.UpdateVenue(ctx.Request.Context(), userID, venueID, req)
if err != nil {
ResponseJSON(ctx, "", dto.VenueDetailResponse{}, err)
return
}
ResponseJSON(ctx, "", res, nil)
}
// DeleteVenue godoc
// @Summary Delete a venue
// @Description Delete an existing venue owned by the current user if it has no classes attached.
// @Tags Venue
// @Produce json
// @Param id path string true "Venue ID"
// @Success 200 {object} map[string]interface{}
// @Failure 400 {object} dto.ErrorResponse
// @Failure 401 {object} dto.ErrorResponse
// @Failure 403 {object} dto.ErrorResponse
// @Failure 404 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/venues/{id} [delete]
func (c *venueController) DeleteVenue(ctx *gin.Context) {
userID := ParseUserId(ctx)
if userID == "" {
return
}
venueID := ctx.Param("id")
if venueID == "" {
ResponseJSON(ctx, "", map[string]interface{}{}, fmt.Errorf("venue id is required"))
return
}
err := c.venueService.DeleteVenue(ctx.Request.Context(), userID, venueID)
if err != nil {
ResponseJSON(ctx, "", map[string]interface{}{}, err)
return
}
ResponseJSON(ctx, "Venue deleted successfully", map[string]interface{}{}, nil)
}