Files
shop-go/internal/repository/stats.go
T

51 lines
1.2 KiB
Go

package repository
import (
"context"
"errors"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
"shop/internal/models"
)
type StatsRepository struct {
pool *pgxpool.Pool
}
func NewStatsRepository(pool *pgxpool.Pool) *StatsRepository {
return &StatsRepository{pool: pool}
}
func (r *StatsRepository) IncrementHomeVisit(ctx context.Context) error {
_, err := r.pool.Exec(ctx, `
INSERT INTO site_stats (id, total_visits, today_visits, visit_date)
VALUES (1, 1, 1, CURRENT_DATE)
ON CONFLICT (id) DO UPDATE SET
total_visits = site_stats.total_visits + 1,
today_visits = CASE
WHEN site_stats.visit_date = CURRENT_DATE THEN site_stats.today_visits + 1
ELSE 1
END,
visit_date = CURRENT_DATE
`)
return err
}
func (r *StatsRepository) Get(ctx context.Context) (models.SiteStats, error) {
var s models.SiteStats
err := r.pool.QueryRow(ctx, `
SELECT total_visits,
CASE WHEN visit_date = CURRENT_DATE THEN today_visits ELSE 0 END
FROM site_stats WHERE id = 1
`).Scan(&s.TotalVisits, &s.TodayVisits)
if errors.Is(err, pgx.ErrNoRows) {
return models.SiteStats{}, nil
}
if err != nil {
return models.SiteStats{}, err
}
return s, nil
}