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.
CI / Lint & Format (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled

This commit is contained in:
2026-02-24 16:19:18 -05:00
parent cc99fea20a
commit d68deb9c74
20 changed files with 235 additions and 285 deletions
+28 -1
View File
@@ -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)."""