payments.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package repository
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/jackc/pgx/v5"
  6. "github.com/jackc/pgx/v5/pgxpool"
  7. "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/models"
  8. )
  9. type PaymentRepo struct {
  10. pool *pgxpool.Pool
  11. }
  12. func NewPaymentRepo(pool *pgxpool.Pool) *PaymentRepo {
  13. return &PaymentRepo{pool: pool}
  14. }
  15. func (r *PaymentRepo) Create(ctx context.Context, p *models.Payment) error {
  16. err := r.pool.QueryRow(ctx,
  17. `INSERT INTO payments (user_id, type, provider, provider_payment_id, amount, currency, status, metadata)
  18. VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
  19. RETURNING id, created_at, updated_at`,
  20. p.UserID, p.Type, p.Provider, p.ProviderPayment,
  21. p.Amount, p.Currency, p.Status, p.Metadata,
  22. ).Scan(&p.ID, &p.CreatedAt, &p.UpdatedAt)
  23. if err != nil {
  24. return fmt.Errorf("create payment: %w", err)
  25. }
  26. return nil
  27. }
  28. func (r *PaymentRepo) GetByID(ctx context.Context, id string) (*models.Payment, error) {
  29. row := r.pool.QueryRow(ctx,
  30. `SELECT id, user_id, type, provider, provider_payment_id, amount, currency, status,
  31. metadata, created_at, updated_at
  32. FROM payments WHERE id = $1`, id)
  33. return scanPayment(row)
  34. }
  35. func (r *PaymentRepo) ListByUser(ctx context.Context, userID string) ([]*models.Payment, error) {
  36. rows, err := r.pool.Query(ctx,
  37. `SELECT id, user_id, type, provider, provider_payment_id, amount, currency, status,
  38. metadata, created_at, updated_at
  39. FROM payments WHERE user_id = $1 ORDER BY created_at DESC`, userID)
  40. if err != nil {
  41. return nil, err
  42. }
  43. defer rows.Close()
  44. var payments []*models.Payment
  45. for rows.Next() {
  46. p, err := scanPayment(rows)
  47. if err != nil {
  48. return nil, err
  49. }
  50. payments = append(payments, p)
  51. }
  52. return payments, nil
  53. }
  54. func (r *PaymentRepo) UpdateStatus(ctx context.Context, id, status string) error {
  55. _, err := r.pool.Exec(ctx,
  56. `UPDATE payments SET status=$1, updated_at=now() WHERE id=$2`, status, id)
  57. return err
  58. }
  59. func scanPayment(row interface{ Scan(dest ...any) error }) (*models.Payment, error) {
  60. var p models.Payment
  61. err := row.Scan(&p.ID, &p.UserID, &p.Type, &p.Provider, &p.ProviderPayment,
  62. &p.Amount, &p.Currency, &p.Status, &p.Metadata, &p.CreatedAt, &p.UpdatedAt)
  63. if err != nil {
  64. if err == pgx.ErrNoRows {
  65. return nil, nil
  66. }
  67. return nil, err
  68. }
  69. return &p, nil
  70. }