Spaces:
Runtime error
Runtime error
File size: 4,657 Bytes
0ce191c 12690b4 174fabb 0ce191c 12690b4 4a66f20 12690b4 4a66f20 12690b4 174fabb | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | package controllers
import (
"abdanhafidz.com/go-boilerplate/models/dto"
"abdanhafidz.com/go-boilerplate/services"
"github.com/gin-gonic/gin"
)
type ClassController interface {
GetClassDetail(ctx *gin.Context)
CreateClass(ctx *gin.Context)
UpdateClass(ctx *gin.Context)
DeleteClass(ctx *gin.Context)
}
type classController struct {
classService services.ClassService
}
func NewClassController(classService services.ClassService) ClassController {
return &classController{classService: classService}
}
// GetClassDetail godoc
// @Summary Get Class Details
// @Description Return comprehensive class information needed to render the detail page.
// @Tags Classes
// @Accept json
// @Produce json
// @Param class_id path string true "Class ID"
// @Success 200 {object} dto.ClassDetailResponse
// @Failure 400 {object} dto.ErrorResponse
// @Failure 404 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/classes/{class_id} [get]
func (c *classController) GetClassDetail(ctx *gin.Context) {
classID := ctx.Param("class_id")
userID := ParseUserId(ctx)
// Validate path parameter
params, err := dto.ValidateClassDetailParams(classID)
if err != nil {
ResponseJSON(ctx, "", dto.ClassDetailResponse{}, err)
return
}
res, err := c.classService.GetClassDetail(ctx.Request.Context(), params, userID)
ResponseJSON(ctx, "", res, err)
}
// CreateClass godoc
// @Summary Host a Class
// @Description Allows an instructor to create/host a new class. Automatically creates an instructor profile if one doesn't exist.
// @Tags Classes
// @Accept json
// @Produce json
// @Param request body dto.CreateClassRequest true "Class Creation Data"
// @Success 201 {object} entities.Class
// @Failure 400 {object} dto.ErrorResponse
// @Failure 401 {object} dto.ErrorResponse
// @Failure 403 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/classes [post]
func (c *classController) CreateClass(ctx *gin.Context) {
req, err := RequestJSON[dto.CreateClassRequest](ctx)
if err != nil {
return
}
userID := ParseUserId(ctx)
if userID == "" {
return
}
res, err := c.classService.HostClass(ctx.Request.Context(), userID, req)
if err != nil {
ResponseJSON(ctx, req, res, err)
return
}
ctx.JSON(201, gin.H{
"success": true,
"message": "Class created successfully",
"data": res,
})
}
// UpdateClass godoc
// @Summary Update a Class
// @Description Update details of an existing class
// @Tags Classes
// @Accept json
// @Produce json
// @Param class_id path string true "Class ID"
// @Param request body dto.UpdateClassRequest true "Class Update Data"
// @Success 200 {object} entities.Class
// @Failure 400 {object} dto.ErrorResponse
// @Failure 404 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/classes/{class_id} [put]
func (c *classController) UpdateClass(ctx *gin.Context) {
classID := ctx.Param("class_id")
if classID == "" {
ctx.JSON(400, gin.H{"error": "class_id is required"})
return
}
req, err := RequestJSON[dto.UpdateClassRequest](ctx)
if err != nil {
return
}
res, err := c.classService.UpdateClass(ctx.Request.Context(), classID, req)
if err != nil {
ResponseJSON(ctx, req, res, err)
return
}
ctx.JSON(200, gin.H{
"success": true,
"message": "Class updated successfully",
"data": res,
})
}
// DeleteClass godoc
// @Summary Delete a Class
// @Description Delete an existing class
// @Tags Classes
// @Accept json
// @Produce json
// @Param class_id path string true "Class ID"
// @Success 200 {object} map[string]interface{}
// @Failure 400 {object} dto.ErrorResponse
// @Failure 404 {object} dto.ErrorResponse
// @Security BearerAuth
// @Router /api/v1/classes/{class_id} [delete]
func (c *classController) DeleteClass(ctx *gin.Context) {
classID := ctx.Param("class_id")
if classID == "" {
ctx.JSON(400, gin.H{"error": "class_id is required"})
return
}
err := c.classService.DeleteClass(ctx.Request.Context(), classID)
if err != nil {
ctx.JSON(400, gin.H{"success": false, "message": err.Error()})
return
}
ctx.JSON(200, gin.H{"success": true, "message": "Class deleted successfully"})
}
|