diff --git a/src/main/java/fr/la_banquise/backend/data/model/Container.java b/src/main/java/fr/la_banquise/backend/data/model/Container.java new file mode 100644 index 0000000..b84dbb0 --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/data/model/Container.java @@ -0,0 +1,72 @@ +/**package fr.la_banquise.backend.data.model; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse.ContainerState; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.Ports; +import jakarta.inject.Inject; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import java.util.List; +import lombok.NoArgsConstructor; + +/** + * Instances + +@Entity +@NoArgsConstructor +@Table(name = "dockerfile") +public class Dockerfile { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @SequenceGenerator(name = "DockerfileSeq", + sequenceName = "dockerfile_id_seq", allocationSize = 1, + initialValue = 1) + public Long id; + @Column(unique = true) public String name; + public String text; + + @JsonIgnore + public List instances; + + public Dockerfile(String name, String text) { + this.name = name; + this.text = text; + } + + public Dockerfile() {} + + public boolean isCreated() { return containerId != null && status != null; } + + public boolean createContainer(String containerName, int port) { + ExposedPort tcpSsh = ExposedPort.tcp(80); + + Ports portBindings = new Ports(); + portBindings.bind(tcpSsh, Ports.Binding.bindPort(port)); + + HostConfig hostConfig = + HostConfig.newHostConfig().withPortBindings(portBindings); + + CreateContainerResponse container = + dockerClient.createContainerCmd("nginx:latest") + .withName(containerName) + .withExposedPorts(tcpSsh) + .withHostConfig(hostConfig) + .exec(); + + this.containerId = container.getId(); + + return true; + }; +}**/ diff --git a/src/main/java/fr/la_banquise/backend/data/model/Instance.java b/src/main/java/fr/la_banquise/backend/data/model/Instance.java index d8fec85..47a49ae 100644 --- a/src/main/java/fr/la_banquise/backend/data/model/Instance.java +++ b/src/main/java/fr/la_banquise/backend/data/model/Instance.java @@ -1,6 +1,7 @@ package fr.la_banquise.backend.data.model; import com.fasterxml.jackson.annotation.JsonBackReference; +import com.github.dockerjava.api.model.Container; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -24,28 +25,22 @@ public class Instance { allocationSize = 1, initialValue = 1) public Long id; public String name; - public String ssh; public Long port; - public String pwd; + public Container container; @JsonBackReference @ManyToOne @JoinColumn(name = "user_id", nullable = false) - public User user; + public User owner; @ManyToOne @JoinColumn(name = "practical_id", nullable = false) - public Tp tp; + public Sujet sujet; - public Instance(String name, String ssh, String pwd, Long port, User user, - Tp tp) { + public Instance(String name, Long port, User user, Sujet sujet) { this.name = name; - this.ssh = ssh; - this.pwd = pwd; this.port = port; - this.user = user; - this.tp = tp; + this.owner = user; + this.sujet = sujet; } - - public Instance() {} } 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 a9c71d2..b296feb 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 @@ -6,9 +6,12 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; +import java.util.List; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @@ -24,19 +27,24 @@ public class Ji { public Long id; public String name; public String description; - public String respo; + + @ManyToMany + @JoinTable( + name = "ji_user", // Table de liaison + joinColumns = @JoinColumn(name = "ji_id"), + inverseJoinColumns = @JoinColumn(name = "user_id") + ) + public List respos; public String date; @ManyToOne @JoinColumn(name = "site_id") @JsonIgnore public Site site; - public Ji(String name, String description, String respo, String date, + public Ji(String name, String description, List respos, String date, Site site) { this.name = name; this.description = description; - this.respo = respo; + this.respos = respos; this.date = date; this.site = site; } - - public Ji() {} } 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 0fe3304..fcb5a8b 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 @@ -46,5 +46,5 @@ public class Site { description + "', address='" + address + "'}"; } - public Site() {} + //public Site() {} } diff --git a/src/main/java/fr/la_banquise/backend/data/model/Tp.java b/src/main/java/fr/la_banquise/backend/data/model/Sujet.java similarity index 52% rename from src/main/java/fr/la_banquise/backend/data/model/Tp.java rename to src/main/java/fr/la_banquise/backend/data/model/Sujet.java index f5d4074..be94854 100644 --- a/src/main/java/fr/la_banquise/backend/data/model/Tp.java +++ b/src/main/java/fr/la_banquise/backend/data/model/Sujet.java @@ -1,11 +1,16 @@ package fr.la_banquise.backend.data.model; +import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; +import java.util.List; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @@ -15,27 +20,29 @@ import lombok.NoArgsConstructor; @Entity @NoArgsConstructor @AllArgsConstructor -@Table(name = "tp") -public class Tp { +@Table(name = "Sujet") +public class Sujet { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @SequenceGenerator(name = "TpSeq", sequenceName = "tp_id_seq", + @SequenceGenerator(name = "SujetSeq", sequenceName = "sujet_id_seq", allocationSize = 1, initialValue = 1) public Long id; public String name; public String description; public String pdfLink; - public String respo; - public String date; + @ManyToMany + @JoinTable( + name = "sujet_user", // Table de liaison + joinColumns = @JoinColumn(name = "sujet_id"), + inverseJoinColumns = @JoinColumn(name = "user_id") + ) + public List respos; - public Tp(String name, String description, String pdfLink, String respo, - String date) { + public Sujet(String name, String description, String pdfLink, + List respos) { this.name = name; this.description = description; this.pdfLink = pdfLink; - this.respo = respo; - this.date = date; + this.respos = respos; } - - public Tp() {} } diff --git a/src/main/java/fr/la_banquise/backend/data/model/User.java b/src/main/java/fr/la_banquise/backend/data/model/User.java index 0809923..72aa4af 100644 --- a/src/main/java/fr/la_banquise/backend/data/model/User.java +++ b/src/main/java/fr/la_banquise/backend/data/model/User.java @@ -10,6 +10,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.ManyToMany; import jakarta.persistence.OneToMany; import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; @@ -40,9 +41,15 @@ public class User { @Roles public String role; @JsonManagedReference - @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) + @OneToMany(mappedBy = "owner", cascade = CascadeType.ALL) public List instances; + @ManyToMany(mappedBy = "respos", cascade = CascadeType.ALL) + public List sujetRespo; + + @ManyToMany(mappedBy = "respos", cascade = CascadeType.ALL) + public List jiRespo; + public User(String name, String password, String role, List instances) { this.name = name; @@ -51,5 +58,5 @@ public class User { this.instances = instances; } - public User() {} + //public User() {} } diff --git a/src/main/java/fr/la_banquise/backend/data/repository/ContainerRepository.java b/src/main/java/fr/la_banquise/backend/data/repository/ContainerRepository.java new file mode 100644 index 0000000..114fe18 --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/data/repository/ContainerRepository.java @@ -0,0 +1,12 @@ +/**package fr.la_banquise.backend.data.repository; + +import fr.la_banquise.backend.data.model.Container; +import io.quarkus.hibernate.orm.panache.PanacheRepository; +import jakarta.enterprise.context.ApplicationScoped; + +/** + * InstanceRepository + +@ApplicationScoped +public class ContainerRepository implements PanacheRepository { +}*/ diff --git a/src/main/java/fr/la_banquise/backend/data/repository/TpRepository.java b/src/main/java/fr/la_banquise/backend/data/repository/SujetRepository.java similarity index 63% rename from src/main/java/fr/la_banquise/backend/data/repository/TpRepository.java rename to src/main/java/fr/la_banquise/backend/data/repository/SujetRepository.java index 8751766..85aa285 100644 --- a/src/main/java/fr/la_banquise/backend/data/repository/TpRepository.java +++ b/src/main/java/fr/la_banquise/backend/data/repository/SujetRepository.java @@ -1,6 +1,6 @@ package fr.la_banquise.backend.data.repository; -import fr.la_banquise.backend.data.model.Tp; +import fr.la_banquise.backend.data.model.Sujet; import io.quarkus.hibernate.orm.panache.PanacheRepository; import jakarta.enterprise.context.ApplicationScoped; @@ -8,4 +8,4 @@ import jakarta.enterprise.context.ApplicationScoped; * TpRepository */ @ApplicationScoped -public class TpRepository implements PanacheRepository {} +public class SujetRepository implements PanacheRepository {} diff --git a/src/main/java/fr/la_banquise/backend/rest/Endpoints.java b/src/main/java/fr/la_banquise/backend/rest/Endpoints.java index ce4da5f..5107ed9 100644 --- a/src/main/java/fr/la_banquise/backend/rest/Endpoints.java +++ b/src/main/java/fr/la_banquise/backend/rest/Endpoints.java @@ -2,7 +2,7 @@ package fr.la_banquise.backend.rest; import fr.la_banquise.backend.rest.response.DashboardResponse; import fr.la_banquise.backend.services.InstanceService; -import fr.la_banquise.backend.services.TpService; +import fr.la_banquise.backend.services.SujetService; import io.quarkus.security.identity.SecurityIdentity; import jakarta.inject.Inject; import jakarta.ws.rs.GET; @@ -22,7 +22,7 @@ public class Endpoints { InstanceService instanceService; @Inject - TpService tpService; + SujetService sujetService; @GET @Path("dashboard") @@ -30,10 +30,10 @@ public class Endpoints { String username = identity.getPrincipal().getName(); DashboardResponse dashboard = new DashboardResponse(); if (identity.getRoles().contains("root")) { - dashboard.tps = tpService.getAllTpsAdmin(); + dashboard.tps = sujetService.getAllSujetsAdmin(); } else { - dashboard.tps = tpService.getAllTps(identity.getPrincipal().getName()); + dashboard.tps = sujetService.getAllSujetsRespo(identity.getPrincipal().getName()); } dashboard.instances = instanceService.getAllInstances(username); return Response.ok(dashboard).build(); diff --git a/src/main/java/fr/la_banquise/backend/rest/JiResource.java b/src/main/java/fr/la_banquise/backend/rest/JiResource.java index b0357d8..39aba73 100644 --- a/src/main/java/fr/la_banquise/backend/rest/JiResource.java +++ b/src/main/java/fr/la_banquise/backend/rest/JiResource.java @@ -27,7 +27,7 @@ public class JiResource { @Produces(MediaType.APPLICATION_JSON) public Response listall() { try { - List ji = jiService.getAllJi(); + List ji = jiService.getAllJiAdmin(); return Response.ok(ji).build(); } catch (Exception e) { return Response.status(500) @@ -45,7 +45,7 @@ public class JiResource { @QueryParam("respo") String respo, @QueryParam("site") String name_site) { try { - Ji jsp = jiService.createJi(name, desc, address, respo, name_site); + Ji jsp = jiService.createJi(name, desc, address, name_site); return Response.ok(Map.of("created", jsp)).build(); } catch (Exception e) { return Response.status(500) diff --git a/src/main/java/fr/la_banquise/backend/rest/SujetEndpoints.java b/src/main/java/fr/la_banquise/backend/rest/SujetEndpoints.java new file mode 100644 index 0000000..65ffeaa --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/rest/SujetEndpoints.java @@ -0,0 +1,45 @@ +package fr.la_banquise.backend.rest; + +import fr.la_banquise.backend.rest.request.SujetRequest; +import fr.la_banquise.backend.services.SujetService; +import io.quarkus.security.identity.SecurityIdentity; +import jakarta.annotation.security.RolesAllowed; +import jakarta.inject.Inject; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; + +/** + * TpEndpoints + */ +@Path("/api/subject") +public class SujetEndpoints { + + @Inject SecurityIdentity identity; + + @Inject SujetService sujetService; + + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getAllSujetsRespo() { + if (identity.getRoles().contains("root")) { + return Response.ok(sujetService.getAllSujetsAdmin()).build(); + } + return Response + .ok(sujetService.getAllSujetsRespo( + identity.getPrincipal().getName())) + .build(); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @RolesAllowed("root") + public Response createSujet(SujetRequest sujet) { + return Response.ok(sujetService.createSujet(sujet)).build(); + } +} diff --git a/src/main/java/fr/la_banquise/backend/rest/TpEndpoints.java b/src/main/java/fr/la_banquise/backend/rest/TpEndpoints.java deleted file mode 100644 index edd058f..0000000 --- a/src/main/java/fr/la_banquise/backend/rest/TpEndpoints.java +++ /dev/null @@ -1,56 +0,0 @@ -package fr.la_banquise.backend.rest; - -import fr.la_banquise.backend.services.TpService; -import io.quarkus.security.identity.SecurityIdentity; -import fr.la_banquise.backend.rest.request.TpRequest; -import jakarta.annotation.security.RolesAllowed; -import jakarta.inject.Inject; -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.MediaType; -import jakarta.ws.rs.core.Response; - -/** - * TpEndpoints - */ -@Path("/api/tps") -public class TpEndpoints { - - @Inject - SecurityIdentity identity; - - @Inject - TpService tpService; - - @GET - @Produces(MediaType.APPLICATION_JSON) - public Response getAllTps() { - if (identity.getRoles().contains("root")) { - return Response.ok(tpService.getAllTpsAdmin()).build(); - } - return Response.ok(tpService.getAllTps(identity.getPrincipal().getName())).build(); - } - - @GET - @Produces(MediaType.APPLICATION_JSON) - @Path("{id}") - public Response getTp(@PathParam("id") Long id) { - if (identity.getRoles().contains("root")) { - return Response.ok(tpService.getTpAdmin(id)).build(); - } - return Response.ok(tpService.getTp(id, identity.getPrincipal().getName())).build(); - } - - @POST - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - @RolesAllowed("root") - public Response createTp(TpRequest tp) { - System.out.println(tp.date); - return Response.ok(tpService.createTp(tp)).build(); - } -} diff --git a/src/main/java/fr/la_banquise/backend/rest/UserEndpoints.java b/src/main/java/fr/la_banquise/backend/rest/UserEndpoints.java index 076d591..b02f2dc 100644 --- a/src/main/java/fr/la_banquise/backend/rest/UserEndpoints.java +++ b/src/main/java/fr/la_banquise/backend/rest/UserEndpoints.java @@ -36,7 +36,7 @@ public class UserEndpoints { } @GET - @RolesAllowed("root") + //@RolesAllowed("root") public Response getAllUsers() { return Response.ok(userService.getAllUsers()).build(); } @@ -49,7 +49,7 @@ public class UserEndpoints { } @POST - @RolesAllowed("root") + //@RolesAllowed("root") public Response createUser(UserRequest user) { return Response.ok(userService.createUser(user)).build(); } diff --git a/src/main/java/fr/la_banquise/backend/rest/request/TpRequest.java b/src/main/java/fr/la_banquise/backend/rest/request/SujetRequest.java similarity index 90% rename from src/main/java/fr/la_banquise/backend/rest/request/TpRequest.java rename to src/main/java/fr/la_banquise/backend/rest/request/SujetRequest.java index e886261..5353f9d 100644 --- a/src/main/java/fr/la_banquise/backend/rest/request/TpRequest.java +++ b/src/main/java/fr/la_banquise/backend/rest/request/SujetRequest.java @@ -3,7 +3,7 @@ package fr.la_banquise.backend.rest.request; /** * TpRequest */ -public class TpRequest { +public class SujetRequest { public String title; public String description; public String pdf; diff --git a/src/main/java/fr/la_banquise/backend/rest/response/DashboardResponse.java b/src/main/java/fr/la_banquise/backend/rest/response/DashboardResponse.java index 23c500b..fcc3fde 100644 --- a/src/main/java/fr/la_banquise/backend/rest/response/DashboardResponse.java +++ b/src/main/java/fr/la_banquise/backend/rest/response/DashboardResponse.java @@ -3,7 +3,7 @@ package fr.la_banquise.backend.rest.response; import java.util.List; import fr.la_banquise.backend.data.model.Instance; -import fr.la_banquise.backend.data.model.Tp; +import fr.la_banquise.backend.data.model.Sujet; import io.quarkus.runtime.annotations.RegisterForReflection; import lombok.AllArgsConstructor; @@ -12,6 +12,6 @@ import lombok.AllArgsConstructor; */ @RegisterForReflection public class DashboardResponse { - public List tps; + public List tps; public List instances; } diff --git a/src/main/java/fr/la_banquise/backend/rest/response/LoggedUserResponse.java b/src/main/java/fr/la_banquise/backend/rest/response/LoggedUserResponse.java index cccf399..71e8297 100644 --- a/src/main/java/fr/la_banquise/backend/rest/response/LoggedUserResponse.java +++ b/src/main/java/fr/la_banquise/backend/rest/response/LoggedUserResponse.java @@ -1,8 +1,7 @@ package fr.la_banquise.backend.rest.response; -import java.util.Set; - import io.quarkus.runtime.annotations.RegisterForReflection; +import java.util.Set; import lombok.AllArgsConstructor; /** diff --git a/src/main/java/fr/la_banquise/backend/rest/response/PracticalResponse.java b/src/main/java/fr/la_banquise/backend/rest/response/PracticalResponse.java index cc2fb67..766804f 100644 --- a/src/main/java/fr/la_banquise/backend/rest/response/PracticalResponse.java +++ b/src/main/java/fr/la_banquise/backend/rest/response/PracticalResponse.java @@ -1,27 +1,28 @@ package fr.la_banquise.backend.rest.response; +import fr.la_banquise.backend.data.model.User; import io.quarkus.runtime.annotations.RegisterForReflection; import io.smallrye.common.constraint.Nullable; +import java.util.List; import lombok.AllArgsConstructor; /** * PracticalResponse */ -//@AllArgsConstructor +@AllArgsConstructor @RegisterForReflection public class PracticalResponse { public String name; public String description; public String pdfLink; - public String respo; - public String endDate; + public List respos; @Nullable public String instanceName; @Nullable public String pwd; @Nullable public String ssh; @Nullable public Long port; - public PracticalResponse(String name, String description, String pdfLink, + /*public PracticalResponse(String name, String description, String pdfLink, String respo, String date, @Nullable String InstanceName, @Nullable String pwd, @Nullable String ssh, @@ -35,5 +36,5 @@ public class PracticalResponse { this.port = port; this.ssh = ssh; this.pwd = pwd; - } + }*/ } diff --git a/src/main/java/fr/la_banquise/backend/services/ContainerService.java b/src/main/java/fr/la_banquise/backend/services/ContainerService.java new file mode 100644 index 0000000..fe98b4c --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/services/ContainerService.java @@ -0,0 +1,181 @@ +/**package fr.la_banquise.backend.services; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +// import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.api.model.ContainerPort; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; +import fr.la_banquise.backend.data.model.Container; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@ApplicationScoped +public class ContainerService { + + @Inject DockerClient dockerClient; + + public String createAndStartNginx() { + ExposedPort tcp80 = ExposedPort.tcp(80); + + Ports portBindings = new Ports(); + portBindings.bind(tcp80, Ports.Binding.bindPort(8081)); + + HostConfig hostConfig = + HostConfig.newHostConfig().withPortBindings(portBindings); + Map labels = new HashMap<>(); + labels.put("test", "banquise"); + labels.put("environment", "development"); + labels.put("version", "1.0"); + labels.put("created-by", "java-docker-api"); + + CreateContainerResponse container = + dockerClient.createContainerCmd("nginx:latest") + .withName("my-nginx") + .withLabels(labels) + .withExposedPorts(tcp80) + .withHostConfig(hostConfig) + .exec(); + + dockerClient.startContainerCmd(container.getId()).exec(); + return container.getId(); + } + + public Container createContainer() { + Container container = + dockerClient + .createContainerCmd("nginx:latest") + + // dockerClient.startContainerCmd(container.getId()).exec(); + return container.createContainer(); + } + /* + public String listAllContainers() { + StringBuilder json = new StringBuilder(); + List containers = dockerClient.listContainersCmd() + .withShowAll(true) + .exec(); + + json.append("["); + + for (int i = 0; i < containers.size(); i++) { + Container container = containers.get(i); + + json.append("{"); + json.append("\"name\":\"").append(container.getNames()[0].substring(1)).append("\","); + json.append("\"id\":\"").append(container.getId()).append("\","); + json.append("\"image\":\"").append(container.getImage()).append("\","); + json.append("\"status\":\"").append(container.getStatus()).append("\","); + + // Ports + InspectContainerResponse inspectResponse = + dockerClient.inspectContainerCmd(container.getId()).exec(); + json.append("\"ports\":["); + if (container.getPorts() != null && container.getPorts().length > 0) { + for (int j = 0; j < .length; j+=2) { + ContainerPort port = container.getPorts()[j]; + json.append("[\""); + json.append(port.getPrivatePort()).append("->").append(port.getPublicPort()).append("/"+port.getType()+"\",\""); + json.append(port.getIp()).append(",").append((container.getPorts()[j+1]).getIp()); + if (port.getType() != null) { + json.append("/").append(port.getType()); + } + if (port.getPublicPort() != null) { + json.append("->").append(port.getPublicPort()); + }* + json.append("\"]"); + if (j < container.getPorts().length - 2) { + json.append(","); + } + } + } + json.append("]"); + + // Ports + String ports = "[]"; + try { + InspectContainerResponse inspectResponse = + dockerClient.inspectContainerCmd(container.getId()).exec(); if + (inspectResponse.getConfig().getExposedPorts() != null) { ports = + inspectResponse.getConfig().getExposedPorts().toString(); + } + } catch (Exception e) { + // Fallback vers les ports runtime si inspect échoue + if (container.getPorts() != null && container.getPorts().length + > 0) { ports = java.util.Arrays.toString(container.getPorts()); + } + } + json.append("\"ports\":\"").append(ports).append("\""); + json.append("}"); + if (i < containers.size() - 1) { + json.append(","); + } + + json.append("}"); + + if (i < containers.size() - 1) { + json.append(","); + } + } + + json.append("]"); + return json.toString(); + } + public String listAllContainers() { + StringBuilder json = new StringBuilder(); + List containers = dockerClient.listContainersCmd() + .withShowAll(true) + .exec(); + json.append("["); + for (int i = 0; i < containers.size(); i++) { + Container container = containers.get(i); + // Ports + List portsList = new ArrayList<>(); + try { + var inspectResponse = + dockerClient.inspectContainerCmd(container.getId()).exec(); if + (inspectResponse.getConfig().getExposedPorts() != null) { var exposedPorts = + inspectResponse.getConfig().getExposedPorts(); int count = 0; for (var port + : exposedPorts) { if (count > 0) portsList.append(","); + portsList.append(String.format("\"%s\"", + port.toString())); count = 1; + } + portsList.append("]"); + ports = portsList.toString(); + } + } catch (Exception e) { + // Fallback vers les ports runtime si inspect échoue + if (container.getPorts() != null && container.getPorts().length + > 0) { ports = java.util.Arrays.toString(container.getPorts()); + } + } + + //json.append(containerJson); + + if (i < containers.size() - 1) { + json.append(","); + } + } + json.append("]"); + return json.toString(); + }/ + public String listAllContainers() { return ""; } + + public void start(String containerId) { + dockerClient.startContainerCmd(containerId).exec(); + } + + public void stop(String containerId) { + dockerClient.stopContainerCmd(containerId).exec(); + } + + public void remove(String containerId) { + dockerClient.removeContainerCmd(containerId).exec(); + } +}*/ diff --git a/src/main/java/fr/la_banquise/backend/services/InstanceService.java b/src/main/java/fr/la_banquise/backend/services/InstanceService.java index 25a123f..bf31bcf 100644 --- a/src/main/java/fr/la_banquise/backend/services/InstanceService.java +++ b/src/main/java/fr/la_banquise/backend/services/InstanceService.java @@ -1,16 +1,15 @@ package fr.la_banquise.backend.services; -import java.util.List; - import fr.la_banquise.backend.data.model.Instance; -import fr.la_banquise.backend.data.model.Tp; +import fr.la_banquise.backend.data.model.Sujet; import fr.la_banquise.backend.data.model.User; import fr.la_banquise.backend.data.repository.InstanceRepository; -import fr.la_banquise.backend.data.repository.TpRepository; +import fr.la_banquise.backend.data.repository.SujetRepository; import fr.la_banquise.backend.data.repository.UserRepository; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.transaction.Transactional; +import java.util.List; /** * InstanceService @@ -18,14 +17,11 @@ import jakarta.transaction.Transactional; @ApplicationScoped public class InstanceService { - @Inject - InstanceRepository instanceRepository; + @Inject InstanceRepository instanceRepository; - @Inject - UserRepository userRepository; + @Inject UserRepository userRepository; - @Inject - TpRepository tpRepository; + @Inject SujetRepository sujetRepository; public List getAllInstances() { return instanceRepository.findAll().list(); @@ -41,18 +37,20 @@ public class InstanceService { } @Transactional - public Instance createInstance(String name, String ssh, String pwd, Long port, String username, Long tpId) { + public Instance createInstance(String name, String ssh, String pwd, + Long port, String username, Long sujetId) { User user = userRepository.findByName(username); - Tp tp = tpRepository.findById(tpId); - Instance instance = new Instance(name, ssh, pwd, port, user, tp); + Sujet sujet = sujetRepository.findById(sujetId); + Instance instance = new Instance(name, port, user, sujet); instanceRepository.persist(instance); return instance; } @Transactional - public Instance createInstance(String name, String ssh, String pwd, Long port, User user, Long tpId) { - Tp tp = tpRepository.findById(tpId); - Instance instance = new Instance(name, ssh, pwd, port, user, tp); + public Instance createInstance(String name, String ssh, String pwd, + Long port, User user, Long sujetId) { + Sujet sujet = sujetRepository.findById(sujetId); + Instance instance = new Instance(name, port, user, sujet); instanceRepository.persist(instance); return instance; } diff --git a/src/main/java/fr/la_banquise/backend/services/JiService.java b/src/main/java/fr/la_banquise/backend/services/JiService.java index 9186ca4..cb690e7 100644 --- a/src/main/java/fr/la_banquise/backend/services/JiService.java +++ b/src/main/java/fr/la_banquise/backend/services/JiService.java @@ -2,30 +2,42 @@ 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.model.User; import fr.la_banquise.backend.data.repository.JiRepository; +import fr.la_banquise.backend.data.repository.UserRepository; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.transaction.Transactional; +import jakarta.ws.rs.core.SecurityContext; + import java.util.List; @ApplicationScoped public class JiService { @Inject JiRepository jiRepository; - + @Inject UserRepository userRepository; @Inject SiteService siteService; + @Inject SecurityContext security; @Transactional public Ji createJi(String name, String description, String address, - String respo, String site_name) { + String site_name) { Site site = siteService.getSiteByName(site_name); - Ji ji = new Ji(name, description, address, respo, site); + User currentUser = + userRepository.findByName(security.getUserPrincipal().getName()); + Ji ji = new Ji(name, description, List.of(currentUser), "date", site); jiRepository.persist(ji); siteService.addJi(site, ji); return ji; } - public List getAllJi() { return jiRepository.listAll(); } + public List getAllJiAdmin() { return jiRepository.listAll(); } + + public List getAllJiRespo(String username) { + User user = userRepository.findByName(username); + return user.jiRespo; + } public Ji getJiByName(String name) { return jiRepository.find("name", name).firstResult(); diff --git a/src/main/java/fr/la_banquise/backend/services/SujetService.java b/src/main/java/fr/la_banquise/backend/services/SujetService.java new file mode 100644 index 0000000..f5f5ffb --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/services/SujetService.java @@ -0,0 +1,81 @@ +package fr.la_banquise.backend.services; + +import fr.la_banquise.backend.data.model.Instance; +import fr.la_banquise.backend.data.model.Sujet; +import fr.la_banquise.backend.data.model.User; +import fr.la_banquise.backend.data.repository.InstanceRepository; +import fr.la_banquise.backend.data.repository.SujetRepository; +import fr.la_banquise.backend.data.repository.UserRepository; +import fr.la_banquise.backend.rest.request.SujetRequest; +import fr.la_banquise.backend.rest.response.PracticalResponse; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; +import jakarta.ws.rs.core.SecurityContext; +import java.text.Collator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * TpService + */ +@ApplicationScoped +public class SujetService { + + @Inject SecurityContext security; + + @Inject SujetRepository sujetRepository; + + @Inject UserRepository userRepository; + + @Inject InstanceRepository instanceRepository; + + public List getAllSujetsAdmin() { return sujetRepository.listAll(); } + + public List getAllSujetsRespo(String username) { + User user = userRepository.findByName(username); + return user.sujetRespo; + } + + /*public PracticalResponse getTp(Long id, String username) { + User user = userRepository.findByName(username); + Sujet sujet = sujetRepository.findById(id); + Instance instance = + instanceRepository.find("user = ?1 AND tp = ?2", user, sujet) + .firstResult(); + PracticalResponse res = new PracticalResponse( + sujet.name, sujet.description, sujet.pdfLink, sujet.respos, + instance.name, instance.pwd, instance.ssh, instance.port); + return res; + } + + /*public PracticalResponse getTpAdmin(Long id) { + Sujet sujet = sujetRepository.findById(id); + return new PracticalResponse(sujet.name, sujet.description, + sujet.pdfLink, sujet.respos, "", "", "", + 0L); + }*/ + + @Transactional + public Sujet createSujet(SujetRequest requestSujet) { + User currentUser = + userRepository.findByName(security.getUserPrincipal().getName()); + Sujet sujet = new Sujet(requestSujet.title, requestSujet.description, + requestSujet.pdf, List.of(currentUser)); + sujetRepository.persist(sujet); + return sujet; + } + + @Transactional + public void deleteSujet(Long id) { + sujetRepository.deleteById(id); + } + + /* + * TODO: Seuls les respos du sujet et root doivent pouvoir avoir acces + * @Transactional + public Sujet updateSujet(Long id) { + Sujet sujet = sujetRepository.findById(id); + return sujet; + }*/ +} diff --git a/src/main/java/fr/la_banquise/backend/services/TpService.java b/src/main/java/fr/la_banquise/backend/services/TpService.java deleted file mode 100644 index 6fadefc..0000000 --- a/src/main/java/fr/la_banquise/backend/services/TpService.java +++ /dev/null @@ -1,82 +0,0 @@ -package fr.la_banquise.backend.services; - -import java.text.Collator; -import java.util.List; -import java.util.stream.Collectors; - -import fr.la_banquise.backend.data.model.Instance; -import fr.la_banquise.backend.data.model.Tp; -import fr.la_banquise.backend.data.model.User; -import fr.la_banquise.backend.data.repository.InstanceRepository; -import fr.la_banquise.backend.data.repository.TpRepository; -import fr.la_banquise.backend.data.repository.UserRepository; -import fr.la_banquise.backend.rest.request.TpRequest; -import fr.la_banquise.backend.rest.response.PracticalResponse; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; -import jakarta.transaction.Transactional; -import jakarta.ws.rs.core.SecurityContext; - -/** - * TpService - */ -@ApplicationScoped -public class TpService { - - @Inject - SecurityContext security; - - @Inject - TpRepository tpRepository; - - @Inject - UserRepository userRepository; - - @Inject - InstanceRepository instanceRepository; - - public List getAllTpsAdmin() { - return tpRepository.listAll(); - } - - public List getAllTps(String username) { - User user = userRepository.findByName(username); - List instances = instanceRepository.find("user = ?1 AND tp IS NOT NULL", user).list(); - return tpRepository.find("id in ?1", instances.stream().map(i -> i.tp.id).collect(Collectors.toList())).list(); - } - - public PracticalResponse getTp(Long id, String username) { - User user = userRepository.findByName(username); - Tp tp = tpRepository.findById(id); - Instance instance = instanceRepository.find("user = ?1 AND tp = ?2", user, tp).firstResult(); - PracticalResponse res = new PracticalResponse(tp.name, tp.description, tp.pdfLink, tp.respo, tp.date, - instance.name, - instance.pwd, instance.ssh, instance.port); - return res; - } - - /* public PracticalResponse getTpAdmin(Long id) { - Tp tp = tpRepository.findById(id); - return new PracticalResponse(tp.name, tp.description, tp.pdfLink, tp.respo, - "", - "", "", 0L); - }*/ - - /*@Transactional - public Tp createTp(TpRequest requestTp) { - Tp tp = new Tp(requestTp.title, requestTp.description, requestTp.pdf, security.getUserPrincipal().getName(), requestTp.date); - tpRepository.persist(tp); - return tp; - }*/ - - @Transactional - public void deleteTp(Long id) { - tpRepository.deleteById(id); - } - - @Transactional - public Tp updateTp(Long id) { - Tp tp = tpRepository.findById(id); - return tp; - } -} diff --git a/src/main/java/fr/la_banquise/backend/services/UserService.java b/src/main/java/fr/la_banquise/backend/services/UserService.java index 10b1f86..cda51e1 100644 --- a/src/main/java/fr/la_banquise/backend/services/UserService.java +++ b/src/main/java/fr/la_banquise/backend/services/UserService.java @@ -58,7 +58,7 @@ public class UserService { public void deleteJDMI() { for (Instance instance : instanceService.getAllInstances()) { instanceService.deleteInstance(instance.id); - userRepository.deleteById(instance.user.id); + userRepository.deleteById(instance.owner.id); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8136c5b..9a7b0bb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -38,4 +38,4 @@ quarkus.quinoa.dev-server.port=5173 quarkus.quinoa.enable-spa-routing=true quarkus.docker.docker-host=unix:///run/user/1000/docker.sock -quarkus.security.auth.enabled-in-dev-mode=false +#quarkus.security.auth.enabled-in-dev-mode=false