Skip to content

BDD-26 — Identifier l'utilisateur déposant un fichier

📄 Ticket fonctionnel

Identifier le déposant d'un fichier

Les administrateurs peuvent identifier rapidement l'utilisateur ayant déposé un fichier, notamment depuis la consultation des fichiers d'un dossier client.

1. User Story

En tant qu'administrateur,
Je veux voir qui a déposé chaque fichier,
Afin de suivre l'origine des documents transmis par les clients.

2. Critères d'acceptance

  1. Lorsqu'un fichier est déposé, le lien avec l'utilisateur déposant est conservé.
  2. L'API retourne les informations simples du déposant : prénom, nom, email si disponibles.
  3. Dans la vue admin d'un dossier, chaque fichier affiche le déposant.
  4. L'affichage reste discret côté UI et ne surcharge pas la liste.
  5. Si l'utilisateur déposant est introuvable ou incomplet, l'interface affiche une valeur de fallback simple.
  6. Les utilisateurs standards ne voient pas d'information inutile ou sensible sur d'autres utilisateurs.
  7. Les tests back et front couvrent l'affichage du déposant.

3. Flux complet

mermaid
sequenceDiagram
    autonumber
    participant U as 👤 Utilisateur
    participant F as 🖥️ Front Upload
    participant API as 🧠 API NestJS
    participant DB as 🗄️ prisma.tool
    participant A as 👤 Admin

    U->>F: Dépose un fichier
    F->>API: POST /documents multipart/form-data
    API->>DB: documents.create + users_documents.create(user_id)
    DB-->>API: document créé
    API-->>F: uuid, name, size, created_at

    A->>F: Ouvre /admin/folders/:uuid
    F->>API: GET /folders/:uuid/documents
    API->>DB: documents WHERE folder_id + users_documents.user
    DB-->>API: documents + depositor simple
    API-->>F: [{uuid, name, size, created_at, depositor}]
    F-->>A: Affiche "Déposé par ..."

4. Périmètre fonctionnel

Backend

FichierRôle
back/src/api/documents/document.service.tsCrée la liaison users_documents lors du dépôt
back/src/api/documents/document-access-policy.service.tsCharge le déposant simple dans la liste des documents accessibles
back/src/api/documents/document.presenter.tsTransforme users_documents.user en champ depositor
back/src/api/folders/folder.service.tsCharge le déposant dans findDocuments pour la vue admin d'un dossier

Frontend

FichierRôle
front/src/components/documents/DocumentListItem.vueAffiche le déposant si showDepositor est actif, avec fallback
front/src/pages/admin/folders/AdminFolderDetailPage.vueActive showDepositor dans la vue admin d'un dossier
front/src/pages/upload/UploadPage.vueN'active pas showDepositor dans la liste standard des fichiers déposés

5. Contrats API

Dépôt

http
POST /documents
X-App-Access-Token: <app_access_token>
Content-Type: multipart/form-data

Le service crée le document et conserve la liaison avec l'utilisateur connecté :

ts
users_documents: {
  create: {
    user_id: user.id;
  }
}

Consultation admin des fichiers d'un dossier

http
GET /folders/:uuid/documents
X-App-Access-Token: <app_access_token>

Réponse :

json
[
  {
    "uuid": "11111111-1111-4111-8111-111111111111",
    "name": "rapport-client.csv",
    "size": 15432,
    "created_at": "2026-04-16T08:12:00.000Z",
    "depositor": {
      "id": 7,
      "firstname": "Jean",
      "lastname": "Dupont",
      "email": "[email protected]"
    }
  }
]

Si le déposant ne peut pas être résolu, depositor vaut null.

Décision sécurité

La liste standard GET /documents ne retourne pas le champ depositor aux utilisateurs non-admin. Le déposant est exposé uniquement pour les rôles admin/super-admin ou via les endpoints admin protégés comme GET /folders/:uuid/documents.

6. Affichage UI

  • Dans /admin/folders/:uuid, chaque ligne de fichier affiche une information discrète :
    • Déposé par Jean Dupont
    • Déposé par [email protected] si le nom est absent
    • Déposé par utilisateur inconnu si aucune information n'est exploitable
  • Dans /upload, la liste standard des fichiers déposés n'affiche pas le déposant.

7. Points de vérification

  • Un upload crée toujours une ligne users_documents pour le déposant.
  • GET /folders/:uuid/documents retourne depositor.firstname, depositor.lastname, depositor.email si disponibles.
  • GET /documents ne retourne pas depositor pour un utilisateur standard.
  • La vue admin dossier active showDepositor.
  • La liste standard /upload ne passe pas showDepositor.
  • Le fallback utilisateur inconnu est affiché si le déposant est absent.
  • Aucun changement n'est nécessaire sur les droits d'accès : les endpoints admin restent protégés par AuthGuard + AdminGuard.

8. Tests associés

Backend

  • back/src/api/documents/document.service.spec.ts — conservation du lien users_documents, transformation depositor, cas null
  • back/src/api/folders/folder.service.spec.tsfindDocuments retourne le déposant simple et le fallback null

Frontend

  • front/src/__tests__/components/documents/DocumentListItem.spec.js — affichage nom, email, fallback et masquage hors showDepositor
  • front/src/__tests__/pages/admin/folders/AdminFolderDetailPage.spec.js — activation de showDepositor dans la vue admin dossier