- pluggable per-domain Repository interfaces; PostgreSQL and SQLite impls - SQLite on modernc.org/sqlite (WAL, busy_timeout, foreign_keys, immediate tx) - separate migrations/sqlite and db.MigrateSQLite; store.NewPostgres/NewSQLite - cmd/reconcile compares object storage with the journal (report, then --delete) - storage.Backend.List and photos.Repository.AllStorageKeys - DB_BACKEND/SQLITE_PATH and STORAGE_BACKEND/FS_ROOT selectable; local defaults (sqlite ./galo.db, fs ./data) - Makefile reconcile/reconcile-delete; docs and .env.example updated
4.2 KiB
4.2 KiB
Tasks
1. Интерфейсы репозиториев и контрактный набор
- 1.1 Ввести
Repositoryв доменах auth, albums, members, photos, social, notifications, sharelinks и перевести сервисы на интерфейсы; проверка —go build ./...проходит, PostgreSQL-реализации не менялись. - 1.2 Поднять общий контрактный набор тестов на каждый
Repository; проверка — набор зелёный на PostgreSQL подTEST_DATABASE_URL(пропуск без него). - 1.3 Зафиксировать маппинг sentinel-ошибок домена и
created_atчерезRETURNINGкак часть контракта; проверка — тесты ошибок «не найдено» на Postgres проходят.
2. SQLite: драйвер, миграции, фабрика
- 2.1 Добавить
modernc.org/sqliteи подключение сjournal_mode=WAL,busy_timeout,foreign_keys=ON; проверка — тест открытия,Pingи применения прагм проходит. - 2.2 Добавить набор
migrations/sqlite/иdb.MigrateSQLite; проверка — тест применяет схему на временном файле и повторный запуск идемпотентен. - 2.3 Реализовать фабрику
store.NewPostgres(pool)/store.NewSQLite(db), возвращающую бандлRepository; проверка — тест собирает бандл для обоих бэкендов иgo build ./...проходит.
3. SQLite-реализации доменов
- 3.1 Реализовать SQLite-store для auth, members, albums; проверка — контрактные тесты этих доменов зелёные на SQLite.
- 3.2 Реализовать SQLite-store для photos (фото, метки, корзина, backfill EXIF); проверка — контрактные тесты photos зелёные на SQLite.
- 3.3 Реализовать SQLite-логику объектов (
BindObject,ClaimGarbage,ClaimStalePending,ClaimVariantJobs,FailVariantJob) вBEGIN IMMEDIATE; проверка — тесты на атомарность привязки/GC и на backoff зелёные. - 3.4 Реализовать SQLite-store для social, notifications, sharelinks; проверка — контрактные тесты этих доменов зелёные на SQLite.
4. Конфигурация, проводка, health, документация
- 4.1 Ввести
DB_BACKEND=postgres|sqliteиSQLITE_PATHс условной валидацией; проверка — юнит-тестыconfig.Loadдля обоих бэкендов и неполной конфигурации. - 4.2 Перевести
app.Newна бандл репозиториев и выбрать бэкенд вcmd/server; проверка — сервер стартует с обоими значениямиDB_BACKEND, db-метка в health динамическая. - 4.3 Обновить
.env.example,project.mdи README с ограничением «один экземпляр на файл SQLite»; проверка — документированный запуск сDB_BACKEND=sqliteстартует.
5. Интеграционные проверки
- 5.1 Прогнать полный контрактный набор на обоих бэкендах и сравнить результаты; проверка — одинаковые исходы на Postgres и SQLite.
- 5.2 End-to-end на SQLite (регистрация → альбом → загрузка → превью → удаление → GC) с перезапуском процесса; проверка — очередь вариантов и GC продолжаются, сирот нет.
- 5.3 Убедиться, что дефолт
postgresне меняет текущее развёртывание; проверка — запуск без новых переменных проходит как раньше.