Docs menu

API#

Surface tRPC de la plateforme, montée sur /api/trpc. Elle sert le web et le mobile. Le modèle d'autorisation est décrit dans ARCHITECTURE.md.

Chaque procédure porte la mention de qui peut l'appeler :

MentionAppelant
publictout le monde
sessiontout compte authentifié
entreprisecompte entreprise, profil créé
prestatairecompte prestataire, profil créé
administrationcompte d'administration

reference#

Catalogues publics. Accessibles sans session : savoir si le service couvre sa région ne doit pas exiger de créer un compte au préalable. Seuls les éléments actifs sont exposés.

ProcédureAccèsDescription
regionspublicRégions ouvertes
sectorspublicSecteurs ouverts
jobTypespublicTypes de postes, avec leur secteur

auth#

ProcédureAccèsDescription
registerpublicCrée un compte et ouvre une session. Les rôles d'administration ne sont pas ouverts à l'inscription
loginpublicOuvre une session
logoutpublicIdempotent — se déconnecter sans session n'est pas une erreur
logoutEverywheresessionFerme les sessions de tous les appareils
mesessionUtilisateur et rattachement métier
requestPasswordResetpublicÉmet un jeton de réinitialisation
resetPasswordpublicConsomme le jeton et remplace le mot de passe

Points de vigilance.

login renvoie le même message qu'une adresse soit inconnue ou le mot de passe faux, et calcule un condensat factice dans les deux cas : l'écart de temps de réponse permettrait sinon d'énumérer les comptes.

requestPasswordReset répond toujours la même chose, que l'adresse existe ou non, et ne renvoie jamais le jeton. Une réinitialisation révoque toutes les sessions de l'utilisateur.

me renvoie principal: null quand le compte existe mais que le profil métier n'est pas créé. C'est ce qui permet de reprendre une inscription interrompue au lieu de la recommencer.

company#

ProcédureAccèsDescription
checkSirensessionContrôle la clé d'un SIREN sans rien créer
createProfilesessionCrée l'entreprise, son établissement et son abonnement
profileentrepriseProfil de l'entreprise connectée

createProfile s'exécute en transaction : une entreprise sans établissement, ou sans abonnement, serait un compte à moitié inscrit. Le SIRET doit relever du SIREN déclaré. Un second appel renvoie CONFLICT — un compte ouvre droit à un établissement.

Le montant de l'abonnement vient des paramètres de plateforme. Tant qu'aucun barème n'est renseigné, il reste à zéro : aucun tarif n'est inventé.

provider#

ProcédureAccèsDescription
checkRegistrationNumbersessionContrôle un numéro d'indépendant et indique l'étape suivante
createProfilesessionCrée le profil, ses zones, secteurs et postes recherchés
profileprestataireProfil du prestataire connecté

Les moins de 18 ans sont refusés. Le jour même de l'anniversaire est accepté.

Sans numéro d'indépendant, le profil est créé avec le statut a_creer et la réponse indique l'orientation vers un parcours externe de création. Le compte reste incomplet tant que les coordonnées bancaires ne sont pas rattachées : sans elles, aucune mission ne peut être réglée.

Un type de poste hors des secteurs choisis est refusé — il ne serait jamais diffusé.

mission#

ProcédureAccèsDescription
publishentreprisePublie une mission
jobTypesentrepriseTypes de postes ouverts
listForCompanyentrepriseMissions de l'établissement
feedprestataireMissions diffusées, classées par distance croissante
detailprestataireFiche de mission — vaut présentation du montant

publish calcule et persiste le montant total estimé, reprend par défaut l'adresse de l'établissement, et renvoie le nombre de prestataires réellement joignables — secteur et rayon — plutôt qu'un chiffre théorique. Le plafond de candidatures est borné entre 5 et 8 ; le rayon est borné à 100 km.

feed filtre sur le rayon propre à chaque mission et sur les secteurs du prestataire. La position peut être transmise par l'appareil, à défaut celle du profil est utilisée.

detail enregistre le taux horaire, la durée et le montant total tels qu'affichés. Sans cette trace, la candidature sera refusée. L'adresse complète n'y figure pas : elle n'est révélée qu'après attribution.

application#

ProcédureAccèsDescription
submitprestataireCandidate à une mission
withdrawprestataireRetire une candidature et libère une place
listMineprestataireCandidatures et historique
listForMissionentrepriseCandidats, classés par distance croissante
selectentrepriseRetient un candidat, écarte les autres, pourvoit la mission

submit exige le montant total confirmé par l'appelant et le confronte à ce qui a été réellement présenté. Elle refuse : sans présentation préalable, si le montant a changé depuis, si le montant confirmé ne correspond pas, si le plafond est atteint, ou si la mission n'est plus ouverte.

La distance est figée au moment de la candidature, pour que la comparaison entre candidats reste stable.

listMine renvoie le montant présenté au moment de la candidature, et non le montant courant de la mission : c'est celui-là qui a été accepté.

timesheet#

ProcédureAccèsDescription
scanCodeentrepriseCode à présenter sur site ; en régénérer un révoque le précédent
assignmentprestataireMission attribuée : adresse complète et itinéraire
scanInprestataireDémarre la mission
scanOutprestataireTermine la mission, ouvre la fenêtre de contestation
forMissionentrepriseRelevé d'heures
validateentrepriseValide les heures
disputeentrepriseConteste, dans la fenêtre
settleDueadministrationTraite les fenêtres échues — destinée à une tâche planifiée

assignment renvoie NOT_FOUND à un prestataire qui n'a pas été retenu.

scanOut calcule les heures à partir des deux horodatages et ouvre une fenêtre de contestation de 24 heures. À son expiration sans contestation, le règlement est déclenché.

admin#

ProcédureAccèsDescription
overviewadministrationCompteurs d'exploitation
companies, providersadministrationSuivi des inscriptions
missionsadministrationSuivi des missions
paymentOrdersadministrationOrdres de règlement
settlementsWithoutOrderadministrationRelevés arrêtés sans ordre — barème manquant
disputesadministrationLitiges, avec les éléments de décision
resolveDisputeadministrationTranche un litige et débloque le règlement

resolveDispute arrête les heures, trace la décision — auteur, heures retenues, motivation — et prépare l'ordre de règlement. Les heures tranchées font foi, et non le décompte automatique. Un litige déjà tranché renvoie CONFLICT.

waitlist#

ProcédureAccèsDescription
joinpublicInscription à la liste d'attente
list, statsadministrationConsultation

join renvoie la même réponse qu'une adresse soit nouvelle ou déjà inscrite : dire « déjà présente » indiquerait qui figure sur la liste.

Erreurs#

Les erreurs métier portent un code HTTP correct — 400, 401, 403, 404, 409 — et un authCode stable destiné à l'affichage.

Elles ne doivent jamais repartir en 500 : une faute de frappe dans un mot de passe compterait alors comme incident serveur et noierait la surveillance. Des tests verrouillent ce point.

Clients#

FichierUsage
apps/web/src/lib/api.tsNavigateur — cookie de session
apps/web/src/lib/api-server.tsComposants serveur — appel direct, lectures seulement
apps/mobile/src/lib/api.tsExpo — jeton relu à chaque requête

Un composant serveur ne peut pas poser de cookie : les mutations qui ouvrent ou ferment une session doivent passer par le point d'entrée HTTP, sinon le Set-Cookie serait perdu.

Last updated Aug 13, 2026Powered by GitDoc — CleverAI