Web Serveur L2
Table des matiĂšres
Votre réseau social préféré a été racheté et il est maintenant inutilisable. Pour remédier à cela, vous avez décidé de créer votre propre API REST de réseau social.

Fonctionnalités
- Chaque utilisateur·rice a un profil oĂč lâon retrouve ses messages postĂ©s, il ou elle sâauthentifie avec une adresse mail et un mot de passe, un nom dâutilisateur·ice, et peut renseigner une Ă©ventuelle description ;
- Chaque message peut ĂȘtre en rĂ©ponse Ă un autre message, mentionner dâautres utilisateur·rices ou une Ă©tiquette ;
- Les messages peuvent ĂȘtre consultĂ©s par un·e utilisateur·ice via :
- son fil dâactualitĂ© oĂč les messages de ses abonnements seront affichĂ©s du plus rĂ©cent au plus ancien ;
- les étiquettes pour afficher tous les messages contenant une ou plusieurs étiquettes.
- Un message peut ĂȘtre repostĂ© par un·e autre utilisateur·ice ;
- Un·e utilisateur·rice peut ĂȘtre suivi·e ou suivre dâautres utilisateur·rices pour recevoir leurs messages dans leur fil dâactualitĂ© ;
- Chaque utilisateur·ice peut voir les mentions (et les réponses) qui lui ont été adressées ;
- Un·e utilisateur·ice peut supprimer ou modifier un de ses messages.
Toutes les classes commencent par rb_
Routes
Pour rĂ©pondre aux fonctionnalitĂ©s attendues, cette API doit donc implĂ©menter un certains nombres de routes associĂ©es Ă des requĂȘtes HTTP.
đ : nĂ©cessite dâĂȘtre authentifié·e
Authentification
| Méthode | Route | Description |
|---|---|---|
| POST | /auth/register | Créer un compte |
| POST | /auth/login | Se connecte |
| POST | /auth/logout | Se dĂ©connecter đ |
Profils
| Méthode | Route | Description |
|---|---|---|
| GET | /users/:username* | Voir le profil dâun·e utilisateur·ice |
| PATCH | /users/me | Modifier son propre profil đ |
Abonnements
| Méthode | Route | Description |
|---|---|---|
| POST | /users/:username/follow | Suivre un·e utilisateur·ice đ |
| DELETE | /users/:username/follow | Ne plus suivre un·e utilisateur·ice đ |
Messages
| Méthode | Route | Description |
|---|---|---|
| POST | /posts | CrĂ©er un message đ |
| GET | /posts/:id | Afficher un message et ses réponses |
| DELETE | /posts/:id | Supprimer son message đ |
| POST | /posts/:id/repost | Reposter un message đ |
| DELETE | /posts/:id/repost | Annuler un repost đ |
Fil dâactualitĂ© & dĂ©couverte
| Méthode | Route | Description |
|---|---|---|
| GET | /feed* ou | Fil dâactualitĂ© |
| GET | /mentions* | Mentions et rĂ©ponses adressĂ©es Ă lâutilisateur·ice đ |
| GET | /tags* | Liste des étiquettes |
| GET | /tags/:tag/posts* | Messages contenant une étiquette donnée. |
*Pour chaque requĂȘtes de cette catĂ©gorie, il est possible de prĂ©ciser un argument ?page={n} qui prĂ©cisera la page dâaffichage,
cela induit une taille de page (par exemple 25) qui limite le nombre de messages retournĂ©s par requĂȘte et lâaffichage de la page courante et du nombre de pages.
Schémas
Pour chaque requĂȘte, des schĂ©mas JSON peuvent ĂȘtre attendus en entrĂ©e ou en sortie, voici les modĂšles qui seront attendus pour cette API.
Authentification (POST)
On sâenregistre en prĂ©cisant son email, un nom dâutilisateur·ice, un mot de passe et une Ă©ventuelle description. On se connecte avec son email et son mot de passe, un token dâauthentification doit ĂȘtre retournĂ© en cas de succĂšs.
Exemple de schémas JSON d'enregistrement et de connexion
{
"email": "alice@ex.com",
"password": "P4ssword!",
"username": "alice",
"description": null
}{
"email": "alice@ex.com",
"password": "P4ssword!",
}Message
Si un message est une rĂ©ponse Ă un message, reply_to contient lâidentifiant du message auquel il rĂ©pond.
Le contenu du message est stocké dans content.
Les mentions (@) et les Ă©tiquettes (#) sont rĂ©cupĂ©rĂ©es par le serveur au moment de lâenvoi et ajoutĂ©es Ă tags et mentions.
created contient un horodatage du moment de la publication.
Chaque message posté se voit attribué un identifiant (id).
Chaque message contient une propriété "hash" contenant le hash du message
Exemple du format JSON d'un message
{
"content": "Hello @alice! #foo #bar",
"reply_to": {
"id": 1234,
"uri": "http://127.0.0.1:8000/posts/1234",
},
"from": {
"username": "bob",
"uri": "http://127.0.0.1:8000/users/bob",
},
"tags": [
{
"tag": "foo",
"uri": "http://127.0.0.1:8000/tags/foo/posts",
},
{
"tag": "bar",
"uri": "http://127.0.0.1:8000/tags/bar/posts",
},
],
"mentions": [
{
"username": "alice",
"uri": "http://127.0.0.1:8000/users/alice",
},
],
"created": "2026-03-03T15:03:04+00:00",
"id": 5678,
"uri": "http://127.0.0.1:8000/posts/5678",
"comments": [
{
"id": 7891,
"uri": "http://127.0.0.1:8000/posts/7891",
},
],
"reposts": [
{
"username": "fred",
"uri": "http://127.0.0.1:8000/users/fred",
"date": "2026-03-23T18:26:34+00:00"
},
],
}Profil
Un profil contient le nom dâutilisateur·ice (username), sa description (description) ainsi que la liste des messages postĂ©s et republiĂ©s du plus rĂ©cent au plus ancien. Il contient Ă©galement la liste des abonné·es et des abonnements (followers et following).
Exemple du format JSON d'un profil
{
"username": "bob",
"description": "My name is Bob.",
"posts": [
// listes de messages
{
"content": "Hello...",
// [...]
},
],
"followers": [
{
"username": "alice",
"uri": "http://127.0.0.1:8000/users/alice"
}
],
"following": [
{
"username": "alice",
"uri": "http://127.0.0.1:8000/users/alice"
}
],
"uri": "http://127.0.0.1:8000/users/bob",
"current_page": 1,
"pages": 10,
}Fil dâactualitĂ© / Ă©tiquettes / mentions
Contient une liste de messages (posts) paginée et triée par date de publication du plus récent au plus ancien.
Exemple du format JSON d'un fil
{
"posts": [
// liste de messages
{
"content": "Hello...",
// [...]
},
{
// [...]
},
// [...]
],
"uri": "http://127.0.0.1:8000/feed",
"current_page": 1,
"pages": 10,
}DĂ©tails dâimplĂ©mentations
- LâaccĂšs
/doit rediriger sur une route par dĂ©faut, par exemple/feed; - Chaque nom dâutilisateur·ice est unique ;
- Les réponses retournent les codes de statut de réponse HTTP appropriés ;
- Lâauthentification et lâaccĂšs aux ressources sont gĂ©rĂ©s par un token dâauthentification ;
- Les réponses contiennent les URIs des ressources.
Environnement
Pour rĂ©aliser ce projet, nous allons utiliser Django REST framework. Pour prĂ©parer lâenvironnement, il faut utiliser le projet de dĂ©part et initialiser lâenvironnement :
git clone https://framagit.org/loriscroce/starter-wsl2.git
cd starter-wsl2python -m venv .venv
# UNIX
source .venv/bin/activate
# Windows
.venv\Scripts\activate
# ---------
pip install -r requirements.txt
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
Pour utiliser le serveur de développement, il faut utiliser la commande :
python manage.py runserver
Pour lancer le test dâexemple :
python manage.py test socialQuelques conseils
- Lisez bien le sujet et nâhĂ©sitez pas Ă me poser des questions ;
- Il nây a pas quâune solution dâimplĂ©mentation pour ce TP ;
- Il vaut mieux implĂ©menter et rendre une sous-partie qui fonctionnelle que la totalitĂ© qui ne lâest pas ;
- Je préfÚre corriger votre code que celui de ChatGPT et ses homologues ;
- Testez votre API avec un client (comme Bruno) ;
- Aidez-vous de la documentation ou de tutoriels;
- Câest Ă©galement une bonne idĂ©e dâutiliser git, dâautant plus que vous pouvez vous faire un compte sur lâinstance Gitlab de lâISIMA. Cela vous permet de travailler plus facilement en groupe et de sauvegarder votre travail.
Modalités de rendu
- Le TP se fait en binĂŽme de la mĂȘme sĂ©ance ;
- Le rendu se fait sur lâespace dĂ©diĂ© Moodle en dĂ©posant :
- Le code du projet (vous pouvez Ă©galement donner un lien fonctionnel dâun dĂ©pĂŽt git accessible) ;
- Un fichier
README.mdou un autre document décrivant le fonctionnement de votre application (routes, etc.) ; - Les noms, prénoms et groupe de votre binÎme.