Aperçu
Base URL
https://admin.lumeo.jeremyduc.dev/api
Format
- JSON UTF-8
- En-tête Authorization: Bearer <JWT> pour les endpoints protégés
Authentification
POST /api/login_check
Request:
POST /api/login_check
Content-Type: application/json
{
"email": "user@example.com",
"password": "secret"
}
Response 200:
{
"token": "<jwt>"
}
Utilisez ce jeton dans l’en-tête Authorization: Bearer <jwt>.
Services
GET /api/services
200 OK
[
{ "id": 1, "title": "Logo minimaliste", "cost": 50, "isAvailable": true, ... }
]
GET /api/services/{id}
200 OK
{ "id": 1, "title": "Logo minimaliste", "description": "...", "cost": 50, ... }
POST /api/services
Auth: Bearer
Body (JSON):
{
"title": "Traduction FR-EN",
"description": "Je traduis vos textes",
"cost": 25,
"tags": [1, 2] // ids de catégories
}
PUT /api/services/{id}
Auth: Bearer (propriétaire)
Body (JSON): mêmes champs que création (hors "status")
Remplace les catégories avec "tags".
DELETE /api/services/{id}
Auth: Bearer (propriétaire)
204 No Content
POST /api/services/{id}/purchase
Auth: Bearer
Body (JSON) optionnel:
{ "message": "Bonjour, j'ai besoin de ..." }
Effets:
- Crée une réservation (reserved)
- Crée une conversation liée
- Rend le service indisponible
- Publie des notifications (Mercure)
Response 201:
{
"reservation": { ... },
"conversation": { ... }
}
Conversations
GET /api/conversations
Auth: Bearer
200 OK: liste des conversations de l'utilisateur (buyer/seller)
GET /api/conversations/{id}
Auth: Bearer + doit être participant
200 OK: conversation + messages
POST /api/conversations/{id}/messages
Auth: Bearer + doit être participant
Body:
{ "content": "Votre message" }
Response 201: message créé + publication Mercure
Réservations
POST /api/reservations/{id}/complete
Auth: Bearer (vendeur)
Effets:
- Marque la réservation "completed"
- Rend le service à nouveau disponible
- Publie des notifications "reservation.completed"
Response 200: réservation mise à jour
Profil
GET /api/myprofile
Auth: Bearer
200 OK: profil courant (groups: profile:read)
POST /api/profile/edit
Auth: Bearer
Body:
{ "username": "Alice", "description": "Graphiste" }
POST /api/profile/edit-image
Auth: Bearer
Form-Data:
imageFile: (fichier)
Commandes
GET /api/myorders
Auth: Bearer
200 OK: commandes (achats de LumCoins)
Paiements
POST /api/payment/create
Auth: Bearer
Body:
{ "amount": 10, "coins": 100 }
Response 200:
{ "checkoutUrl": "https://checkout.stripe.com/..." }
POST /api/payment/confirm-checkout
Body:
{ "session_id": "<CHECKOUT_SESSION_ID>" }
Effet: crédite les LumCoins si paiement "paid".
Mercure (temps réel)
Topics principaux
https://lumeo.app/profiles/{profileId}/notifications— événements:message.created,reservation.created,reservation.completedhttps://lumeo.app/conversations/{conversationId}— événements:message.created
Exemple payload "message.created":
{
"type": "message.created",
"conversationId": 123,
"message": {
"id": 456,
"content": "Bonjour !",
"senderProfileId": 7,
"createdAt": "2025-09-07T12:34:56+00:00"
}
}
Erreurs & Statuts
- 200 OK
- 201 Created
- 204 No Content
- 400 Bad Request
- 401 Unauthorized
- 403 Forbidden
- 404 Not Found
- 409 Conflict
- 422 Unprocessable Entity
- 500 Internal Server Error
Format d’erreur typique
{ "error": "Message explicatif" }