feat(db): add storage backend metadata columns #135

Merged
forbes merged 1 commits from feat-file-storage-metadata into main 2026-02-17 18:32:06 +00:00
Owner

Summary

Add storage_backend columns to item_files and revisions tables to track which storage backend holds each file, enabling dual-running MinIO and filesystem backends during migration.

Migration

migrations/017_file_storage_metadata.sql:

ALTER TABLE item_files
  ADD COLUMN IF NOT EXISTS storage_backend TEXT NOT NULL DEFAULT 'minio';

ALTER TABLE revisions
  ADD COLUMN IF NOT EXISTS file_storage_backend TEXT NOT NULL DEFAULT 'minio';

Existing rows default to 'minio'. New uploads will write 'filesystem' when the filesystem backend is active.

DB repository changes

internal/db/items.goRevision struct

  • Added FileStorageBackend string field
  • CreateRevision: inserts file_storage_backend, defaults to "minio" if empty
  • GetRevisions: reads COALESCE(file_storage_backend, 'minio') in the hasStatusColumn branch; defaults to "minio" in the legacy branch
  • GetRevision: same pattern as above
  • CreateRevisionFromExisting: copies FileStorageBackend from source revision

internal/db/item_files.goItemFile struct

  • Added StorageBackend string field
  • Create: inserts storage_backend, defaults to "minio" if empty
  • ListByItem: reads COALESCE(storage_backend, 'minio')
  • Get: reads COALESCE(storage_backend, 'minio')

Backward compatibility

  • COALESCE in all SELECTs handles rows where the column hasn't been populated yet
  • Default value 'minio' means existing data is unaffected
  • The hasStatusColumn == false branches (pre-migration-007 databases) set FileStorageBackend = "minio" in Go — these databases certainly don't have migration 017 either

Files changed

File Change
migrations/017_file_storage_metadata.sql New — adds columns
internal/db/items.go Revision.FileStorageBackend + query updates
internal/db/item_files.go ItemFile.StorageBackend + query updates

Verification

  • go build ./... passes
  • go vet ./... passes
  • Migration applies cleanly (additive ALTER TABLE with defaults)

Closes #128

Part of

Storage Migration: MinIO → PostgreSQL + Filesystem

## Summary Add `storage_backend` columns to `item_files` and `revisions` tables to track which storage backend holds each file, enabling dual-running MinIO and filesystem backends during migration. ## Migration `migrations/017_file_storage_metadata.sql`: ```sql ALTER TABLE item_files ADD COLUMN IF NOT EXISTS storage_backend TEXT NOT NULL DEFAULT 'minio'; ALTER TABLE revisions ADD COLUMN IF NOT EXISTS file_storage_backend TEXT NOT NULL DEFAULT 'minio'; ``` Existing rows default to `'minio'`. New uploads will write `'filesystem'` when the filesystem backend is active. ## DB repository changes ### `internal/db/items.go` — `Revision` struct - Added `FileStorageBackend string` field - `CreateRevision`: inserts `file_storage_backend`, defaults to `"minio"` if empty - `GetRevisions`: reads `COALESCE(file_storage_backend, 'minio')` in the `hasStatusColumn` branch; defaults to `"minio"` in the legacy branch - `GetRevision`: same pattern as above - `CreateRevisionFromExisting`: copies `FileStorageBackend` from source revision ### `internal/db/item_files.go` — `ItemFile` struct - Added `StorageBackend string` field - `Create`: inserts `storage_backend`, defaults to `"minio"` if empty - `ListByItem`: reads `COALESCE(storage_backend, 'minio')` - `Get`: reads `COALESCE(storage_backend, 'minio')` ## Backward compatibility - `COALESCE` in all SELECTs handles rows where the column hasn't been populated yet - Default value `'minio'` means existing data is unaffected - The `hasStatusColumn == false` branches (pre-migration-007 databases) set `FileStorageBackend = "minio"` in Go — these databases certainly don't have migration 017 either ## Files changed | File | Change | |------|--------| | `migrations/017_file_storage_metadata.sql` | **New** — adds columns | | `internal/db/items.go` | `Revision.FileStorageBackend` + query updates | | `internal/db/item_files.go` | `ItemFile.StorageBackend` + query updates | ## Verification - `go build ./...` passes - `go vet ./...` passes - Migration applies cleanly (additive ALTER TABLE with defaults) Closes #128 ## Part of Storage Migration: MinIO → PostgreSQL + Filesystem
forbes added 1 commit 2026-02-17 18:30:51 +00:00
Add storage_backend columns to track which backend (minio or filesystem)
holds each file, enabling dual-running during migration.

Migration 017_file_storage_metadata.sql:
- item_files.storage_backend TEXT NOT NULL DEFAULT 'minio'
- revisions.file_storage_backend TEXT NOT NULL DEFAULT 'minio'

DB repository changes:
- Revision struct: add FileStorageBackend field
- ItemFile struct: add StorageBackend field
- All INSERT queries include the new columns
- All SELECT queries read them (COALESCE for pre-migration compat)
- CreateRevisionFromExisting copies the backend from source revision
- Default to 'minio' when field is empty (backward compat)

Existing rows default to 'minio'. New uploads will write 'filesystem'
when the filesystem backend is active.

Closes #128
forbes merged commit 9181673554 into main 2026-02-17 18:32:06 +00:00
forbes deleted branch feat-file-storage-metadata 2026-02-17 18:32:07 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kindred/silo#135