Merge remote-tracking branch 'origin/tp_rest' into tp_rest

# Conflicts:
#	src/main/java/fr/istic/taa/jaxrs/DAO/QuestionDAO.java
#	src/main/java/fr/istic/taa/jaxrs/DAO/UtilisateurDAO.java
This commit is contained in:
Vu Tuan Minh
2025-10-24 23:14:33 +02:00
16 changed files with 70 additions and 31 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/target/
/data/

View File

@@ -50,7 +50,7 @@ classDiagram
class Quizz{
-session: Session
-id : int
-utilisateur: Utilisateur
-createur: Utilisateur
}
class Reponse{
-id : int
@@ -61,10 +61,10 @@ classDiagram
-choix : ArrayList<String>
}
class ReponseCourte{
-value : String
}
class Question{
-id : int
-enonce : String
-reponse: Reponse
}
```
@@ -93,7 +93,7 @@ classDiagram
| Methode | URL | Description |
|---------|------------------------------------------------|-----------------------------------------|
| GET | `/quizz` | Retourne toute la liste du quizz |
| GET | `/quizz/{quizz_id}/questions | Retourne toutes questions du quizz |
| GET | `/quizz/{quizz_id}/questions` | Retourne toutes questions du quizz |
| GET | `/quizz/{quizz_id}/add_question/{question_id}` | Ajoute une nouvuelle question au quizz |
| DELETE | `/quizz/{quizz_id}/delete` | Suprrime le quizz |
| PUT | `/quizz/{quizz_id}/deleteQ` | Supprime toute les questions de quizz |

View File

@@ -45,6 +45,11 @@
<artifactId>mysql-connector-j</artifactId>
<version>8.1.0</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.2</version>
</dependency>
<!-- ==== REST API ==== -->
<!--https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-undertow -->
<dependency>

View File

