FEAT: Stockage Alarik/S3 — IStorageProvider, upload atomique, batch delete #7

Closed
opened 2026-08-10 21:02:18 +02:00 by nonobis · 0 comments
Owner

🎯 Contexte

Aucun stockage objet n'est implémenté : pas d'IStorageProvider, pas d'AlarikStorageProvider. L'enum StorageProvider existe mais rien ne l'utilise. Les snapshots sont stockés via URL string sur l'événement, sans upload S3.

📚 Référence spec (MASTER_SPECIFICATION.md v2.0)

Phase 8 — Storage Alarik/S3 : AlarikStorageProvider (IStorageProvider), staging prefix pour uploads atomiques, batch delete (RemoveObjectsAsync, 1000/appel), health check
7.1 Path patterns : recordings/{siteId}/{cameraId}/{date}/{timestamp}.ts (rétention 7-90 j), snapshots/{siteId}/{cameraId}/{date}/{eventId}.jpg, snapshots/unknown/{personId}.jpg (30 j)
7.2 Upload sécurisé : 1) upload staging/ 2) créer l'enregistrement DB 3) move atomique vers recordings/ (ou delete staging si erreur) — pas de race condition S3Cleanup
Correctif D6 : S3Cleanup paginé (pas de HashSet 1.5GB)

🔍 État actuel (vérifié dans le code)

StorageProvider enum : S3, Local. docker-compose.prod.yml a un service alarik (ghcr.io/achtungsoftware/alarik:latest, port 9000) mais aucune intégration applicative. AttachSnapshotAsync ne fait que stocker une URL.

🧩 À faire

  • Interface IStorageProvider (Upload/Download/Delete/DeleteBatch/Health) dans Application
  • Implémentation AlarikStorageProvider (S3-compatible, MinIO client ou AWS SDK)
  • Upload atomique staging → move (7.2)
  • Batch delete 1000/appel
  • Brancher sur l'attachement de snapshots (POST /api/events/{id}/snapshot) et les enregistrements
  • Health check Alarik (GET /health)
  • Tests : Testcontainers Alarik (Phase 8), upload/download/batch delete

🧪 Critères d'acceptation

  • UploadAsync → fichier dans Alarik ; DownloadAsync → récupération
  • Upload atomique : crash pendant upload → pas de fichier orphelin
  • DeleteBatchAsync → 1000 fichiers en 1 appel

📁 Fichiers concernés

src/Heimdall.Application/Common/IStorageProvider.cs (nouveau), src/Heimdall.Infrastructure/Services/Storage/AlarikStorageProvider.cs (nouveau), src/Heimdall.Infrastructure/DependencyInjection.cs, tests/Heimdall.Infrastructure.Tests/

## 🎯 Contexte Aucun stockage objet n'est implémenté : pas d'`IStorageProvider`, pas d'`AlarikStorageProvider`. L'enum `StorageProvider` existe mais rien ne l'utilise. Les snapshots sont stockés via URL string sur l'événement, sans upload S3. ## 📚 Référence spec (MASTER_SPECIFICATION.md v2.0) **Phase 8 — Storage Alarik/S3** : `AlarikStorageProvider (IStorageProvider)`, staging prefix pour uploads atomiques, batch delete (`RemoveObjectsAsync`, 1000/appel), health check **7.1 Path patterns** : `recordings/{siteId}/{cameraId}/{date}/{timestamp}.ts` (rétention 7-90 j), `snapshots/{siteId}/{cameraId}/{date}/{eventId}.jpg`, `snapshots/unknown/{personId}.jpg` (30 j) **7.2 Upload sécurisé** : 1) upload staging/ 2) créer l'enregistrement DB 3) move atomique vers recordings/ (ou delete staging si erreur) — pas de race condition S3Cleanup **Correctif D6** : S3Cleanup paginé (pas de HashSet 1.5GB) ## 🔍 État actuel (vérifié dans le code) `StorageProvider` enum : S3, Local. `docker-compose.prod.yml` a un service `alarik` (ghcr.io/achtungsoftware/alarik:latest, port 9000) mais aucune intégration applicative. `AttachSnapshotAsync` ne fait que stocker une URL. ## 🧩 À faire - [ ] Interface `IStorageProvider` (Upload/Download/Delete/DeleteBatch/Health) dans Application - [ ] Implémentation `AlarikStorageProvider` (S3-compatible, MinIO client ou AWS SDK) - [ ] Upload atomique staging → move (7.2) - [ ] Batch delete 1000/appel - [ ] Brancher sur l'attachement de snapshots (POST /api/events/{id}/snapshot) et les enregistrements - [ ] Health check Alarik (GET /health) - [ ] Tests : Testcontainers Alarik (Phase 8), upload/download/batch delete ## 🧪 Critères d'acceptation - [ ] UploadAsync → fichier dans Alarik ; DownloadAsync → récupération - [ ] Upload atomique : crash pendant upload → pas de fichier orphelin - [ ] DeleteBatchAsync → 1000 fichiers en 1 appel ## 📁 Fichiers concernés src/Heimdall.Application/Common/IStorageProvider.cs (nouveau), src/Heimdall.Infrastructure/Services/Storage/AlarikStorageProvider.cs (nouveau), src/Heimdall.Infrastructure/DependencyInjection.cs, tests/Heimdall.Infrastructure.Tests/
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall#7
No description provided.