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, avecstart_date,end_date,start_time,end_time,group_idetdurationen 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 ;PUTaccepte 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_idest 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,contentfacultatif,kind,recipient_idfacultatif ounullpour 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_nameetcolor.
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 --noinputavec une instance MySQL de test et un utilisateur autorisé à créer la base de test. Ne pas pointerDATABASE_URLvers une base de production pour ces tests. - Frontend :
npm test,npm run lint,npm run builddansfrontend.