lifedebugger commited on
Commit
12690b4
·
1 Parent(s): d8cdd09

Deploy files from GitHub repository

Browse files
controllers/authentication_controller.go CHANGED
@@ -24,18 +24,50 @@ func NewAuthenticationController(userService services.UserService) Authenticatio
24
  }
25
  }
26
 
 
 
 
 
 
 
 
 
 
 
27
  func (c *authenticationController) SignUp(ctx *gin.Context) {
28
  req := RequestJSON[dto.SignUpRequest](ctx)
29
  res, err := c.userService.Create(ctx.Request.Context(), req.Name, req.Email, req.Username, req.Password)
30
  ResponseJSON(ctx, req, res, err)
31
  }
32
 
 
 
 
 
 
 
 
 
 
 
33
  func (c *authenticationController) SignIn(ctx *gin.Context) {
34
  req := RequestJSON[dto.SignInRequest](ctx)
35
  res, err := c.userService.Validate(ctx, req.EmailorUsername, req.Password)
36
  ResponseJSON(ctx, req, res, err)
37
  }
38
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  func (c *authenticationController) ChangePassword(ctx *gin.Context) {
40
  req := RequestJSON[dto.ChangePasswordRequest](ctx)
41
  userId := ParseUserId(ctx)
@@ -43,6 +75,17 @@ func (c *authenticationController) ChangePassword(ctx *gin.Context) {
43
  ResponseJSON(ctx, req, res, err)
44
  }
45
 
 
 
 
 
 
 
 
 
 
 
 
46
  func (c *authenticationController) UpdateUserRole(ctx *gin.Context) {
47
  req := RequestJSON[dto.UpdateUserRoleRequest](ctx)
48
  userId := ctx.Param("userId")
 
24
  }
25
  }
26
 
27
+ // SignUp godoc
28
+ // @Summary Sign Up
29
+ // @Description Register a new user with name, email, username and password.
30
+ // @Tags Auth
31
+ // @Accept json
32
+ // @Produce json
33
+ // @Param request body dto.SignUpRequest true "Sign Up Data"
34
+ // @Success 200 {object} entity.User
35
+ // @Failure 400 {object} dto.ErrorResponse
36
+ // @Router /api/v1/authentication/register [post]
37
  func (c *authenticationController) SignUp(ctx *gin.Context) {
38
  req := RequestJSON[dto.SignUpRequest](ctx)
39
  res, err := c.userService.Create(ctx.Request.Context(), req.Name, req.Email, req.Username, req.Password)
40
  ResponseJSON(ctx, req, res, err)
41
  }
42
 
43
+ // SignIn godoc
44
+ // @Summary Sign In
45
+ // @Description Authenticate user via email/username and password.
46
+ // @Tags Auth
47
+ // @Accept json
48
+ // @Produce json
49
+ // @Param request body dto.SignInRequest true "Sign In Data"
50
+ // @Success 200 {object} dto.AuthenticatedUser
51
+ // @Failure 401 {object} dto.ErrorResponse
52
+ // @Router /api/v1/authentication/login [post]
53
  func (c *authenticationController) SignIn(ctx *gin.Context) {
54
  req := RequestJSON[dto.SignInRequest](ctx)
55
  res, err := c.userService.Validate(ctx, req.EmailorUsername, req.Password)
56
  ResponseJSON(ctx, req, res, err)
57
  }
58
 
59
+ // ChangePassword godoc
60
+ // @Summary Change Password
61
+ // @Description Update password for the logged-in user.
62
+ // @Tags Auth
63
+ // @Accept json
64
+ // @Produce json
65
+ // @Param request body dto.ChangePasswordRequest true "Password Change Data"
66
+ // @Success 200 {object} dto.AuthenticatedUser
67
+ // @Failure 400 {object} dto.ErrorResponse
68
+ // @Failure 401 {object} dto.ErrorResponse
69
+ // @Security BearerAuth
70
+ // @Router /api/v1/authentication/change-password [put]
71
  func (c *authenticationController) ChangePassword(ctx *gin.Context) {
72
  req := RequestJSON[dto.ChangePasswordRequest](ctx)
73
  userId := ParseUserId(ctx)
 
75
  ResponseJSON(ctx, req, res, err)
76
  }
77
 
