@@ -265,7 +265,7 @@ func (s *ClubService) JoinClub(clubID, userID uint) (*models.ClubMembershipRespo
265265 return & response , nil
266266}
267267
268- func (s * ClubService ) LeaveClub (clubID , userID uint ) error {
268+ func (s * ClubService ) LeaveClub (clubID , userID uint , ownerAction * models. OwnerLeaveRequest ) error {
269269 club , err := s .clubRepo .GetByID (clubID )
270270 if err != nil {
271271 if errors .Is (err , gorm .ErrRecordNotFound ) {
@@ -280,13 +280,55 @@ func (s *ClubService) LeaveClub(clubID, userID uint) error {
280280 }
281281 return err
282282 }
283+
284+ isOwner := club .OwnerID != nil && * club .OwnerID == userID
285+ if isOwner {
286+ if ownerAction == nil || ownerAction .Action == "" {
287+ return errors .New ("owner must choose action: transfer or close" )
288+ }
289+ switch ownerAction .Action {
290+ case "close" :
291+ return s .clubRepo .Delete (club .ID )
292+ case "transfer" :
293+ if ownerAction .NewOwnerID == nil {
294+ return errors .New ("new_owner_id is required for transfer" )
295+ }
296+ if err := s .TransferOwnership (clubID , userID , * ownerAction .NewOwnerID ); err != nil {
297+ return err
298+ }
299+ if err := s .clubRepo .LeaveClub (clubID , userID ); err != nil {
300+ return err
301+ }
302+ if m .IsApproved && club .MembersCount > 0 {
303+ club .MembersCount --
304+ if err := s .clubRepo .Update (club ); err != nil {
305+ return err
306+ }
307+ }
308+ if club .MembersCount == 0 {
309+ return s .clubRepo .Delete (club .ID )
310+ }
311+ return nil
312+ default :
313+ return errors .New ("invalid action; must be one of: transfer, close" )
314+ }
315+ }
316+
317+ if err := s .clubRepo .LeaveClub (clubID , userID ); err != nil {
318+ return err
319+ }
283320 if m .IsApproved && club .MembersCount > 0 {
284321 club .MembersCount --
285322 if err := s .clubRepo .Update (club ); err != nil {
286323 return err
287324 }
288325 }
289- return s .clubRepo .LeaveClub (clubID , userID )
326+
327+ if club .MembersCount == 0 {
328+ return s .clubRepo .Delete (club .ID )
329+ }
330+
331+ return nil
290332}
291333
292334func (s * ClubService ) ListClubMembers (clubID uint ) ([]* models.ClubMembership , error ) {
@@ -414,4 +456,45 @@ func (s *ClubService) ListClubRatings(clubID uint, limit, offset int) ([]models.
414456 return nil , err
415457 }
416458 return s .clubRatingRepo .ListByClub (clubID , limit , offset )
459+ }
460+
461+ func (s * ClubService ) TransferOwnership (clubID , currentOwnerID , newOwnerID uint ) error {
462+ club , err := s .clubRepo .GetByID (clubID )
463+ if err != nil {
464+ if errors .Is (err , gorm .ErrRecordNotFound ) {
465+ return ErrClubNotFound
466+ }
467+ return err
468+ }
469+ if club .OwnerID == nil || * club .OwnerID != currentOwnerID {
470+ return errors .New ("only the owner can transfer ownership" )
471+ }
472+ if newOwnerID == currentOwnerID {
473+ return errors .New ("new owner must be different from current owner" )
474+ }
475+
476+ newOwnerMembership , err := s .clubRepo .GetClubMemberByUserID (clubID , newOwnerID )
477+ if err != nil {
478+ if errors .Is (err , gorm .ErrRecordNotFound ) {
479+ return errors .New ("new owner must be a member of the club" )
480+ }
481+ return err
482+ }
483+ if ! newOwnerMembership .IsApproved {
484+ return errors .New ("new owner must be an approved member of the club" )
485+ }
486+
487+ club .OwnerID = & newOwnerID
488+ if err := s .clubRepo .Update (club ); err != nil {
489+ return err
490+ }
491+
492+ if newOwnerMembership .Role != "admin" {
493+ newOwnerMembership .Role = "admin"
494+ if err := s .clubRepo .UpdateMembership (newOwnerMembership ); err != nil {
495+ return err
496+ }
497+ }
498+
499+ return nil
417500}
0 commit comments