31 lines
1.6 KiB
Go
31 lines
1.6 KiB
Go
// 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)
|
||
}
|