78
+ // UpdateUserRole godoc
79
+ // @Summary Update User Role (Legacy)
80
+ // @Description Update user role. Note: This is an older endpoint, consider using /api/v1/users/me/roles instead.
81
+ // @Tags Users
82
+ // @Accept json
83
+ // @Produce json
84
+ // @Param userId path string true "User ID"
85
+ // @Param request body dto.UpdateUserRoleRequest true "Role Update Data"
86
+ // @Success 200 {object} entity.User
87
+ // @Failure 400 {object} dto.ErrorResponse
88
+ // @Router /api/v1/authentication/role/{userId} [put]
89
  func (c *authenticationController) UpdateUserRole(ctx *gin.Context) {
90
  req := RequestJSON[dto.UpdateUserRoleRequest](ctx)
91
  userId := ctx.Param("userId")
controllers/class_controller.go CHANGED
@@ -8,6 +8,7 @@ import (
8
 
9
  type ClassController interface {
10
  GetClassDetail(ctx *gin.Context)
 
11
  }
12
 
13
  type classController struct {
@@ -44,3 +45,33 @@ func (c *classController) GetClassDetail(ctx *gin.Context) {
44
  res, err := c.classService.GetClassDetail(ctx.Request.Context(), params, userID)
45
  ResponseJSON(ctx, "", res, err)
46
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
  type ClassController interface {
10
  GetClassDetail(ctx *gin.Context)
11
+ CreateClass(ctx *gin.Context)
12
  }
13
 
14
  type classController struct {
 
45
  res, err := c.classService.GetClassDetail(ctx.Request.Context(), params, userID)
46
  ResponseJSON(ctx, "", res, err)
47
  }
48
+
49
+ // CreateClass godoc
50
+ // @Summary Host a Class
51
+ // @Description Allows an instructor to create/host a new class. Automatically creates an instructor profile if one doesn't exist.
52
+ // @Tags Classes
53
+ // @Accept json
54
+ // @Produce json
55
+ // @Param request body dto.CreateClassRequest true "Class Creation Data"
56
+ // @Success 201 {object} entities.Class
57
+ // @Failure 400 {object} dto.ErrorResponse
58
+ // @Failure 401 {object} dto.ErrorResponse
59
+ // @Failure 403 {object} dto.ErrorResponse
60
+ // @Security BearerAuth
61
+ // @Router /api/v1/classes [post]
62
+ func (c *classController) CreateClass(ctx *gin.Context) {
63
+ req := RequestJSON[dto.CreateClassRequest](ctx)
64
+ userID := ParseUserId(ctx)
65
+
66
+ res, err := c.classService.HostClass(ctx.Request.Context(), userID, req)
67
+ if err != nil {
68
+ ResponseJSON(ctx, req, res, err)
69
+ return
70
+ }
71
+
72
+ ctx.JSON(201, gin.H{
73
+ "success": true,
74
+ "message": "Class created successfully",
75
+ "data": res,
76
+ })
77
+ }
controllers/otp_verification_controller.go CHANGED
@@ -23,6 +23,16 @@ func NewOTPVerificationController(otpService services.OTPVerificationService) OT
23
 
24
  // DTOs moved to models/dto/otp_dto.go
25
 
 
 
 
 
 
 
 
 
 
 
26
  func (c *otpVerificationController) RequestOTP(ctx *gin.Context) {
27
  req := RequestJSON[dto.OTPRequestInput](ctx)
28
  res, err := c.otpService.RequestOTP(ctx.Request.Context(), req)
@@ -33,6 +43,16 @@ func (c *otpVerificationController) RequestOTP(ctx *gin.Context) {
33
  ResponseJSON(ctx, "OTP sent successfully via WhatsApp", res, nil)
34
  }
35
 
 
 
 
 
 
 
 
 
 
 
36
  func (c *otpVerificationController) VerifyOTP(ctx *gin.Context) {
37
  req := RequestJSON[dto.OTPVerifyInput](ctx)
38
  res, err := c.otpService.VerifyOTP(ctx.Request.Context(), req)
 
23
 
24
  // DTOs moved to models/dto/otp_dto.go
25
 
26
+ // RequestOTP godoc
27
+ // @Summary Request OTP
28
+ // @Description Trigger an OTP code via WhatsApp for phone number verification.
29
+ // @Tags Auth
30
+ // @Accept json
31
+ // @Produce json
32
+ // @Param request body dto.OTPRequestInput true "OTP Request Data"
33
+ // @Success 200 {object} dto.OTPRequestResponse
34
+ // @Failure 400 {object} dto.ErrorResponse
35
+ // @Router /api/v1/auth/otp/request [post]
36
  func (c *otpVerificationController) RequestOTP(ctx *gin.Context) {
37
  req := RequestJSON[dto.OTPRequestInput](ctx)
38
  res, err := c.otpService.RequestOTP(ctx.Request.Context(), req)
 
43
  ResponseJSON(ctx, "OTP sent successfully via WhatsApp", res, nil)
44
  }
45
 
46
+ // VerifyOTP godoc
47
+ // @Summary Verify OTP
48
+ // @Description Validate the OTP code provided by the user and return authentication token.
49
+ // @Tags Auth
50
+ // @Accept json
51
+ // @Produce json
52
+ // @Param request body dto.OTPVerifyInput true "OTP Verification Data"
53
+ // @Success 200 {object} dto.OTPVerifyResponse
54
+ // @Failure 400 {object} dto.ErrorResponse
55
+ // @Router /api/v1/auth/otp/verify [post]
56
  func (c *otpVerificationController) VerifyOTP(ctx *gin.Context) {
57
  req := RequestJSON[dto.OTPVerifyInput](ctx)
58
  res, err := c.otpService.VerifyOTP(ctx.Request.Context(), req)
controllers/user_controller.go CHANGED
@@ -23,18 +23,51 @@ func NewUserController(userService services.UserService) UserController {
23
  }
24
  }
25
 
 
 
 
 
 
 
 
 
 
 
26
  func (c *userController) GetProfile(ctx *gin.Context) {
27
  userId := ParseUserId(ctx)
28
  res, err := c.userService.GetProfile(ctx.Request.Context(), userId)
29
  ResponseJSON(ctx, "", res, err)
30
  }
31
 
 
 
 
 
 
 
 
 
 
 
 
32
  func (c *userController) GetUserDetails(ctx *gin.Context) {
33
  userId := ctx.Param("id")
34
  res, err := c.userService.GetProfile(ctx.Request.Context(), userId)
35
  ResponseJSON(ctx, "", res, err)
36
  }
37
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  func (c *userController) UpdateAboutYou(ctx *gin.Context) {
39
  req := RequestJSON[dto.UpdateAboutYouRequest](ctx)
40
  userId := ParseUserId(ctx)
@@ -42,6 +75,18 @@ func (c *userController) UpdateAboutYou(ctx *gin.Context) {
42
  ResponseJSON(ctx, req, res, err)
43
  }
44
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  func (c *userController) AssignRoles(ctx *gin.Context) {
46
  req := RequestJSON[dto.UpdateUserRolesRequest](ctx)
47
  userId := ParseUserId(ctx)
 
23
  }
24
  }
25
 
26
+ // GetProfile godoc
27
+ // @Summary Get My Profile
28
+ // @Description Get current logged-in user profile, including roles and about details.
29
+ // @Tags Users
30
+ // @Accept json
31
+ // @Produce json
32
+ // @Success 200 {object} dto.UserProfileResponse
33
+ // @Failure 401 {object} dto.ErrorResponse
34
+ // @Security BearerAuth
35
+ // @Router /api/v1/users/me [get]
36
  func (c *userController) GetProfile(ctx *gin.Context) {
37
  userId := ParseUserId(ctx)
38
  res, err := c.userService.GetProfile(ctx.Request.Context(), userId)
39
  ResponseJSON(ctx, "", res, err)
40
  }
41
 
42
+ // GetUserDetails godoc
43
+ // @Summary Get User Details
44
+ // @Description Get public profile and roles of another user by their ID.
45
+ // @Tags Users
46
+ // @Accept json
47
+ // @Produce json
48
+ // @Param id path string true "User ID"
49
+ // @Success 200 {object} dto.UserProfileResponse
50
+ // @Failure 404 {object} dto.ErrorResponse
51
+ // @Security BearerAuth
52
+ // @Router /api/v1/users/{id} [get]
53
  func (c *userController) GetUserDetails(ctx *gin.Context) {
54
  userId := ctx.Param("id")
55
  res, err := c.userService.GetProfile(ctx.Request.Context(), userId)
56
  ResponseJSON(ctx, "", res, err)
57
  }
58
 
59
+ // UpdateAboutYou godoc
60
+ // @Summary Update About You
61
+ // @Description Update user's personal details like gender, dance level, and description.
62
+ // @Tags Users
63
+ // @Accept json
64
+ // @Produce json
65
+ // @Param request body dto.UpdateAboutYouRequest true "Update Profile Data"
66
+ // @Success 200 {object} dto.UserProfileResponse
67
+ // @Failure 400 {object} dto.ErrorResponse
68
+ // @Failure 401 {object} dto.ErrorResponse
69
+ // @Security BearerAuth
70
+ // @Router /api/v1/users/me/about [put]
71
  func (c *userController) UpdateAboutYou(ctx *gin.Context) {
72
  req := RequestJSON[dto.UpdateAboutYouRequest](ctx)
73
  userId := ParseUserId(ctx)
 
75
  ResponseJSON(ctx, req, res, err)
76
  }
77
 
78
+ // AssignRoles godoc
79
+ // @Summary Assign Role
80
+ // @Description Update user's primary role (member, instructor, venue_owner).
81
+ // @Tags Users
82
+ // @Accept json
83
+ // @Produce json
84
+ // @Param request body dto.UpdateUserRolesRequest true "Role Assignment Data"
85
+ // @Success 200 {object} dto.UserProfileResponse
86
+ // @Failure 400 {object} dto.ErrorResponse
87
+ // @Failure 401 {object} dto.ErrorResponse
88
+ // @Security BearerAuth
89
+ // @Router /api/v1/users/me/roles [put]
90
  func (c *userController) AssignRoles(ctx *gin.Context) {
91
  req := RequestJSON[dto.UpdateUserRolesRequest](ctx)
92
  userId := ParseUserId(ctx)
router/class_router.go CHANGED
@@ -11,5 +11,6 @@ func ClassRouterSetup(router *gin.Engine, classController provider.ControllerPro
11
  classRoute.Use(authMiddleware.VerifyAccount)
12
  {
13
  classRoute.GET("/:class_id", classController.ProvideClassController().GetClassDetail)
 
14
  }
15
  }
 
11
  classRoute.Use(authMiddleware.VerifyAccount)
12
  {
13
  classRoute.GET("/:class_id", classController.ProvideClassController().GetClassDetail)
14
+ classRoute.POST("", classController.ProvideClassController().CreateClass)
15
  }
16
  }
swagger/docs/docs.go CHANGED
The diff for this file is too large to render. See raw diff
 
swagger/docs/swagger.json CHANGED
@@ -20,9 +20,9 @@
20
  "host": "lifedebugger-danzapp-be-test.hf.space",
21
  "basePath": "/",
22
  "paths": {
23
- "/api/v1/class-categories": {
24
- "get": {
25
- "description": "Get master list of class categories",
26
  "consumes": [
27
  "application/json"
28
  ],
@@ -30,14 +30,25 @@
30
  "application/json"
31
  ],
32
  "tags": [
33
- "Master Data"
 
 
 
 
 
 
 
 
 
 
 
 
34
  ],
35
- "summary": "Get Class Categories",
36
  "responses": {
37
  "200": {
38
  "description": "OK",
39
  "schema": {
40
- "$ref": "#/definitions/dto.CategoryResponseWrapper"
41
  }
42
  },
43
  "400": {
@@ -49,14 +60,9 @@
49
  }
50
  }
51
  },
52
- "/api/v1/classes/filters": {
53
- "get": {
54
- "security": [
55
- {
56
- "BearerAuth": []
57
- }
58
- ],
59
- "description": "Returns available filter options for class search",
60
  "consumes": [
61
  "application/json"
62
  ],
@@ -64,14 +70,25 @@
64
  "application/json"
65
  ],
66
  "tags": [
67
- "Classes"
 
 
 
 
 
 
 
 
 
 
 
 
68
  ],
69
- "summary": "Get Class Filters Metadata",
70
  "responses": {
71
  "200": {
72
  "description": "OK",
73
  "schema": {
74
- "$ref": "#/definitions/dto.FiltersMetadataResponse"
75
  }
76
  },
77
  "400": {
@@ -79,24 +96,18 @@
79
  "schema": {
80
  "$ref": "#/definitions/dto.ErrorResponse"
81
  }
82
- },
83
- "401": {
84
- "description": "Unauthorized",
85
- "schema": {
86
- "$ref": "#/definitions/dto.ErrorResponse"
87
- }
88
  }
89
  }
90
  }
91
  },
92
- "/api/v1/classes/search": {
93
- "get": {
94
  "security": [
95
  {
96
  "BearerAuth": []
97
  }
98
  ],
99
- "description": "Search classes with filters and sorting options",
100
  "consumes": [
101
  "application/json"
102
  ],
@@ -104,81 +115,25 @@
104
  "application/json"
105
  ],
106
  "tags": [
107
- "Classes"
108
  ],
109
- "summary": "Search for Classes",
110
  "parameters": [
111
  {
112
- "type": "string",
113
- "description": "Search query",
114
- "name": "q",
115
- "in": "query"
116
- },
117
- {
118
- "type": "string",
119
- "description": "Location name",
120
- "name": "location_name",
121
- "in": "query"
122
- },
123
- {
124
- "type": "number",
125
- "description": "User latitude",
126
- "name": "latitude",
127
- "in": "query"
128
- },
129
- {
130
- "type": "number",
131
- "description": "User longitude",
132
- "name": "longitude",
133
- "in": "query"
134
- },
135
- {
136
- "type": "string",
137
- "default": "nearest",
138
- "description": "Sort by (nearest|popular|rating|newest)",
139
- "name": "sort_by",
140
- "in": "query"
141
- },
142
- {
143
- "type": "integer",
144
- "default": 1,
145
- "description": "Page number",
146
- "name": "page",
147
- "in": "query"
148
- },
149
- {
150
- "type": "integer",
151
- "default": 10,
152
- "description": "Items per page",
153
- "name": "limit",
154
- "in": "query"
155
- },
156
- {
157
- "type": "string",
158
- "default": "class",
159
- "description": "View type",
160
- "name": "view_type",
161
- "in": "query"
162
- },
163
- {
164
- "type": "string",
165
- "default": "all",
166
- "description": "Category",
167
- "name": "category",
168
- "in": "query"
169
- },
170
- {
171
- "type": "string",
172
- "description": "Dance type",
173
- "name": "dance_type",
174
- "in": "query"
175
  }
176
  ],
177
  "responses": {
178
  "200": {
179
  "description": "OK",
180
  "schema": {
181
- "$ref": "#/definitions/dto.SearchClassesResponse"
182
  }
183
  },
184
  "400": {
@@ -196,14 +151,9 @@
196
  }
197
  }
198
  },
199
- "/api/v1/classes/{class_id}": {
200
- "get": {
201
- "security": [
202
- {
203
- "BearerAuth": []
204
- }
205
- ],
206
- "description": "Return comprehensive class information needed to render the detail page.",
207
  "consumes": [
208
  "application/json"
209
  ],
@@ -211,33 +161,29 @@
211
  "application/json"
212
  ],
213
  "tags": [
214
- "Classes"
215
  ],
216
- "summary": "Get Class Details",
217
  "parameters": [
218
  {
219
- "type": "string",
220
- "description": "Class ID",
221
- "name": "class_id",
222
- "in": "path",
223
- "required": true
 
 
224
  }
225
  ],
226
  "responses": {
227
  "200": {
228
  "description": "OK",
229
  "schema": {
230
- "$ref": "#/definitions/dto.ClassDetailResponse"
231
- }
232
- },
233
- "400": {
234
- "description": "Bad Request",
235
- "schema": {
236
- "$ref": "#/definitions/dto.ErrorResponse"
237
  }
238
  },
239
- "404": {
240
- "description": "Not Found",
241
  "schema": {
242
  "$ref": "#/definitions/dto.ErrorResponse"
243
  }
@@ -245,9 +191,9 @@
245
  }
246
  }
247
  },
248
- "/api/v1/event-categories": {
249
- "get": {
250
- "description": "Get master list of event categories",
251
  "consumes": [
252
  "application/json"
253
  ],
@@ -255,14 +201,25 @@
255
  "application/json"
256
  ],
257
  "tags": [
258
- "Master Data"
 
 
 
 
 
 
 
 
 
 
 
 
259
  ],
260
- "summary": "Get Event Categories",
261
  "responses": {
262
  "200": {
263
  "description": "OK",
264
  "schema": {
265
- "$ref": "#/definitions/dto.CategoryResponseWrapper"
266
  }
267
  },
268
  "400": {
@@ -274,14 +231,9 @@
274
  }
275
  }
276
  },
277
- "/api/v1/home": {
278
- "get": {
279
- "security": [
280
- {
281
- "BearerAuth": []
282
- }
283
- ],
284
- "description": "Return all sections needed by the home page in one aggregated response.",
285
  "consumes": [
286
  "application/json"
287
  ],
@@ -289,40 +241,32 @@
289
  "application/json"
290
  ],
291
  "tags": [
292
- "Home Dashboard"
293
  ],
294
- "summary": "Get Home Page Data",
295
  "parameters": [
296
  {
297
  "type": "string",
298
- "description": "Selected date for schedule card section (YYYY-MM-DD)",
299
- "name": "date",
300
- "in": "query"
301
- },
302
- {
303
- "type": "number",
304
- "description": "User latitude",
305
- "name": "latitude",
306
- "in": "query"
307
- },
308
- {
309
- "type": "number",
310
- "description": "User longitude",
311
- "name": "longitude",
312
- "in": "query"
313
  },
314
  {
315
- "type": "string",
316
- "description": "User city",
317
- "name": "city",
318
- "in": "query"
 
 
 
319
  }
320
  ],
321
  "responses": {
322
  "200": {
323
  "description": "OK",
324
  "schema": {
325
- "$ref": "#/definitions/dto.HomeResponseWrapper"
326
  }
327
  },
328
  "400": {
@@ -334,9 +278,9 @@
334
  }
335
  }
336
  },
337
- "/api/v1/payment/callback": {
338
- "post": {
339
- "description": "Receive and process payment status updates from Xendit",
340
  "consumes": [
341
  "application/json"
342
  ],
@@ -344,26 +288,14 @@
344
  "application/json"
345
  ],
346
  "tags": [
347
- "Payment"
348
- ],
349
- "summary": "Handle Xendit Payment Callback",
350
- "parameters": [
351
- {
352
- "description": "Xendit Callback Payload",
353
- "name": "request",
354
- "in": "body",
355
- "required": true,
356
- "schema": {
357
- "type": "object",
358
- "additionalProperties": true
359
- }
360
- }
361
  ],
 
362
  "responses": {
363
  "200": {
364
  "description": "OK",
365
  "schema": {
366
- "$ref": "#/definitions/dto.SuccessResponse-any"
367
  }
368
  },
369
  "400": {
@@ -375,14 +307,14 @@
375
  }
376
  }
377
  },
378
- "/api/v1/schedules": {
379
- "get": {
380
  "security": [
381
  {
382
  "BearerAuth": []
383
  }
384
  ],
385
- "description": "Get a list of class or event schedules based on date range, city, filters, etc.",
386
  "consumes": [
387
  "application/json"
388
  ],
@@ -390,64 +322,262 @@
390
  "application/json"
391
  ],
392
  "tags": [
393
- "Home Dashboard"
394
  ],
395
- "summary": "Get Schedule List",
396
  "parameters": [
397
  {
398
- "type": "string",
399
- "description": "Exact date (YYYY-MM-DD)",
400
- "name": "date",
401
- "in": "query"
402
- },
403
- {
404
- "type": "string",
405
- "description": "Start date range (YYYY-MM-DD)",
406
- "name": "start_date",
407
- "in": "query"
 
 
 
 
 
408
  },
409
- {
410
- "type": "string",
411
- "description": "End date range (YYYY-MM-DD)",
412
- "name": "end_date",
413
- "in": "query"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
414
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
415
  {
416
  "type": "string",
417
- "description": "Filter by city",
418
- "name": "city",
419
  "in": "query"
420
  },
421
  {
422
  "type": "string",
423
- "description": "Filter by class level (e.g., beginner)",
424
- "name": "level",
 
 
 
 
 
 
 
 
 
 
 
 
425
  "in": "query"
426
  },
427
  {
428
  "type": "string",
429
- "description": "Filter by class category (e.g., salsa)",
430
- "name": "category",
 
431
  "in": "query"
432
  },
433
  {
434
  "type": "integer",
435
- "description": "Page number (default: 1)",
 
436
  "name": "page",
437
  "in": "query"
438
  },
439
  {
440
  "type": "integer",
441
- "description": "Items per page (default: 10, max: 100)",
 
442
  "name": "limit",
443
  "in": "query"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
444
  }
445
  ],
446
  "responses": {
447
  "200": {
448
  "description": "OK",
449
  "schema": {
450
- "$ref": "#/definitions/dto.ScheduleListResponseWrapper"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
451
  }
452
  },
453
  "400": {
@@ -458,132 +588,864 @@
458
  }
459
  }
460
  }
461
- }
462
- },
463
- "definitions": {
464
- "dto.CategoryResponse": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
465
  "type": "object",
466
  "properties": {
467
- "id": {
468
  "type": "string"
469
  },
470
- "image_url": {
 
 
 
 
 
 
471
  "type": "string"
472
  },
473
- "name": {
 
 
 
 
 
 
 
 
 
474
  "type": "string"
475
  }
476
  }
477
  },
478
- "dto.CategoryResponseWrapper": {
479
  "type": "object",
480
  "properties": {
481
- "data": {
482
- "type": "array",
483
- "items": {
484
- "$ref": "#/definitions/dto.CategoryResponse"
485
- }
486
  },
487
- "success": {
488
- "type": "boolean"
489
  }
490
  }
491
  },
492
- "dto.ClassBooking": {
493
  "type": "object",
494
  "properties": {
495
- "booking_type": {
496
- "type": "string"
497
- },
498
- "button_text": {
499
- "type": "string"
500
  },
501
- "is_bookable": {
502
- "type": "boolean"
503
  },
504
  "starting_price": {
505
  "$ref": "#/definitions/dto.PriceData"
506
  }
507
  }
508
  },
509
- "dto.ClassDescription": {
510
  "type": "object",
511
  "properties": {
512
- "full_text": {
513
  "type": "string"
514
  },
515
- "is_truncated": {
516
- "type": "boolean"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
517
  },
518
- "short_text": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
519
  "type": "string"
520
  }
521
  }
522
  },
523
- "dto.ClassDetailResponse": {
524
  "type": "object",
525
  "properties": {
526
- "booking": {
527
- "$ref": "#/definitions/dto.ClassBooking"
528
  },
529
- "cancellation_policy": {
530
- "type": "array",
531
- "items": {
532
- "type": "string"
533
- }
534
  },
535
- "class_id": {
 
 
 
 
 
 
 
 
 
 
 
536
  "type": "string"
537
  },
538
- "description": {
539
- "$ref": "#/definitions/dto.ClassDescription"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
540
  },
541
- "details": {
 
 
 
 
 
 
 
 
 
 
 
542
  "type": "array",
543
  "items": {
544
- "type": "string"
545
  }
546
  },
547
- "extra_lessons": {
548
- "$ref": "#/definitions/dto.ClassExtraLessons"
 
 
 
549
  },
550
- "favorite": {
551
- "$ref": "#/definitions/dto.ClassFavorite"
 
 
 
552
  },
553
- "gallery": {
554
  "type": "array",
555
  "items": {
556
- "$ref": "#/definitions/dto.ClassGalleryItem"
557
  }
 
 
 
 
 
 
 
 
558
  },
559
- "hero_image_url": {
560
  "type": "string"
561
  },
562
- "house_dancer": {
563
- "$ref": "#/definitions/dto.ClassHouseDancer"
564
  },
565
- "instructor": {
566
- "$ref": "#/definitions/dto.ClassInstructor"
 
 
 
 
 
 
 
 
567
  },
568
- "location": {
569
- "$ref": "#/definitions/dto.ClassLocation"
570
  },
571
- "rating": {
572
- "$ref": "#/definitions/dto.ClassRating"
573
  },
574
- "share": {
575
- "$ref": "#/definitions/dto.ClassShare"
576
  },
577
- "summary": {
578
- "$ref": "#/definitions/dto.ClassSummary"
 
 
 
 
 
 
 
 
579
  },
580
- "tags": {
581
- "type": "array",
582
- "items": {
583
- "$ref": "#/definitions/dto.ClassTag"
584
- }
585
  },
586
- "title": {
587
  "type": "string"
588
  },
589
  "type": {
@@ -591,333 +1453,449 @@
591
  }
592
  }
593
  },
594
- "dto.ClassExtraLessons": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
595
  "type": "object",
596
  "properties": {
597
- "available": {
598
- "type": "boolean"
 
 
 
 
 
 
 
 
599
  },
600
- "description": {
 
 
 
 
 
 
 
 
 
601
  "type": "string"
602
  }
603
  }
604
  },
605
- "dto.ClassFavorite": {
606
  "type": "object",
607
  "properties": {
608
- "is_favorited": {
609
- "type": "boolean"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
610
  }
611
  }
612
  },
613
- "dto.ClassGalleryItem": {
614
  "type": "object",
615
  "properties": {
616
- "id": {
617
- "type": "string"
618
  },
619
- "image_url": {
620
  "type": "string"
621
  },
622
- "thumbnail_url": {
623
- "type": "string"
624
  }
625
  }
626
  },
627
- "dto.ClassHouseDancer": {
628
  "type": "object",
629
  "properties": {
630
- "available": {
631
- "type": "boolean"
632
- },
633
- "description": {
634
  "type": "string"
635
- },
636
- "price": {
637
- "$ref": "#/definitions/dto.PriceData"
638
  }
639
  }
640
  },
641
- "dto.ClassInstructor": {
642
  "type": "object",
643
  "properties": {
644
  "avatar_url": {
645
  "type": "string"
646
  },
647
- "id": {
648
- "type": "string"
649
- },
650
- "is_message_enabled": {
651
- "type": "boolean"
652
- },
653
- "name": {
654
  "type": "string"
655
  },
656
- "subtitle": {
657
  "type": "string"
658
  },
659
- "title": {
660
  "type": "string"
661
  }
662
  }
663
  },
664
- "dto.ClassLocation": {
665
  "type": "object",
666
  "properties": {
667
- "address": {
668
- "type": "string"
 
 
 
669
  },
670
- "area_text": {
671
  "type": "string"
672
  },
673
- "latitude": {
674
- "type": "number"
 
 
 
675
  },
676
- "longitude": {
677
- "type": "number"
678
  },
679
- "map_preview_url": {
680
  "type": "string"
681
  },
682
- "venue_name": {
 
 
 
683
  "type": "string"
684
  }
685
  }
686
  },
687
- "dto.ClassRating": {
688
  "type": "object",
689
  "properties": {
690
- "average": {
691
- "type": "number"
692
  },
693
- "count": {
694
  "type": "integer"
 
 
 
 
 
 
695
  }
696
  }
697
  },
698
- "dto.ClassSearchResult": {
699
  "type": "object",
 
 
 
 
 
700
  "properties": {
701
- "class_id": {
702
  "type": "string"
703
  },
704
- "distance_km": {
705
- "type": "number"
706
- },
707
- "is_favorited": {
708
- "type": "boolean"
709
- },
710
- "location_text": {
711
  "type": "string"
712
  },
713
- "price": {
714
- "$ref": "#/definitions/dto.PriceInfo"
715
  },
716
- "schedule_text": {
717
  "type": "string"
718
  },
719
- "thumbnail_url": {
720
  "type": "string"
721
  },
722
- "title": {
723
  "type": "string"
724
  }
725
  }
726
  },
727
- "dto.ClassShare": {
728
  "type": "object",
729
  "properties": {
730
- "share_text": {
731
  "type": "string"
732
  },
733
- "share_url": {
 
 
 
734
  "type": "string"
735
- }
736
- }
737
- },
738
- "dto.ClassSummary": {
739
- "type": "object",
740
- "properties": {
741
- "date": {
742
- "$ref": "#/definitions/dto.DateDisplay"
743
  },
744
- "location": {
745
- "$ref": "#/definitions/dto.SummaryLocation"
746
  },
747
- "starting_price": {
748
- "$ref": "#/definitions/dto.PriceData"
 
 
 
749
  }
750
  }
751
  },
752
- "dto.ClassTag": {
753
  "type": "object",
754
  "properties": {
755
- "key": {
756
  "type": "string"
757
  },
758
- "label": {
 
 
 
 
 
 
759
  "type": "string"
760
  }
761
  }
762
  },
763
- "dto.CurrentLocation": {
764
  "type": "object",
 
 
 
 
 
 
765
  "properties": {
766
- "city": {
767
  "type": "string"
768
  },
769
- "label": {
770
  "type": "string"
771
  },
772
- "latitude": {
773
- "type": "number"
774
  },
775
- "longitude": {
776
- "type": "number"
 
 
 
777
  }
778
  }
779
  },
780
- "dto.DateDisplay": {
781
  "type": "object",
782
  "properties": {
783
- "display": {
784
- "type": "string"
785
  },
786
- "raw": {
787
- "type": "string"
788
  }
789
  }
790
  },
791
- "dto.ErrorResponse": {
792
  "type": "object",
793
  "properties": {
794
- "errors": {},
795
- "message": {},
796
- "meta_data": {},
797
- "status": {
798
- "type": "string"
 
 
 
 
 
 
 
 
 
799
  }
800
  }
801
  },
802
- "dto.FilterOption": {
803
  "type": "object",
804
  "properties": {
805
- "id": {
806
- "type": "string"
807
  },
808
- "is_default": {
809
- "type": "boolean"
810
  },
811
- "label": {
812
- "type": "string"
 
 
 
813
  }
814
  }
815
  },
816
- "dto.FiltersMetadataResponse": {
817
  "type": "object",
818
  "properties": {
819
- "categories": {
820
- "type": "array",
821
- "items": {
822
- "$ref": "#/definitions/dto.FilterOption"
823
- }
824
- },
825
- "dance_types": {
826
- "type": "array",
827
- "items": {
828
- "$ref": "#/definitions/dto.FilterOption"
829
- }
830
  },
831
- "sort_options": {
832
- "type": "array",
833
- "items": {
834
- "$ref": "#/definitions/dto.SortOption"
835
- }
836
  },
837
- "view_types": {
838
- "type": "array",
839
- "items": {
840
- "$ref": "#/definitions/dto.FilterOption"
841
- }
842
  }
843
  }
844
  },
845
- "dto.HomeBeginnerClassSection": {
846
  "type": "object",
847
  "properties": {
848
- "id": {
849
  "type": "string"
850
  },
851
- "image_url": {
852
  "type": "string"
853
  },
854
- "name": {
855
- "type": "string"
856
  },
857
- "type": {
858
- "type": "string"
859
  }
860
  }
861
  },
862
- "dto.HomeDay": {
863
  "type": "object",
864
  "properties": {
 
 
 
 
 
 
865
  "date": {
866
  "type": "string"
867
  },
868
- "day_name_short": {
869
  "type": "string"
870
  },
871
- "day_number": {
872
- "type": "integer"
873
  },
874
- "has_schedule": {
875
  "type": "boolean"
876
  },
877
- "is_selected": {
878
- "type": "boolean"
879
- }
880
- }
881
- },
882
- "dto.HomeEventSection": {
883
- "type": "object",
884
- "properties": {
885
- "id": {
886
  "type": "string"
887
  },
888
- "image_url": {
889
  "type": "string"
890
  },
891
- "name": {
892
  "type": "string"
893
  },
894
- "type": {
 
 
 
895
  "type": "string"
896
  }
897
  }
898
  },
899
- "dto.HomeHeroBanner": {
900
  "type": "object",
901
  "properties": {
902
- "badge_text": {
903
  "type": "string"
904
  },
905
- "cta_target_id": {
 
 
 
906
  "type": "string"
907
  },
908
- "cta_text": {
909
  "type": "string"
910
  },
911
- "cta_type": {
912
  "type": "string"
913
  },
914
- "id": {
915
  "type": "string"
916
  },
917
- "image_url": {
918
  "type": "string"
919
  },
920
- "subtitle": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
921
  "type": "string"
922
  },
923
  "title": {
@@ -925,409 +1903,533 @@
925
  }
926
  }
927
  },
928
- "dto.HomeNotifications": {
929
  "type": "object",
930
  "properties": {
931
- "unread_count": {
932
- "type": "integer"
 
 
 
 
 
 
933
  }
934
  }
935
  },
936
- "dto.HomePromoStrip": {
937
  "type": "object",
938
  "properties": {
939
- "cta_target_id": {
940
- "type": "string"
941
- },
942
- "cta_text": {
943
- "type": "string"
944
- },
945
- "cta_type": {
946
- "type": "string"
947
  },
948
- "id": {
949
  "type": "string"
950
  },
951
- "text": {
952
- "type": "string"
953
  }
954
  }
955
  },
956
- "dto.HomeResponse": {
957
  "type": "object",
958
  "properties": {
959
- "beginner_class_sections": {
960
- "type": "array",
961
- "items": {
962
- "$ref": "#/definitions/dto.HomeBeginnerClassSection"
963
- }
964
  },
965
- "event_sections": {
966
  "type": "array",
967
  "items": {
968
- "$ref": "#/definitions/dto.HomeEventSection"
969
  }
970
  },
971
- "hero_banners": {
 
 
 
972
  "type": "array",
973
  "items": {
974
- "$ref": "#/definitions/dto.HomeHeroBanner"
975
  }
976
  },
977
- "notifications": {
978
- "$ref": "#/definitions/dto.HomeNotifications"
979
- },
980
- "promo_strip": {
981
- "$ref": "#/definitions/dto.HomePromoStrip"
982
- },
983
- "search": {
984
- "$ref": "#/definitions/dto.HomeSearch"
985
- },
986
- "user": {
987
- "$ref": "#/definitions/dto.HomeUser"
988
- },
989
- "week_schedule": {
990
- "$ref": "#/definitions/dto.HomeWeekSchedule"
991
  }
992
  }
993
  },
994
- "dto.HomeResponseWrapper": {
995
  "type": "object",
996
  "properties": {
997
- "data": {
998
- "$ref": "#/definitions/dto.HomeResponse"
999
  },
1000
- "message": {
 
 
 
 
1001
  "type": "string"
1002
  },
1003
- "success": {
1004
- "type": "boolean"
1005
  }
1006
  }
1007
  },
1008
- "dto.HomeSearch": {
1009
  "type": "object",
 
 
 
 
1010
  "properties": {
1011
- "placeholder": {
 
 
 
1012
  "type": "string"
1013
  }
1014
  }
1015
  },
1016
- "dto.HomeUser": {
1017
  "type": "object",
 
 
 
 
 
1018
  "properties": {
1019
- "avatar_url": {
1020
  "type": "string"
1021
  },
1022
- "first_name": {
1023
  "type": "string"
1024
  },
1025
- "full_name": {
1026
  "type": "string"
1027
  },
1028
- "id": {
1029
  "type": "string"
1030
  }
1031
  }
1032
  },
1033
- "dto.HomeWeekSchedule": {
1034
  "type": "object",
1035
  "properties": {
1036
- "days": {
1037
- "type": "array",
1038
- "items": {
1039
- "$ref": "#/definitions/dto.HomeDay"
1040
- }
1041
- },
1042
- "end_date": {
1043
- "type": "string"
1044
- },
1045
- "items": {
1046
- "type": "array",
1047
- "items": {
1048
- "$ref": "#/definitions/dto.ScheduleItem"
1049
- }
1050
- },
1051
- "selected_date": {
1052
- "type": "string"
1053
- },
1054
- "start_date": {
1055
  "type": "string"
1056
  },
1057
- "view_all_url": {
1058
- "type": "string"
1059
  },
1060
- "week_label": {
1061
  "type": "string"
1062
  }
1063
  }
1064
  },
1065
- "dto.Pagination": {
1066
  "type": "object",
1067
  "properties": {
1068
- "has_next_page": {
1069
- "type": "boolean"
1070
- },
1071
- "limit": {
1072
- "type": "integer"
1073
- },
1074
- "page": {
1075
- "type": "integer"
1076
- },
1077
- "total_items": {
1078
- "type": "integer"
1079
- },
1080
- "total_pages": {
1081
- "type": "integer"
1082
  }
1083
  }
1084
  },
1085
- "dto.PaginationMeta": {
1086
  "type": "object",
1087
  "properties": {
1088
- "limit": {
1089
- "type": "integer"
1090
- },
1091
- "page": {
1092
- "type": "integer"
1093
- },
1094
- "total_items": {
1095
- "type": "integer"
1096
- },
1097
- "total_pages": {
1098
- "type": "integer"
1099
  }
1100
  }
1101
  },
1102
- "dto.PriceData": {
1103
  "type": "object",
1104
  "properties": {
1105
- "amount": {
1106
- "type": "integer"
1107
  },
1108
- "currency": {
1109
  "type": "string"
1110
  },
1111
- "display": {
 
 
 
 
 
 
1112
  "type": "string"
1113
  }
1114
  }
1115
  },
1116
- "dto.PriceInfo": {
1117
  "type": "object",
 
 
 
1118
  "properties": {
1119
- "currency": {
1120
  "type": "string"
1121
- },
1122
- "display": {
 
 
 
 
 
 
 
 
1123
  "type": "string"
1124
- },
1125
- "max_amount": {
1126
- "type": "number"
1127
- },
1128
- "min_amount": {
1129
- "type": "number"
1130
  }
1131
  }
1132
  },
1133
- "dto.ScheduleItem": {
1134
  "type": "object",
1135
  "properties": {
1136
  "city": {
1137
  "type": "string"
1138
  },
1139
- "class_id": {
1140
  "type": "string"
1141
  },
1142
- "date": {
1143
  "type": "string"
1144
  },
1145
- "display_time": {
1146
  "type": "string"
1147
  },
1148
- "end_time": {
1149
  "type": "string"
1150
  },
1151
- "is_booked": {
1152
- "type": "boolean"
1153
  },
1154
- "schedule_id": {
1155
  "type": "string"
1156
  },
1157
- "start_time": {
 
 
 
 
 
 
 
 
 
1158
  "type": "string"
1159
  },
1160
- "studio_name": {
1161
  "type": "string"
1162
  },
1163
- "teacher_name": {
1164
  "type": "string"
1165
  },
1166
- "title": {
1167
  "type": "string"
 
 
 
 
 
 
1168
  }
1169
  }
1170
  },
1171
- "dto.ScheduleListItem": {
1172
  "type": "object",
1173
  "properties": {
1174
- "address": {
1175
  "type": "string"
1176
  },
1177
- "available_slots": {
1178
- "type": "integer"
1179
- },
1180
- "category": {
1181
  "type": "string"
 
 
 
 
 
 
 
 
1182
  },
1183
- "city": {
1184
- "type": "string"
 
 
 
 
1185
  },
1186
- "class_id": {
1187
  "type": "string"
1188
  },
1189
- "date": {
1190
- "type": "string"
 
 
 
 
1191
  },
1192
- "display_time": {
1193
  "type": "string"
1194
  },
1195
- "end_time": {
1196
  "type": "string"
1197
  },
1198
- "is_booked": {
1199
- "type": "boolean"
1200
  },
1201
- "level": {
1202
  "type": "string"
1203
  },
1204
  "price": {
1205
- "$ref": "#/definitions/dto.PriceData"
1206
- },
1207
- "schedule_id": {
1208
- "type": "string"
1209
  },
1210
- "start_time": {
1211
  "type": "string"
1212
  },
1213
- "studio_name": {
1214
  "type": "string"
1215
  },
1216
- "teacher_name": {
1217
  "type": "string"
1218
  },
1219
- "thumbnail_url": {
1220
- "type": "string"
1221
  },
1222
- "title": {
1223
  "type": "string"
1224
  }
1225
  }
1226
  },
1227
- "dto.ScheduleListResponse": {
1228
  "type": "object",
1229
  "properties": {
1230
- "items": {
 
 
 
 
 
 
1231
  "type": "array",
1232
  "items": {
1233
- "$ref": "#/definitions/dto.ScheduleListItem"
 
1234
  }
1235
  },
1236
- "pagination": {
1237
- "$ref": "#/definitions/dto.PaginationMeta"
1238
- }
1239
- }
1240
- },
1241
- "dto.ScheduleListResponseWrapper": {
1242
- "type": "object",
1243
- "properties": {
1244
- "data": {
1245
- "$ref": "#/definitions/dto.ScheduleListResponse"
1246
  },
1247
- "message": {
1248
  "type": "string"
1249
  },
1250
- "success": {
1251
- "type": "boolean"
 
 
 
 
 
 
 
 
 
 
1252
  }
1253
  }
1254
  },
1255
- "dto.SearchClassesResponse": {
1256
  "type": "object",
1257
  "properties": {
1258
- "current_location": {
1259
- "$ref": "#/definitions/dto.CurrentLocation"
 
 
 
 
1260
  },
1261
- "nearby_classes": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1262
  "type": "array",
1263
  "items": {
1264
- "$ref": "#/definitions/dto.ClassSearchResult"
 
1265
  }
1266
  },
1267
- "pagination": {
1268
- "$ref": "#/definitions/dto.Pagination"
1269
  },
1270
- "previous_classes": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1271
  "type": "array",
1272
  "items": {
1273
- "$ref": "#/definitions/dto.ClassSearchResult"
1274
  }
1275
  },
1276
- "search_context": {
1277
- "$ref": "#/definitions/dto.SearchContext"
1278
  }
1279
  }
1280
  },
