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)
|
|||
|
|
}
|