From 0b2d11029f32574119ea6af8b8466de031f7d73f Mon Sep 17 00:00:00 2001 From: Yannis Devos <yannis.devos.etu@univ-lille.fr> Date: Tue, 18 Mar 2025 17:21:38 +0100 Subject: [PATCH] Ajout de l'API REST et Correction syntaxe et de chemin d'image dans le doc_appli.md --- WEB-INF/src/API/ControleurRestCampusTalk.java | 65 +++++++++++++++++++ doc/doc_appli.md | 31 +++++---- 2 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 WEB-INF/src/API/ControleurRestCampusTalk.java diff --git a/WEB-INF/src/API/ControleurRestCampusTalk.java b/WEB-INF/src/API/ControleurRestCampusTalk.java new file mode 100644 index 0000000..d65cde5 --- /dev/null +++ b/WEB-INF/src/API/ControleurRestCampusTalk.java @@ -0,0 +1,65 @@ +package API; + +import com.fasterxml.jackson.databind.ObjectMapper; +import dao.ThreadDAO; +import dao.UserDAO; +import dto.Message; +import dto.MyThread; +import dto.User; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +@WebServlet("/CampusTalkDatas/*") +public class ControleurRestCampusTalk extends HttpServlet { + private final ObjectMapper objectMapper = new ObjectMapper(); + private final UserDAO userDao = new UserDAO(); + private final ThreadDAO threadDao = new ThreadDAO(); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + res.setContentType("application/json;charset=UTF-8"); + PrintWriter out = res.getWriter(); + + String pathInfo = req.getPathInfo(); + + List<MyThread> threadsFollowed = new ArrayList<>(); + + if (pathInfo == null || pathInfo.equals("/")) { + List<User> users = userDao.getAllUsers(); + out.println(objectMapper.writeValueAsString(users)); + } else { + try { + int id = Integer.parseInt(pathInfo.substring(1)); + User user = userDao.getUserById(id); + List<Integer> threadsId = userDao.getThreadsFollowedByUser(user); + + + for (Integer thId: threadsId) { + MyThread th = threadDao.getThreadById(thId); + threadsFollowed.add(th); + } + + if (user != null) { + out.println(objectMapper.writeValueAsString(threadsFollowed)); + } else { + res.sendError(HttpServletResponse.SC_NOT_FOUND, "User not found"); + } + } catch (NumberFormatException e) { + res.sendError(HttpServletResponse.SC_BAD_REQUEST, "invalid ID"); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + out.close(); + } +} \ No newline at end of file diff --git a/doc/doc_appli.md b/doc/doc_appli.md index 6311f47..5b36b53 100644 --- a/doc/doc_appli.md +++ b/doc/doc_appli.md @@ -17,7 +17,7 @@ L'application est reliée à une **base de données** qui est la source de l'aff - **Modèle Conceptuel de Données** : - + - **Modèle Logique de données** : @@ -151,60 +151,65 @@ Nous avons uniquement utilisé des servlets sur ce projet. Pour une meilleure li *Le nom de la servlet représente son entrée, chacune vérifient si l'utilisateur est connecté et enregistré dans la session. Si ce n'est pas le cas (par exemple si la page a été bookmarkée et visitée a posteriori, une fois la session échue), les servlet redirigent toutes vers l'écran de connexion.* -`http://localhost:8080/s4a021-web-backend/`**Account** +`http://localhost:8080/s4a021-web-backend/Account` - Permet de gérer les informations du compte de l'utilisateur (changer son mot de passe ou supprimer son compte) -`http://localhost:8080/s4a021-web-backend/`**DeleteAccount** +`http://localhost:8080/s4a021-web-backend/DeleteAccount` - Est appelée par **Account** lorsque l'utilisateur supprime son compte. -`http://localhost:8080/s4a021-web-backend/`**Discover** +`http://localhost:8080/s4a021-web-backend/Discover` - Affiche tous les fils de discussion, sans prendre en compte si l'utilisateur connecté les suit déjà ou non. Un bouton *Follow* ou *Followed* permet d'indiquer à l'utilisateur s'il suit le fil affiché. -`http://localhost:8080/s4a021-web-backend/`**Welcome** +`http://localhost:8080/s4a021-web-backend/Welcome` - Affiche le fil d'actualité de l'utilisateur avec les messages des fils de discussion auxquels il est abonné. L'utilisateur peut réagir aux messages avec un bouton *Like* ou *Unlike*. - L'utilisateur peut poster un message dans un fil de dicussion en dessous de chaque message affiché sur son feed. -`http://localhost:8080/s4a021-web-backend/`**Following** +`http://localhost:8080/s4a021-web-backend/Following` - Affiche la liste des fils de discussion auxquels l'utilisateur connecté est abonné, et depuis combien de temps il les suit. -`http://localhost:8080/s4a021-web-backend/`**FollowThread** +`http://localhost:8080/s4a021-web-backend/FollowThread` - N'affiche rien et exécute seulement du code lorsqu'elle est appelée dans **Discover**. - Avec les paramètres d'un formulaire envoyé en POST, une requête est exécutée pour enregistrer l'abonnement de l'utilisateur à un fil de discussion, puis la servlet redirige vers la page d'origine. -`http://localhost:8080/s4a021-web-backend/`**LikeMessage** +`http://localhost:8080/s4a021-web-backend/LikeMessage` - N'affiche rien et exécute seulement du code lorsqu'elle est appelée dans **Feed**. - Comme pour **FollowThread**, avec les paramètres d'un formulaire envoyé en POST, une requête est exécutée pour enregistrer la réaction de l'utilisateur à un message d'un fil de discussion, puis la servlet redirige vers la page d'origine. -`http://localhost:8080/s4a021-web-backend/`**LogIn** +`http://localhost:8080/s4a021-web-backend/LogIn` - N'affiche rien et exécute du code lorsqu'elle reçoit les paramètres du formulaire de connexion de la page `index.html`. - Vérifie si l'utilisateur existe bien dans la base de données et si oui, elle redirige vers la page **Welcome**. Si non, elle indique une erreur. - Si le login ou le mot de passe est vide, la page affiche un message d'erreur en indiquant qu'il est nécessaire, et permet de revenir sur le formulaire de connexion. -`http://localhost:8080/s4a021-web-backend/`**NewThread** +`http://localhost:8080/s4a021-web-backend/NewThread` - Affiche un formulaire de création de fil de discussion avec un premier message à poster dedans. Quand le formulaire est envoyé, la page s'appelle elle-même pour exécuter la requête de création et affiche un message de validation si tout a bien fonctionné. -`http://localhost:8080/s4a021-web-backend/`**PageGeneration** +`http://localhost:8080/s4a021-web-backend/PageGeneration` - Ce contrôleur n'est pas une servlet, seulement une classe Java avec une seule méthode statique permettant de générer le menu de navigation pour éviter la redondance d'écriture HTML. -`http://localhost:8080/s4a021-web-backend/`**PostMessage** +`http://localhost:8080/s4a021-web-backend/PostMessage` - N'affiche rien et exécute le code nécessaire à l'exécution d'une requête d'envoi de message dans un fil de discussion. - Elle peut être appelée par **Welcome** quand un utilisateur poste un message dans un fil qu'il suit, ou dans **NewThread** quand il crée un nouveau fil. -`http://localhost:8080/s4a021-web-backend/`**SignUp** +`http://localhost:8080/s4a021-web-backend/SignUp` - Similairement à **LogIn**, n'affiche rien mais vérifie que le nouveau compte envoyé dans le formulaire de `create.html` n'existe pas dans la base de donnée. S'il n'existe pas déjà , elle exécute la requête de création d'utilisateur. Sinon, elle affiche un message d'information et permet de revenir sur l'écran de connexion. +### API Rest + +`http://localhost:8080/s4a021-web-backend/CampusTalkDatas/x` (Où `x` est l'id d'un utilisateur) + +- Permet un appel REST en GET renvoyant en JSON les Threads suivis par l'utilisateur ayant pour id : `x` ## Points techniques difficiles et comment ils ont été réglés -- GitLab