1281
- "dto.SearchContext": {
1282
  "type": "object",
1283
  "properties": {
1284
- "query": {
1285
  "type": "string"
1286
  },
1287
- "selected_filters": {
1288
- "type": "object",
1289
- "additionalProperties": true
1290
  },
1291
- "sort_by": {
1292
  "type": "string"
1293
  },
1294
- "view_type": {
 
 
 
1295
  "type": "string"
1296
  }
1297
  }
1298
  },
1299
- "dto.SortOption": {
1300
  "type": "object",
1301
  "properties": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1302
  "id": {
1303
  "type": "string"
1304
  },
1305
- "is_default": {
1306
- "type": "boolean"
 
1307
  },
1308
- "label": {
 
 
 
 
 
 
 
 
1309
  "type": "string"
1310
- }
1311
- }
1312
- },
1313
- "dto.SuccessResponse-any": {
1314
- "type": "object",
1315
- "properties": {
1316
- "data": {},
1317
- "message": {},
1318
- "meta_data": {},
1319
- "status": {
 
 
 
 
 
 
 
 
 
 
 
1320
  "type": "string"
1321
  }
1322
  }
1323
  },
1324
- "dto.SummaryLocation": {
1325
  "type": "object",
1326
  "properties": {
1327
- "display": {
1328
  "type": "string"
1329
  },
1330
- "venue_name": {
 
 
 
 
 
 
1331
  "type": "string"
1332
  }
1333
  }
 
20
  "host": "lifedebugger-danzapp-be-test.hf.space",
21
  "basePath": "/",
22
  "paths": {
23
+ "/api/v1/auth/otp/request": {
24
+ "post": {
25
+ "description": "Trigger an OTP code via WhatsApp for phone number verification.",
26
  "consumes": [
27
  "application/json"
28
  ],
 
30
  "application/json"
31
  ],
32
  "tags": [
33
+ "Auth"
34
+ ],
35
+ "summary": "Request OTP",
36
+ "parameters": [
37
+ {
38
+ "description": "OTP Request Data",
39
+ "name": "request",
40
+ "in": "body",
41
+ "required": true,
42
+ "schema": {
43
+ "$ref": "#/definitions/dto.OTPRequestInput"
44
+ }
45
+ }
46
  ],
 
47
  "responses": {
48
  "200": {
49
  "description": "OK",
50
  "schema": {
51
+ "$ref": "#/definitions/dto.OTPRequestResponse"
52
  }
53
  },
54
  "400": {
 
60
  }
61
  }
62
  },
63
+ "/api/v1/auth/otp/verify": {
64
+ "post": {
65
+ "description": "Validate the OTP code provided by the user and return authentication token.",
 
 
 
 
 
66
  "consumes": [
67
  "application/json"
68
  ],
 
70
  "application/json"
71
  ],
72
  "tags": [
73
+ "Auth"
74
+ ],
75
+ "summary": "Verify OTP",
76
+ "parameters": [
77
+ {
78
+ "description": "OTP Verification Data",
79
+ "name": "request",
80
+ "in": "body",
81
+ "required": true,
82
+ "schema": {
83
+ "$ref": "#/definitions/dto.OTPVerifyInput"
84
+ }
85
+ }
86
  ],
 
87
  "responses": {
88
  "200": {
89
  "description": "OK",
90
  "schema": {
91
+ "$ref": "#/definitions/dto.OTPVerifyResponse"
92
  }
93
  },
94
  "400": {
 
96
  "schema": {
97
  "$ref": "#/definitions/dto.ErrorResponse"
98
  }
 
 
 
 
 
 
99
  }
100
  }
101
  }
102
  },
103
+ "/api/v1/authentication/change-password": {
104
+ "put": {
105
  "security": [
106
  {
107
  "BearerAuth": []
108
  }
109
  ],
110
+ "description": "Update password for the logged-in user.",
111
  "consumes": [
112
  "application/json"
113
  ],
 
115
  "application/json"
116
  ],
117
  "tags": [
118
+ "Auth"
119
  ],
120
+ "summary": "Change Password",
121
  "parameters": [
122
  {
123
+ "description": "Password Change Data",
124
+ "name": "request",
125
+ "in": "body",
126
+ "required": true,
127
+ "schema": {
128
+ "$ref": "#/definitions/dto.ChangePasswordRequest"
129
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  }
131
  ],
132
  "responses": {
133
  "200": {
134
  "description": "OK",
135
  "schema": {
136
+ "$ref": "#/definitions/dto.AuthenticatedUser"
137
  }
138
  },
139
  "400": {
 
151
  }
152
  }
153
  },
154
+ "/api/v1/authentication/login": {
155
+ "post": {
156
+ "description": "Authenticate user via email/username and password.",
 
 
 
 
 
157
  "consumes": [
158
  "application/json"
159
  ],
 
161
  "application/json"
162
  ],
163
  "tags": [
164
+ "Auth"
165
  ],
166
+ "summary": "Sign In",
167
  "parameters": [
168
  {
169
+ "description": "Sign In Data",
170
+ "name": "request",
171
+ "in": "body",
172
+ "required": true,
173
+ "schema": {
174
+ "$ref": "#/definitions/dto.SignInRequest"
175
+ }
176
  }
177
  ],
178
  "responses": {
179
  "200": {
180
  "description": "OK",
181
  "schema": {
182
+ "$ref": "#/definitions/dto.AuthenticatedUser"
 
 
 
 
 
 
183
  }
184
  },
185
+ "401": {
186
+ "description": "Unauthorized",
187
  "schema": {
188
  "$ref": "#/definitions/dto.ErrorResponse"
189
  }
 
191
  }
192
  }
193
  },
194
+ "/api/v1/authentication/register": {
195
+ "post": {
196
+ "description": "Register a new user with name, email, username and password.",
197
  "consumes": [
198
  "application/json"
199
  ],
 
201
  "application/json"
202
  ],
203
  "tags": [
204
+ "Auth"
205
+ ],
206
+ "summary": "Sign Up",
207
+ "parameters": [
208
+ {
209
+ "description": "Sign Up Data",
210
+ "name": "request",
211
+ "in": "body",
212
+ "required": true,
213
+ "schema": {
214
+ "$ref": "#/definitions/dto.SignUpRequest"
215
+ }
216
+ }
217
  ],
 
218
  "responses": {
219
  "200": {
220
  "description": "OK",
221
  "schema": {
222
+ "$ref": "#/definitions/entities.User"
223
  }
224
  },
225
  "400": {
 
231
  }
232
  }
233
  },
234
+ "/api/v1/authentication/role/{userId}": {
235
+ "put": {
236
+ "description": "Update user role. Note: This is an older endpoint, consider using /api/v1/users/me/roles instead.",
 
 
 
 
 
237
  "consumes": [
238
  "application/json"
239
  ],
 
241
  "application/json"
242
  ],
243
  "tags": [
244
+ "Users"
245
  ],
246
+ "summary": "Update User Role (Legacy)",
247
  "parameters": [
248
  {
249
  "type": "string",
250
+ "description": "User ID",
251
+ "name": "userId",
252
+ "in": "path",
253
+ "required": true
 
 
 
 
 
 
 
 
 
 
 
254
  },
255
  {
256
+ "description": "Role Update Data",
257
+ "name": "request",
258
+ "in": "body",
259
+ "required": true,
260
+ "schema": {
261
+ "$ref": "#/definitions/dto.UpdateUserRoleRequest"
262
+ }
263
  }
264
  ],
265
  "responses": {
266
  "200": {
267
  "description": "OK",
268
  "schema": {
269
+ "$ref": "#/definitions/entities.User"
270
  }
271
  },
272
  "400": {
 
278
  }
279
  }
280
  },
281
+ "/api/v1/class-categories": {
282
+ "get": {
283
+ "description": "Get master list of class categories",
284
  "consumes": [
285
  "application/json"
286
  ],
 
288
  "application/json"
289
  ],
290
  "tags": [
291
+ "Master Data"
 
 
 
 
 
 
 
 
 
 
 
 
 
292
  ],
293
+ "summary": "Get Class Categories",
294
  "responses": {
295
  "200": {
296
  "description": "OK",
297
  "schema": {
298
+ "$ref": "#/definitions/dto.CategoryResponseWrapper"
299
  }
300
  },
301
  "400": {
 
307
  }
308
  }
309
  },
310
+ "/api/v1/classes": {
311
+ "post": {
312
  "security": [
313
  {
314
  "BearerAuth": []
315
  }
316
  ],
317
+ "description": "Allows an instructor to create/host a new class. Automatically creates an instructor profile if one doesn't exist.",
318
  "consumes": [
319
  "application/json"
320
  ],
 
322
  "application/json"
323
  ],
324
  "tags": [
325
+ "Classes"
326
  ],
327
+ "summary": "Host a Class",
328
  "parameters": [
329
  {
330
+ "description": "Class Creation Data",
331
+ "name": "request",
332
+ "in": "body",
333
+ "required": true,
334
+ "schema": {
335
+ "$ref": "#/definitions/dto.CreateClassRequest"
336
+ }
337
+ }
338
+ ],
339
+ "responses": {
340
+ "201": {
341
+ "description": "Created",
342
+ "schema": {
343
+ "$ref": "#/definitions/entities.Class"
344
+ }
345
  },
346
+ "400": {
347
+ "description": "Bad Request",
348
+ "schema": {
349
+ "$ref": "#/definitions/dto.ErrorResponse"
350
+ }
351
+ },
352
+ "401": {
353
+ "description": "Unauthorized",
354
+ "schema": {
355
+ "$ref": "#/definitions/dto.ErrorResponse"
356
+ }
357
+ },
358
+ "403": {
359
+ "description": "Forbidden",
360
+ "schema": {
361
+ "$ref": "#/definitions/dto.ErrorResponse"
362
+ }
363
+ }
364
+ }
365
+ }
366
+ },
367
+ "/api/v1/classes/filters": {
368
+ "get": {
369
+ "security": [
370
+ {
371
+ "BearerAuth": []
372
+ }
373
+ ],
374
+ "description": "Returns available filter options for class search",
375
+ "consumes": [
376
+ "application/json"
377
+ ],
378
+ "produces": [
379
+ "application/json"
380
+ ],
381
+ "tags": [
382
+ "Classes"
383
+ ],
384
+ "summary": "Get Class Filters Metadata",
385
+ "responses": {
386
+ "200": {
387
+ "description": "OK",
388
+ "schema": {
389
+ "$ref": "#/definitions/dto.FiltersMetadataResponse"
390
+ }
391
+ },
392
+ "400": {
393
+ "description": "Bad Request",
394
+ "schema": {
395
+ "$ref": "#/definitions/dto.ErrorResponse"
396
+ }
397
  },
398
+ "401": {
399
+ "description": "Unauthorized",
400
+ "schema": {
401
+ "$ref": "#/definitions/dto.ErrorResponse"
402
+ }
403
+ }
404
+ }
405
+ }
406
+ },
407
+ "/api/v1/classes/search": {
408
+ "get": {
409
+ "security": [
410
+ {
411
+ "BearerAuth": []
412
+ }
413
+ ],
414
+ "description": "Search classes with filters and sorting options",
415
+ "consumes": [
416
+ "application/json"
417
+ ],
418
+ "produces": [
419
+ "application/json"
420
+ ],
421
+ "tags": [
422
+ "Classes"
423
+ ],
424
+ "summary": "Search for Classes",
425
+ "parameters": [
426
  {
427
  "type": "string",
428
+ "description": "Search query",
429
+ "name": "q",
430
  "in": "query"
431
  },
432
  {
433
  "type": "string",
434
+ "description": "Location name",
435
+ "name": "location_name",
436
+ "in": "query"
437
+ },
438
+ {
439
+ "type": "number",
440
+ "description": "User latitude",
441
+ "name": "latitude",
442
+ "in": "query"
443
+ },
444
+ {
445
+ "type": "number",
446
+ "description": "User longitude",
447
+ "name": "longitude",
448
  "in": "query"
449
  },
450
  {
451
  "type": "string",
452
+ "default": "nearest",
453
+ "description": "Sort by (nearest|popular|rating|newest)",
454
+ "name": "sort_by",
455
  "in": "query"
456
  },
457
  {
458
  "type": "integer",
459
+ "default": 1,
460
+ "description": "Page number",
461
  "name": "page",
462
  "in": "query"
463
  },
464
  {
465
  "type": "integer",
466
+ "default": 10,
467
+ "description": "Items per page",
468
  "name": "limit",
469
  "in": "query"
470
+ },
471
+ {
472
+ "type": "string",
473
+ "default": "class",
474
+ "description": "View type",
475
+ "name": "view_type",
476
+ "in": "query"
477
+ },
478
+ {
479
+ "type": "string",
480
+ "default": "all",
481
+ "description": "Category",
482
+ "name": "category",
483
+ "in": "query"
484
+ },
485
+ {
486
+ "type": "string",
487
+ "description": "Dance type",
488
+ "name": "dance_type",
489
+ "in": "query"
490
  }
491
  ],
492
  "responses": {
493
  "200": {
494
  "description": "OK",
495
  "schema": {
496
+ "$ref": "#/definitions/dto.SearchClassesResponse"
497
+ }
498
+ },
499
+ "400": {
500
+ "description": "Bad Request",
501
+ "schema": {
502
+ "$ref": "#/definitions/dto.ErrorResponse"
503
+ }
504
+ },
505
+ "401": {
506
+ "description": "Unauthorized",
507
+ "schema": {
508
+ "$ref": "#/definitions/dto.ErrorResponse"
509
+ }
510
+ }
511
+ }
512
+ }
513
+ },
514
+ "/api/v1/classes/{class_id}": {
515
+ "get": {
516
+ "security": [
517
+ {
518
+ "BearerAuth": []
519
+ }
520
+ ],
521
+ "description": "Return comprehensive class information needed to render the detail page.",
522
+ "consumes": [
523
+ "application/json"
524
+ ],
525
+ "produces": [
526
+ "application/json"
527
+ ],
528
+ "tags": [
529
+ "Classes"
530
+ ],
531
+ "summary": "Get Class Details",
532
+ "parameters": [
533
+ {
534
+ "type": "string",
535
+ "description": "Class ID",
536
+ "name": "class_id",
537
+ "in": "path",
538
+ "required": true
539
+ }
540
+ ],
541
+ "responses": {
542
+ "200": {
543
+ "description": "OK",
544
+ "schema": {
545
+ "$ref": "#/definitions/dto.ClassDetailResponse"
546
+ }
547
+ },
548
+ "400": {
549
+ "description": "Bad Request",
550
+ "schema": {
551
+ "$ref": "#/definitions/dto.ErrorResponse"
552
+ }
553
+ },
554
+ "404": {
555
+ "description": "Not Found",
556
+ "schema": {
557
+ "$ref": "#/definitions/dto.ErrorResponse"
558
+ }
559
+ }
560
+ }
561
+ }
562
+ },
563
+ "/api/v1/event-categories": {
564
+ "get": {
565
+ "description": "Get master list of event categories",
566
+ "consumes": [
567
+ "application/json"
568
+ ],
569
+ "produces": [
570
+ "application/json"
571
+ ],
572
+ "tags": [
573
+ "Master Data"
574
+ ],
575
+ "summary": "Get Event Categories",
576
+ "responses": {
577
+ "200": {
578
+ "description": "OK",
579
+ "schema": {
580
+ "$ref": "#/definitions/dto.CategoryResponseWrapper"
581
  }
582
  },
583
  "400": {
 
588
  }
589
  }
590
  }
591
+ },
592
+ "/api/v1/home": {
593
+ "get": {
594
+ "security": [
595
+ {
596
+ "BearerAuth": []
597
+ }
598
+ ],
599
+ "description": "Return all sections needed by the home page in one aggregated response.",
600
+ "consumes": [
601
+ "application/json"
602
+ ],
603
+ "produces": [
604
+ "application/json"
605
+ ],
606
+ "tags": [
607
+ "Home Dashboard"
608
+ ],
609
+ "summary": "Get Home Page Data",
610
+ "parameters": [
611
+ {
612
+ "type": "string",
613
+ "description": "Selected date for schedule card section (YYYY-MM-DD)",
614
+ "name": "date",
615
+ "in": "query"
616
+ },
617
+ {
618
+ "type": "number",
619
+ "description": "User latitude",
620
+ "name": "latitude",
621
+ "in": "query"
622
+ },
623
+ {
624
+ "type": "number",
625
+ "description": "User longitude",
626
+ "name": "longitude",
627
+ "in": "query"
628
+ },
629
+ {
630
+ "type": "string",
631
+ "description": "User city",
632
+ "name": "city",
633
+ "in": "query"
634
+ }
635
+ ],
636
+ "responses": {
637
+ "200": {
638
+ "description": "OK",
639
+ "schema": {
640
+ "$ref": "#/definitions/dto.HomeResponseWrapper"
641
+ }
642
+ },
643
+ "400": {
644
+ "description": "Bad Request",
645
+ "schema": {
646
+ "$ref": "#/definitions/dto.ErrorResponse"
647
+ }
648
+ }
649
+ }
650
+ }
651
+ },
652
+ "/api/v1/payment/callback": {
653
+ "post": {
654
+ "description": "Receive and process payment status updates from Xendit",
655
+ "consumes": [
656
+ "application/json"
657
+ ],
658
+ "produces": [
659
+ "application/json"
660
+ ],
661
+ "tags": [
662
+ "Payment"
663
+ ],
664
+ "summary": "Handle Xendit Payment Callback",
665
+ "parameters": [
666
+ {
667
+ "description": "Xendit Callback Payload",
668
+ "name": "request",
669
+ "in": "body",
670
+ "required": true,
671
+ "schema": {
672
+ "type": "object",
673
+ "additionalProperties": true
674
+ }
675
+ }
676
+ ],
677
+ "responses": {
678
+ "200": {
679
+ "description": "OK",
680
+ "schema": {
681
+ "$ref": "#/definitions/dto.SuccessResponse-any"
682
+ }
683
+ },
684
+ "400": {
685
+ "description": "Bad Request",
686
+ "schema": {
687
+ "$ref": "#/definitions/dto.ErrorResponse"
688
+ }
689
+ }
690
+ }
691
+ }
692
+ },
693
+ "/api/v1/schedules": {
694
+ "get": {
695
+ "security": [
696
+ {
697
+ "BearerAuth": []
698
+ }
699
+ ],
700
+ "description": "Get a list of class or event schedules based on date range, city, filters, etc.",
701
+ "consumes": [
702
+ "application/json"
703
+ ],
704
+ "produces": [
705
+ "application/json"
706
+ ],
707
+ "tags": [
708
+ "Home Dashboard"
709
+ ],
710
+ "summary": "Get Schedule List",
711
+ "parameters": [
712
+ {
713
+ "type": "string",
714
+ "description": "Exact date (YYYY-MM-DD)",
715
+ "name": "date",
716
+ "in": "query"
717
+ },
718
+ {
719
+ "type": "string",
720
+ "description": "Start date range (YYYY-MM-DD)",
721
+ "name": "start_date",
722
+ "in": "query"
723
+ },
724
+ {
725
+ "type": "string",
726
+ "description": "End date range (YYYY-MM-DD)",
727
+ "name": "end_date",
728
+ "in": "query"
729
+ },
730
+ {
731
+ "type": "string",
732
+ "description": "Filter by city",
733
+ "name": "city",
734
+ "in": "query"
735
+ },
736
+ {
737
+ "type": "string",
738
+ "description": "Filter by class level (e.g., beginner)",
739
+ "name": "level",
740
+ "in": "query"
741
+ },
742
+ {
743
+ "type": "string",
744
+ "description": "Filter by class category (e.g., salsa)",
745
+ "name": "category",
746
+ "in": "query"
747
+ },
748
+ {
749
+ "type": "integer",
750
+ "description": "Page number (default: 1)",
751
+ "name": "page",
752
+ "in": "query"
753
+ },
754
+ {
755
+ "type": "integer",
756
+ "description": "Items per page (default: 10, max: 100)",
757
+ "name": "limit",
758
+ "in": "query"
759
+ }
760
+ ],
761
+ "responses": {
762
+ "200": {
763
+ "description": "OK",
764
+ "schema": {
765
+ "$ref": "#/definitions/dto.ScheduleListResponseWrapper"
766
+ }
767
+ },
768
+ "400": {
769
+ "description": "Bad Request",
770
+ "schema": {
771
+ "$ref": "#/definitions/dto.ErrorResponse"
772
+ }
773
+ }
774
+ }
775
+ }
776
+ },
777
+ "/api/v1/users/me": {
778
+ "get": {
779
+ "security": [
780
+ {
781
+ "BearerAuth": []
782
+ }
783
+ ],
784
+ "description": "Get current logged-in user profile, including roles and about details.",
785
+ "consumes": [
786
+ "application/json"
787
+ ],
788
+ "produces": [
789
+ "application/json"
790
+ ],
791
+ "tags": [
792
+ "Users"
793
+ ],
794
+ "summary": "Get My Profile",
795
+ "responses": {
796
+ "200": {
797
+ "description": "OK",
798
+ "schema": {
799
+ "$ref": "#/definitions/dto.UserProfileResponse"
800
+ }
801
+ },
802
+ "401": {
803
+ "description": "Unauthorized",
804
+ "schema": {
805
+ "$ref": "#/definitions/dto.ErrorResponse"
806
+ }
807
+ }
808
+ }
809
+ }
810
+ },
811
+ "/api/v1/users/me/about": {
812
+ "put": {
813
+ "security": [
814
+ {
815
+ "BearerAuth": []
816
+ }
817
+ ],
818
+ "description": "Update user's personal details like gender, dance level, and description.",
819
+ "consumes": [
820
+ "application/json"
821
+ ],
822
+ "produces": [
823
+ "application/json"
824
+ ],
825
+ "tags": [
826
+ "Users"
827
+ ],
828
+ "summary": "Update About You",
829
+ "parameters": [
830
+ {
831
+ "description": "Update Profile Data",
832
+ "name": "request",
833
+ "in": "body",
834
+ "required": true,
835
+ "schema": {
836
+ "$ref": "#/definitions/dto.UpdateAboutYouRequest"
837
+ }
838
+ }
839
+ ],
840
+ "responses": {
841
+ "200": {
842
+ "description": "OK",
843
+ "schema": {
844
+ "$ref": "#/definitions/dto.UserProfileResponse"
845
+ }
846
+ },
847
+ "400": {
848
+ "description": "Bad Request",
849
+ "schema": {
850
+ "$ref": "#/definitions/dto.ErrorResponse"
851
+ }
852
+ },
853
+ "401": {
854
+ "description": "Unauthorized",
855
+ "schema": {
856
+ "$ref": "#/definitions/dto.ErrorResponse"
857
+ }
858
+ }
859
+ }
860
+ }
861
+ },
862
+ "/api/v1/users/me/roles": {
863
+ "put": {
864
+ "security": [
865
+ {
866
+ "BearerAuth": []
867
+ }
868
+ ],
869
+ "description": "Update user's primary role (member, instructor, venue_owner).",
870
+ "consumes": [
871
+ "application/json"
872
+ ],
873
+ "produces": [
874
+ "application/json"
875
+ ],
876
+ "tags": [
877
+ "Users"
878
+ ],
879
+ "summary": "Assign Role",
880
+ "parameters": [
881
+ {
882
+ "description": "Role Assignment Data",
883
+ "name": "request",
884
+ "in": "body",
885
+ "required": true,
886
+ "schema": {
887
+ "$ref": "#/definitions/dto.UpdateUserRolesRequest"
888
+ }
889
+ }
890
+ ],
891
+ "responses": {
892
+ "200": {
893
+ "description": "OK",
894
+ "schema": {
895
+ "$ref": "#/definitions/dto.UserProfileResponse"
896
+ }
897
+ },
898
+ "400": {
899
+ "description": "Bad Request",
900
+ "schema": {
901
+ "$ref": "#/definitions/dto.ErrorResponse"
902
+ }
903
+ },
904
+ "401": {
905
+ "description": "Unauthorized",
906
+ "schema": {
907
+ "$ref": "#/definitions/dto.ErrorResponse"
908
+ }
909
+ }
910
+ }
911
+ }
912
+ },
913
+ "/api/v1/users/{id}": {
914
+ "get": {
915
+ "security": [
916
+ {
917
+ "BearerAuth": []
918
+ }
919
+ ],
920
+ "description": "Get public profile and roles of another user by their ID.",
921
+ "consumes": [
922
+ "application/json"
923
+ ],
924
+ "produces": [
925
+ "application/json"
926
+ ],
927
+ "tags": [
928
+ "Users"
929
+ ],
930
+ "summary": "Get User Details",
931
+ "parameters": [
932
+ {
933
+ "type": "string",
934
+ "description": "User ID",
935
+ "name": "id",
936
+ "in": "path",
937
+ "required": true
938
+ }
939
+ ],
940
+ "responses": {
941
+ "200": {
942
+ "description": "OK",
943
+ "schema": {
944
+ "$ref": "#/definitions/dto.UserProfileResponse"
945
+ }
946
+ },
947
+ "404": {
948
+ "description": "Not Found",
949
+ "schema": {
950
+ "$ref": "#/definitions/dto.ErrorResponse"
951
+ }
952
+ }
953
+ }
954
+ }
955
+ }
956
+ },
957
+ "definitions": {
958
+ "dto.AuthenticatedUser": {
959
+ "type": "object",
960
+ "properties": {
961
+ "token": {
962
+ "type": "string"
963
+ },
964
+ "user": {
965
+ "$ref": "#/definitions/entities.User"
966
+ }
967
+ }
968
+ },
969
+ "dto.CategoryResponse": {
970
+ "type": "object",
971
+ "properties": {
972
+ "id": {
973
+ "type": "string"
974
+ },
975
+ "image_url": {
976
+ "type": "string"
977
+ },
978
+ "name": {
979
+ "type": "string"
980
+ }
981
+ }
982
+ },
983
+ "dto.CategoryResponseWrapper": {
984
+ "type": "object",
985
+ "properties": {
986
+ "data": {
987
+ "type": "array",
988
+ "items": {
989
+ "$ref": "#/definitions/dto.CategoryResponse"
990
+ }
991
+ },
992
+ "success": {
993
+ "type": "boolean"
994
+ }
995
+ }
996
+ },
997
+ "dto.ChangePasswordRequest": {
998
+ "type": "object",
999
+ "required": [
1000
+ "new_password",
1001
+ "old_password"
1002
+ ],
1003
+ "properties": {
1004
+ "new_password": {
1005
+ "type": "string"
1006
+ },
1007
+ "old_password": {
1008
+ "type": "string"
1009
+ }
1010
+ }
1011
+ },
1012
+ "dto.ClassBooking": {
1013
+ "type": "object",
1014
+ "properties": {
1015
+ "booking_type": {
1016
+ "type": "string"
1017
+ },
1018
+ "button_text": {
1019
+ "type": "string"
1020
+ },
1021
+ "is_bookable": {
1022
+ "type": "boolean"
1023
+ },
1024
+ "starting_price": {
1025
+ "$ref": "#/definitions/dto.PriceData"
1026
+ }
1027
+ }
1028
+ },
1029
+ "dto.ClassDescription": {
1030
+ "type": "object",
1031
+ "properties": {
1032
+ "full_text": {
1033
+ "type": "string"
1034
+ },
1035
+ "is_truncated": {
1036
+ "type": "boolean"
1037
+ },
1038
+ "short_text": {
1039
+ "type": "string"
1040
+ }
1041
+ }
1042
+ },
1043
+ "dto.ClassDetailResponse": {
1044
+ "type": "object",
1045
+ "properties": {
1046
+ "booking": {
1047
+ "$ref": "#/definitions/dto.ClassBooking"
1048
+ },
1049
+ "cancellation_policy": {
1050
+ "type": "array",
1051
+ "items": {
1052
+ "type": "string"
1053
+ }
1054
+ },
1055
+ "class_id": {
1056
+ "type": "string"
1057
+ },
1058
+ "description": {
1059
+ "$ref": "#/definitions/dto.ClassDescription"
1060
+ },
1061
+ "details": {
1062
+ "type": "array",
1063
+ "items": {
1064
+ "type": "string"
1065
+ }
1066
+ },
1067
+ "extra_lessons": {
1068
+ "$ref": "#/definitions/dto.ClassExtraLessons"
1069
+ },
1070
+ "favorite": {
1071
+ "$ref": "#/definitions/dto.ClassFavorite"
1072
+ },
1073
+ "gallery": {
1074
+ "type": "array",
1075
+ "items": {
1076
+ "$ref": "#/definitions/dto.ClassGalleryItem"
1077
+ }
1078
+ },
1079
+ "hero_image_url": {
1080
+ "type": "string"
1081
+ },
1082
+ "house_dancer": {
1083
+ "$ref": "#/definitions/dto.ClassHouseDancer"
1084
+ },
1085
+ "instructor": {
1086
+ "$ref": "#/definitions/dto.ClassInstructor"
1087
+ },
1088
+ "location": {
1089
+ "$ref": "#/definitions/dto.ClassLocation"
1090
+ },
1091
+ "rating": {
1092
+ "$ref": "#/definitions/dto.ClassRating"
1093
+ },
1094
+ "share": {
1095
+ "$ref": "#/definitions/dto.ClassShare"
1096
+ },
1097
+ "summary": {
1098
+ "$ref": "#/definitions/dto.ClassSummary"
1099
+ },
1100
+ "tags": {
1101
+ "type": "array",
1102
+ "items": {
1103
+ "$ref": "#/definitions/dto.ClassTag"
1104
+ }
1105
+ },
1106
+ "title": {
1107
+ "type": "string"
1108
+ },
1109
+ "type": {
1110
+ "type": "string"
1111
+ }
1112
+ }
1113
+ },
1114
+ "dto.ClassExtraLessons": {
1115
+ "type": "object",
1116
+ "properties": {
1117
+ "available": {
1118
+ "type": "boolean"
1119
+ },
1120
+ "description": {
1121
+ "type": "string"
1122
+ }
1123
+ }
1124
+ },
1125
+ "dto.ClassFavorite": {
1126
+ "type": "object",
1127
+ "properties": {
1128
+ "is_favorited": {
1129
+ "type": "boolean"
1130
+ }
1131
+ }
1132
+ },
1133
+ "dto.ClassGalleryItem": {
1134
+ "type": "object",
1135
+ "properties": {
1136
+ "id": {
1137
+ "type": "string"
1138
+ },
1139
+ "image_url": {
1140
+ "type": "string"
1141
+ },
1142
+ "thumbnail_url": {
1143
+ "type": "string"
1144
+ }
1145
+ }
1146
+ },
1147
+ "dto.ClassHouseDancer": {
1148
+ "type": "object",
1149
+ "properties": {
1150
+ "available": {
1151
+ "type": "boolean"
1152
+ },
1153
+ "description": {
1154
+ "type": "string"
1155
+ },
1156
+ "price": {
1157
+ "$ref": "#/definitions/dto.PriceData"
1158
+ }
1159
+ }
1160
+ },
1161
+ "dto.ClassInstructor": {
1162
+ "type": "object",
1163
+ "properties": {
1164
+ "avatar_url": {
1165
+ "type": "string"
1166
+ },
1167
+ "id": {
1168
+ "type": "string"
1169
+ },
1170
+ "is_message_enabled": {
1171
+ "type": "boolean"
1172
+ },
1173
+ "name": {
1174
+ "type": "string"
1175
+ },
1176
+ "subtitle": {
1177
+ "type": "string"
1178
+ },
1179
+ "title": {
1180
+ "type": "string"
1181
+ }
1182
+ }
1183
+ },
1184
+ "dto.ClassLocation": {
1185
+ "type": "object",
1186
+ "properties": {
1187
+ "address": {
1188
+ "type": "string"
1189
+ },
1190
+ "area_text": {
1191
+ "type": "string"
1192
+ },
1193
+ "latitude": {
1194
+ "type": "number"
1195
+ },
1196
+ "longitude": {
1197
+ "type": "number"
1198
+ },
1199
+ "map_preview_url": {
1200
+ "type": "string"
1201
+ },
1202
+ "venue_name": {
1203
+ "type": "string"
1204
+ }
1205
+ }
1206
+ },
1207
+ "dto.ClassRating": {
1208
+ "type": "object",
1209
+ "properties": {
1210
+ "average": {
1211
+ "type": "number"
1212
+ },
1213
+ "count": {
1214
+ "type": "integer"
1215
+ }
1216
+ }
1217
+ },
1218
+ "dto.ClassSearchResult": {
1219
  "type": "object",
1220
  "properties": {
1221
+ "class_id": {
1222
  "type": "string"
1223
  },
1224
+ "distance_km": {
1225
+ "type": "number"
1226
+ },
1227
+ "is_favorited": {
1228
+ "type": "boolean"
1229
+ },
1230
+ "location_text": {
1231
  "type": "string"
1232
  },
1233
+ "price": {
1234
+ "$ref": "#/definitions/dto.PriceInfo"
1235
+ },
1236
+ "schedule_text": {
1237
+ "type": "string"
1238
+ },
1239
+ "thumbnail_url": {
1240
+ "type": "string"
1241
+ },
1242
+ "title": {
1243
  "type": "string"
1244
  }
1245
  }
1246
  },
1247
+ "dto.ClassShare": {
1248
  "type": "object",
1249
  "properties": {
1250
+ "share_text": {
1251
+ "type": "string"
 
 
 
1252
  },
1253
+ "share_url": {
1254
+ "type": "string"
1255
  }
1256
  }
1257
  },
1258
+ "dto.ClassSummary": {
1259
  "type": "object",
1260
  "properties": {
1261
+ "date": {
1262
+ "$ref": "#/definitions/dto.DateDisplay"
 
 
 
1263
  },
1264
+ "location": {
1265
+ "$ref": "#/definitions/dto.SummaryLocation"
1266
  },
1267
  "starting_price": {
1268
  "$ref": "#/definitions/dto.PriceData"
1269
  }
1270
  }
1271
  },
1272
+ "dto.ClassTag": {
1273
  "type": "object",
1274
  "properties": {
1275
+ "key": {
1276
  "type": "string"
1277
  },
1278
+ "label": {
1279
+ "type": "string"
1280
+ }
1281
+ }
1282
+ },
1283
+ "dto.CreateClassRequest": {
1284
+ "type": "object",
1285
+ "required": [
1286
+ "capacity",
1287
+ "end_time",
1288
+ "price",
1289
+ "schedule_type",
1290
+ "start_time",
1291
+ "title"
1292
+ ],
1293
+ "properties": {
1294
+ "capacity": {
1295
+ "type": "integer"
1296
  },
1297
+ "description": {
1298
+ "type": "string"
1299
+ },
1300
+ "end_time": {
1301
+ "type": "string"
1302
+ },
1303
+ "price": {
1304
+ "type": "number"
1305
+ },
1306
+ "schedule_type": {
1307
+ "type": "string"
1308
+ },
1309
+ "start_time": {
1310
+ "type": "string"
1311
+ },
1312
+ "title": {
1313
+ "type": "string"
1314
+ },
1315
+ "venue_id": {
1316
  "type": "string"
1317
  }
1318
  }
1319
  },
1320
+ "dto.CurrentLocation": {
1321
  "type": "object",
1322
  "properties": {
1323
+ "city": {
1324
+ "type": "string"
1325
  },
1326
+ "label": {
1327
+ "type": "string"
 
 
 
1328
  },
1329
+ "latitude": {
1330
+ "type": "number"
1331
+ },
1332
+ "longitude": {
1333
+ "type": "number"
1334
+ }
1335
+ }
1336
+ },
1337
+ "dto.DateDisplay": {
1338
+ "type": "object",
1339
+ "properties": {
1340
+ "display": {
1341
  "type": "string"
1342
  },
1343
+ "raw": {
1344
+ "type": "string"
1345
+ }
1346
+ }
1347
+ },
1348
+ "dto.ErrorResponse": {
1349
+ "type": "object",
1350
+ "properties": {
1351
+ "errors": {},
1352
+ "message": {},
1353
+ "meta_data": {},
1354
+ "status": {
1355
+ "type": "string"
1356
+ }
1357
+ }
1358
+ },
1359
+ "dto.FilterOption": {
1360
+ "type": "object",
1361
+ "properties": {
1362
+ "id": {
1363
+ "type": "string"
1364
  },
1365
+ "is_default": {
1366
+ "type": "boolean"
1367
+ },
1368
+ "label": {
1369
+ "type": "string"
1370
+ }
1371
+ }
1372
+ },
1373
+ "dto.FiltersMetadataResponse": {
1374
+ "type": "object",
1375
+ "properties": {
1376
+ "categories": {
1377
  "type": "array",
1378
  "items": {
1379
+ "$ref": "#/definitions/dto.FilterOption"
1380
  }
1381
  },
1382
+ "dance_types": {
1383
+ "type": "array",
1384
+ "items": {
1385
+ "$ref": "#/definitions/dto.FilterOption"
1386
+ }
1387
  },
1388
+ "sort_options": {
1389
+ "type": "array",
1390
+ "items": {
1391
+ "$ref": "#/definitions/dto.SortOption"
1392
+ }
1393
  },
1394
+ "view_types": {
1395
  "type": "array",
1396
  "items": {
1397
+ "$ref": "#/definitions/dto.FilterOption"
1398
  }
1399
+ }
1400
+ }
1401
+ },
1402
+ "dto.HomeBeginnerClassSection": {
1403
+ "type": "object",
1404
+ "properties": {
1405
+ "id": {
1406
+ "type": "string"
1407
  },
1408
+ "image_url": {
1409
  "type": "string"
1410
  },
1411
+ "name": {
1412
+ "type": "string"
1413
  },
1414
+ "type": {
1415
+ "type": "string"
1416
+ }
1417
+ }
1418
+ },
1419
+ "dto.HomeDay": {
1420
+ "type": "object",
1421
+ "properties": {
1422
+ "date": {
1423
+ "type": "string"
1424
  },
1425
+ "day_name_short": {
1426
+ "type": "string"
1427
  },
1428
+ "day_number": {
1429
+ "type": "integer"
1430
  },
1431
+ "has_schedule": {
1432
+ "type": "boolean"
1433
  },
1434
+ "is_selected": {
1435
+ "type": "boolean"
1436
+ }
1437
+ }
1438
+ },
1439
+ "dto.HomeEventSection": {
1440
+ "type": "object",
1441
+ "properties": {
1442
+ "id": {
1443
+ "type": "string"
1444
  },
1445
+ "image_url": {
1446
+ "type": "string"
 
 
 
1447
  },
1448
+ "name": {
1449
  "type": "string"
1450
  },
1451
  "type": {
 
1453
  }
1454
  }
1455
  },
1456
+ "dto.HomeHeroBanner": {
1457
+ "type": "object",
1458
+ "properties": {
1459
+ "badge_text": {
1460
+ "type": "string"
1461
+ },
1462
+ "cta_target_id": {
1463
+ "type": "string"
1464
+ },
1465
+ "cta_text": {
1466
+ "type": "string"
1467
+ },
1468
+ "cta_type": {
1469
+ "type": "string"
1470
+ },
1471
+ "id": {
1472
+ "type": "string"
1473
+ },
1474
+ "image_url": {
1475
+ "type": "string"
1476
+ },
1477
+ "subtitle": {
1478
+ "type": "string"
1479
+ },
1480
+ "title": {
1481
+ "type": "string"
1482
+ }
1483
+ }
1484
+ },
1485
+ "dto.HomeNotifications": {
1486
  "type": "object",
1487
  "properties": {
1488
+ "unread_count": {
1489
+ "type": "integer"
1490
+ }
1491
+ }
1492
+ },
1493
+ "dto.HomePromoStrip": {
1494
+ "type": "object",
1495
+ "properties": {
1496
+ "cta_target_id": {
1497
+ "type": "string"
1498
  },
1499
+ "cta_text": {
1500
+ "type": "string"
1501
+ },
1502
+ "cta_type": {
1503
+ "type": "string"
1504
+ },
1505
+ "id": {
1506
+ "type": "string"
1507
+ },
1508
+ "text": {
1509
  "type": "string"
1510
  }
1511
  }
1512
  },
1513
+ "dto.HomeResponse": {
1514
  "type": "object",
1515
  "properties": {
1516
+ "beginner_class_sections": {
1517
+ "type": "array",
1518
+ "items": {
1519
+ "$ref": "#/definitions/dto.HomeBeginnerClassSection"
1520
+ }
1521
+ },
1522
+ "event_sections": {
1523
+ "type": "array",
1524
+ "items": {
1525
+ "$ref": "#/definitions/dto.HomeEventSection"
1526
+ }
1527
+ },
1528
+ "hero_banners": {
1529
+ "type": "array",
1530
+ "items": {
1531
+ "$ref": "#/definitions/dto.HomeHeroBanner"
1532
+ }
1533
+ },
1534
+ "notifications": {
1535
+ "$ref": "#/definitions/dto.HomeNotifications"
1536
+ },
1537
+ "promo_strip": {
1538
+ "$ref": "#/definitions/dto.HomePromoStrip"
1539
+ },
1540
+ "search": {
1541
+ "$ref": "#/definitions/dto.HomeSearch"
1542
+ },
1543
+ "user": {
1544
+ "$ref": "#/definitions/dto.HomeUser"
1545
+ },
1546
+ "week_schedule": {
1547
+ "$ref": "#/definitions/dto.HomeWeekSchedule"
1548
  }
1549
  }
1550
  },
1551
+ "dto.HomeResponseWrapper": {
1552
  "type": "object",
1553
  "properties": {
1554
+ "data": {
1555
+ "$ref": "#/definitions/dto.HomeResponse"
1556
  },
1557
+ "message": {
1558
  "type": "string"
1559
  },
1560
+ "success": {
1561
+ "type": "boolean"
1562
  }
1563
  }
1564
  },
1565
+ "dto.HomeSearch": {
1566
  "type": "object",
1567
  "properties": {
1568
+ "placeholder": {
 
 
 
1569
  "type": "string"
 
 
 
1570
  }
1571
  }
1572
  },
1573
+ "dto.HomeUser": {
1574
  "type": "object",
1575
  "properties": {
1576
  "avatar_url": {
1577
  "type": "string"
1578
  },
1579
+ "first_name": {
 
 
 
 
 
 
1580
  "type": "string"
1581
  },
1582
+ "full_name": {
1583
  "type": "string"
1584
  },
1585
+ "id": {
1586
  "type": "string"
1587
  }
1588
  }
1589
  },
1590
+ "dto.HomeWeekSchedule": {
1591
  "type": "object",
1592
  "properties": {
1593
+ "days": {
1594
+ "type": "array",
1595
+ "items": {
1596
+ "$ref": "#/definitions/dto.HomeDay"
1597
+ }
1598
  },
1599
+ "end_date": {
1600
  "type": "string"
1601
  },
1602
+ "items": {
1603
+ "type": "array",
1604
+ "items": {
1605
+ "$ref": "#/definitions/dto.ScheduleItem"
1606
+ }
1607
  },
1608
+ "selected_date": {
1609
+ "type": "string"
1610
  },
1611
+ "start_date": {
1612
  "type": "string"
1613
  },
1614
+ "view_all_url": {
1615
+ "type": "string"
1616
+ },
1617
+ "week_label": {
1618
  "type": "string"
1619
  }
1620
  }
1621
  },
1622
+ "dto.OTPAuth": {
1623
  "type": "object",
1624
  "properties": {
1625
+ "access_token": {
1626
+ "type": "string"
1627
  },
1628
+ "expires_in_seconds": {
1629
  "type": "integer"
1630
+ },
1631
+ "refresh_token": {
1632
+ "type": "string"
1633
+ },
1634
+ "token_type": {
1635
+ "type": "string"
1636
  }
1637
  }
1638
  },
1639
+ "dto.OTPRequestInput": {
1640
  "type": "object",
1641
+ "required": [
1642
+ "channel",
1643
+ "phone_number",
1644
+ "purpose"
1645
+ ],
1646
  "properties": {
1647
+ "app_name": {
1648
  "type": "string"
1649
  },
1650
+ "channel": {
 
 
 
 
 
 
1651
  "type": "string"
1652
  },
1653
+ "device_id": {
1654
+ "type": "string"
1655
  },
1656
+ "locale": {
1657
  "type": "string"
1658
  },
1659
+ "phone_number": {
1660
  "type": "string"
1661
  },
1662
+ "purpose": {
1663
  "type": "string"
1664
  }
1665
  }
1666
  },
1667
+ "dto.OTPRequestResponse": {
1668
  "type": "object",
1669
  "properties": {
1670
+ "channel": {
1671
  "type": "string"
1672
  },
1673
+ "expires_in_seconds": {
1674
+ "type": "integer"
1675
+ },
1676
+ "masked_destination": {
1677
  "type": "string"
 
 
 
 
 
 
 
 
1678
  },
1679
+ "otp_length": {
1680
+ "type": "integer"
1681
  },
1682
+ "otp_request_id": {
1683
+ "type": "string"
1684
+ },
1685
+ "resend_available_in_seconds": {
1686
+ "type": "integer"
1687
  }
1688
  }
1689
  },
1690
+ "dto.OTPVerifiedUser": {
1691
  "type": "object",
1692
  "properties": {
1693
+ "id": {
1694
  "type": "string"
1695
  },
1696
+ "is_new_user": {
1697
+ "type": "boolean"
1698
+ },
1699
+ "name": {
1700
+ "type": "string"
1701
+ },
1702
+ "phone_number": {
1703
  "type": "string"
1704
  }
1705
  }
1706
  },
1707
+ "dto.OTPVerifyInput": {
1708
  "type": "object",
1709
+ "required": [
1710
+ "otp_code",
1711
+ "otp_request_id",
1712
+ "phone_number",
1713
+ "purpose"
1714
+ ],
1715
  "properties": {
1716
+ "device_id": {
1717
  "type": "string"
1718
  },
1719
+ "otp_code": {
1720
  "type": "string"
1721
  },
1722
+ "otp_request_id": {
1723
+ "type": "string"
1724
  },
1725
+ "phone_number": {
1726
+ "type": "string"
1727
+ },
1728
+ "purpose": {
1729
+ "type": "string"
1730
  }
1731
  }
1732
  },
1733
+ "dto.OTPVerifyResponse": {
1734
  "type": "object",
1735
  "properties": {
1736
+ "auth": {
1737
+ "$ref": "#/definitions/dto.OTPAuth"
1738
  },
1739
+ "user": {
1740
+ "$ref": "#/definitions/dto.OTPVerifiedUser"
1741
  }
1742
  }
1743
  },
1744
+ "dto.Pagination": {
1745
  "type": "object",
1746
  "properties": {
1747
+ "has_next_page": {
1748
+ "type": "boolean"
1749
+ },
1750
+ "limit": {
1751
+ "type": "integer"
1752
+ },
1753
+ "page": {
1754
+ "type": "integer"
1755
+ },
1756
+ "total_items": {
1757
+ "type": "integer"
1758
+ },
1759
+ "total_pages": {
1760
+ "type": "integer"
1761
  }
1762
  }
1763
  },
1764
+ "dto.PaginationMeta": {
1765
  "type": "object",
1766
  "properties": {
1767
+ "limit": {
1768
+ "type": "integer"
1769
  },
1770
+ "page": {
1771
+ "type": "integer"
1772
  },
1773
+ "total_items": {
1774
+ "type": "integer"
1775
+ },
1776
+ "total_pages": {
1777
+ "type": "integer"
1778
  }
1779
  }
1780
  },
1781
+ "dto.PriceData": {
1782
  "type": "object",
1783
  "properties": {
1784
+ "amount": {
1785
+ "type": "integer"
 
 
 
 
 
 
 
 
 
1786
  },
1787
+ "currency": {
1788
+ "type": "string"
 
 
 
1789
  },
1790
+ "display": {
1791
+ "type": "string"
 
 
 
1792
  }
1793
  }
1794
  },
1795
+ "dto.PriceInfo": {
1796
  "type": "object",
1797
  "properties": {
1798
+ "currency": {
1799
  "type": "string"
1800
  },
1801
+ "display": {
1802
  "type": "string"
1803
  },
1804
+ "max_amount": {
1805
+ "type": "number"
1806
  },
1807
+ "min_amount": {
1808
+ "type": "number"
1809
  }
1810
  }
1811
  },
1812
+ "dto.ScheduleItem": {
1813
  "type": "object",
1814
  "properties": {
1815
+ "city": {
1816
+ "type": "string"
1817
+ },
1818
+ "class_id": {
1819
+ "type": "string"
1820
+ },
1821
  "date": {
1822
  "type": "string"
1823
  },
1824
+ "display_time": {
1825
  "type": "string"
1826
  },
1827
+ "end_time": {
1828
+ "type": "string"
1829
  },
1830
+ "is_booked": {
1831
  "type": "boolean"
1832
  },
1833
+ "schedule_id": {
 
 
 
 
 
 
 
 
1834
  "type": "string"
1835
  },
1836
+ "start_time": {
1837
  "type": "string"
1838
  },
1839
+ "studio_name": {
1840
  "type": "string"
1841
  },
1842
+ "teacher_name": {
1843
+ "type": "string"
1844
+ },
1845
+ "title": {
1846
  "type": "string"
1847
  }
1848
  }
1849
  },
1850
+ "dto.ScheduleListItem": {
1851
  "type": "object",
1852
  "properties": {
1853
+ "address": {
1854
  "type": "string"
1855
  },
1856
+ "available_slots": {
1857
+ "type": "integer"
1858
+ },
1859
+ "category": {
1860
  "type": "string"
1861
  },
1862
+ "city": {
1863
  "type": "string"
1864
  },
1865
+ "class_id": {
1866
  "type": "string"
1867
  },
1868
+ "date": {
1869
  "type": "string"
1870
  },
1871
+ "display_time": {
1872
  "type": "string"
1873
  },
1874
+ "end_time": {
1875
+ "type": "string"
1876
+ },
1877
+ "is_booked": {
1878
+ "type": "boolean"
1879
+ },
1880
+ "level": {
1881
+ "type": "string"
1882
+ },
1883
+ "price": {
1884
+ "$ref": "#/definitions/dto.PriceData"
1885
+ },
1886
+ "schedule_id": {
1887
+ "type": "string"
1888
+ },
1889
+ "start_time": {
1890
+ "type": "string"
1891
+ },
1892
+ "studio_name": {
1893
+ "type": "string"
1894
+ },
1895
+ "teacher_name": {
1896
+ "type": "string"
1897
+ },
1898
+ "thumbnail_url": {
1899
  "type": "string"
1900
  },
1901
  "title": {
 
1903
  }
1904
  }
1905
  },
1906
+ "dto.ScheduleListResponse": {
1907
  "type": "object",
1908
  "properties": {
1909
+ "items": {
1910
+ "type": "array",
1911
+ "items": {
1912
+ "$ref": "#/definitions/dto.ScheduleListItem"
1913
+ }
1914
+ },
1915
+ "pagination": {
1916
+ "$ref": "#/definitions/dto.PaginationMeta"
1917
  }
1918
  }
1919
  },
1920
+ "dto.ScheduleListResponseWrapper": {
1921
  "type": "object",
1922
  "properties": {
1923
+ "data": {
1924
+ "$ref": "#/definitions/dto.ScheduleListResponse"
 
 
 
 
 
 
1925
  },
1926
+ "message": {
1927
  "type": "string"
1928
  },
1929
+ "success": {
1930
+ "type": "boolean"
1931
  }
1932
  }
1933
  },
1934
+ "dto.SearchClassesResponse": {
1935
  "type": "object",
1936
  "properties": {
1937
+ "current_location": {
1938
+ "$ref": "#/definitions/dto.CurrentLocation"
 
 
 
1939
  },
1940
+ "nearby_classes": {
1941
  "type": "array",
1942
  "items": {
1943
+ "$ref": "#/definitions/dto.ClassSearchResult"
1944
  }
1945
  },
1946
+ "pagination": {
1947
+ "$ref": "#/definitions/dto.Pagination"
1948
+ },
1949
+ "previous_classes": {
1950
  "type": "array",
1951
  "items": {
1952
+ "$ref": "#/definitions/dto.ClassSearchResult"
1953
  }
1954
  },
1955
+ "search_context": {
1956
+ "$ref": "#/definitions/dto.SearchContext"
 
 
 
 
 
 
 
 
 
 
 
 
1957
  }
1958
  }
1959
  },
1960
+ "dto.SearchContext": {
1961
  "type": "object",
1962
  "properties": {
1963
+ "query": {
1964
+ "type": "string"
1965
  },
1966
+ "selected_filters": {
1967
+ "type": "object",
1968
+ "additionalProperties": true
1969
+ },
1970
+ "sort_by": {
1971
  "type": "string"
1972
  },
1973
+ "view_type": {
1974
+ "type": "string"
1975
  }
1976
  }
1977
  },
1978
+ "dto.SignInRequest": {
1979
  "type": "object",
1980
+ "required": [
1981
+ "email_or_username",
1982
+ "password"
1983
+ ],
1984
  "properties": {
1985
+ "email_or_username": {
1986
+ "type": "string"
1987
+ },
1988
+ "password": {
1989
  "type": "string"
1990
  }
1991
  }
1992
  },
1993
+ "dto.SignUpRequest": {
1994
  "type": "object",
1995
+ "required": [
1996
+ "email",
1997
+ "password",
1998
+ "username"
1999
+ ],
2000
  "properties": {
2001
+ "email": {
2002
  "type": "string"
2003
  },
2004
+ "name": {
2005
  "type": "string"
2006
  },
2007
+ "password": {
2008
  "type": "string"
2009
  },
2010
+ "username": {
2011
  "type": "string"
2012
  }
2013
  }
2014
  },
2015
+ "dto.SortOption": {
2016
  "type": "object",
2017
  "properties": {
2018
+ "id": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2019
  "type": "string"
2020
  },
2021
+ "is_default": {
2022
+ "type": "boolean"
2023
  },
2024
+ "label": {
2025
  "type": "string"
2026
  }
2027
  }
2028
  },
