Files
ds-galo/openspec/changes/sqlite-metadata-backend/tasks.md
T
iu 176a8d8ced feat(metadata): SQLite backend, storage reconciliation and local defaults
- 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
2026-10-11 10:08:31 +03:00

4.2 KiB
Raw Blame History

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 не меняет текущее развёртывание; проверка — запуск без новых переменных проходит как раньше.