From c464ee093e2c335c3bc273cc71c96218113f08b9 Mon Sep 17 00:00:00 2001 From: Trey t Date: Wed, 24 Dec 2025 22:55:38 -0600 Subject: [PATCH] Add timezone to admin interface user and notification prefs views MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Shows the user's auto-captured timezone (IANA format) in: - Notification preferences list/detail/update responses - User detail response 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- internal/admin/dto/responses.go | 1 + internal/admin/handlers/notification_prefs_handler.go | 7 +++++++ internal/admin/handlers/user_handler.go | 6 ++++++ 3 files changed, 14 insertions(+) diff --git a/internal/admin/dto/responses.go b/internal/admin/dto/responses.go index 908390d..dc94efc 100644 --- a/internal/admin/dto/responses.go +++ b/internal/admin/dto/responses.go @@ -49,6 +49,7 @@ type UserDetailResponse struct { UserResponse Residences []ResidenceSummary `json:"residences,omitempty"` Devices []DeviceSummary `json:"devices,omitempty"` + Timezone *string `json:"timezone,omitempty"` // IANA timezone (auto-captured from mobile app) } // ResidenceSummary is a brief residence representation diff --git a/internal/admin/handlers/notification_prefs_handler.go b/internal/admin/handlers/notification_prefs_handler.go index 4a5c02c..b825791 100644 --- a/internal/admin/handlers/notification_prefs_handler.go +++ b/internal/admin/handlers/notification_prefs_handler.go @@ -44,6 +44,9 @@ type NotificationPrefResponse struct { WarrantyExpiringHour *int `json:"warranty_expiring_hour"` DailyDigestHour *int `json:"daily_digest_hour"` + // User timezone (IANA name, auto-captured from X-Timezone header) + Timezone *string `json:"timezone"` + CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` } @@ -123,6 +126,7 @@ func (h *AdminNotificationPrefsHandler) List(c echo.Context) error { TaskOverdueHour: pref.TaskOverdueHour, WarrantyExpiringHour: pref.WarrantyExpiringHour, DailyDigestHour: pref.DailyDigestHour, + Timezone: pref.Timezone, CreatedAt: pref.CreatedAt.Format("2006-01-02T15:04:05Z"), UpdatedAt: pref.UpdatedAt.Format("2006-01-02T15:04:05Z"), } @@ -166,6 +170,7 @@ func (h *AdminNotificationPrefsHandler) Get(c echo.Context) error { TaskOverdueHour: pref.TaskOverdueHour, WarrantyExpiringHour: pref.WarrantyExpiringHour, DailyDigestHour: pref.DailyDigestHour, + Timezone: pref.Timezone, CreatedAt: pref.CreatedAt.Format("2006-01-02T15:04:05Z"), UpdatedAt: pref.UpdatedAt.Format("2006-01-02T15:04:05Z"), }) @@ -275,6 +280,7 @@ func (h *AdminNotificationPrefsHandler) Update(c echo.Context) error { TaskOverdueHour: pref.TaskOverdueHour, WarrantyExpiringHour: pref.WarrantyExpiringHour, DailyDigestHour: pref.DailyDigestHour, + Timezone: pref.Timezone, CreatedAt: pref.CreatedAt.Format("2006-01-02T15:04:05Z"), UpdatedAt: pref.UpdatedAt.Format("2006-01-02T15:04:05Z"), }) @@ -333,6 +339,7 @@ func (h *AdminNotificationPrefsHandler) GetByUser(c echo.Context) error { TaskOverdueHour: pref.TaskOverdueHour, WarrantyExpiringHour: pref.WarrantyExpiringHour, DailyDigestHour: pref.DailyDigestHour, + Timezone: pref.Timezone, CreatedAt: pref.CreatedAt.Format("2006-01-02T15:04:05Z"), UpdatedAt: pref.UpdatedAt.Format("2006-01-02T15:04:05Z"), }) diff --git a/internal/admin/handlers/user_handler.go b/internal/admin/handlers/user_handler.go index 184060e..d11f1de 100644 --- a/internal/admin/handlers/user_handler.go +++ b/internal/admin/handlers/user_handler.go @@ -109,6 +109,12 @@ func (h *AdminUserHandler) Get(c echo.Context) error { }) } + // Add timezone from notification preferences + var prefs models.NotificationPreference + if err := h.db.Where("user_id = ?", user.ID).First(&prefs).Error; err == nil { + response.Timezone = prefs.Timezone + } + return c.JSON(http.StatusOK, response) }