2029
+ "dto.SuccessResponse-any": {
2030
  "type": "object",
2031
  "properties": {
2032
+ "data": {},
2033
+ "message": {},
2034
+ "meta_data": {},
2035
+ "status": {
2036
+ "type": "string"
 
 
 
 
 
 
 
 
 
2037
  }
2038
  }
2039
  },
2040
+ "dto.SummaryLocation": {
2041
  "type": "object",
2042
  "properties": {
2043
+ "display": {
2044
+ "type": "string"
2045
+ },
2046
+ "venue_name": {
2047
+ "type": "string"
 
 
 
 
 
 
2048
  }
2049
  }
2050
  },
2051
+ "dto.UpdateAboutYouRequest": {
2052
  "type": "object",
2053
  "properties": {
2054
+ "city": {
2055
+ "type": "string"
2056
  },
2057
+ "dance_level": {
2058
  "type": "string"
2059
  },
2060
+ "description": {
2061
+ "type": "string"
2062
+ },
2063
+ "gender": {
2064
+ "type": "string"
2065
+ },
2066
+ "province": {
2067
  "type": "string"
2068
  }
2069
  }
2070
  },
2071
+ "dto.UpdateUserRoleRequest": {
2072
  "type": "object",
2073
+ "required": [
2074
+ "role"
2075
+ ],
2076
  "properties": {
2077
+ "role": {
2078
  "type": "string"
2079
+ }
2080
+ }
2081
+ },
2082
+ "dto.UpdateUserRolesRequest": {
2083
+ "type": "object",
2084
+ "required": [
2085
+ "role"
2086
+ ],
2087
+ "properties": {
2088
+ "role": {
2089
  "type": "string"
 
 
 
 
 
 
2090
  }
2091
  }
2092
  },
