Skip to content

Commit d52b7a0

Browse files
add my clubs endpoint
1 parent ac15167 commit d52b7a0

File tree

6 files changed

+61
-1
lines changed

6 files changed

+61
-1
lines changed

internal/handlers/club.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,4 +551,33 @@ func (h *ClubHandler) ListClubRatings(c *gin.Context) {
551551
c.JSON(http.StatusOK, gin.H{
552552
"ratings": ratings,
553553
})
554+
}
555+
556+
// @Summary Get user's clubs
557+
// @Description Retrieve a list of clubs the authenticated user is a member of
558+
// @Tags Users
559+
// @Produce json
560+
// @Success 200 {object} map[string]interface{} "List of user's clubs"
561+
// @Failure 401 {object} map[string]string "Unauthorized"
562+
// @Failure 500 {object} map[string]string "Internal server error"
563+
// @Router /api/v1/users/my-clubs [get]
564+
func (h *ClubHandler) GetMyClubs(c *gin.Context) {
565+
uidRaw, ok := c.Get("user_id")
566+
if !ok {
567+
c.JSON(http.StatusUnauthorized, gin.H{"error": "user not authenticated"})
568+
return
569+
}
570+
userID, ok := uidRaw.(uint)
571+
if !ok {
572+
c.JSON(http.StatusInternalServerError, gin.H{"error": "invalid user ID"})
573+
return
574+
}
575+
576+
clubs, err := h.clubService.ListUserClubs(userID)
577+
if err != nil {
578+
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
579+
return
580+
}
581+
582+
c.JSON(http.StatusOK, gin.H{"clubs": clubs})
554583
}

internal/handlers/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ func (s *Server) setupRoutes() {
154154
protected.POST("/clubs/:id/join", clubHandler.JoinClub)
155155
protected.POST("/clubs/:id/leave", middleware.RequireClubMembership(clubRepo), clubHandler.LeaveClub)
156156
protected.POST("/clubs/:id/ratings", middleware.RequireClubMembership(clubRepo), clubHandler.RateClub)
157+
protected.GET("/my-clubs", clubHandler.GetMyClubs)
157158

158159
protected.PUT("/clubs/:id/members/:user_id", middleware.RequireClubMembershipWithRoles(clubRepo, "club_admin", "moderator"), clubHandler.UpdateClubMember)
159160
protected.GET("/clubs/:id/members/:user_id", clubHandler.GetClubMember)

internal/models/club.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ type UpdateClubRatingRequest struct {
110110

111111
type OwnerLeaveRequest struct {
112112
Action string `json:"action" validate:"omitempty,oneof=transfer close"`
113-
NewOwnerID *uint `json:"new_owner_id,omitempty"`
113+
NewOwnerID *uint `json:"new_owner_id,omitempty"`
114114
}
115115

116116
type ClubMembershipResponse struct {

internal/repository/club.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,19 @@ func (r *clubRatingRepository) GetAggregateForClub(clubID uint) (float32, int, e
184184
func (r *clubRepository) UpdateMembership(m *models.ClubMembership) error {
185185
return r.db.Save(m).Error
186186
}
187+
188+
func (r *clubRepository) ListUserClubs(userID uint) ([]*models.Club, error) {
189+
var clubs []*models.Club
190+
err := r.db.Joins("JOIN club_memberships ON club_memberships.club_id = clubs.id").
191+
Where("club_memberships.user_id = ? AND club_memberships.is_approved = true", userID).
192+
Preload("Owner").
193+
Preload("Moderators").
194+
Preload("Members").
195+
Preload("Members.User").
196+
Preload("Posts").
197+
Find(&clubs).Error
198+
if err != nil {
199+
return nil, err
200+
}
201+
return clubs, nil
202+
}

internal/repository/interfaces.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type ClubRepository interface {
2929
UpdateRatingAggregate(clubID uint, avg float32, count int) error
3030
UpdateMembership(m *models.ClubMembership) error
3131
CountApprovedMembers(clubID uint) (int64, error)
32+
ListUserClubs(userID uint) ([]*models.Club, error)
3233
}
3334

3435
type ClubRatingRepository interface {

internal/services/club.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,4 +513,17 @@ func (s *ClubService) TransferOwnership(clubID, currentOwnerID, newOwnerID uint)
513513
}
514514

515515
return nil
516+
}
517+
518+
func (s *ClubService) ListUserClubs(userID uint) ([]models.ClubResponse, error) {
519+
clubs, err := s.clubRepo.ListUserClubs(userID)
520+
if err != nil {
521+
return nil, err
522+
}
523+
524+
var responses []models.ClubResponse
525+
for _, club := range clubs {
526+
responses = append(responses, club.ToResponse())
527+
}
528+
return responses, nil
516529
}

0 commit comments

Comments
 (0)