bd8ee9b647
Presigned URLs point at the internal minio:9000 host a browser can't reach. Add ObjectStore.get_object and a GET /media/{id}/content endpoint that resolves visibility and streams the bytes; MediaRead.url now points there. Keeps the object store private and downloads behind the privacy engine.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Justin Paul <justin@jpaul.me>
26 lines
766 B
Python
26 lines
766 B
Python
"""ObjectStore interface — pluggable binary storage behind the service layer.
|
|
|
|
Implementations are S3-compatible (MinIO for self-host, any S3 otherwise).
|
|
Methods are async wrappers so the service layer stays non-blocking even though
|
|
the underlying SDK (boto3) is synchronous.
|
|
"""
|
|
|
|
from abc import ABC, abstractmethod
|
|
|
|
|
|
class ObjectStore(ABC):
|
|
@abstractmethod
|
|
async def ensure_bucket(self) -> None: ...
|
|
|
|
@abstractmethod
|
|
async def put_object(self, *, key: str, data: bytes, content_type: str) -> None: ...
|
|
|
|
@abstractmethod
|
|
async def get_object(self, *, key: str) -> bytes: ...
|
|
|
|
@abstractmethod
|
|
async def presigned_get_url(self, *, key: str) -> str: ...
|
|
|
|
@abstractmethod
|
|
async def delete_object(self, *, key: str) -> None: ...
|