REST API works

This commit is contained in:
Vu Tuan Minh
2025-09-30 01:49:48 +02:00
parent 6f75f83f58
commit d18bb21b74
30 changed files with 857 additions and 0 deletions

View File

@@ -0,0 +1,60 @@
package fr.istic.taa.jaxrs.DAO;
import java.io.Serializable;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityTransaction;
public abstract class AbstractJpaDao<K, T extends Serializable> implements IGenericDao<K, T> {
protected EntityManager em;
private Class<T> entityClass;
public AbstractJpaDao() {
this.em = EntityManagerHelper.getEntityManager();
}
//Pour connaitre qu'on travaille avec quelle classe
public void setClass(Class<T> class2){
this.entityClass= class2;
}
public T findOne(K id) {
return em.find(entityClass, id);
}
public List<T> findAll() {
return em.createQuery("select e from " + entityClass.getName() + " as e", entityClass).getResultList();
}
//CRUD
public void create(T entity){
EntityTransaction t = em.getTransaction();
t.begin();
em.persist(entity);
t.commit();
}
public T findById(K id) {
return em.find(entityClass, id);
}
public T update(T entity){
EntityTransaction t = em.getTransaction();
t.begin();
T T_sync = em.merge(entity);
t.commit();
return T_sync;
}
public void delete(T entity){
EntityTransaction t = em.getTransaction();
t.begin();
em.remove(entity);
t.commit();
}
public void deleteById(K id) {
T T_to_be_deleted = em.find(entityClass, id);
em.remove(T_to_be_deleted);
}
}

View File

@@ -0,0 +1,50 @@
package fr.istic.taa.jaxrs.DAO;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class EntityManagerHelper {
private static final EntityManagerFactory emf;
private static final ThreadLocal<EntityManager> threadLocal;
static {
emf = Persistence.createEntityManagerFactory("dev");
threadLocal = new ThreadLocal<EntityManager>();
}
public static EntityManager getEntityManager() {
EntityManager em = threadLocal.get();
if (em == null) {
em = emf.createEntityManager();
threadLocal.set(em);
}
return em;
}
public static void closeEntityManager() {
EntityManager em = threadLocal.get();
if (em != null) {
em.close();
threadLocal.set(null);
}
}
public static void closeEntityManagerFactory() {
emf.close();
}
public static void beginTransaction() {
getEntityManager().getTransaction().begin();
}
public static void rollback() {
getEntityManager().getTransaction().rollback();
}
public static void commit() {
getEntityManager().getTransaction().commit();
}
}

View File

@@ -0,0 +1,14 @@
package fr.istic.taa.jaxrs.DAO;
import java.io.Serializable;
import java.util.List;
public interface IGenericDao<K, T extends Serializable> {
void create(final T entity);
T findById(final K id);
T update(final T entity);
void delete(final T entity);
void deleteById(final K id);
List<T> findAll();
T findOne(final K id);
}

View File

@@ -0,0 +1,10 @@
package fr.istic.taa.jaxrs.DAO;
import fr.istic.taa.jaxrs.metier.Question;
public class QuestionDAO extends AbstractJpaDao<Integer, Question> {
public QuestionDAO(){
super();
this.setClass(Question.class);
}
}

View File

@@ -0,0 +1,18 @@
package fr.istic.taa.jaxrs.DAO;
import jakarta.persistence.EntityTransaction;
import fr.istic.taa.jaxrs.metier.Quizz;
public class QuizzDAO extends AbstractJpaDao<Integer, Quizz> {
public QuizzDAO(){
super();
this.setClass(Quizz.class);
}
public void deleteAllQuiz(){
EntityTransaction et= em.getTransaction();
et.begin();
em.createQuery("delete from Quizz").executeUpdate();
et.commit();
}
}

View File

@@ -0,0 +1,19 @@
package fr.istic.taa.jaxrs.DAO;
import fr.istic.taa.jaxrs.metier.Reponse;
public class ReponseDAO extends AbstractJpaDao<Integer, Reponse> {
public ReponseDAO(){
super();
this.setClass(Reponse.class);
}
/*public List<String> getGoodResponses(){
EntityTransaction t=em.getTransaction();
t.begin();
Query query=em.createQuery("select r from Reponse r where r.reponses");
List<String> lString=query.getResultList();
t.commit();
return lString;
}*/
}

