Files
ds-galo/openspec/changes/storage-orphan-reconciliation/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

2.2 KiB

Tasks

1. Перечисление в хранилище

  • 1.1 Добавить List(ctx, prefix) ([]ObjectInfo{Key,Size,ModTime}) в storage.Backend и реализовать в storage.S3 через ListObjectsV2 с пагинацией; проверка — тест перечисления под префиксом (под S3_ENDPOINT, иначе пропуск).
  • 1.2 Реализовать List в storage.FS обходом корня с относительными ключами; проверка — юнит-тест на временном каталоге.

2. Ключи журнала в метаданных

  • 2.1 Добавить AllStorageKeys в photos.Repository и реализовать в pg- и sqlite-store; проверка — контрактный тест на обоих бэкендах.

3. Команда reconcile

  • 3.1 Реализовать cmd/reconcile: инвентаризация обеих сторон, классификация сирот/пропавших, отчёт по умолчанию; проверка — юнит-тесты классификации.
  • 3.2 Добавить флаги --delete, --min-age, --sample с ограничением области objects/ и защитой свежих блобов; проверка — тест: молодой блоб не удаляется, старый сирота удаляется, пропавшие не трогаются.
  • 3.3 Собрать бэкенды через конфиг (storage.Open + бандл репозиториев) для postgres/sqlite и s3/fs; проверка — запуск на fs и s3.

4. Документация и интеграция

  • 4.1 Обновить README.md и project.md с описанием команды и её безопасного использования; проверка — документированный запуск работает.
  • 4.2 Интеграционная проверка: создать сироту, прогнать отчёт, затем --delete, убедиться в удалении и в том, что журнальные записи не затронуты.