Louis Mazin d424689e12 big maj
2026-09-24 19:35:37 +02:00

4.6 KiB

Contrat API

Toutes les routes métier exigent un JWT. Les listes de pointages et les routes de détail sont limitées au propriétaire ; les administrateurs peuvent consulter et gérer les pointages de tous les utilisateurs. Les événements restent privés à leur créateur, comme auparavant.

Pointages

  • GET /api/time/entries/ renvoie une liste de lignes journalières, avec start_date, end_date, start_time, end_time, group_id et duration en heures.
  • POST /api/time/entries/create/ accepte ces dates/heures et, pour un administrateur, user_id. Une entrée sans sortie est permise sur une journée.
  • PATCH /api/time/entries/{id}/ modifie un pointage simple. Une période sur plusieurs jours est découpée côté serveur. L'ancienne route .../{id}/update/ reste un alias avec les mêmes validations ; PUT accepte aussi les champs partiels.
  • PATCH /api/time/groups/{uuid}/ modifie une période entière en transaction. Les dates/heures omises conservent les bornes existantes. La réponse est la première ligne, au même format que la création.
  • DELETE /api/time/groups/{uuid}/ supprime toutes les lignes du groupe en transaction. Une ligne d'un groupe ne peut pas être modifiée/supprimée isolément.
  • group_id est attribué exclusivement par le serveur. Les chevauchements et les entrées ouvertes concurrentes sont refusés.

Le front recharge la liste après une mutation. Il utilise duration fourni par le serveur et additionne les lignes d'un groupe pour afficher sa durée.

Le scan conserve les conflits HTTP 409. Pour les résoudre, le client renvoie resolution, time, scan_date et, selon le conflit, entry_id ou scan_time. Une résolution devenue obsolète ou chevauchant un autre pointage est refusée.

Événements et comptes

La création et la modification d'événements renvoient le même objet complet que la lecture. Dates, heures et couleurs sont validées côté serveur.

Un administrateur standard peut gérer les comptes ordinaires et les promouvoir administrateurs. Seul un superutilisateur peut gérer les comptes superutilisateurs ou accorder ce rôle. Un compte ne peut pas se supprimer, se désactiver ou retirer son propre accès administrateur.

Tâches, informations et mémos

L'espace Entreprise → Tâches et mémos est partagé entre tous les utilisateurs authentifiés. Le destinataire désigne la personne concernée ; ce n'est pas une publication privée.

  • Table notes_note : titre, contenu, type (task, info, memo), auteur, destinataire facultatif, date de clôture et dates de création/modification.
  • GET /api/notes/ : liste paginée (count, next, previous, results, 24 éléments par page). Filtres : kind, scope=all|mine|to_me, state=all|pending|done, search, page.
  • POST /api/notes/ : title, content facultatif, kind, recipient_id facultatif ou null pour toute l'équipe. L'auteur est fixé par le serveur.
  • GET|PATCH|DELETE /api/notes/{id}/ : consulter, modifier ou supprimer. Seuls l'auteur et les administrateurs peuvent modifier ou supprimer.
  • PATCH /api/notes/{id}/completion/ : { "is_done": true|false }. L'auteur, le destinataire et les administrateurs peuvent terminer ou rouvrir une tâche. Une tâche destinée à toute l'équipe peut être terminée par chacun.
  • GET /api/notes/recipients/ : annuaire des comptes actifs limité à id, username, first_name, last_name et color.

Les réponses comprennent can_edit et can_complete pour l'interface ; les mêmes permissions sont contrôlées à chaque écriture côté serveur. La suppression d'un compte conserve ses publications en retirant la référence au compte.

Session et migrations

Le client renouvelle un accès expiré avec /api/auth/refresh/, mutualise les renouvellements concurrents dans le même onglet, puis rejoue la requête une fois. Le nouveau refresh token remplace l'ancien, qui est placé sur liste noire. Les erreurs de réseau ne suppriment pas la session ; un refresh invalide la ferme.

Exécuter python manage.py migrate à chaque déploiement. La migration 0005 réconcilie les contraintes physiques des pointages avec l'état Django. Elle refuse les anciens pointages sans heure d'entrée et les doublons : ces données doivent être corrigées explicitement, elles ne sont ni inventées ni supprimées.

Vérification

  • Backend : python manage.py test time_tracking events users notes --noinput avec une instance MySQL de test et un utilisateur autorisé à créer la base de test. Ne pas pointer DATABASE_URL vers une base de production pour ces tests.
  • Frontend : npm test, npm run lint, npm run build dans frontend.