diff --git a/src/main/java/fr/la_banquise/backend/data/model/Ji.java b/src/main/java/fr/la_banquise/backend/data/model/Ji.java index 40c6764..95d9151 100644 --- a/src/main/java/fr/la_banquise/backend/data/model/Ji.java +++ b/src/main/java/fr/la_banquise/backend/data/model/Ji.java @@ -9,10 +9,8 @@ import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import java.util.List; -/** - * Tp - */ @Entity @NoArgsConstructor @AllArgsConstructor @@ -26,11 +24,13 @@ public class Ji { public String description; public String respo; public String date; + public Long siteId; - public Tp(String name, String description, String respo, String date) { + public Ji(String name, String description, String respo, String date, Long siteId) { this.name = name; this.description = description; this.respo = respo; this.date = date; + this.siteId = siteId; } } diff --git a/src/main/java/fr/la_banquise/backend/data/model/Site.java b/src/main/java/fr/la_banquise/backend/data/model/Site.java index 6230d59..db3fc61 100644 --- a/src/main/java/fr/la_banquise/backend/data/model/Site.java +++ b/src/main/java/fr/la_banquise/backend/data/model/Site.java @@ -1,31 +1,48 @@ package fr.la_banquise.backend.data.model; import io.quarkus.hibernate.orm.panache.PanacheEntity; + +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import java.util.Set; +import java.util.HashSet; @Entity @NoArgsConstructor @AllArgsConstructor -@Table(name = "site") +@Table(name = "site", uniqueConstraints = { + @UniqueConstraint(columnNames = "name") +}) public class Site { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @SequenceGenerator(name = "SiteSeq", sequenceName = "site_id_seq", allocationSize = 1, initialValue = 1) public Long id; + + @Column(unique = true, nullable = false) public String name; public String description; public String address; + public Set jiInSite; public Site(String name, String description, String address) { this.name = name; this.description = description; this.address = address; + this.jiInSite = new HashSet(); + } + + + @Override + public String toString() { + return "Site{id=" + id + ", name='" + name + "', description='" + description + "', address='" + address + "'}"; } } diff --git a/src/main/java/fr/la_banquise/backend/data/model/Sites.java b/src/main/java/fr/la_banquise/backend/data/model/Sites.java deleted file mode 100644 index 79dfc28..0000000 --- a/src/main/java/fr/la_banquise/backend/data/model/Sites.java +++ /dev/null @@ -1,31 +0,0 @@ -package fr.la_banquise.backend.data.model; - -import io.quarkus.hibernate.orm.panache.PanacheEntity; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import java.util.List; - - -@Entity -@NoArgsConstructor -@AllArgsConstructor -@Table(name = "Sites") -public class Sites { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @SequenceGenerator(name = "SitesSeq", sequenceName = "sites_id_seq", allocationSize = 1, initialValue = 1) - public Long id; - public List sites; - - public Sites(List sites) { - this.sites = sites; - } -} - - diff --git a/src/main/java/fr/la_banquise/backend/data/repository/SitesRepository.java b/src/main/java/fr/la_banquise/backend/data/repository/JiRepository.java similarity index 61% rename from src/main/java/fr/la_banquise/backend/data/repository/SitesRepository.java rename to src/main/java/fr/la_banquise/backend/data/repository/JiRepository.java index 599d124..c2025c5 100644 --- a/src/main/java/fr/la_banquise/backend/data/repository/SitesRepository.java +++ b/src/main/java/fr/la_banquise/backend/data/repository/JiRepository.java @@ -1,9 +1,9 @@ package fr.la_banquise.backend.data.repository; -import fr.la_banquise.backend.data.model.Sites; +import fr.la_banquise.backend.data.model.Ji; import io.quarkus.hibernate.orm.panache.PanacheRepository; import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped -public class SitesRepository implements PanacheRepository { +public class JiRepository implements PanacheRepository { } diff --git a/src/main/java/fr/la_banquise/backend/data/repository/SiteRepository.java b/src/main/java/fr/la_banquise/backend/data/repository/SiteRepository.java new file mode 100644 index 0000000..18e5aa0 --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/data/repository/SiteRepository.java @@ -0,0 +1,9 @@ +package fr.la_banquise.backend.data.repository; + +import fr.la_banquise.backend.data.model.Site; +import io.quarkus.hibernate.orm.panache.PanacheRepository; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class SiteRepository implements PanacheRepository { +} diff --git a/src/main/java/fr/la_banquise/backend/rest/JiResource.java b/src/main/java/fr/la_banquise/backend/rest/JiResource.java new file mode 100644 index 0000000..2934cde --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/rest/JiResource.java @@ -0,0 +1,118 @@ +package fr.la_banquise.backend.rest; + +import fr.la_banquise.backend.data.model.Ji; +import fr.la_banquise.backend.services.JiService; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import java.util.List; +import java.util.stream.Collectors; + +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; + +import java.util.Map; + +@Path("/ji") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class JiResource { + + @Inject + JiService jiService; + + + @GET + @Path("/listall") + @Produces(MediaType.APPLICATION_JSON) + public Response listall() { + try { + List ji = jiService.getAllJi(); + return Response.ok(ji).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + @POST + @Path("/create") + public Response createJi(@QueryParam("name") String name, @QueryParam("desc") String desc, @QueryParam("address") String address, @QueryParam("respo") String respo, @QueryParam("site") String name_site) { + try { + Ji jsp = jiService.createJi(name, desc, address, respo, name_site); + return Response.ok(Map.of("created", jsp)).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + @GET + @Path("/getbyname") + @Produces(MediaType.APPLICATION_JSON) + public Response getJiByName(@QueryParam("name") String name) { + try { + Ji ji = jiService.getJiByName(name); + return Response.ok(ji.toString()).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + @DELETE + @Path("/del") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Successfully deleted"), + @APIResponse(responseCode = "500", description = "Internal server error, usually site not found") +}) + public Response deleteJiByName(@QueryParam("name") String name) { + try { + jiService.deleteJiByName(name); + return Response.ok().build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } +/* + @GET + @Path("/all") + public Response listContainers() { + try { + String id = dockerService.listAllContainers(); + return Response.ok(id).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + @POST + @Path("/start") + public Response start(@QueryParam("id") String id) { + try { + dockerService.start(id); + return Response.ok(Map.of("containerId", id, "status", "Running")).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + @POST + @Path("/stop") + public Response stop(@QueryParam("id") String id) { + try { + dockerService.stop(id); + return Response.ok(Map.of("containerId", id, "status", "removed")).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + @DELETE + @Path("/remove") + public Response remove(@QueryParam("id") String id) { + try { + dockerService.remove(id); + return Response.ok(Map.of("containerId", id, "status", "removed")).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + }*/ +} diff --git a/src/main/java/fr/la_banquise/backend/rest/SiteEndpoints.java b/src/main/java/fr/la_banquise/backend/rest/SiteEndpoints.java new file mode 100644 index 0000000..3b23052 --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/rest/SiteEndpoints.java @@ -0,0 +1,129 @@ +package fr.la_banquise.backend.rest; + +import fr.la_banquise.backend.data.model.Site; +import fr.la_banquise.backend.services.SiteService; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import java.util.List; +import java.util.stream.Collectors; + +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.parameters.Parameter; + +import java.util.Map; + +@Path("/sites") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class SiteEndpoints { + + @Inject + SiteService siteService; + + @GET + @Path("/listall") + @Produces(MediaType.APPLICATION_JSON) + public Response listall() { + try { + List sites = siteService.getAllSites(); + return Response.ok(sites).build(); + } + catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + @POST + @Path("/create") + public Response createSite(@QueryParam("name") String name, @QueryParam("desc") String desc, @QueryParam("address") String address) { + try { + String jsp = siteService.createSite(name, desc, address).toString(); + return Response.ok(Map.of("created", jsp)).build(); + } + catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + + + @GET + @Path("/getbyname") + @Produces(MediaType.APPLICATION_JSON) + public Response getSiteByName(@QueryParam("name") String name) { + try { + Site site = siteService.getSiteByName(name); + return Response.ok(site.toString()).build(); + } + catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + + + @DELETE + @Path("/del") + @Operation(summary = "Deletes a site", description = "Permanently removes a site if no Ji are associated to it.") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Successfully deleted"), + @APIResponse(responseCode = "409", description = "Cannot delete site, it has associated JI records"), + @APIResponse(responseCode = "500", description = "Internal server error, usually site not found")}) + public Response deleteSiteByName(@QueryParam("name") String name) { + try { + boolean retour = siteService.deleteSiteByName(name); + if (retour) { return Response.ok().build(); } + return Response.status(409).entity(Map.of("Cannot delete site", "it has associated JI records")).build(); + } + catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } +/* + @GET + @Path("/all") + public Response listContainers() { + try { + String id = dockerService.listAllContainers(); + return Response.ok(id).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + @POST + @Path("/start") + public Response start(@QueryParam("id") String id) { + try { + dockerService.start(id); + return Response.ok(Map.of("containerId", id, "status", "Running")).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + @POST + @Path("/stop") + public Response stop(@QueryParam("id") String id) { + try { + dockerService.stop(id); + return Response.ok(Map.of("containerId", id, "status", "removed")).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + @DELETE + @Path("/remove") + public Response remove(@QueryParam("id") String id) { + try { + dockerService.remove(id); + return Response.ok(Map.of("containerId", id, "status", "removed")).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + }*/ +} diff --git a/src/main/java/fr/la_banquise/backend/services/DockerService.java b/src/main/java/fr/la_banquise/backend/services/DockerService.java index 4e53bee..426f5ed 100644 --- a/src/main/java/fr/la_banquise/backend/services/DockerService.java +++ b/src/main/java/fr/la_banquise/backend/services/DockerService.java @@ -134,7 +134,7 @@ if (port.getType() != null) { json.append("]"); return json.toString(); -} */ +} public String listAllContainers() { StringBuilder json = new StringBuilder(); List containers = dockerClient.listContainersCmd() @@ -173,7 +173,8 @@ if (port.getType() != null) { } json.append("]"); return json.toString(); -} +}*/ + public String listAllContainers() { return ""; } public void start(String containerId) { dockerClient.startContainerCmd(containerId).exec(); diff --git a/src/main/java/fr/la_banquise/backend/services/JiService.java b/src/main/java/fr/la_banquise/backend/services/JiService.java new file mode 100644 index 0000000..03b1e4c --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/services/JiService.java @@ -0,0 +1,59 @@ +package fr.la_banquise.backend.services; + +import fr.la_banquise.backend.data.model.Ji; +import fr.la_banquise.backend.data.model.Site; +import fr.la_banquise.backend.data.repository.JiRepository; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import java.util.List; + +@ApplicationScoped +public class JiService { + + @Inject + JiRepository jiRepository; + + @Inject + SiteService siteService; + + @Transactional + public Ji createJi(String name, String description, String address, String respo, String site_name) { + Site site = siteService.getSiteByName(site_name); + Ji ji = new Ji(name, description, address, respo, site.id); + jiRepository.persist(ji); + siteService.addJi(site, ji.id); + return ji; + } + + /*@Transactional + public List saveAllSites(List sites) { + sites.forEach(site -> siteRepository.persist(site)); + return sites; + }*/ + + public List getAllJi() { + return jiRepository.listAll(); + } + + public Ji getJiByName(String name) { + return jiRepository.find("name", name).firstResult(); + } + + public Ji getJiById(Long id) { + return jiRepository.findById(id); + } + + @Transactional + public void deleteJiById(Long id) { + siteService.removeJi(siteService.getSiteById(getJiById(id).siteId), id); + jiRepository.deleteById(id); + } + + @Transactional + public void deleteJiByName(String name) { + Ji ji = getJiByName(name); + siteService.removeJi(siteService.getSiteById(ji.siteId), ji.id); + jiRepository.delete(ji); + } +} diff --git a/src/main/java/fr/la_banquise/backend/services/SiteService.java b/src/main/java/fr/la_banquise/backend/services/SiteService.java new file mode 100644 index 0000000..2ea1743 --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/services/SiteService.java @@ -0,0 +1,72 @@ +package fr.la_banquise.backend.services; + +import fr.la_banquise.backend.data.model.Site; +import fr.la_banquise.backend.data.repository.SiteRepository; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import java.util.List; + +@ApplicationScoped +public class SiteService { + + @Inject + SiteRepository siteRepository; + + @Transactional + public Site createSite(String name, String description, String address) { + Site site = new Site(name, description, address); + siteRepository.persist(site); + return site; + } + + /*@Transactional + public List saveAllSites(List sites) { + sites.forEach(site -> siteRepository.persist(site)); + return sites; + }*/ + + public List getAllSites() { + return siteRepository.listAll(); + } + + public Site getSiteByName(String name) { + return siteRepository.find("name", name).firstResult(); + } + + public Site getSiteById(Long id) { + return siteRepository.findById(id); + } + + @Transactional + public void addJi(Site site, Long id){ + site.jiInSite.add(id); + } + + @Transactional + public void removeJi(Site site, Long id){ + site.jiInSite.remove(id); + } + + @Transactional + public boolean deleteSiteById(Long id) { + if (getSiteById(id).jiInSite.isEmpty()) + { + siteRepository.deleteById(id); + return true; + } + return false; + + } + + @Transactional + public boolean deleteSiteByName(String name) { + Site site = getSiteByName(name); + if (site.jiInSite.isEmpty()) + { + siteRepository.delete(site); + return true; + } + return false; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ee245e3..9922da7 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -26,13 +26,13 @@ quarkus.security.ldap.identity-mapping.attribute-mappings."0".filter-base-dn=ou= # database quarkus.datasource.db-kind = postgresql -quarkus.datasource.username = postgres -quarkus.datasource.password = secret -#quarkus.datasource.jdbc.url = jdbc:postgresql://localhost:5432/quarkus +quarkus.datasource.username = banq +quarkus.datasource.password = test +quarkus.datasource.jdbc.url = jdbc:postgresql://localhost:5432/quarkus # drop and create the database at startup (use `update` to only update the schema)drop-and-create -quarkus.hibernate-orm.database.generation=update -#quarkus.hibernate-orm.database.generation=drop-and-create +#quarkus.hibernate-orm.database.generation=update +quarkus.hibernate-orm.database.generation=drop-and-create quarkus.quinoa.dev-server.port=5173 quarkus.quinoa.enable-spa-routing=true