Mise à jour de la configuration de la base de données pour utiliser PostgreSQL et ajout de Redis dans le fichier .env. Modifications du Dockerfile pour installer les dépendances nécessaires. Amélioration des services de stockage pour supporter les opérations asynchrones avec S3 et le stockage local. Refactorisation des pipelines d'images pour une meilleure gestion des tâches asynchrones. Ajout de la gestion des clés API dans l'authentification. Mise à jour de la documentation et des exemples d'utilisation.
This commit is contained in:
@@ -44,6 +44,10 @@ class StorageBackend(ABC):
|
||||
async def get_size(self, path: str) -> int:
|
||||
"""Retourne la taille en bytes."""
|
||||
|
||||
@abstractmethod
|
||||
async def get_bytes(self, path: str) -> bytes:
|
||||
"""Lit le contenu d'un fichier en bytes."""
|
||||
|
||||
|
||||
class LocalStorage(StorageBackend):
|
||||
"""Stockage sur disque local avec URLs signées HMAC."""
|
||||
@@ -101,6 +105,12 @@ class LocalStorage(StorageBackend):
|
||||
return full.stat().st_size
|
||||
return 0
|
||||
|
||||
async def get_bytes(self, path: str) -> bytes:
|
||||
"""Lit un fichier local."""
|
||||
full = self._full_path(path)
|
||||
async with aiofiles.open(full, "rb") as f:
|
||||
return await f.read()
|
||||
|
||||
def get_absolute_path(self, path: str) -> Path:
|
||||
"""Retourne le chemin absolu d'un fichier (pour FileResponse)."""
|
||||
return self._full_path(path)
|
||||
@@ -139,9 +149,15 @@ class S3Storage(StorageBackend):
|
||||
)
|
||||
|
||||
async def save(self, content: bytes, path: str, content_type: str) -> str:
|
||||
"""Upload vers S3/MinIO."""
|
||||
"""Upload vers S3/MinIO. Crée le bucket si nécessaire."""
|
||||
session = self._get_session()
|
||||
async with session.client("s3", endpoint_url=self._endpoint_url) as client:
|
||||
# Vérifier/Créer le bucket
|
||||
try:
|
||||
await client.head_bucket(Bucket=self._bucket)
|
||||
except Exception:
|
||||
await client.create_bucket(Bucket=self._bucket)
|
||||
|
||||
await client.put_object(
|
||||
Bucket=self._bucket,
|
||||
Key=self._s3_key(path),
|
||||
@@ -196,6 +212,17 @@ class S3Storage(StorageBackend):
|
||||
except Exception:
|
||||
return 0
|
||||
|
||||
async def get_bytes(self, path: str) -> bytes:
|
||||
"""Télécharge un objet S3/MinIO."""
|
||||
session = self._get_session()
|
||||
async with session.client("s3", endpoint_url=self._endpoint_url) as client:
|
||||
resp = await client.get_object(
|
||||
Bucket=self._bucket,
|
||||
Key=self._s3_key(path),
|
||||
)
|
||||
async with resp["Body"] as stream:
|
||||
return await stream.read()
|
||||
|
||||
|
||||
def get_storage_backend() -> StorageBackend:
|
||||
"""Factory : retourne le backend de stockage configuré (singleton)."""
|
||||
|
||||
Reference in New Issue
Block a user