Web Serveur L2

  • 6 min de lecture
  • Étiquettes: 
  • TP
  • L2
  • UCA
  • Isima
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.

Standards XKCD

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.

INFO

🔒 : nĂ©cessite d’ĂȘtre authentifié·e

Authentification

MéthodeRouteDescription
POST/auth/registerCréer un compte
POST/auth/loginSe connecte
POST/auth/logoutSe dĂ©connecter 🔒

Profils

MéthodeRouteDescription
GET/users/:username*Voir le profil d’un·e utilisateur·ice
PATCH/users/meModifier son propre profil 🔒

Abonnements

MéthodeRouteDescription
POST/users/:username/followSuivre un·e utilisateur·ice 🔒
DELETE/users/:username/followNe plus suivre un·e utilisateur·ice 🔒

Messages

MéthodeRouteDescription
POST/postsCrĂ©er un message 🔒
GET/posts/:idAfficher un message et ses réponses
DELETE/posts/:idSupprimer son message 🔒
POST/posts/:id/repostReposter un message 🔒
DELETE/posts/:id/repostAnnuler un repost 🔒

Fil d’actualitĂ© & dĂ©couverte

MéthodeRouteDescription
GET/feed* ouFil 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.

Des schĂ©mas supplĂ©mentaires peuvent ĂȘtre nĂ©cessaires.

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-wsl2
python -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 social

Quelques 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.md ou un autre document dĂ©crivant le fonctionnement de votre application (routes, etc.) ;
    • Les noms, prĂ©noms et groupe de votre binĂŽme.