Add user count column to residences admin page

- 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 <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-12-09 18:40:30 -06:00
parent 68a4c28d68
commit 56b60fcfc8
4 changed files with 12 additions and 1 deletions

View File

@@ -57,6 +57,10 @@ const columns: ColumnDef<Residence>[] = [
accessorKey: 'owner_name', accessorKey: 'owner_name',
header: 'Owner', header: 'Owner',
}, },
{
accessorKey: 'user_count',
header: 'Users',
},
{ {
accessorKey: 'city', accessorKey: 'city',
header: 'Location', header: 'Location',

View File

@@ -109,6 +109,7 @@ export interface Residence {
purchase_price?: number; purchase_price?: number;
is_primary: boolean; is_primary: boolean;
is_active: boolean; is_active: boolean;
user_count: number;
created_at: string; created_at: string;
updated_at: string; updated_at: string;
} }

View File

@@ -98,6 +98,7 @@ type ResidenceResponse struct {
PurchasePrice *float64 `json:"purchase_price,omitempty"` PurchasePrice *float64 `json:"purchase_price,omitempty"`
IsPrimary bool `json:"is_primary"` IsPrimary bool `json:"is_primary"`
IsActive bool `json:"is_active"` IsActive bool `json:"is_active"`
UserCount int `json:"user_count"`
CreatedAt string `json:"created_at"` CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"` UpdatedAt string `json:"updated_at"`
} }

View File

@@ -36,7 +36,8 @@ func (h *AdminResidenceHandler) List(c *gin.Context) {
query := h.db.Model(&models.Residence{}). query := h.db.Model(&models.Residence{}).
Preload("Owner"). Preload("Owner").
Preload("PropertyType") Preload("PropertyType").
Preload("Users")
// Apply search // Apply search
if filters.Search != "" { if filters.Search != "" {
@@ -331,6 +332,9 @@ func (h *AdminResidenceHandler) BulkDelete(c *gin.Context) {
} }
func (h *AdminResidenceHandler) toResidenceResponse(res *models.Residence) dto.ResidenceResponse { func (h *AdminResidenceHandler) toResidenceResponse(res *models.Residence) dto.ResidenceResponse {
// User count = owner (1) + shared users
userCount := 1 + len(res.Users)
response := dto.ResidenceResponse{ response := dto.ResidenceResponse{
ID: res.ID, ID: res.ID,
Name: res.Name, Name: res.Name,
@@ -345,6 +349,7 @@ func (h *AdminResidenceHandler) toResidenceResponse(res *models.Residence) dto.R
Description: res.Description, Description: res.Description,
IsPrimary: res.IsPrimary, IsPrimary: res.IsPrimary,
IsActive: res.IsActive, IsActive: res.IsActive,
UserCount: userCount,
CreatedAt: res.CreatedAt.Format("2006-01-02T15:04:05Z"), CreatedAt: res.CreatedAt.Format("2006-01-02T15:04:05Z"),
UpdatedAt: res.UpdatedAt.Format("2006-01-02T15:04:05Z"), UpdatedAt: res.UpdatedAt.Format("2006-01-02T15:04:05Z"),
} }