@extends('layouts.app') @section('title', 'Documentation de l\'API - ' . app_setting('app_name', 'Dev App')) @section('content') @php $base = url('/api/v1'); $sections = [ 'Compte & jeton' => [ ['GET', '/me', 'Le compte et le jeton utilisés (pratique pour tester une configuration).'], ], 'Projets' => [ ['GET', '/projects', 'Projets accessibles, avec leurs colonnes.'], ['POST', '/projects', 'Créer un projet (colonnes par défaut créées). Corps : name, description?, color? (#rrggbb), allow_guest_reports?, client_portal_enabled?, member_ids?[]. Jeton administrateur.'], ['GET', '/projects/{id}', 'Détail : colonnes, membres, liens (tableau, signalement, portail).'], ['PATCH', '/projects/{id}', 'Modifier : name, description, repository_url, color, allow_guest_reports, client_portal_enabled, archived (bool).'], ['GET', '/projects/{id}/roadmap', 'Toutes les colonnes et leurs tickets, pensé pour une IA.'], ['POST', '/projects/{id}/ai-sync', 'Déplacer plusieurs tickets d\'un coup. Corps : updates[] { ticket_number|ticket_id, column_name|column_id, comment? }.'], ], 'Colonnes & membres' => [ ['POST', '/projects/{id}/columns', 'Ajouter une colonne : name, color?, is_closed_status?.'], ['PATCH', '/projects/{id}/columns/{column}', 'Modifier : name, color, order_position, is_closed_status, is_default (true).'], ['POST', '/projects/{id}/members', 'Donner accès : user_id ou email. Jeton administrateur.'], ['DELETE', '/projects/{id}/members/{user}', 'Retirer l\'accès. Jeton administrateur.'], ], 'Tickets' => [ ['GET', '/projects/{id}/tickets', 'Lister, filtres : column_id, type, priority, label (nom), version (nom), search.'], ['POST', '/projects/{id}/tickets', 'Créer : title, description?, test_instructions?, type? (bug|feature|improvement|task, défaut task), priority? (low|normal|high|urgent), column_name|column_id?, assigned_to_id|assignee_email?, due_date?, is_visible_to_client? (défaut true), version? (id ou nom, créée au besoin), labels?[] (noms, créées au besoin), checklist?[] (étapes).'], ['GET', '/tickets/{id}', 'Détail avec commentaires, pièces jointes, étiquettes, version, étapes, liens (links) et historique (history).'], ['PATCH', '/tickets/{id}', 'Modifier : title, description, test_instructions, type, priority, column_name|column_id, assigned_to_id, due_date, is_visible_to_client, order_position, version (id, nom ou null), labels[] (remplace), comment? (note interne, ou visible avec comment_is_internal=false).'], ['DELETE', '/tickets/{id}', 'Supprimer définitivement.'], ['POST', '/tickets/{id}/comments', 'Commenter : content, is_internal_only? (défaut true), author_name?.'], ['POST', '/tickets/{id}/attachments', 'Joindre un fichier (multipart, champ file, 10 Mo max).'], ['POST', '/tickets/{id}/checklist', 'Ajouter des étapes : content, ou items[].'], ['PATCH', '/checklist-items/{id}', 'Modifier une étape : content, is_done, position.'], ['DELETE', '/checklist-items/{id}', 'Retirer une étape.'], ['POST', '/tickets/{id}/links', 'Relier : type (depends_on|duplicates|follows|relates), linked_ticket_id ou target (« #12 » ou « Nom du projet #12 »).'], ['DELETE', '/ticket-links/{id}', 'Retirer un lien.'], ], 'Historique & recherche' => [ ['GET', '/activity', 'Ce qui s\'est passé dans tous les projets accessibles. Filtres : since (date, du plus ancien au plus récent), project_id, limit (200 par défaut, 500 max).'], ['GET', '/projects/{id}/activity', 'Historique d\'un projet, filtres since et limit.'], ['GET', '/tickets/{id}/activity', 'Historique d\'un ticket.'], ['GET', '/search', 'Recherche dans tous les projets : q (titres, descriptions, ce qu\'il faut tester, commentaires, notes).'], ], 'Mémoire du projet' => [ ['GET', '/projects/{id}/notes', 'Notes de l\'équipe (décisions, règles, liens).'], ['POST', '/projects/{id}/notes', 'Ajouter : title, content?, category? (decision|rule|link|info), is_pinned?.'], ['PATCH', '/notes/{id}', 'Modifier une note.'], ['DELETE', '/notes/{id}', 'Supprimer une note.'], ['GET', '/projects/{id}/locations', 'Dépôt et dossiers du code par poste de travail.'], ['POST', '/projects/{id}/locations', 'Enregistrer le dossier d\'un poste : workstation, path, notes? (remplace le dossier si le poste existe déjà).'], ['PATCH', '/locations/{id}', 'Modifier : workstation, path, notes.'], ['DELETE', '/locations/{id}', 'Retirer un emplacement.'], ['GET', '/projects/{id}/versions', 'Versions et leurs tickets.'], ['POST', '/projects/{id}/versions', 'Créer : name, description?, released? (bool) ou released_at?.'], ['PATCH', '/versions/{id}', 'Modifier : name, description, released (true publie maintenant), released_at.'], ['DELETE', '/versions/{id}', 'Supprimer (les tickets restent).'], ['GET', '/projects/{id}/labels', 'Étiquettes du projet.'], ['POST', '/projects/{id}/labels', 'Créer : name, color? (#rrggbb).'], ['PATCH', '/labels/{id}', 'Modifier : name, color.'], ['DELETE', '/labels/{id}', 'Supprimer.'], ], 'Comptes' => [ ['GET', '/users', 'Lister (filtre role). Jeton administrateur.'], ['POST', '/users', 'Créer : name, email, role (admin|collaborator|client), company?, password? (10 caractères min.), project_ids?[]. Sans mot de passe, un client reçoit un lien de connexion (login_url, 7 jours, usage unique).'], ['PATCH', '/users/{id}', 'Modifier : name, email, role, company, password, project_ids[].'], ], ]; $integration = [ ['POST', '/integration/services', 'Livrer un service : crée le compte client si l\'e-mail est inconnu, crée le projet (ou le rouvre), donne l\'accès. Idempotent sur reference. Renvoie le suivi et un login_url.'], ['GET', '/integration/services/{reference}', 'Suivi à afficher au client : statut, avancement en %, colonnes, tickets visibles, derniers échanges, liens publics.'], ['PATCH', '/integration/services/{reference}', 'Renommer : name, description.'], ['POST', '/integration/services/{reference}/suspend', 'Suspendre (impayé…) : le client et les liens publics perdent l\'accès, l\'équipe le garde.'], ['POST', '/integration/services/{reference}/unsuspend', 'Réactiver.'], ['POST', '/integration/services/{reference}/terminate', 'Résilier : projet archivé (données conservées), clients retirés. Une nouvelle livraison le rouvre.'], ['POST', '/integration/services/{reference}/clients', 'Ajouter un autre client au service : email, name, company?.'], ['POST', '/integration/services/{reference}/tickets', 'Demande du client : client_email, title, description, type? (bug|feature|improvement), priority?.'], ['GET', '/integration/services/{reference}/tickets/{numéro}', 'Un ticket visible, avec ses échanges publics.'], ['POST', '/integration/services/{reference}/tickets/{numéro}/comments', 'Réponse du client : client_email, content.'], ['POST', '/integration/login-links', 'Lien de connexion à usage unique pour un client : email, reference?, minutes? (15 par défaut).'], ]; $methodColors = ['GET' => 'bg-emerald-100 text-emerald-800', 'POST' => 'bg-indigo-100 text-indigo-800', 'PATCH' => 'bg-amber-100 text-amber-800', 'DELETE' => 'bg-rose-100 text-rose-800']; @endphp
REST + JSON, version 1. Toutes les réponses sont en JSON, les erreurs de validation renvoient 422.
Chaque requête porte un jeton dans l'en-tête : Authorization: Bearer devapp_…. Le jeton dans l'URL n'est pas accepté.
/integration/…, c'est-à-dire les projets livrés comme service à un client, et seulement ce que ce client peut voir (jamais les notes internes).URL de base : {{ $base }}
{{ $path }}
{{ $description }}
Quand une commande de développement est validée dans le panel, il « livre le service » : DevApp crée le compte client et le projet, puis renvoie un lien de connexion.
Le panel affiche ensuite l'avancement avec GET /integration/services/{reference}. La reference est l'identifiant du service côté panel (lettres, chiffres, . _ : -).
{{ $path }}
{{ $description }}