51 lines
1.2 KiB
Go
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
|
|
}
|