FEAT: Stockage Alarik/S3 — IStorageProvider, upload atomique, batch delete #7
Labels
No labels
bug
chore
design
dx:ci
dx:database
dx:dotnet
dx:infra
dx:security
dx:tests
dx:ui
etape-1
etape-2
etape-3
etape-4
etape-5
etape-6
etape-7
feature
priority-high
priority-low
priority-medium
security
spec
tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
nonobis/Heimdall#7
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🎯 Contexte
Aucun stockage objet n'est implémenté : pas d'
IStorageProvider, pas d'AlarikStorageProvider. L'enumStorageProviderexiste 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 check7.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)
StorageProviderenum : S3, Local.docker-compose.prod.ymla un servicealarik(ghcr.io/achtungsoftware/alarik:latest, port 9000) mais aucune intégration applicative.AttachSnapshotAsyncne fait que stocker une URL.🧩 À faire
IStorageProvider(Upload/Download/Delete/DeleteBatch/Health) dans ApplicationAlarikStorageProvider(S3-compatible, MinIO client ou AWS SDK)🧪 Critères d'acceptation
📁 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/