View File

@@ -0,0 +1,29 @@
package fr.istic.taa.jaxrs.DAO;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Query;
import fr.istic.taa.jaxrs.metier.Session;
import java.util.List;
public class SessionDAO extends AbstractJpaDao<Integer, Session> {
public SessionDAO() {
super();
this.setClass(Session.class);
}
public List<Session> findByTheme(String theme){
EntityTransaction t=em.getTransaction();
t.begin();
Query query=em.createQuery("select s from Session s where s.theme=:theme");
query.setParameter("theme",theme);
List<Session> sessions=query.getResultList();
t.commit();
if(sessions.size()>0){
return sessions;
}else{
return null;
}
}
}

View File

@@ -0,0 +1,37 @@
package fr.istic.taa.jaxrs.DAO;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Query;
import fr.istic.taa.jaxrs.metier.Session;
import fr.istic.taa.jaxrs.metier.Utilisateur;
public class UtilisateurDAO extends AbstractJpaDao<Integer, Utilisateur> {
public UtilisateurDAO() {
super();
this.setClass(Utilisateur.class);
}
public Utilisateur findByEmail(String email){
EntityTransaction t=em.getTransaction();
t.begin();
Query query=em.createQuery("select u from Utilisateur u where u.email=:email");
query.setParameter("email",email);
Utilisateur u=(Utilisateur)query.getSingleResult();
t.commit();
return u;
}
public void addToSession(int sessionId, int userId) {
EntityTransaction t = em.getTransaction();
t.begin();
Session s = em.find(Session.class, sessionId);
Utilisateur u = em.find(Utilisateur.class, userId);
//FAUT AJOUTER OWNING SIDE ( Ici u --> s)
u.getSession().add(s);
//Jsp il faut birectionnelle ou pas?
s.getUtilisateurs().add(u);
em.merge(u);
t.commit();
}
}

View File

@@ -0,0 +1,13 @@
package fr.istic.taa.jaxrs.DTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class QuestionDTO {
private int id;
private String question;
private String reponse;
}

View File

@@ -0,0 +1,12 @@
package fr.istic.taa.jaxrs.DTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class QuizzDTO {
private int id;
}

View File

@@ -0,0 +1,10 @@
package fr.istic.taa.jaxrs.DTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class ReponseDTO {
}

View File

@@ -0,0 +1,10 @@
package fr.istic.taa.jaxrs.DTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class SessionDTO {
}

View File

@@ -0,0 +1,13 @@
package fr.istic.taa.jaxrs.DTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class UtilisateurDTO {
private int id;
private String name;
private String email;
}

View File

@@ -0,0 +1,32 @@
package fr.istic.taa.jaxrs;
import io.undertow.Undertow;
import org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer;
import java.util.logging.Logger;
/**
* RESTfull microservice, based on JAX-RS and JBoss Undertow
*
*/
public class RestServer {
private static final Logger logger = Logger.getLogger(RestServer.class.getName());
public static void main( String[] args ) {
UndertowJaxrsServer ut = new UndertowJaxrsServer();
TestApplication ta = new TestApplication();
ut.deploy(ta);
ut.start(
Undertow.builder()
.addHttpListener(8080, "localhost")
);
logger.info("JAX-RS based micro-service running!");
}
}

View File

