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 :
| Mention | Appelant |
|---|---|
| public | tout le monde |
| session | tout compte authentifié |
| entreprise | compte entreprise, profil créé |
| prestataire | compte prestataire, profil créé |
| administration | compte 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édure | Accès | Description |
|---|---|---|
regions | public | Régions ouvertes |
sectors | public | Secteurs ouverts |
jobTypes | public | Types de postes, avec leur secteur |
auth#
| Procédure | Accès | Description |
|---|---|---|
register | public | Crée un compte et ouvre une session. Les rôles d'administration ne sont pas ouverts à l'inscription |
login | public | Ouvre une session |
logout | public | Idempotent — se déconnecter sans session n'est pas une erreur |
logoutEverywhere | session | Ferme les sessions de tous les appareils |
me | session | Utilisateur et rattachement métier |
requestPasswordReset | public | Émet un jeton de réinitialisation |
resetPassword | public | Consomme 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édure | Accès | Description |
|---|---|---|
checkSiren | session | Contrôle la clé d'un SIREN sans rien créer |
createProfile | session | Crée l'entreprise, son établissement et son abonnement |
profile | entreprise | Profil 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édure | Accès | Description |
|---|---|---|
checkRegistrationNumber | session | Contrôle un numéro d'indépendant et indique l'étape suivante |
createProfile | session | Crée le profil, ses zones, secteurs et postes recherchés |
profile | prestataire | Profil 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édure | Accès | Description |
|---|---|---|
publish | entreprise | Publie une mission |
jobTypes | entreprise | Types de postes ouverts |
listForCompany | entreprise | Missions de l'établissement |
feed | prestataire | Missions diffusées, classées par distance croissante |
detail | prestataire | Fiche 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édure | Accès | Description |
|---|---|---|
submit | prestataire | Candidate à une mission |
withdraw | prestataire | Retire une candidature et libère une place |
listMine | prestataire | Candidatures et historique |
listForMission | entreprise | Candidats, classés par distance croissante |
select | entreprise | Retient 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édure | Accès | Description |
|---|---|---|
scanCode | entreprise | Code à présenter sur site ; en régénérer un révoque le précédent |
assignment | prestataire | Mission attribuée : adresse complète et itinéraire |
scanIn | prestataire | Démarre la mission |
scanOut | prestataire | Termine la mission, ouvre la fenêtre de contestation |
forMission | entreprise | Relevé d'heures |
validate | entreprise | Valide les heures |
dispute | entreprise | Conteste, dans la fenêtre |
settleDue | administration | Traite 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édure | Accès | Description |
|---|---|---|
overview | administration | Compteurs d'exploitation |
companies, providers | administration | Suivi des inscriptions |
missions | administration | Suivi des missions |
paymentOrders | administration | Ordres de règlement |
settlementsWithoutOrder | administration | Relevés arrêtés sans ordre — barème manquant |
disputes | administration | Litiges, avec les éléments de décision |
resolveDispute | administration | Tranche 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édure | Accès | Description |
|---|---|---|
join | public | Inscription à la liste d'attente |
list, stats | administration | Consultation |
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#
| Fichier | Usage |
|---|---|
apps/web/src/lib/api.ts | Navigateur — cookie de session |
apps/web/src/lib/api-server.ts | Composants serveur — appel direct, lectures seulement |
apps/mobile/src/lib/api.ts | Expo — 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.