@@ -99,20 +99,58 @@ func (h *ClubHandler) GetClub(c *gin.Context) {
9999}
100100
101101// @Summary Get all clubs
102- // @Description Retrieve a list of all clubs
102+ // @Description Retrieve a list of all clubs with optional filters
103103// @Tags Clubs
104104// @Produce json
105+ // @Param location query string false "Filter by location (partial match)"
106+ // @Param genre query string false "Filter by genre (partial match)"
107+ // @Param meeting_type query string false "Filter by meeting type" Enums(online, in-person, hybrid)
108+ // @Param min_members query int false "Minimum member count"
109+ // @Param max_members query int false "Maximum member count"
110+ // @Param limit query int false "Number of results to return" default(20)
111+ // @Param offset query int false "Number of results to skip" default(0)
105112// @Success 200 {object} map[string]interface{} "Clubs retrieved successfully"
113+ // @Failure 400 {object} map[string]string "Bad request - invalid filter parameters"
106114// @Failure 500 {object} map[string]string "Internal server error"
107115// @Router /api/v1/clubs [get]
108116func (h * ClubHandler ) GetAllClubs (c * gin.Context ) {
109- clubs , err := h .clubService .GetAllClubs ()
117+ location := c .Query ("location" )
118+ genre := c .Query ("genre" )
119+ meetingType := c .Query ("meeting_type" )
120+ minMembers , _ := strconv .Atoi (c .DefaultQuery ("min_members" , "0" ))
121+ maxMembers , _ := strconv .Atoi (c .DefaultQuery ("max_members" , "0" ))
122+ limit , _ := strconv .Atoi (c .DefaultQuery ("limit" , "20" ))
123+ offset , _ := strconv .Atoi (c .DefaultQuery ("offset" , "0" ))
124+
125+ hasFilters := location != "" || genre != "" || meetingType != "" || minMembers > 0 || maxMembers > 0
126+
127+ if ! hasFilters {
128+ clubs , err := h .clubService .GetAllClubs ()
129+ if err != nil {
130+ c .JSON (http .StatusInternalServerError , gin.H {"error" : "failed to retrieve clubs" })
131+ return
132+ }
133+ c .JSON (http .StatusOK , gin.H {"clubs" : clubs })
134+ return
135+ }
136+
137+ if meetingType != "" && meetingType != "online" && meetingType != "in-person" && meetingType != "hybrid" {
138+ c .JSON (http .StatusBadRequest , gin.H {"error" : "meeting_type must be one of: online, in-person, hybrid" })
139+ return
140+ }
141+
142+ clubs , err := h .clubService .GetClubsWithFilters (location , genre , meetingType , minMembers , maxMembers , limit , offset )
110143 if err != nil {
111144 c .JSON (http .StatusInternalServerError , gin.H {"error" : "failed to retrieve clubs" })
112145 return
113146 }
114147
115- c .JSON (http .StatusOK , gin.H {"clubs" : clubs })
148+ c .JSON (http .StatusOK , gin.H {
149+ "clubs" : clubs ,
150+ "count" : len (clubs ),
151+ "limit" : limit ,
152+ "offset" : offset ,
153+ })
116154}
117155
118156// @Summary Update club
@@ -194,9 +232,9 @@ func (h *ClubHandler) DeleteClub(c *gin.Context) {
194232 }
195233
196234 if _ , err := h .clubService .GetClubByID (uint (id )); err != nil {
197- c .JSON (http .StatusNotFound , gin.H {"error" : "club not found" })
198- return
199- }
235+ c .JSON (http .StatusNotFound , gin.H {"error" : "club not found" })
236+ return
237+ }
200238
201239 uidRaw , ok := c .Get ("user_id" )
202240 if ! ok {
@@ -307,12 +345,12 @@ func (h *ClubHandler) LeaveClub(c *gin.Context) {
307345 c .JSON (http .StatusBadRequest , gin.H {"error" : err .Error ()})
308346 return
309347 case "owner must choose action: transfer or close" ,
310- "new_owner_id is required for transfer" ,
311- "only the owner can transfer ownership" ,
312- "new owner must be different from current owner" ,
313- "new owner must be a member of the club" ,
314- "new owner must be an approved member" ,
315- "invalid action; must be one of: transfer, close" :
348+ "new_owner_id is required for transfer" ,
349+ "only the owner can transfer ownership" ,
350+ "new owner must be different from current owner" ,
351+ "new owner must be a member of the club" ,
352+ "new owner must be an approved member" ,
353+ "invalid action; must be one of: transfer, close" :
316354 c .JSON (http .StatusBadRequest , gin.H {"error" : err .Error ()})
317355 return
318356 default :
@@ -580,4 +618,4 @@ func (h *ClubHandler) GetMyClubs(c *gin.Context) {
580618 }
581619
582620 c .JSON (http .StatusOK , gin.H {"clubs" : clubs })
583- }
621+ }
0 commit comments