package router import ( "context" "log" "bookhoard/templates" "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" "github.com/jackc/pgx/v5/pgxpool" "github.com/labstack/echo/v5" ) func getTemplateUserWithTheme(c *echo.Context, cfg *Config) (templates.User, error) { userID := c.Get("user_id").(string) userEmail := c.Get("user_email").(string) userUsername := c.Get("user_username").(string) userRole := c.Get("user_role").(string) userUUID, err := uuid.Parse(userID) if err != nil { log.Printf("getTemplateUserWithTheme failed: invalid UUID '%s': %v", userID, err) return templates.User{}, err } userDB, err := cfg.Queries.GetUser(c.Request().Context(), uuidToPGType(userUUID)) if err != nil { log.Printf("getTemplateUserWithTheme failed: database query error for user ID %s: %v", userID, err) return templates.User{}, err } userTheme := "tokyo-night" if userDB.Theme.Valid { userTheme = userDB.Theme.String } // Extract JWT token for WebSocket authentication token := "" if cookie, err := c.Cookie("token"); err == nil { token = cookie.Value } return templates.User{ ID: userID, Email: userEmail, Username: userUsername, Role: userRole, Theme: userTheme, Token: token, }, nil } func convertPending(pending []map[string]interface{}) []templates.PendingRegistrationData { result := make([]templates.PendingRegistrationData, len(pending)) for i, p := range pending { result[i] = templates.PendingRegistrationData{ RegistrationID: p["registration_id"].(string), DeviceName: p["device_name"].(string), DeviceType: p["device_type"].(string), ExpiresAt: p["expires_at"].(string), } } return result } func pingDB(cfg *Config, ctx context.Context) error { if cfg.DBPool != nil { if pool, ok := cfg.DBPool.(*pgxpool.Pool); ok { return pool.Ping(ctx) } } return nil } func parseUUID(s string) (uuid.UUID, error) { return uuid.Parse(s) } func uuidToPGType(u uuid.UUID) pgtype.UUID { return pgtype.UUID{Bytes: [16]byte(u), Valid: true} }