Documentation de l'API

Bonjour Monsieur, une documentation complète de l’API est disponible sur /api/doc, générée avec NelmioApiDocBundle. Si jamais cette documentation ne fonctionne pas correctement, vous pouvez consulter celle présente sur cette page, qui reprend toutes les routes et leur fonctionnement. Sur ce projet, j’ai essayé d’expérimenter avec des concepts que je ne connaissais pas encore, comme les DTO, les Enum, et d’autres bonnes pratiques liées à Symfony. J’espère les avoir utilisés correctement, et j’ai tenté de rendre l’API claire et fonctionnelle

Auth

POST /api/register

Inscrire un nouvel utilisateur

Body JSON (Request):
{
  "email": "[email protected]",
  "password": "MotDePasse123",
  "displayName": "MonPseudo"
}
Response JSON:

200

{
  "id": 1,
  "email": "[email protected]",
  "displayName": "MonPseudo"
}

400 - validation échouée

409 - email ou displayName déjà utilisé

500 - échec envoi email

POST /api/login_check

Connexion d’un utilisateur

Body JSON (Request):
{
  "email": "[email protected]",
  "password": "MotDePasse123"
}
Response JSON:

200

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

401 - Identifiants invalides

POST /api/verify/email

Vérification de l’email utilisateur

Query Parameters:

id - ID utilisateur (integer)

Response JSON:

200 - Email vérifié

{
  "message": "Email vérifié avec succès"
}

400 - Bad Request

Event

POST /api/event/create

Créer un nouvel événement

Body JSON (Request):
{
  "description": "Anniversaire de Jean",
  "startDate": "2025-12-20T14:00:00",
  "endDate": "2025-12-20T18:00:00",
  "status": "PUBLIC",
  "locationType": "INDOOR",
  "eventStatus": "PLANNED",
  "street": "123 Rue Exemple",
  "city": "Paris",
  "zipCode": "75001",
  "country": "France"
}
Response JSON:

200 - Événement créé avec succès

{
  "id": 10,
  "description": "Anniversaire de Jean",
  "startDate": "2025-12-20 14:00:00",
  "endDate": "2025-12-20 18:00:00",
  "visibilitystatus": "PUBLIC",
  "locationType": "INDOOR",
  "eventStatus": "PLANNED",
  "organizer": [{"id": 1, "displayName": "Jean", "email": "[email protected]"}],
  "location": {
    "street": "123 Rue Exemple",
    "city": "Paris",
    "zipCode": "75001",
    "country": "France"
  }
}

400 - Mauvaise requête

401 - Non autorisé

PUT /api/event/update/{id}

Mettre à jour un événement existant

id - ID de l’événement

Body JSON (Request):
{
  "description": "Nouvelle description",
  "startDate": "2025-12-21T14:00:00",
  "endDate": "2025-12-21T18:00:00",
  "eventStatus": "ONGOING",
  "street": "456 Rue Nouvelle",
  "city": "Paris",
  "zipCode": "75002",
  "country": "France"
}

200 - Événement mis à jour

{
  "id": 10,
  "description": "Nouvelle description",
  "startDate": "2025-12-21 14:00:00",
  "endDate": "2025-12-21 18:00:00",
  "eventStatus": "ONGOING",
  "location": {
    "street": "456 Rue Nouvelle",
    "city": "Paris",
    "zipCode": "75002",
    "country": "France"
  }
}

400 - Mauvaise requête

401 - Non autorisé

403 - Forbidden (non organisateur)

GET /api/events

Récupérer tous les événements

200 - Liste des événements

[
  {
    "id": 10,
    "description": "Anniversaire de Jean",
    "startDate": "2025-12-20 14:00:00",
    "endDate": "2025-12-20 18:00:00",
    "visibilitystatus": "PUBLIC",
    "locationType": "INDOOR",
    "eventStatus": "PLANNED"
  }
]

GET /api/events/public

Récupérer tous les événements publics

200 - Liste des événements publics

