Niveaux d'accès
Comment les niveaux BASIC, STANDARD et FULL controlent la visibilite des champs
Principe
Chaque clé API possède un niveau d’accès qui determine quels champs sont retournes dans les réponses JSON. Cela permet à la clinique de controler precisement les données partagees avec chaque partenaire.
Le niveau d’accès ne change pas les endpoints accessibles (ca, c’est le role des permissions). Il filtre les champs dans les réponses.
Les trois niveaux
| Niveau | Description | Cas d’usage |
|---|---|---|
| BASIC | Identifiants et infos minimales | Affichage de listes, références croisees |
| STANDARD | Informations metier courantes | Intégrations metier classiques |
| FULL | Toutes les données disponibles | Partenaires de confiance, synchronisation complete |
Configuration par clé
Chaque clé a :
- Un niveau par défaut qui s’applique à toutes les ressources (
STANDARDsi la clinique n’en a pas choisi) - Des surcharges par ressource pour ajuster finement
Exemple de configuration :
{
"defaultAccessLevel": "STANDARD",
"resourceScopes": {
"patient": "FULL",
"client": "BASIC"
}
}
Dans cet exemple :
/patientsretourne tous les champs (FULL)/clientsretourne uniquement id, firstName, lastName (BASIC)/invoicesretourne le niveau STANDARD (défaut)
Les noms de ressource des surcharges sont patient, client, appointment, consultation,
invoice et stock. Le niveau d’une ressource s’applique aux routes qui commencent par son chemin,
sauf /appointments/types et /appointments/available-slots : le catalogue des types et les créneaux
libres ne sont pas des rendez-vous (ni animal ni client), ils rendent tous leurs champs quel que soit
le niveau.
Champs par ressource
En BASIC et en STANDARD, la réponse ne garde que les champs listés. En FULL, rien n’est filtré : la
réponse porte tous les champs que la route renvoie, y compris ceux qui ne sont pas dans les
tableaux ci-dessous. Le filtre s’applique au premier niveau de l’objet, de chaque objet d’une liste, ou
de chaque élément d’une page (items, la pagination totalCount, limit, offset, hasMore étant
gardée). Une réponse d’erreur n’est jamais filtrée : elle garde son message.
Patient
| Champ | BASIC | STANDARD | FULL |
|---|---|---|---|
id | x | x | x |
name | x | x | x |
species | x | x | x |
breed | x | x | x |
sex | x | x | x |
clientId | x | x | |
birthDate | x | x | |
microchipNumber | x | x | |
createdAt | x | x | |
tous les autres champs de la fiche (photoUrl, updatedAt…) | x |
Client
| Champ | BASIC | STANDARD | FULL |
|---|---|---|---|
id | x | x | x |
firstName | x | x | x |
lastName | x | x | x |
phone | x | x | |
email | x | x | |
createdAt | x | x | |
tous les autres champs de la fiche (address, updatedAt…) | x |
Rendez-vous
| Champ | BASIC | STANDARD | FULL |
|---|---|---|---|
id | x | x | x |
patientId | x | x | x |
vetId | x | x | x |
startAt, endAt (horaire) | x | x | x |
workflow (avancement : PLANNED, CONFIRMED, WAITING, IN_PROGRESS, TO_BILL, COMPLETED) | x | x | x |
category (CANCELLED, NO_SHOW, DECEASED, EMERGENCY, WALK_IN, HOSPITALIZATION, ou null) | x | x | x |
clientId | x | x | |
appointmentTypeId | x | x | |
reason | x | x | |
isUrgent | x | x | |
arrivedAt | x | x | |
calledAt | x | x | |
createdAt | x | x | |
durationMinutes, salle et les autres champs | x |
Consultation
| Champ | BASIC | STANDARD | FULL |
|---|---|---|---|
id | x | x | x |
patientId | x | x | x |
vetId | x | x | x |
status | x | x | x |
startedAt | x | x | x |
appointmentId | x | x | |
importance | x | x | |
validatedAt | x | x | |
ownerSummary | x | x | |
ownerDiagnosis | x | x | |
ownerInstructions | x | x | |
createdAt | x | x | |
patient, client, vet (résumés) | x | x | |
| tous les autres champs | x |
Facture
| Champ | BASIC | STANDARD | FULL |
|---|---|---|---|
id | x | x | x |
clientId | x | x | x |
invoiceNumber | x | x | x |
status | x | x | x |
totalTtc | x | x | x |
consultationId | x | x | |
subtotal | x | x | |
totalTax | x | x | |
paidAmount | x | x | |
remainingAmount | x | x | |
createdAt | x | x | |
tous les autres champs (lines, totalHt…) | x |
Stock
| Champ | BASIC | STANDARD | FULL |
|---|---|---|---|
id | x | x | x |
productName | x | x | x |
quantity | x | x | x |
isLowStock | x | x | x |
isOutOfStock | x | x | x |
productId | x | x | |
productCategory | x | x | |
minThreshold | x | x | |
maxThreshold | x | x | |
lastMovementAt | x | x | |
updatedAt | x | x | |
| tous les autres champs | x |
GET /stock répond une page (items, totalCount, limit, offset, hasMore) : chaque élément
de items suit le tableau ci-dessus, la pagination est gardée.
Aujourd’hui, GET /invoices et GET /patients/list répondent des listes avec totaux et statistiques,
que le filtre ne sait pas lire : en BASIC et en STANDARD, elles arrivent vides ({}). Lisez les
pièces une par une (GET /invoices/{id}, GET /patients/{id}), ou demandez le niveau FULL.