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