| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- 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
- }
|