package repository import ( "context" "fmt" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgxpool" "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/models" ) type PaymentRepo struct { pool *pgxpool.Pool } func NewPaymentRepo(pool *pgxpool.Pool) *PaymentRepo { return &PaymentRepo{pool: pool} } func (r *PaymentRepo) Create(ctx context.Context, p *models.Payment) error { err := r.pool.QueryRow(ctx, `INSERT INTO payments (user_id, type, provider, provider_payment_id, amount, currency, status, metadata) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id, created_at, updated_at`, p.UserID, p.Type, p.Provider, p.ProviderPayment, p.Amount, p.Currency, p.Status, p.Metadata, ).Scan(&p.ID, &p.CreatedAt, &p.UpdatedAt) if err != nil { return fmt.Errorf("create payment: %w", err) } return nil } func (r *PaymentRepo) GetByID(ctx context.Context, id string) (*models.Payment, error) { row := r.pool.QueryRow(ctx, `SELECT id, user_id, type, provider, provider_payment_id, amount, currency, status, metadata, created_at, updated_at FROM payments WHERE id = $1`, id) return scanPayment(row) } func (r *PaymentRepo) ListByUser(ctx context.Context, userID string) ([]*models.Payment, error) { rows, err := r.pool.Query(ctx, `SELECT id, user_id, type, provider, provider_payment_id, amount, currency, status, metadata, created_at, updated_at FROM payments WHERE user_id = $1 ORDER BY created_at DESC`, userID) if err != nil { return nil, err } defer rows.Close() var payments []*models.Payment for rows.Next() { p, err := scanPayment(rows) if err != nil { return nil, err } payments = append(payments, p) } return payments, nil } func (r *PaymentRepo) UpdateStatus(ctx context.Context, id, status string) error { _, err := r.pool.Exec(ctx, `UPDATE payments SET status=$1, updated_at=now() WHERE id=$2`, status, id) return err } func scanPayment(row interface{ Scan(dest ...any) error }) (*models.Payment, error) { var p models.Payment err := row.Scan(&p.ID, &p.UserID, &p.Type, &p.Provider, &p.ProviderPayment, &p.Amount, &p.Currency, &p.Status, &p.Metadata, &p.CreatedAt, &p.UpdatedAt) if err != nil { if err == pgx.ErrNoRows { return nil, nil } return nil, err } return &p, nil }