[
  {
    "id": 10,
    "description": "Anniversaire de Jean",
    "startDate": "2025-12-20 14:00:00",
    "endDate": "2025-12-20 18:00:00",
    "visibilitystatus": "PUBLIC",
    "locationType": "INDOOR",
    "eventStatus": "PLANNED"
  }
]

GET /api/event/{id}

Récupérer les détails d’un événement par ID

id - ID de l’événement

200 - Détails de l’événement

{
  "id": 10,
  "description": "Anniversaire de Jean",
  "location": "123 Rue Exemple, Paris, 75001, France",
  "startDate": "2025-12-20 14:00:00",
  "endDate": "2025-12-20 18:00:00",
  "organizer": [{"id": 1, "displayName": "Jean", "email": "[email protected]"}],
  "contributions": [],
  "participants": [{"id": 2, "displayName": "Marie"}],
  "guests": [{"id": 3, "displayName": "Paul", "status": "PENDING"}],
  "suggestions": [{"id": 1, "label": "Décoration anniversaire", "status": "TO_TAKE", "who": null}]
}

401 - Non autorisé

403 - Forbidden (événement privé non accessible)

POST /api/event/{id}/participate

Participer à un événement public

id - ID de l’événement

200 - Inscription réussie

{
  "message": "You have successfully registered for the event: Anniversaire de Jean"
}

400 - Déjà inscrit

401 - Non autorisé

403 - Événement privé

POST /api/event/{id}/cancelParticipation

Annuler la participation à un événement public

id - ID de l’événement

200 - Participation annulée

{
  "message": "You have successfully canceled your participation for the event: Anniversaire de Jean"
}

401 - Non autorisé

403 - Événement privé

POST /api/event/{id}/send-invitations/{guestid}

Envoyer une invitation à un invité pour un événement privé

id - ID de l’événement

guestid - ID de l’invité

200 - Invitation envoyée

{
  "message": "Invitation sent successfully to: Paul"
}

400 - Bad Request

401 - Non autorisé

404 - Invité non trouvé

Contribution

POST /api/contribution/suggestion/{id}/take

Prendre une suggestion comme contribution

id - ID de la suggestion

Response JSON:

201 - Suggestion prise

{
  "id": 15,
  "label": "Décoration anniversaire",
  "taken": true
}

400 - Suggestion non disponible

401 - Non autorisé

POST /api/contribution/event/{id}/create

Créer une contribution personnalisée pour un événement

id - ID de l’événement

Body JSON (Request):
{
  "label": "Gâteau au chocolat"
}
Response JSON:

201 - Contribution créée

{
  "id": 20,
  "eventId": 10,
  "label": "Gâteau au chocolat"
}

400 - Bad Request

401 - Non autorisé

DELETE /api/contribution/delete/{id}

Supprimer une contribution

id - ID de la contribution

Response JSON:

200 - Contribution supprimée

{
  "message": "Contribution supprimée avec succès"
}

401 - Non autorisé

403 - Pas d’autorisation

404 - Contribution non trouvée

PUT /api/contribution/update/{id}

Mettre à jour une contribution

id - ID de la contribution

Body JSON (Request):
{
  "label": "Gâteau aux fraises",
  "suggestionId": 15
}
Response JSON:

200 - Contribution mise à jour

{
  "id": 20,
  "label": "Gâteau aux fraises",
  "suggestionId": 15
}

400 - Bad Request

401 - Non autorisé

404 - Contribution non trouvée

Invitation

GET /api/invitations

Récupérer les invitations de l’utilisateur connecté

Response JSON:

200 - Liste des invitations

[
  {
    "id": 5,
    "eventId": 10,
    "status": "PENDING"
  }
]

401 - Non autorisé

POST /api/invitation/accept/{id}

Accepter une invitation par ID

id - ID de l’invitation

Response JSON:

200 - Invitation acceptée

{
  "id": 5,
  "status": "ACCEPTED"
}

400 - Action impossible (événement passé ou annulé, déjà accepté)

401 - Non autorisé