@@ -6,12 +6,19 @@ import jakarta.persistence.Persistence;
public class EntityManagerHelper {
private static final EntityManagerFactory emf;
private static EntityManagerFactory emf;
private static final ThreadLocal<EntityManager> threadLocal;
static {
try {
emf = Persistence.createEntityManagerFactory("dev");
} catch (Exception e) {
emf = null;
e.printStackTrace();
}
threadLocal = new ThreadLocal<EntityManager>();
}
public static EntityManager getEntityManager() {

View File

@@ -89,13 +89,13 @@ public class QuestionDAO extends AbstractJpaDao<Integer, Question> {
}
}
public void changeQuestion(String newQuestion, Integer id) {
public void changeEnonce(String newEnonce, Integer id) {
EntityTransaction t = em.getTransaction();
try {
if (!t.isActive()) t.begin();
Question q = em.find(Question.class, id);
if (q != null) {
q.setQuestion(newQuestion);
q.setEnonce(newEnonce);
em.merge(q);
}
t.commit();

View File

@@ -26,19 +26,15 @@ public class UtilisateurDAO extends AbstractJpaDao<Integer, Utilisateur> {
if (!t.isActive()) {
t.begin();
}
Session s = em.find(Session.class, sessionId);
Utilisateur u = em.find(Utilisateur.class, userId);
if (s == null || u == null) {
throw new IllegalArgumentException("User or session not found");
}
if (!u.getSession().contains(s)) {
u.getSession().add(s);
u.getSessions().add(s);
em.merge(u);
}
t.commit();
} catch (Exception e) {
if (t.isActive()) t.rollback();

View File

@@ -8,7 +8,7 @@ import java.util.List;
@XmlRootElement
public class QuizzDTO {
private int id;
private Integer sessionId;
private List<Integer> sessionsId;
private Integer utilisateurId;
private List<Integer> questionsId;
}

View File

@@ -7,7 +7,6 @@ import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.ArrayList;
import java.util.List;
@Mapper

View File

@@ -2,6 +2,7 @@ package fr.istic.taa.jaxrs.Mapper;
import fr.istic.taa.jaxrs.DTO.QuizzDTO;
import fr.istic.taa.jaxrs.metier.Question;
import fr.istic.taa.jaxrs.metier.Session;
import fr.istic.taa.jaxrs.metier.Quizz;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@@ -16,8 +17,8 @@ public interface QuizzMapper {
//https://www.baeldung.com/mapstruct-map-source-object-target-list
//https://mapstruct.org/
@Mapping(target="sessionId", source="session.id")
@Mapping(target="utilisateurId", source = "utilisateur.id")
@Mapping(target="sessionsId", expression="java(function_mapS(quizz.getSessions()))")
@Mapping(target="utilisateurId", source = "createur.id")
@Mapping(target="questionsId",expression="java(function_mapQ(quizz.getQuestions()))")
QuizzDTO toDTO(Quizz quizz);
Quizz toEntity(QuizzDTO quizzDTO);
@@ -31,4 +32,12 @@ public interface QuizzMapper {
}
return list;
}
default List<Integer> function_mapS(List<Session> sessionList){
List<Integer> list=new ArrayList<Integer>();
for(Session session : sessionList){
list.add(session.getId());
}
return list;
}
}

View File

@@ -17,7 +17,7 @@ public class Question implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String question;
private String enonce;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name ="bonne_reponse", referencedColumnName = "id")

View File

@@ -20,12 +20,12 @@ public class Quizz implements Serializable {
@GeneratedValue
private int id;
@ManyToOne
private Session session;
@ManyToMany
private List<Session> sessions;
@ManyToOne
@JoinColumn(name="id_utilisateur")
private Utilisateur utilisateur;
private Utilisateur createur;
@OneToMany(mappedBy = "quizz")
private List<Question> questions=new ArrayList<Question>();

View File

@@ -23,10 +23,10 @@ public class Session implements Serializable {
@Column(unique=true)
private int codePIN;
@OneToMany(mappedBy="session", fetch = FetchType.EAGER)
@ManyToMany(mappedBy="sessions", fetch = FetchType.EAGER)
private List<Quizz> quizzs = new ArrayList<>();
@ManyToMany(mappedBy = "session", fetch = FetchType.EAGER)
@ManyToMany(mappedBy = "sessions", fetch = FetchType.EAGER)
private List<Utilisateur> utilisateurs = new ArrayList<>();
private String theme;
}

View File

@@ -28,8 +28,8 @@ public class Utilisateur implements Serializable {
joinColumns = @JoinColumn(name="utilisateur_id"),
inverseJoinColumns = @JoinColumn(name = "session_id")
)
private List<Session> session= new ArrayList<>();;
private List<Session> sessions= new ArrayList<>();;
@OneToMany(mappedBy = "utilisateur")
@OneToMany(mappedBy = "createur")
private List<Quizz> quizzs;
}

View File

@@ -77,8 +77,8 @@ public class QuestionResource {
if (question == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
questionDAO.changeQuestion(newQuestion, id);
return Response.status(Response.Status.CREATED).entity("Question mis à jour : " + newQuestion).build();
questionDAO.changeEnonce(newQuestion, id);
return Response.status(Response.Status.CREATED).entity("Enonce de la question mis à jour : " + newQuestion).build();
}

View File

@@ -1,5 +1,7 @@
package fr.istic.taa.jaxrs.rest;
import java.util.List;
import fr.istic.taa.jaxrs.DAO.QuestionDAO;
import fr.istic.taa.jaxrs.DAO.QuizzDAO;
import fr.istic.taa.jaxrs.DTO.QuestionDTO;
@@ -14,11 +16,15 @@ import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.ws.rs.*;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
import java.util.List;
@Path("quizz")
@Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"})
@@ -27,6 +33,21 @@ public class QuizzResource {
public final QuizzDAO quizzDAO = new QuizzDAO();
public final QuestionDAO questionDAO = new QuestionDAO();
@GET
@Operation(summary = "List all quizz",
tags = {"Quizz"},
description = "List all quizz.",
responses = {
@ApiResponse(description = "List of all quizz", content = @Content(
array = @ArraySchema(schema = @Schema(implementation = Question.class))))
}
)
public List<QuizzDTO> listQuizz() {
List<Quizz> quizz = quizzDAO.findAll();
return mapper.toDTOs(quizz);
}
@GET
@Path("/{quizz_id}")
@Operation(summary = "Get a quizz by ID",

View File

@@ -147,7 +147,7 @@ public class UtilisateurResource {
return Response.status(Response.Status.NOT_FOUND).build();
}
//If user already joined
if (utilisateur.getSession().contains(existingSession)) {
if (utilisateur.getSessions().contains(existingSession)) {
return Response.status(Response.Status.CONFLICT).build();
}
utilisateurDAO.addToSession(user_id, session_id);
@@ -178,7 +178,7 @@ public class UtilisateurResource {
if (utilisateur == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
List<Session> sess = utilisateur.getSession();
List<Session> sess = utilisateur.getSessions();
List<SessionDTO> dtos = SessionMapper.INSTANCE.toDTOs(sess);
return Response.status(Response.Status.OK).entity(dtos).build();
}