Aller au contenu principal

Utilisateurs & Profils

GET /users/me

Auth requis

Retourne le profil complet de l'utilisateur connecté avec ses intérêts.

Request

GET /users/me
Authorization: Bearer <token>

Response

200 OK

{
"id": 42,
"name": "Marie Dupont",
"email": "marie@exemple.com",
"bio": "Passionnée de randonnée",
"location": "Paris, France",
"role": "user",
"is_active": true,
"Profile": {
"id": 18,
"user_id": 42,
"first_name": "Marie",
"last_name": "Dupont",
"age": 28,
"biography": "Je propose des randonnées guidées autour de Paris.",
"country": "France",
"city": "Paris",
"image_url": "https://...",
"is_searchable": true,
"Interests": [
{ "id": 3, "name": "Randonnée" },
{ "id": 7, "name": "Cuisine" }
]
}
}

PATCH /users/profile

Auth requis

Met à jour le profil de l'utilisateur connecté (champs User + Profile + Intérêts).

Request

PATCH /users/profile
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Marie D.",
"bio": "Guide de randonnée à Paris",
"location": "Île-de-France",
"first_name": "Marie",
"last_name": "Dupont",
"age": 28,
"biography": "Je propose des randonnées autour de Paris.",
"country": "France",
"city": "Paris",
"image_url": "https://cdn.example.com/photo.jpg",
"is_searchable": true,
"interest_ids": [3, 7, 12]
}
ChampModèleDescription
nameUserNom affiché
bioUserBio courte
locationUserLocalisation générale
first_nameProfilePrénom
last_nameProfileNom
ageProfileÂge
biographyProfileBio longue
countryProfilePays
cityProfileVille
image_urlProfileURL photo de profil
is_searchableProfileVisibilité dans la recherche
interest_idsProfileTableau d'IDs d'intérêts
Indexation automatique

Si is_searchable passe à true, le profil est automatiquement indexé dans Meilisearch. Si is_searchable passe à false, le profil est retiré de l'index.

Response

200 OK — Retourne le User complet avec Profile et Interests mis à jour.


PUT /users/profile/interests

Auth requis

Met à jour uniquement les intérêts du profil.

Request

PUT /users/profile/interests
Authorization: Bearer <token>
Content-Type: application/json
{
"interest_ids": [3, 7, 12, 15]
}

Response

200 OK

{
"id": 18,
"user_id": 42,
"Interests": [
{ "id": 3, "name": "Randonnée" },
{ "id": 7, "name": "Cuisine" },
{ "id": 12, "name": "Photographie" },
{ "id": 15, "name": "Escalade" }
]
}

PATCH /users/searchable

Auth requis

Active ou désactive la visibilité du profil dans les recherches.

Request

PATCH /users/searchable
Authorization: Bearer <token>
Content-Type: application/json
{
"is_searchable": true
}

Response

200 OK

{
"is_searchable": true
}

GET /users/search

Auth optionnel — enrichi si connecté

Recherche des profils publics. Si l'utilisateur est connecté, la recherche est enrichie sémantiquement avec son propre profil (intérêts, bio, localisation).

Request

GET /users/search?q=yoga&filterInterests=Yoga,Méditation&filterCity=Paris&filterCountry=France&limit=20
Authorization: Bearer <token> (optionnel)
ParamètreTypeRequisDescription
qstringNonRequête textuelle
filterInterestsstringNonIntérêts séparés par virgule
filterCitystringNonVilles séparées par virgule
filterCountrystringNonPays séparés par virgule
limitnumberNonNombre de résultats (défaut: 20)

Response

200 OK

{
"hits": [
{
"id": 18,
"user_id": 42,
"name": "Marie Dupont",
"biography": "Guide de randonnée à Paris.",
"city": "Paris",
"country": "France",
"interests": ["Randonnée", "Cuisine"],
"image_url": "https://...",
"_rankingScore": 0.923
}
],
"query": "yoga",
"estimatedTotalHits": 1,
"limit": 20,
"offset": 0
}
Enrichissement sémantique

Connecté (semanticRatio: 0.7) : la requête est enrichie avec les intérêts, la bio et la localisation du chercheur.

Non connecté (semanticRatio: 0.5) : recherche hybride standard sans contexte personnel.

Le profil du chercheur est toujours exclu des résultats.


GET /users/:id

Public

Retourne le profil public d'un utilisateur par son ID de profil.

Request

GET /users/18

Response

200 OK — Cache-Control: public, max-age=3600

{
"id": 42,
"name": "Marie Dupont",
"profile": {
"id": 18,
"first_name": "Marie",
"last_name": "Dupont",
"age": 28,
"biography": "Je propose des randonnées guidées autour de Paris.",
"country": "France",
"city": "Paris",
"image_url": "https://...",
"interests": [
{ "id": 3, "name": "Randonnée" },
{ "id": 7, "name": "Cuisine" }
]
}
}

403 Forbidden — Profil non searchable ou utilisateur inactif

{
"error": "Ce profil n'est pas accessible"
}

POST /users

Public

Crée un utilisateur directement (admin / seeding). Voir POST /auth/signup pour la voie normale.