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