@@ -0,0 +1,44 @@
/**
* JBoss, Home of Professional Open Source
* Copyright Red Hat, Inc., and individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package fr.istic.taa.jaxrs;
import java.util.HashSet;
import java.util.Set;
import fr.istic.taa.jaxrs.rest.PetResource;
import io.swagger.v3.jaxrs2.integration.resources.OpenApiResource;
import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;
@ApplicationPath("/")
public class TestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> clazzes = new HashSet<Class<?>>();
clazzes.add(OpenApiResource.class);
clazzes.add(PetResource.class);
// clazzes.add(AcceptHeaderOpenApiResource.class);
return clazzes;
}
}

View File

@@ -0,0 +1,44 @@
package fr.istic.taa.jaxrs.domain;
import java.util.ArrayList;
import java.util.List;
import io.swagger.v3.oas.models.tags.Tag;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlElementWrapper;
import jakarta.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Pet")
public class Pet {
private long id;
private String name;
private List<Tag> tags = new ArrayList<Tag>();
@XmlElement(name = "id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@XmlElement(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElementWrapper(name = "tags")
@XmlElement(name = "tag")
public List<Tag> getTags() {
return tags;
}
public void setTags(List<Tag> tags) {
this.tags = tags;
}
}

View File

@@ -0,0 +1,28 @@
package fr.istic.taa.jaxrs.metier;
import java.util.List;
import jakarta.persistence.Entity;
import jakarta.persistence.PrimaryKeyJoinColumn;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
@PrimaryKeyJoinColumn(name = "Choix_Id")
public class Choix extends Reponse{
List<String> choix;
@Override
public String valHTML(){
String res = "";
for (String val : this.choix) {
res+=val+"<br/>";
}
return res;
}
}

View File

@@ -0,0 +1,27 @@
package fr.istic.taa.jaxrs.metier;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Question implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String question;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name ="bonne_reponse", referencedColumnName = "id")
private Reponse reponse;
@ManyToOne
@JoinColumn(name="id_quizz")
private Quizz quizz;
}

View File

@@ -0,0 +1,34 @@
package fr.istic.taa.jaxrs.metier;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Quizz implements Serializable {
@Id
@GeneratedValue
private int id;
@ManyToOne
private Session session;
@ManyToOne
@JoinColumn(name="id_utilisateur")
private Utilisateur utilisateur;
@OneToMany(mappedBy = "quizz")
private List<Question> questions=new ArrayList<Question>();
public void addQuestion(Question question) {
this.questions.add(question);
}
}

View File

@@ -0,0 +1,30 @@
package fr.istic.taa.jaxrs.metier;
import java.io.Serializable;
import java.util.List;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="Type_reponse")
@DiscriminatorValue("Reponse")
public abstract class Reponse implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@OneToOne
private Question question;
public List<String> reponses;
public String valHTML(){
return "";
}
}

View File

@@ -0,0 +1,21 @@
package fr.istic.taa.jaxrs.metier;
import jakarta.persistence.Entity;
import jakarta.persistence.PrimaryKeyJoinColumn;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
@PrimaryKeyJoinColumn(name = "RC_Id")
public class ReponseCourte extends Reponse{
String value;
@Override
public String valHTML(){
return "INPUT";
}
}

View File

@@ -0,0 +1,29 @@
package fr.istic.taa.jaxrs.metier;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Session implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(unique=true)
private int codePIN;
@OneToMany(mappedBy="session")
private List<Quizz> quizzs = new ArrayList<>();
@ManyToMany(mappedBy = "session")
private List<Utilisateur> utilisateurs = new ArrayList<>();
private String theme;
}

View File

@@ -0,0 +1,33 @@
package fr.istic.taa.jaxrs.metier;
import jakarta.persistence.*;
import lombok.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Utilisateur implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@Column(unique=true)
private String email;
private String password;
@ManyToMany
@JoinTable(
name="utilisateur_session",
joinColumns = @JoinColumn(name="utilisateur_id"),
inverseJoinColumns = @JoinColumn(name = "session_id")
)
private List<Session> session= new ArrayList<>();;
@OneToMany(mappedBy = "utilisateur")
private List<Quizz> quizzs;
}

View File

@@ -0,0 +1,38 @@
package fr.istic.taa.jaxrs.rest;
import fr.istic.taa.jaxrs.domain.Pet;
import io.swagger.v3.oas.annotations.Parameter;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
@Path("pet")
@Produces({"application/json", "application/xml"})
public class PetResource {
@GET
@Path("/{petId}")
public Pet getPetById(@PathParam("petId") Long petId) {
// return pet
return new Pet();
}
@GET
@Path("/")
public Pet getPet(Long petId) {
return new Pet();
}
@POST
@Consumes("application/json")
public Response addPet(
@Parameter(description = "Pet object that needs to be added to the store", required = true) Pet pet) {
// add pet
return Response.ok().entity("SUCCESS").build();
}
}