2093
+ "dto.UserProfileResponse": {
2094
  "type": "object",
2095
  "properties": {
2096
  "city": {
2097
  "type": "string"
2098
  },
2099
+ "dance_level": {
2100
  "type": "string"
2101
  },
2102
+ "description": {
2103
  "type": "string"
2104
  },
2105
+ "email": {
2106
  "type": "string"
2107
  },
2108
+ "full_name": {
2109
  "type": "string"
2110
  },
2111
+ "gender": {
2112
+ "type": "string"
2113
  },
2114
+ "id": {
2115
  "type": "string"
2116
  },
2117
+ "is_instructor": {
2118
+ "type": "boolean"
2119
+ },
2120
+ "is_member": {
2121
+ "type": "boolean"
2122
+ },
2123
+ "is_vo": {
2124
+ "type": "boolean"
2125
+ },
2126
+ "nickname": {
2127
  "type": "string"
2128
  },
2129
+ "phone_number": {
2130
  "type": "string"
2131
  },
2132
+ "profile_media": {
2133
  "type": "string"
2134
  },
2135
+ "province": {
2136
  "type": "string"
2137
+ },
2138
+ "roles": {
2139
+ "type": "array",
2140
+ "items": {
2141
+ "$ref": "#/definitions/dto.UserRoleResponse"
2142
+ }
2143
  }
2144
  }
2145
  },
