73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"sno/internal/models"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
type PurchaseRepository interface {
|
|
Create(ctx context.Context, purchase *models.Purchase) (*models.Purchase, error)
|
|
GetByUserID(ctx context.Context, userID int64) ([]models.Purchase, error)
|
|
}
|
|
|
|
type postgresPurchaseRepository struct {
|
|
db *pgxpool.Pool
|
|
}
|
|
|
|
func NewPurchaseRepository(db *pgxpool.Pool) PurchaseRepository {
|
|
return &postgresPurchaseRepository{db: db}
|
|
}
|
|
|
|
func (r *postgresPurchaseRepository) Create(ctx context.Context, purchase *models.Purchase) (*models.Purchase, error) {
|
|
query := `
|
|
INSERT INTO purchases (user_id, reward_id, stars_spent, status)
|
|
VALUES ($1, $2, $3, $4)
|
|
RETURNING id, purchased_at
|
|
`
|
|
querier := getQuerier(ctx, r.db)
|
|
err := querier.QueryRow(ctx, query,
|
|
purchase.UserID, purchase.RewardID, purchase.StarsSpent, purchase.Status,
|
|
).Scan(&purchase.ID, &purchase.PurchasedAt)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return purchase, nil
|
|
}
|
|
|
|
// GetByUserID retrieves all purchases for a given user, ordered by most recent first.
|
|
func (r *postgresPurchaseRepository) GetByUserID(ctx context.Context, userID int64) ([]models.Purchase, error) {
|
|
query := `
|
|
SELECT id, user_id, reward_id, stars_spent, purchased_at, status
|
|
FROM purchases
|
|
WHERE user_id = $1
|
|
ORDER BY purchased_at DESC
|
|
`
|
|
rows, err := r.db.Query(ctx, query, userID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var purchases []models.Purchase
|
|
for rows.Next() {
|
|
var p models.Purchase
|
|
if err := rows.Scan(&p.ID, &p.UserID, &p.RewardID, &p.StarsSpent, &p.PurchasedAt, &p.Status); err != nil {
|
|
return nil, err
|
|
}
|
|
purchases = append(purchases, p)
|
|
}
|
|
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if purchases == nil {
|
|
return []models.Purchase{}, nil
|
|
}
|
|
|
|
return purchases, nil
|
|
}
|