axe/internal/repository/db.go

31 lines
1.6 KiB
Go
Raw Permalink Normal View History

2026-10-18 19:07:25 +00:00
// Package repository — доступ к данным: репозитории профилей, заявок
// и refresh-сессий. Всё общение с PostgreSQL живёт здесь; ошибки
// pgx превращаются в три доменных класса (ErrNotFound/ErrConflict/ErrInvalid),
// детали которых наружу не уходят.
package repository
import (
"context"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgconn"
)
// Querier — минимальный набор запросов, который нужен репозиториям.
// Реализуют и *pgxpool.Pool (боевой путь), и pgx.Tx (тесты: выполняют
// сценарий и откатывают транзакцию, не оставляя данных в БД).
type Querier interface {
Exec(ctx context.Context, sql string, args ...any) (pgconn.CommandTag, error)
Query(ctx context.Context, sql string, args ...any) (pgx.Rows, error)
QueryRow(ctx context.Context, sql string, args ...any) pgx.Row
}
// Beginer — то, что умеет начать транзакцию: *pgxpool.Pool (боевой путь)
// и pgx.Tx (в тестах — SAVEPOINT внутри тестовой транзакции). Нужен
// репозиториям, чьи шаги обязаны выполниться атомарно: например,
// клиентское удаление мастера (членства + профиль) не должно остаться
// наполовину, если второй шаг упёрся в FK.
type Beginer interface {
Begin(ctx context.Context) (pgx.Tx, error)
}