34d30e3134
Media model + migration; an ObjectStore interface with an S3/MinIO (boto3) implementation behind the service layer. Upload (multipart) stores bytes in object storage + a metadata row (checksum, size, content-type, optional attach to person/event/source); list returns presigned URLs; delete is soft. Editor-gated, privacy-filtered, audited. 24 tests pass (object store faked). Introduces the worker container (same image, 'python -m app.worker'): its first job is the scheduled 30-day soft-delete purge across tables + media object cleanup. Compose gains worker + S3 env on backend/worker; dev override builds the worker too. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Justin Paul <justin@jpaul.me>
23 lines
548 B
Python
23 lines
548 B
Python
import uuid
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
|
|
class MediaRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: uuid.UUID
|
|
tree_id: uuid.UUID
|
|
original_filename: str
|
|
content_type: str
|
|
byte_size: int
|
|
checksum_sha256: str
|
|
title: str | None
|
|
person_id: uuid.UUID | None
|
|
event_id: uuid.UUID | None
|
|
source_id: uuid.UUID | None
|
|
created_at: datetime
|
|
# Presigned download URL, filled in by the router from the ObjectStore.
|
|
url: str | None = None
|