From 56b60fcfc88b253d47e220e7e29373aefbe3f1db Mon Sep 17 00:00:00 2001 From: Trey t Date: Tue, 9 Dec 2025 18:40:30 -0600 Subject: [PATCH] Add user count column to residences admin page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add user_count field to ResidenceResponse DTO - Update residence handler to preload Users and calculate count - Count includes owner (1) plus all shared users - Add Users column to admin residences list 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- admin/src/app/(dashboard)/residences/page.tsx | 4 ++++ admin/src/types/models.ts | 1 + internal/admin/dto/responses.go | 1 + internal/admin/handlers/residence_handler.go | 7 ++++++- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/admin/src/app/(dashboard)/residences/page.tsx b/admin/src/app/(dashboard)/residences/page.tsx index c5935a0..027278f 100644 --- a/admin/src/app/(dashboard)/residences/page.tsx +++ b/admin/src/app/(dashboard)/residences/page.tsx @@ -57,6 +57,10 @@ const columns: ColumnDef[] = [ accessorKey: 'owner_name', header: 'Owner', }, + { + accessorKey: 'user_count', + header: 'Users', + }, { accessorKey: 'city', header: 'Location', diff --git a/admin/src/types/models.ts b/admin/src/types/models.ts index 7416614..62007a9 100644 --- a/admin/src/types/models.ts +++ b/admin/src/types/models.ts @@ -109,6 +109,7 @@ export interface Residence { purchase_price?: number; is_primary: boolean; is_active: boolean; + user_count: number; created_at: string; updated_at: string; } diff --git a/internal/admin/dto/responses.go b/internal/admin/dto/responses.go index c73475f..908390d 100644 --- a/internal/admin/dto/responses.go +++ b/internal/admin/dto/responses.go @@ -98,6 +98,7 @@ type ResidenceResponse struct { PurchasePrice *float64 `json:"purchase_price,omitempty"` IsPrimary bool `json:"is_primary"` IsActive bool `json:"is_active"` + UserCount int `json:"user_count"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` } diff --git a/internal/admin/handlers/residence_handler.go b/internal/admin/handlers/residence_handler.go index 3d14d0a..34586bb 100644 --- a/internal/admin/handlers/residence_handler.go +++ b/internal/admin/handlers/residence_handler.go @@ -36,7 +36,8 @@ func (h *AdminResidenceHandler) List(c *gin.Context) { query := h.db.Model(&models.Residence{}). Preload("Owner"). - Preload("PropertyType") + Preload("PropertyType"). + Preload("Users") // Apply search if filters.Search != "" { @@ -331,6 +332,9 @@ func (h *AdminResidenceHandler) BulkDelete(c *gin.Context) { } func (h *AdminResidenceHandler) toResidenceResponse(res *models.Residence) dto.ResidenceResponse { + // User count = owner (1) + shared users + userCount := 1 + len(res.Users) + response := dto.ResidenceResponse{ ID: res.ID, Name: res.Name, @@ -345,6 +349,7 @@ func (h *AdminResidenceHandler) toResidenceResponse(res *models.Residence) dto.R Description: res.Description, IsPrimary: res.IsPrimary, IsActive: res.IsActive, + UserCount: userCount, CreatedAt: res.CreatedAt.Format("2006-01-02T15:04:05Z"), UpdatedAt: res.UpdatedAt.Format("2006-01-02T15:04:05Z"), }