2146
+ "dto.UserRoleResponse": {
2147
  "type": "object",
2148
  "properties": {
2149
+ "created_at": {
2150
  "type": "string"
2151
  },
2152
+ "role": {
 
 
 
2153
  "type": "string"
2154
+ }
2155
+ }
2156
+ },
2157
+ "entities.Class": {
2158
+ "type": "object",
2159
+ "properties": {
2160
+ "capacity": {
2161
+ "type": "integer"
2162
  },
2163
+ "classMedia": {
2164
+ "type": "array",
2165
+ "items": {
2166
+ "type": "integer",
2167
+ "format": "int32"
2168
+ }
2169
  },
2170
+ "createdAt": {
2171
  "type": "string"
2172
  },
2173
+ "description": {
2174
+ "type": "array",
2175
+ "items": {
2176
+ "type": "integer",
2177
+ "format": "int32"
2178
+ }
2179
  },
2180
+ "endTime": {
2181
  "type": "string"
2182
  },
2183
+ "id": {
2184
  "type": "string"
2185
  },
2186
+ "instructor": {
2187
+ "$ref": "#/definitions/entities.Instructor"
2188
  },
2189
+ "instructorID": {
2190
  "type": "string"
2191
  },
2192
  "price": {
2193
+ "type": "number",
2194
+ "format": "float64"
 
 
2195
  },
2196
+ "scheduleType": {
2197
  "type": "string"
2198
  },
2199
+ "startTime": {
2200
  "type": "string"
2201
  },
2202
+ "title": {
2203
  "type": "string"
2204
  },
2205
+ "venue": {
2206
+ "$ref": "#/definitions/entities.Venue"
2207
  },
2208
+ "venueID": {
2209
  "type": "string"
2210
  }
2211
  }
2212
  },
