From b48fcbfaa670e7c6deac13a7470631cf7173bf03 Mon Sep 17 00:00:00 2001 From: juancwu Date: Sat, 11 Apr 2026 17:50:16 +0000 Subject: [PATCH] chore: count space members without retrieving all member info save some RAM --- internal/handler/space.go | 9 +++++---- internal/repository/space.go | 12 +++++++++++- internal/service/space.go | 8 ++++++++ 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/internal/handler/space.go b/internal/handler/space.go index db01624..0f71ac4 100644 --- a/internal/handler/space.go +++ b/internal/handler/space.go @@ -37,15 +37,16 @@ func (h *spaceHandler) SpacesPage(w http.ResponseWriter, r *http.Request) { cards := make([]blocks.SpaceCardInfo, 0, len(spaces)) for _, sp := range spaces { - members, err := h.spaceService.GetMembers(sp.ID) + memberCount, err := h.spaceService.GetMemberCount(sp.ID) if err != nil { - slog.Error("failed to load space members", "error", err, "space_id", sp.ID) - members = nil + slog.Error("failed to get space member count", "error", err, "space_id", sp.ID) + memberCount = 0 } + cards = append(cards, blocks.SpaceCardInfo{ ID: sp.ID, Name: sp.Name, - MemberCount: len(members), + MemberCount: memberCount, TotalBalance: decimal.Zero, Currency: currency.CAD, }) diff --git a/internal/repository/space.go b/internal/repository/space.go index 764c299..70b473d 100644 --- a/internal/repository/space.go +++ b/internal/repository/space.go @@ -22,6 +22,7 @@ type SpaceRepository interface { IsMember(spaceID, userID string) (bool, error) GetMembers(spaceID string) ([]*model.SpaceMemberWithProfile, error) UpdateName(spaceID, name string) error + GetMemberCount(spaceID string) (int, error) Delete(spaceID string) error } @@ -130,9 +131,18 @@ func (r *spaceRepository) UpdateName(spaceID, name string) error { return err } - func (r *spaceRepository) Delete(spaceID string) error { query := `DELETE FROM spaces WHERE id = $1;` _, err := r.db.Exec(query, spaceID) return err } + +func (r *spaceRepository) GetMemberCount(spaceID string) (int, error) { + query := `SELECT COUNT(sm.user_id) FROM space_members sm WHERE sm.space_id = $1` + var count int + err := r.db.Get(&count, query, spaceID) + if err != nil { + return 0, err + } + return count, nil +} diff --git a/internal/service/space.go b/internal/service/space.go index ea2763e..36def42 100644 --- a/internal/service/space.go +++ b/internal/service/space.go @@ -94,3 +94,11 @@ func (s *SpaceService) UpdateSpaceName(spaceID, name string) error { func (s *SpaceService) DeleteSpace(spaceID string) error { return s.spaceRepo.Delete(spaceID) } + +func (s *SpaceService) GetMemberCount(spaceID string) (int, error) { + count, err := s.spaceRepo.GetMemberCount(spaceID) + if err != nil { + return 0, fmt.Errorf("failed to get member count: %w", err) + } + return count, nil +}