From 77c8c4fad8f91cdb96cf09d58b35f8dac0765953 Mon Sep 17 00:00:00 2001 From: Trey t Date: Wed, 3 Dec 2025 09:52:37 -0600 Subject: [PATCH] Add lightweight summary endpoint for task statistics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add GET /api/residences/summary/ endpoint - Returns task statistics without full residence data - Enables efficient refresh of home screen summary counts 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- internal/handlers/residence_handler.go | 14 +++++++++++ internal/router/router.go | 1 + internal/services/residence_service.go | 34 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/internal/handlers/residence_handler.go b/internal/handlers/residence_handler.go index 81f5a67..1827013 100644 --- a/internal/handlers/residence_handler.go +++ b/internal/handlers/residence_handler.go @@ -56,6 +56,20 @@ func (h *ResidenceHandler) GetMyResidences(c *gin.Context) { c.JSON(http.StatusOK, response) } +// GetSummary handles GET /api/residences/summary/ +// Returns just the task statistics summary without full residence data +func (h *ResidenceHandler) GetSummary(c *gin.Context) { + user := c.MustGet(middleware.AuthUserKey).(*models.User) + + summary, err := h.residenceService.GetSummary(user.ID) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, summary) +} + // GetResidence handles GET /api/residences/:id/ func (h *ResidenceHandler) GetResidence(c *gin.Context) { user := c.MustGet(middleware.AuthUserKey).(*models.User) diff --git a/internal/router/router.go b/internal/router/router.go index cdfe974..30ee904 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -244,6 +244,7 @@ func setupResidenceRoutes(api *gin.RouterGroup, residenceHandler *handlers.Resid residences.GET("/", residenceHandler.ListResidences) residences.POST("/", residenceHandler.CreateResidence) residences.GET("/my-residences/", residenceHandler.GetMyResidences) + residences.GET("/summary/", residenceHandler.GetSummary) residences.POST("/join-with-code/", residenceHandler.JoinWithCode) residences.GET("/:id/", residenceHandler.GetResidence) diff --git a/internal/services/residence_service.go b/internal/services/residence_service.go index 6d5e79a..7709fbd 100644 --- a/internal/services/residence_service.go +++ b/internal/services/residence_service.go @@ -120,6 +120,40 @@ func (s *ResidenceService) GetMyResidences(userID uint) (*responses.MyResidences }, nil } +// GetSummary returns just the task summary statistics for a user's residences +// This is a lightweight endpoint for refreshing summary counts without full residence data +func (s *ResidenceService) GetSummary(userID uint) (*responses.TotalSummary, error) { + residences, err := s.residenceRepo.FindByUser(userID) + if err != nil { + return nil, err + } + + summary := &responses.TotalSummary{ + TotalResidences: len(residences), + } + + // Get task statistics if task repository is available + if s.taskRepo != nil && len(residences) > 0 { + // Collect residence IDs + residenceIDs := make([]uint, len(residences)) + for i, r := range residences { + residenceIDs[i] = r.ID + } + + // Get aggregated statistics + stats, err := s.taskRepo.GetTaskStatistics(residenceIDs) + if err == nil && stats != nil { + summary.TotalTasks = stats.TotalTasks + summary.TotalPending = stats.TotalPending + summary.TotalOverdue = stats.TotalOverdue + summary.TasksDueNextWeek = stats.TasksDueNextWeek + summary.TasksDueNextMonth = stats.TasksDueNextMonth + } + } + + return summary, nil +} + // CreateResidence creates a new residence func (s *ResidenceService) CreateResidence(req *requests.CreateResidenceRequest, ownerID uint) (*responses.ResidenceResponse, error) { // TODO: Check subscription tier limits