2213
+ "entities.Instructor": {
2214
  "type": "object",
2215
  "properties": {
2216
+ "createdAt": {
2217
+ "type": "string"
2218
+ },
2219
+ "id": {
2220
+ "type": "string"
2221
+ },
2222
+ "introduction": {
2223
  "type": "array",
2224
  "items": {
2225
+ "type": "integer",
2226
+ "format": "int32"
2227
  }
2228
  },
2229
+ "profileMedia": {
2230
+ "type": "array",
2231
+ "items": {
2232
+ "type": "integer",
2233
+ "format": "int32"
2234
+ }
 
 
 
 
2235
  },
2236
+ "rank": {
2237
  "type": "string"
2238
  },
2239
+ "specialization": {
2240
+ "type": "array",
2241
+ "items": {
2242
+ "type": "integer",
2243
+ "format": "int32"
2244
+ }
2245
+ },
2246
+ "user": {
2247
+ "$ref": "#/definitions/entities.User"
2248
+ },
2249
+ "userID": {
2250
+ "type": "string"
2251
  }
2252
  }
2253
  },
2254
+ "entities.User": {
2255
  "type": "object",
2256
  "properties": {
2257
+ "additionalDetails": {
2258
+ "type": "array",
2259
+ "items": {
2260
+ "type": "integer",
2261
+ "format": "int32"
2262
+ }
2263
  },
2264
+ "city": {
2265
+ "type": "string"
2266
+ },
2267
+ "createdAt": {
2268
+ "type": "string"
2269
+ },
2270
+ "danceLevel": {
2271
+ "type": "string"
2272
+ },
2273
+ "description": {
2274
+ "type": "string"
2275
+ },
2276
+ "email": {
2277
+ "type": "string"
2278
+ },
2279
+ "fullName": {
2280
+ "type": "string"
2281
+ },
2282
+ "gender": {
2283
+ "type": "string"
2284
+ },
2285
+ "id": {
2286
+ "type": "string"
2287
+ },
2288
+ "interests": {
2289
  "type": "array",
2290
  "items": {
2291
+ "type": "integer",
2292
+ "format": "int32"
2293
  }
2294
  },
2295
+ "isInstructor": {
2296
+ "type": "boolean"
2297
  },
2298
+ "isMember": {
2299
+ "type": "boolean"
2300
+ },
2301
+ "isVO": {
2302
+ "type": "boolean"
2303
+ },
2304
+ "nickname": {
2305
+ "type": "string"
2306
+ },
2307
+ "passwordHash": {
2308
+ "type": "string"
2309
+ },
2310
+ "phoneNumber": {
2311
+ "type": "string"
2312
+ },
2313
+ "prefedLanguage": {
2314
+ "type": "string"
2315
+ },
2316
+ "profileMedia": {
2317
+ "type": "string"
2318
+ },
2319
+ "province": {
2320
+ "type": "string"
2321
+ },
2322
+ "roles": {
2323
  "type": "array",
2324
  "items": {
2325
+ "$ref": "#/definitions/entities.UserRole"
2326
  }
2327
  },
2328
+ "updatedAt": {
2329
+ "type": "string"
2330
  }
2331
  }
2332
  },
2333
+ "entities.UserRole": {
2334
  "type": "object",
2335
  "properties": {
2336
+ "createdAt": {
2337
  "type": "string"
2338
  },
2339
+ "id": {
2340
+ "type": "string"
 
2341
  },
2342
+ "role": {
2343
  "type": "string"
2344
  },
2345
+ "user": {
2346
+ "$ref": "#/definitions/entities.User"
2347
+ },
2348
+ "userID": {
2349
  "type": "string"
2350
  }
2351
  }
2352
  },
2353
+ "entities.Venue": {
2354
  "type": "object",
2355
  "properties": {
2356
+ "address": {
2357
+ "type": "string"
2358
+ },
2359
+ "capacity": {
2360
+ "type": "integer"
2361
+ },
2362
+ "city": {
2363
+ "type": "string"
2364
+ },
2365
+ "closingTime": {
2366
+ "type": "string"
2367
+ },
2368
+ "createdAt": {
2369
+ "type": "string"
2370
+ },
2371
+ "description": {
2372
+ "type": "array",
2373
+ "items": {
2374
+ "type": "integer",
2375
+ "format": "int32"
2376
+ }
2377
+ },
2378
  "id": {
2379
  "type": "string"
2380
  },
2381
+ "latitude": {
2382
+ "type": "number",
2383
+ "format": "float64"
2384
  },
2385
+ "longitude": {
2386
+ "type": "number",
2387
+ "format": "float64"
2388
+ },
2389
+ "minimumConsumption": {
2390
+ "type": "number",
2391
+ "format": "float64"
2392
+ },
2393
+ "name": {
2394
  "type": "string"
2395
+ },
2396
+ "openingTime": {
2397
+ "type": "string"
2398
+ },
2399
+ "owner": {
2400
+ "$ref": "#/definitions/entities.VenueOwner"
2401
+ },
2402
+ "ownerID": {
2403
+ "type": "string"
2404
+ },
2405
+ "province": {
2406
+ "type": "string"
2407
+ },
2408
+ "venueMedia": {
2409
+ "type": "array",
2410
+ "items": {
2411
+ "type": "integer",
2412
+ "format": "int32"
2413
+ }
2414
+ },
2415
+ "verificationStatus": {
2416
  "type": "string"
2417
  }
2418
  }
2419
  },
