FEAT: Service ICameraAccessService — résolution des accès caméra par utilisateur #132

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

Contexte

Service central de résolution des droits d'accès aux caméras pour un utilisateur donné. Ce service est le cœur du système de contrôle d'accès granulaire : il détermine quelles caméras un utilisateur peut voir, en croisant son rôle, ses assignations de sites, et ses assignations de caméras spécifiques.

Référence spec

Section 4.2 Permissions (Policies) — résolution des droits.

État actuel

  • L'accès est vérifié au niveau site uniquement (UserSite)
  • Pas de filtrage caméra : un utilisateur assigné à un site voit toutes les caméras
  • Les contrôleurs utilisent [Authorize(Policy = AppPermissions.CameraRead)] sans filtrage granulaire

À faire

  1. Créer ICameraAccessService dans Heimdall.Application/Services/ :

    • HasCameraAccessAsync(userId, cameraId) → vérifie l'accès à une caméra
    • GetAccessibleCameraIdsAsync(userId, siteId) → IDs des caméras accessibles pour un site
    • GetAccessibleSiteIdsAsync(userId) → IDs des sites accessibles
    • ApplyCameraFilter(query, userId) → filtre un IQueryable
  2. Implémenter CameraAccessService :

    • Admin → accès complet (retourner immédiatement true/tous les IDs)
    • Supervisor/Viewer → vérifier UserSite puis UserCameraAccess :
      • Si UserCameraAccess avec CameraId = null pour ce site → toutes les caméras
      • Sinon → uniquement les caméras listées dans UserCameraAccess
    • Si aucun UserSite ni UserCameraAccess → pas d'accès
  3. Enregistrer le service dans DI (ServiceCollectionExtensions)

  4. Créer les tests unitaires :

    • Admin voit tout
    • User sans assignment voit rien
    • User avec site-wide voit toutes les caméras du site
    • User avec caméras spécifiques ne voit que celles-ci
    • Soft-deleted cameras exclues

Critères d'acceptation

  • Interface ICameraAccessService créée
  • Implémentation correcte pour Admin/Supervisor/Viewer
  • Logique de résolution : UserSite → UserCameraAccess → fallback
  • Filtrage IQueryable<Camera> fonctionnel
  • Service enregistré dans DI
  • Tests unitaires couvrant tous les cas

Fichiers concernés

  • src/Heimdall.Application/Services/ICameraAccessService.cs (nouveau)
  • src/Heimdall.Application/Services/CameraAccessService.cs (nouveau)
  • src/Heimdall.Infrastructure/DependencyInjection.cs
  • tests/Heimdall.Tests/Services/CameraAccessServiceTests.cs (nouveau)

Maquette

N/A — ticket backend sans composante UI.

## Contexte Service central de résolution des droits d'accès aux caméras pour un utilisateur donné. Ce service est le **cœur** du système de contrôle d'accès granulaire : il détermine quelles caméras un utilisateur peut voir, en croisant son rôle, ses assignations de sites, et ses assignations de caméras spécifiques. ## Référence spec Section 4.2 Permissions (Policies) — résolution des droits. ## État actuel - L'accès est vérifié au niveau site uniquement (`UserSite`) - Pas de filtrage caméra : un utilisateur assigné à un site voit toutes les caméras - Les contrôleurs utilisent `[Authorize(Policy = AppPermissions.CameraRead)]` sans filtrage granulaire ## À faire 1. Créer `ICameraAccessService` dans `Heimdall.Application/Services/` : - `HasCameraAccessAsync(userId, cameraId)` → vérifie l'accès à une caméra - `GetAccessibleCameraIdsAsync(userId, siteId)` → IDs des caméras accessibles pour un site - `GetAccessibleSiteIdsAsync(userId)` → IDs des sites accessibles - `ApplyCameraFilter(query, userId)` → filtre un IQueryable<Camera> 2. Implémenter `CameraAccessService` : - **Admin** → accès complet (retourner immédiatement true/tous les IDs) - **Supervisor/Viewer** → vérifier `UserSite` puis `UserCameraAccess` : - Si `UserCameraAccess` avec `CameraId = null` pour ce site → toutes les caméras - Sinon → uniquement les caméras listées dans `UserCameraAccess` - Si aucun `UserSite` ni `UserCameraAccess` → pas d'accès 3. Enregistrer le service dans DI (`ServiceCollectionExtensions`) 4. Créer les tests unitaires : - Admin voit tout - User sans assignment voit rien - User avec site-wide voit toutes les caméras du site - User avec caméras spécifiques ne voit que celles-ci - Soft-deleted cameras exclues ## Critères d'acceptation - [ ] Interface `ICameraAccessService` créée - [ ] Implémentation correcte pour Admin/Supervisor/Viewer - [ ] Logique de résolution : UserSite → UserCameraAccess → fallback - [ ] Filtrage `IQueryable<Camera>` fonctionnel - [ ] Service enregistré dans DI - [ ] Tests unitaires couvrant tous les cas ## Fichiers concernés - `src/Heimdall.Application/Services/ICameraAccessService.cs` (nouveau) - `src/Heimdall.Application/Services/CameraAccessService.cs` (nouveau) - `src/Heimdall.Infrastructure/DependencyInjection.cs` - `tests/Heimdall.Tests/Services/CameraAccessServiceTests.cs` (nouveau) --- ## Maquette N/A — ticket backend sans composante UI.
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#132
No description provided.