FEAT: Entité UserCameraAccess — modèle de données pour contrôle d'accès granulaire caméra #131

Open
opened 2026-08-18 08:52:44 +02:00 by nonobis · 0 comments
Owner

Contexte

Feature de contrôle d'accès granulaire par caméra. Actuellement, un utilisateur a accès à toutes les caméras d'un site s'il est assigné à ce site (UserSite). Il faut permettre de restreindre l'accès à des caméras spécifiques au sein d'un site.

Exemples d'usage :

  • M. Dupont peut voir toutes les caméras du site A mais une seule caméra du site B
  • Mme Martin peut voir les caméras 1 et 3 du site A uniquement
  • Un administrateur voit toutes les caméras de tous les sites (comportement existant)

Référence spec

Section 4.2 Permissions (Policies) — extension du modèle de contrôle d'accès.
Section ENTITIES : ajout de UserCameraAccess au schéma.

État actuel

  • UserSite (userId, siteId) → accès site complet (tout ou rien)
  • AppRole (Admin/Supervisor/Viewer) → permissions par rôle, pas de granularité caméra
  • Camera appartient à Site → pas de contrôle d'accès individuel
  • L'API PUT /api/users/{id}/sites existe mais n'est pas exposée dans l'UI UsersPage

À faire

  1. Créer l'entité UserCameraAccess dans Heimdall.Domain/Entities/ :
    • UserId (Guid, FK → AppUser)
    • SiteId (Guid, FK → Site)
    • CameraId (Guid?, FK → Camera) — null = toutes les caméras du site
    • Index composé unique (UserId, SiteId, CameraId) avec filter sur CameraId nullable
    • Relations navigation : User, Site, Camera
  2. Ajouter DbSet<UserCameraAccess> dans AppDbContext
  3. Ajouter la configuration EF Core (UserCameraAccessConfiguration) :
    • Clé primaire composite ou surrogate (Guid)
    • Contrainte d'unicité
    • Query filter pour soft delete des sites/caméras
  4. Créer la migration EF Core
  5. Créer les tests unitaires pour les contraintes du modèle

Critères d'acceptation

  • Entité UserCameraAccess créée avec bonnes relations
  • Migration EF Core applicable sans erreur
  • Contrainte d'unicité vérifiée (pas de doublon user+site+camera)
  • CameraId nullable (null = accès complet au site)
  • Query filters cohérents avec les soft deletes existants
  • Tests unitaires passent

Fichiers concernés

  • src/Heimdall.Domain/Entities/UserCameraAccess.cs (nouveau)
  • src/Heimdall.Infrastructure/Data/AppDbContext.cs
  • src/Heimdall.Infrastructure/Data/Configurations/UserCameraAccessConfiguration.cs (nouveau)
  • src/Heimdall.Infrastructure/Migrations/ (nouvelle migration)

Maquette

  • Lien Penpot : [à définir — maquette the-designer requise]

![Maquette](à définir)

## Contexte Feature de contrôle d'accès granulaire par caméra. Actuellement, un utilisateur a accès à **toutes** les caméras d'un site s'il est assigné à ce site (`UserSite`). Il faut permettre de restreindre l'accès à des caméras spécifiques au sein d'un site. **Exemples d'usage :** - M. Dupont peut voir **toutes** les caméras du site A mais **une seule** caméra du site B - Mme Martin peut voir les caméras 1 et 3 du site A uniquement - Un administrateur voit **toutes** les caméras de **tous** les sites (comportement existant) ## Référence spec Section 4.2 Permissions (Policies) — extension du modèle de contrôle d'accès. Section ENTITIES : ajout de `UserCameraAccess` au schéma. ## État actuel - `UserSite` (userId, siteId) → accès site complet (tout ou rien) - `AppRole` (Admin/Supervisor/Viewer) → permissions par rôle, pas de granularité caméra - `Camera` appartient à `Site` → pas de contrôle d'accès individuel - L'API `PUT /api/users/{id}/sites` existe mais n'est pas exposée dans l'UI UsersPage ## À faire 1. Créer l'entité `UserCameraAccess` dans `Heimdall.Domain/Entities/` : - `UserId` (Guid, FK → AppUser) - `SiteId` (Guid, FK → Site) - `CameraId` (Guid?, FK → Camera) — null = toutes les caméras du site - Index composé unique (UserId, SiteId, CameraId) avec filter sur CameraId nullable - Relations navigation : User, Site, Camera 2. Ajouter `DbSet<UserCameraAccess>` dans `AppDbContext` 3. Ajouter la configuration EF Core (`UserCameraAccessConfiguration`) : - Clé primaire composite ou surrogate (Guid) - Contrainte d'unicité - Query filter pour soft delete des sites/caméras 4. Créer la migration EF Core 5. Créer les tests unitaires pour les contraintes du modèle ## Critères d'acceptation - [ ] Entité `UserCameraAccess` créée avec bonnes relations - [ ] Migration EF Core applicable sans erreur - [ ] Contrainte d'unicité vérifiée (pas de doublon user+site+camera) - [ ] CameraId nullable (null = accès complet au site) - [ ] Query filters cohérents avec les soft deletes existants - [ ] Tests unitaires passent ## Fichiers concernés - `src/Heimdall.Domain/Entities/UserCameraAccess.cs` (nouveau) - `src/Heimdall.Infrastructure/Data/AppDbContext.cs` - `src/Heimdall.Infrastructure/Data/Configurations/UserCameraAccessConfiguration.cs` (nouveau) - `src/Heimdall.Infrastructure/Migrations/` (nouvelle migration) --- ## Maquette - **Lien Penpot** : [à définir — maquette the-designer requise] ![Maquette](à définir)
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#131
No description provided.