403 - Invitation non destinée à l’utilisateur

404 - Invitation non trouvée

POST /api/invitation/decline/{id}

Refuser une invitation par ID

id - ID de l’invitation

Response JSON:

200 - Invitation refusée

{
  "id": 5,
  "status": "DECLINED"
}

400 - Action impossible (événement passé ou annulé, déjà refusé)

401 - Non autorisé

403 - Invitation non destinée à l’utilisateur

404 - Invitation non trouvée

Organizer

POST /api/event/{id}/upload/image

Uploader une image pour un événement

id - ID de l’événement

Response JSON:

200 - Image uploadée

{
  "message": "Image uploadée avec succès",
  "url": "/uploads/event/10/image.jpg"
}

401 - Non autorisé

403 - Non organisateur

POST /api/event/{id}/promote/{profileId}

Promouvoir un participant en organisateur

id - ID de l’événement

profileId - ID du profil à promouvoir

200 - Profil promu

{
  "profileId": 12,
  "role": "ORGANIZER"
}

400 - Profil non participant

401 - Non autorisé

403 - Non organisateur

POST /api/event/{id}/demote/{profileId}

Démouvoir un organisateur en participant

id - ID de l’événement

profileId - ID du profil à rétrograder

200 - Profil démotivé

{
  "profileId": 12,
  "role": "PARTICIPANT"
}

400 - Profil non organisateur

401 - Non autorisé

403 - Non organisateur

Suggestion

POST /api/suggestion/event/{id}/create

Créer une suggestion pour un événement privé

id - ID de l’événement

Body JSON (Request):
{
  "label": "Décoration anniversaire"
}
Response JSON:

200 - Suggestion créée avec succès

{
  "id": 1,
  "label": "Décoration anniversaire",
  "status": "TO_TAKE",
  "event": {
    "id": 10,
    "description": "Anniversaire de Jean",
    "startDate": "2025-12-20 14:00:00",
    "endDate": "2025-12-20 18:00:00",
    "location": {
      "street": "123 Rue Exemple",
      "city": "Paris",
      "zipCode": "75001",
      "country": "France"
    }
  }
}

400 - Mauvaise requête (événement public ou suggestion déjà existante)

{
  "error": "Cannot add suggestions to a public event"
}
{
  "error": "Suggestion Already Exist"
}

401 - Non autorisé

{
  "error": "Unauthorized"
}

403 - L’utilisateur n’est pas organisateur

"YOU ARE NOT ADMIN"

Profile

GET /api/profile/{id}/events

Récupérer les événements du profil authentifié

id - ID du profil

200 - Liste des événements

[
  {
    "id": 10,
    "description": "Anniversaire de Jean",
    "startDate": "2025-12-20 14:00:00",
    "endDate": "2025-12-20 18:00:00",
    "visibilitystatus": "PUBLIC",
    "locationType": "INDOOR",
    "eventStatus": "PLANNED"
  }
]

401 - Non autorisé

403 - Forbidden (accès à un autre profil)

POST /api/profile/{id}/upload/image

Uploader une image pour le profil

id - ID du profil

Form Data:
img: [fichier image]
        

200 - Image uploadée avec succès

{
  "message": "image successfully upload"
}

401 - Non autorisé

403 - Forbidden (profil autre que le sien)

GET /api/profiles

Récupérer tous les profils

200 - Liste des profils

[
  {
    "id": 1,
    "displayName": "Jean",
    "email": "[email protected]"
  },
  {
    "id": 2,
    "displayName": "Marie",
    "email": "[email protected]"
  }
]

401 - Non autorisé

PUT /api/profile/edit/{id}

Modifier le profil authentifié

id - ID du profil

Body JSON:
{
  "displayName": "New Display Name"
}

200 - Profil mis à jour

{
  "id": 1,
  "displayName": "New Display Name",
  "email": "[email protected]"
}

401 - Non autorisé

403 - Forbidden (profil autre que le sien)

409 - Conflit, displayName déjà utilisé