2420
+ "entities.VenueOwner": {
2421
  "type": "object",
2422
  "properties": {
2423
+ "createdAt": {
2424
  "type": "string"
2425
  },
2426
+ "id": {
2427
+ "type": "string"
2428
+ },
2429
+ "user": {
2430
+ "$ref": "#/definitions/entities.User"
2431
+ },
2432
+ "userID": {
2433
  "type": "string"
2434
  }
2435
  }
swagger/docs/swagger.yaml CHANGED
@@ -1,5 +1,12 @@
1
  basePath: /
2
  definitions:
 
 
 
 
 
 
 
3
  dto.CategoryResponse:
4
  properties:
5
  id:
@@ -18,6 +25,16 @@ definitions:
18
  success:
19
  type: boolean
20
  type: object
 
 
 
 
 
 
 
 
 
 
21
  dto.ClassBooking:
22
  properties:
23
  booking_type:
@@ -194,6 +211,32 @@ definitions:
194
  label:
195
  type: string
196
  type: object
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  dto.CurrentLocation:
198
  properties:
199
  city:
@@ -391,6 +434,87 @@ definitions:
391
  week_label:
392
  type: string
393
  type: object
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
394
  dto.Pagination:
395
  properties:
396
  has_next_page:
@@ -544,6 +668,31 @@ definitions:
544
  view_type:
545
  type: string
546
  type: object
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
547
  dto.SortOption:
548
  properties:
549
  id:
@@ -568,6 +717,264 @@ definitions:
568
  venue_name:
569
  type: string
570
  type: object
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
571
  host: lifedebugger-danzapp-be-test.hf.space
572
  info:
573
  contact:
@@ -580,6 +987,175 @@ info:
580
  title: Go Boilerplate API
581
  version: 1.0.0
582
  paths:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
583
  /api/v1/class-categories:
584
  get:
585
  consumes:
@@ -599,6 +1175,43 @@ paths:
599
  summary: Get Class Categories
600
  tags:
601
  - Master Data
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
602
  /api/v1/classes/{class_id}:
603
  get:
604
  consumes:
@@ -866,6 +1479,118 @@ paths:
866
  summary: Get Schedule List
867
  tags:
868
  - Home Dashboard
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
869
  schemes:
870
  - http
871
  - https
 
1
  basePath: /
2
  definitions:
3
+ dto.AuthenticatedUser:
4
+ properties:
5
+ token:
6
+ type: string
7
+ user:
8
+ $ref: '#/definitions/entities.User'
9
+ type: object
10
  dto.CategoryResponse:
11
  properties:
12
  id:
 
25
  success:
26
  type: boolean
27
  type: object
28
+ dto.ChangePasswordRequest:
29
+ properties:
30
+ new_password:
31
+ type: string
32
+ old_password:
33
+ type: string
34
+ required:
35
+ - new_password
36
+ - old_password
37
+ type: object
38
  dto.ClassBooking:
39
  properties:
40
  booking_type:
 
211
  label:
212
  type: string
213
  type: object
214
+ dto.CreateClassRequest:
215
+ properties:
216
+ capacity:
217
+ type: integer
218
+ description:
219
+ type: string
220
+ end_time:
221
+ type: string
222
+ price:
223
+ type: number
224
+ schedule_type:
225
+ type: string
226
+ start_time:
227
+ type: string
228
+ title:
229
+ type: string
230
+ venue_id:
231
+ type: string
232
+ required:
233
+ - capacity
234
+ - end_time
235
+ - price
236
+ - schedule_type
237
+ - start_time
238
+ - title
239
+ type: object
240
  dto.CurrentLocation:
241
  properties:
242
  city:
 
434
  week_label:
435
  type: string
436
  type: object
437
+ dto.OTPAuth:
438
+ properties:
439
+ access_token:
440
+ type: string
441
+ expires_in_seconds:
442
+ type: integer
443
+ refresh_token:
444
+ type: string
445
+ token_type:
446
+ type: string
447
+ type: object
448
+ dto.OTPRequestInput:
449
+ properties:
450
+ app_name:
451
+ type: string
452
+ channel:
453
+ type: string
454
+ device_id:
455
+ type: string
456
+ locale:
457
+ type: string
458
+ phone_number:
459
+ type: string
460
+ purpose:
461
+ type: string
462
+ required:
463
+ - channel
464
+ - phone_number
465
+ - purpose
466
+ type: object
467
+ dto.OTPRequestResponse:
468
+ properties:
469
+ channel:
470
+ type: string
471
+ expires_in_seconds:
472
+ type: integer
473
+ masked_destination:
474
+ type: string
475
+ otp_length:
476
+ type: integer
477
+ otp_request_id:
478
+ type: string
479
+ resend_available_in_seconds:
480
+ type: integer
481
+ type: object
482
+ dto.OTPVerifiedUser:
483
+ properties:
484
+ id:
485
+ type: string
486
+ is_new_user:
487
+ type: boolean
488
+ name:
489
+ type: string
490
+ phone_number:
491
+ type: string
492
+ type: object
493
+ dto.OTPVerifyInput:
494
+ properties:
495
+ device_id:
496
+ type: string
497
+ otp_code:
498
+ type: string
499
+ otp_request_id:
500
+ type: string
501
+ phone_number:
502
+ type: string
503
+ purpose:
504
+ type: string
505
+ required:
506
+ - otp_code
507
+ - otp_request_id
508
+ - phone_number
509
+ - purpose
510
+ type: object
511
+ dto.OTPVerifyResponse:
512
+ properties:
513
+ auth:
514
+ $ref: '#/definitions/dto.OTPAuth'
515
+ user:
516
+ $ref: '#/definitions/dto.OTPVerifiedUser'
517
+ type: object
518
  dto.Pagination:
519
  properties:
520
  has_next_page:
 
668
  view_type:
669
  type: string
670
  type: object
671
+ dto.SignInRequest:
672
+ properties:
673
+ email_or_username:
674
+ type: string
675
+ password:
676
+ type: string
677
+ required:
678
+ - email_or_username
679
+ - password
680
+ type: object
681
+ dto.SignUpRequest:
682
+ properties:
683
+ email:
684
+ type: string
685
+ name:
686
+ type: string
687
+ password:
688
+ type: string
689
+ username:
690
+ type: string
691
+ required:
692
+ - email
693
+ - password
694
+ - username
695
+ type: object
696
  dto.SortOption:
697
  properties:
698
  id:
 
717
  venue_name:
718
  type: string
719
  type: object
720
+ dto.UpdateAboutYouRequest:
721
+ properties:
722
+ city:
723
+ type: string
724
+ dance_level:
725
+ type: string
726
+ description:
727
+ type: string
728
+ gender:
729
+ type: string
730
+ province:
731
+ type: string
732
+ type: object
733
+ dto.UpdateUserRoleRequest:
734
+ properties:
735
+ role:
736
+ type: string
737
+ required:
738
+ - role
739
+ type: object
740
+ dto.UpdateUserRolesRequest:
741
+ properties:
742
+ role:
743
+ type: string
744
+ required:
745
+ - role
746
+ type: object
747
+ dto.UserProfileResponse:
748
+ properties:
749
+ city:
750
+ type: string
751
+ dance_level:
752
+ type: string
753
+ description:
754
+ type: string
755
+ email:
756
+ type: string
757
+ full_name:
758
+ type: string
759
+ gender:
760
+ type: string
761
+ id:
762
+ type: string
763
+ is_instructor:
764
+ type: boolean
765
+ is_member:
766
+ type: boolean
767
+ is_vo:
768
+ type: boolean
769
+ nickname:
770
+ type: string
771
+ phone_number:
772
+ type: string
773
+ profile_media:
774
+ type: string
775
+ province:
776
+ type: string
777
+ roles:
778
+ items:
779
+ $ref: '#/definitions/dto.UserRoleResponse'
780
+ type: array
781
+ type: object
782
+ dto.UserRoleResponse:
783
+ properties:
784
+ created_at:
785
+ type: string
786
+ role:
787
+ type: string
788
+ type: object
789
+ entities.Class:
790
+ properties:
791
+ capacity:
792
+ type: integer
793
+ classMedia:
794
+ items:
795
+ format: int32
796
+ type: integer
797
+ type: array
798
+ createdAt:
799
+ type: string
800
+ description:
801
+ items:
802
+ format: int32
803
+ type: integer
804
+ type: array
805
+ endTime:
806
+ type: string
807
+ id:
808
+ type: string
809
+ instructor:
810
+ $ref: '#/definitions/entities.Instructor'
811
+ instructorID:
812
+ type: string
813
+ price:
814
+ format: float64
815
+ type: number
816
+ scheduleType:
817
+ type: string
818
+ startTime:
819
+ type: string
820
+ title:
821
+ type: string
822
+ venue:
823
+ $ref: '#/definitions/entities.Venue'
824
+ venueID:
825
+ type: string
826
+ type: object
827
+ entities.Instructor:
828
+ properties:
829
+ createdAt:
830
+ type: string
831
+ id:
832
+ type: string
833
+ introduction:
834
+ items:
835
+ format: int32
836
+ type: integer
837
+ type: array
838
+ profileMedia:
839
+ items:
840
+ format: int32
841
+ type: integer
842
+ type: array
843
+ rank:
844
+ type: string
845
+ specialization:
846
+ items:
847
+ format: int32
848
+ type: integer
849
+ type: array
850
+ user:
851
+ $ref: '#/definitions/entities.User'
852
+ userID:
853
+ type: string
854
+ type: object
855
+ entities.User:
856
+ properties:
857
+ additionalDetails:
858
+ items:
859
+ format: int32
860
+ type: integer
861
+ type: array
862
+ city:
863
+ type: string
864
+ createdAt:
865
+ type: string
866
+ danceLevel:
867
+ type: string
868
+ description:
869
+ type: string
870
+ email:
871
+ type: string
872
+ fullName:
873
+ type: string
874
+ gender:
875
+ type: string
876
+ id:
877
+ type: string
878
+ interests:
879
+ items:
880
+ format: int32
881
+ type: integer
882
+ type: array
883
+ isInstructor:
884
+ type: boolean
885
+ isMember:
886
+ type: boolean
887
+ isVO:
888
+ type: boolean
889
+ nickname:
890
+ type: string
891
+ passwordHash:
892
+ type: string
893
+ phoneNumber:
894
+ type: string
895
+ prefedLanguage:
896
+ type: string
897
+ profileMedia:
898
+ type: string
899
+ province:
900
+ type: string
901
+ roles:
902
+ items:
903
+ $ref: '#/definitions/entities.UserRole'
904
+ type: array
905
+ updatedAt:
906
+ type: string
907
+ type: object
908
+ entities.UserRole:
909
+ properties:
910
+ createdAt:
911
+ type: string
912
+ id:
913
+ type: string
914
+ role:
915
+ type: string
916
+ user:
917
+ $ref: '#/definitions/entities.User'
918
+ userID:
919
+ type: string
920
+ type: object
921
+ entities.Venue:
922
+ properties:
923
+ address:
924
+ type: string
925
+ capacity:
926
+ type: integer
927
+ city:
928
+ type: string
929
+ closingTime:
930
+ type: string
931
+ createdAt:
932
+ type: string
933
+ description:
934
+ items:
935
+ format: int32
936
+ type: integer
937
+ type: array
938
+ id:
939
+ type: string
940
+ latitude:
941
+ format: float64
942
+ type: number
943
+ longitude:
944
+ format: float64
945
+ type: number
946
+ minimumConsumption:
947
+ format: float64
948
+ type: number
949
+ name:
950
+ type: string
951
+ openingTime:
952
+ type: string
953
+ owner:
954
+ $ref: '#/definitions/entities.VenueOwner'
955
+ ownerID:
956
+ type: string
957
+ province:
958
+ type: string
959
+ venueMedia:
960
+ items:
961
+ format: int32
962
+ type: integer
963
+ type: array
964
+ verificationStatus:
965
+ type: string
966
+ type: object
967
+ entities.VenueOwner:
968
+ properties:
969
+ createdAt:
970
+ type: string
971
+ id:
972
+ type: string
973
+ user:
974
+ $ref: '#/definitions/entities.User'
975
+ userID:
976
+ type: string
977
+ type: object
978
  host: lifedebugger-danzapp-be-test.hf.space
979
  info:
980
  contact:
 
987
  title: Go Boilerplate API
988
  version: 1.0.0
989
  paths:
990
+ /api/v1/auth/otp/request:
991
+ post:
992
+ consumes:
993
+ - application/json
994
+ description: Trigger an OTP code via WhatsApp for phone number verification.
995
+ parameters:
996
+ - description: OTP Request Data
997
+ in: body
998
+ name: request
999
+ required: true
1000
+ schema:
1001
+ $ref: '#/definitions/dto.OTPRequestInput'
1002
+ produces:
1003
+ - application/json
1004
+ responses:
1005
+ "200":
1006
+ description: OK
1007
+ schema:
1008
+ $ref: '#/definitions/dto.OTPRequestResponse'
1009
+ "400":
1010
+ description: Bad Request
1011
+ schema:
1012
+ $ref: '#/definitions/dto.ErrorResponse'
1013
+ summary: Request OTP
1014
+ tags:
1015
+ - Auth
1016
+ /api/v1/auth/otp/verify:
1017
+ post:
1018
+ consumes:
1019
+ - application/json
1020
+ description: Validate the OTP code provided by the user and return authentication
1021
+ token.
1022
+ parameters:
1023
+ - description: OTP Verification Data
1024
+ in: body
1025
+ name: request
1026
+ required: true
1027
+ schema:
1028
+ $ref: '#/definitions/dto.OTPVerifyInput'
1029
+ produces:
1030
+ - application/json
1031
+ responses:
1032
+ "200":
1033
+ description: OK
1034
+ schema:
1035
+ $ref: '#/definitions/dto.OTPVerifyResponse'
1036
+ "400":
1037
+ description: Bad Request
1038
+ schema:
1039
+ $ref: '#/definitions/dto.ErrorResponse'
1040
+ summary: Verify OTP
1041
+ tags:
1042
+ - Auth
1043
+ /api/v1/authentication/change-password:
1044
+ put:
1045
+ consumes:
1046
+ - application/json
1047
+ description: Update password for the logged-in user.
1048
+ parameters:
1049
+ - description: Password Change Data
1050
+ in: body
1051
+ name: request
1052
+ required: true
1053
+ schema:
1054
+ $ref: '#/definitions/dto.ChangePasswordRequest'
1055
+ produces:
1056
+ - application/json
1057
+ responses:
1058
+ "200":
1059
+ description: OK
1060
+ schema:
1061
+ $ref: '#/definitions/dto.AuthenticatedUser'
1062
+ "400":
1063
+ description: Bad Request
1064
+ schema:
1065
+ $ref: '#/definitions/dto.ErrorResponse'
1066
+ "401":
1067
+ description: Unauthorized
1068
+ schema:
1069
+ $ref: '#/definitions/dto.ErrorResponse'
1070
+ security:
1071
+ - BearerAuth: []
1072
+ summary: Change Password
1073
+ tags:
1074
+ - Auth
1075
+ /api/v1/authentication/login:
1076
+ post:
1077
+ consumes:
1078
+ - application/json
1079
+ description: Authenticate user via email/username and password.
1080
+ parameters:
1081
+ - description: Sign In Data
1082
+ in: body
1083
+ name: request
1084
+ required: true
1085
+ schema:
1086
+ $ref: '#/definitions/dto.SignInRequest'
1087
+ produces:
1088
+ - application/json
1089
+ responses:
1090
+ "200":
1091
+ description: OK
1092
+ schema:
1093
+ $ref: '#/definitions/dto.AuthenticatedUser'
1094
+ "401":
1095
+ description: Unauthorized
1096
+ schema:
1097
+ $ref: '#/definitions/dto.ErrorResponse'
1098
+ summary: Sign In
1099
+ tags:
1100
+ - Auth
1101
+ /api/v1/authentication/register:
1102
+ post:
1103
+ consumes:
1104
+ - application/json
1105
+ description: Register a new user with name, email, username and password.
1106
+ parameters:
1107
+ - description: Sign Up Data
1108
+ in: body
1109
+ name: request
1110
+ required: true
1111
+ schema:
1112
+ $ref: '#/definitions/dto.SignUpRequest'
1113
+ produces:
1114
+ - application/json
1115
+ responses:
1116
+ "200":
1117
+ description: OK
1118
+ schema:
1119
+ $ref: '#/definitions/entities.User'
1120
+ "400":
1121
+ description: Bad Request
1122
+ schema:
1123
+ $ref: '#/definitions/dto.ErrorResponse'
1124
+ summary: Sign Up
1125
+ tags:
1126
+ - Auth
1127
+ /api/v1/authentication/role/{userId}:
1128
+ put:
1129
+ consumes:
1130
+ - application/json
1131
+ description: 'Update user role. Note: This is an older endpoint, consider using
1132
+ /api/v1/users/me/roles instead.'
1133
+ parameters:
1134
+ - description: User ID
1135
+ in: path
1136
+ name: userId
1137
+ required: true
1138
+ type: string
1139
+ - description: Role Update Data
1140
+ in: body
1141
+ name: request
1142
+ required: true
1143
+ schema:
1144
+ $ref: '#/definitions/dto.UpdateUserRoleRequest'
1145
+ produces:
1146
+ - application/json
1147
+ responses:
1148
+ "200":
1149
+ description: OK
1150
+ schema:
1151
+ $ref: '#/definitions/entities.User'
1152
+ "400":
1153
+ description: Bad Request
1154
+ schema:
1155
+ $ref: '#/definitions/dto.ErrorResponse'
1156
+ summary: Update User Role (Legacy)
1157
+ tags:
1158
+ - Users
1159
  /api/v1/class-categories:
1160
  get:
1161
  consumes:
 
1175
  summary: Get Class Categories
1176
  tags:
1177
  - Master Data
1178
+ /api/v1/classes:
1179
+ post:
1180
+ consumes:
1181
+ - application/json
1182
+ description: Allows an instructor to create/host a new class. Automatically
1183
+ creates an instructor profile if one doesn't exist.
1184
+ parameters:
1185
+ - description: Class Creation Data
1186
+ in: body
1187
+ name: request
1188
+ required: true
1189
+ schema:
1190
+ $ref: '#/definitions/dto.CreateClassRequest'
1191
+ produces:
1192
+ - application/json
1193
+ responses:
1194
+ "201":
1195
+ description: Created
1196
+ schema:
1197
+ $ref: '#/definitions/entities.Class'
1198
+ "400":
1199
+ description: Bad Request
1200
+ schema:
1201
+ $ref: '#/definitions/dto.ErrorResponse'
1202
+ "401":
1203
+ description: Unauthorized
1204
+ schema:
1205
+ $ref: '#/definitions/dto.ErrorResponse'
1206
+ "403":
1207
+ description: Forbidden
1208
+ schema:
1209
+ $ref: '#/definitions/dto.ErrorResponse'
1210
+ security:
1211
+ - BearerAuth: []
1212
+ summary: Host a Class
1213
+ tags:
1214
+ - Classes
1215
  /api/v1/classes/{class_id}:
1216
  get:
1217
  consumes:
 
1479
  summary: Get Schedule List
1480
  tags:
1481
  - Home Dashboard
1482
+ /api/v1/users/{id}:
1483
+ get:
1484
+ consumes:
1485
+ - application/json
1486
+ description: Get public profile and roles of another user by their ID.
1487
+ parameters:
1488
+ - description: User ID
1489
+ in: path
1490
+ name: id
1491
+ required: true
1492
+ type: string
1493
+ produces:
1494
+ - application/json
1495
+ responses:
1496
+ "200":
1497
+ description: OK
1498
+ schema:
1499
+ $ref: '#/definitions/dto.UserProfileResponse'
1500
+ "404":
1501
+ description: Not Found
1502
+ schema:
1503
+ $ref: '#/definitions/dto.ErrorResponse'
1504
+ security:
1505
+ - BearerAuth: []
1506
+ summary: Get User Details
1507
+ tags:
1508
+ - Users
1509
+ /api/v1/users/me:
1510
+ get:
1511
+ consumes:
1512
+ - application/json
1513
+ description: Get current logged-in user profile, including roles and about details.
1514
+ produces:
1515
+ - application/json
1516
+ responses:
1517
+ "200":
1518
+ description: OK
1519
+ schema:
1520
+ $ref: '#/definitions/dto.UserProfileResponse'
1521
+ "401":
1522
+ description: Unauthorized
1523
+ schema:
1524
+ $ref: '#/definitions/dto.ErrorResponse'
1525
+ security:
1526
+ - BearerAuth: []
1527
+ summary: Get My Profile
1528
+ tags:
1529
+ - Users
1530
+ /api/v1/users/me/about:
1531
+ put:
1532
+ consumes:
1533
+ - application/json
1534
+ description: Update user's personal details like gender, dance level, and description.
1535
+ parameters:
1536
+ - description: Update Profile Data
1537
+ in: body
1538
+ name: request
1539
+ required: true
1540
+ schema:
1541
+ $ref: '#/definitions/dto.UpdateAboutYouRequest'
1542
+ produces:
1543
+ - application/json
1544
+ responses:
1545
+ "200":
1546
+ description: OK
1547
+ schema:
1548
+ $ref: '#/definitions/dto.UserProfileResponse'
1549
+ "400":
1550
+ description: Bad Request
1551
+ schema:
1552
+ $ref: '#/definitions/dto.ErrorResponse'
1553
+ "401":
1554
+ description: Unauthorized
1555
+ schema:
1556
+ $ref: '#/definitions/dto.ErrorResponse'
1557
+ security:
1558
+ - BearerAuth: []
1559
+ summary: Update About You
1560
+ tags:
1561
+ - Users
1562
+ /api/v1/users/me/roles:
1563
+ put:
1564
+ consumes:
1565
+ - application/json
1566
+ description: Update user's primary role (member, instructor, venue_owner).
1567
+ parameters:
1568
+ - description: Role Assignment Data
1569
+ in: body
1570
+ name: request
1571
+ required: true
1572
+ schema:
1573
+ $ref: '#/definitions/dto.UpdateUserRolesRequest'
1574
+ produces:
1575
+ - application/json
1576
+ responses:
1577
+ "200":
1578
+ description: OK
1579
+ schema:
1580
+ $ref: '#/definitions/dto.UserProfileResponse'
1581
+ "400":
1582
+ description: Bad Request
1583
+ schema:
1584
+ $ref: '#/definitions/dto.ErrorResponse'
1585
+ "401":
1586
+ description: Unauthorized
1587
+ schema:
1588
+ $ref: '#/definitions/dto.ErrorResponse'
1589
+ security:
1590
+ - BearerAuth: []
1591
+ summary: Assign Role
1592
+ tags:
1593
+ - Users
1594
  schemes:
1595
  - http
1596
  - https