From e2e8afd07adc70248bef99957249fa0b0584e354 Mon Sep 17 00:00:00 2001 From: emil Date: Fri, 1 May 2026 17:06:34 +0300 Subject: [PATCH] fix: scan timestamptz into time.Time in admin service pgx v5 uses binary protocol for timestamptz and cannot scan it directly into *string. Scan into time.Time and format as RFC3339. Fixes /admin/users internal server error and broken grant search. Co-Authored-By: Claude Sonnet 4.6 --- backend/internal/admin/service.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/internal/admin/service.go b/backend/internal/admin/service.go index dd12a50..b4557f2 100644 --- a/backend/internal/admin/service.go +++ b/backend/internal/admin/service.go @@ -3,6 +3,7 @@ package admin import ( "context" "fmt" + "time" "github.com/jackc/pgx/v5/pgxpool" @@ -123,10 +124,12 @@ func (s *Service) ListTransactions(ctx context.Context, limit, offset int, txTyp var txs []AdminTransaction for rows.Next() { var t AdminTransaction + var createdAt time.Time if err := rows.Scan(&t.ID, &t.UserID, &t.UserEmail, &t.PartnerID, - &t.Amount, &t.Type, &t.Description, &t.CreatedAt); err != nil { + &t.Amount, &t.Type, &t.Description, &createdAt); err != nil { return nil, 0, fmt.Errorf("service.ListTransactions: scan: %w", err) } + t.CreatedAt = createdAt.UTC().Format(time.RFC3339) txs = append(txs, t) } if err := rows.Err(); err != nil { @@ -189,9 +192,11 @@ func (s *Service) ListStudents(ctx context.Context, search string, limit, offset var students []Student for rows.Next() { var st Student - if err := rows.Scan(&st.ID, &st.Email, &st.Name, &st.StudentID, &st.Balance, &st.CreatedAt); err != nil { + var createdAt time.Time + if err := rows.Scan(&st.ID, &st.Email, &st.Name, &st.StudentID, &st.Balance, &createdAt); err != nil { return nil, 0, fmt.Errorf("service.ListStudents: scan: %w", err) } + st.CreatedAt = createdAt.UTC().Format(time.RFC3339) students = append(students, st) } if err := rows.Err(); err != nil {