Фото квартиры прикрепляются к оценке, хранятся в Postgres (bytea) —
без отдельного файлового тома, уезжают вместе с бэкапом БД.
- data/sql/007_estimate_photos.sql — таблица estimate_photos
(FK на trade_in_estimates, ON DELETE CASCADE).
- POST /estimate/{id}/photos — multipart-загрузка (image/*, ≤10 МБ,
≤12 фото на оценку).
- GET /estimate/{id}/photos — список метаданных.
- GET /estimate/{id}/photos/{photo_id} — отдать содержимое.
- python-multipart добавлен в зависимости (FastAPI UploadFile).
Фронтенд (file-drop в форме) — отдельным PR.
23 lines
978 B
PL/PgSQL
23 lines
978 B
PL/PgSQL
-- Trade-In MVP — фото квартиры, прикреплённые к оценке (#394).
|
||
-- Хранение в bytea (без отдельного файлового тома): фото идут в PDF-отчёт
|
||
-- и путешествуют вместе с бэкапом БД (#397). Привязка к trade_in_estimates.
|
||
|
||
BEGIN;
|
||
|
||
CREATE TABLE IF NOT EXISTS estimate_photos (
|
||
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
estimate_id uuid NOT NULL REFERENCES trade_in_estimates(id) ON DELETE CASCADE,
|
||
filename text,
|
||
content_type text NOT NULL,
|
||
content bytea NOT NULL,
|
||
size_bytes int,
|
||
uploaded_at timestamptz NOT NULL DEFAULT NOW()
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS estimate_photos_estimate_idx
|
||
ON estimate_photos (estimate_id, uploaded_at);
|
||
|
||
COMMENT ON TABLE estimate_photos IS
|
||
'#394 — фото квартиры, привязанные к trade_in_estimates. Хранение в bytea.';
|
||
|
||
COMMIT;
|