diff --git a/.gitignore b/.gitignore
index 23756e9..028470e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
+.vscode
+.idea
# dependencies
front_end/node_modules
/.pnp
diff --git a/README.md b/README.md
index ae7adc2..8f43eef 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
# hackathon
+In order to launch any task (Maven compile, clean install ...) be sure to launch the Docker compose in the root directory with :
+docker compose up
## Getting started
diff --git a/back_end/pom.xml b/back_end/pom.xml
index 201a645..a2c98b2 100644
--- a/back_end/pom.xml
+++ b/back_end/pom.xml
@@ -97,7 +97,19 @@
spring-boot-starter-thymeleaf-test
test
-
+
+ org.projectlombok
+ lombok
+ 1.18.32
+ provided
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ 2.5.0
+
+
+
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/ActiviteDTO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/ActiviteDTO.java
new file mode 100644
index 0000000..7759ef1
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/ActiviteDTO.java
@@ -0,0 +1,15 @@
+package hackathon.FrisbYEE.jpa.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ActiviteDTO {
+ private Integer id;
+ private String name;
+ private String theme;
+ private Long duree; // optional, can be null
+ private List dataActivite;
+ private Integer sessionId;
+}
\ No newline at end of file
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/AdminDTO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/AdminDTO.java
new file mode 100644
index 0000000..3656be2
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/AdminDTO.java
@@ -0,0 +1,8 @@
+package hackathon.FrisbYEE.jpa.dto;
+import lombok.Data;
+
+@Data
+public class AdminDTO {
+ private Integer id;
+ private String name;
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/AthleteDTO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/AthleteDTO.java
new file mode 100644
index 0000000..6820a44
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/AthleteDTO.java
@@ -0,0 +1,16 @@
+package hackathon.FrisbYEE.jpa.dto;
+
+import lombok.Data;
+import java.util.List;
+
+@Data
+public class AthleteDTO {
+ private Integer id;
+ private String name;
+ private String categorie;
+ private String niveau;
+ private List groupes = new ArrayList<>();
+ private List sessionIds = new ArrayList<>();
+ private Integer userId;
+
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/CoachDTO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/CoachDTO.java
new file mode 100644
index 0000000..32fb5f2
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/CoachDTO.java
@@ -0,0 +1,10 @@
+package hackathon.FrisbYEE.jpa.dto;
+
+import lombok.Data;
+
+@Data
+public class CoachDTO {
+ private Integer id;
+ private String name;
+
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/SessionDTO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/SessionDTO.java
new file mode 100644
index 0000000..73f2b3c
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/SessionDTO.java
@@ -0,0 +1,22 @@
+package hackathon.FrisbYEE.jpa.dto;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+public class SessionDTO {
+
+ private Integer id;
+ private String name;
+ private Boolean isRecurrent;
+ private LocalDateTime creneau;
+ private Long duree;
+ private String groupe;
+
+ private Integer coachId;
+ private List athleteIds;
+ private List activiteIds;
+
+}
\ No newline at end of file
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/UserDTO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/UserDTO.java
new file mode 100644
index 0000000..239977f
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/UserDTO.java
@@ -0,0 +1,12 @@
+package hackathon.FrisbYEE.jpa.dto;
+
+import hackathon.FrisbYEE.jpa.metier.Role;
+import lombok.Data;
+
+@Data
+public class UserDTO {
+ private Integer id;
+ private String name;
+ private String email;
+ private Role role;
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/interfaces/IAthlete.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/interfaces/IAthlete.java
new file mode 100644
index 0000000..e84a030
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/interfaces/IAthlete.java
@@ -0,0 +1,9 @@
+package hackathon.FrisbYEE.jpa.interfaces;
+
+import java.io.Serializable;
+
+public interface IAthlete{
+ public void run();
+
+
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Activite.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Activite.java
new file mode 100644
index 0000000..96105b0
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Activite.java
@@ -0,0 +1,50 @@
+package hackathon.FrisbYEE.jpa.metier;
+
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.ManyToOne;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import jakarta.persistence.Access;
+import jakarta.persistence.AccessType;
+import jakarta.persistence.ElementCollection;
+import jakarta.persistence.Entity;
+
+@Entity
+@Getter @Setter @NoArgsConstructor
+@Access(AccessType.FIELD)
+
+public class Activite implements Serializable {
+
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private String name;
+ private String theme;
+ private Long duree;
+ @ElementCollection
+ private List dataActivite = new ArrayList<>();
+
+ @ManyToOne
+ private Session session;
+
+ public Activite(String name) {
+ this.name = name;
+ }
+
+ public Activite(String name, String theme, List dataActivite, Long duree) {
+ this.name = name;
+ this.theme = theme;
+ this.duree = duree;
+ this.dataActivite = dataActivite;
+ }
+
+ @Override
+ public String toString() {
+ return "Activite [id=" + id + " , name=" + name + "]";
+ }
+
+}
\ No newline at end of file
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Admin.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Admin.java
new file mode 100644
index 0000000..69bcd52
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Admin.java
@@ -0,0 +1,34 @@
+package hackathon.FrisbYEE.jpa.metier;
+
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.OneToOne;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import jakarta.persistence.Access;
+import jakarta.persistence.AccessType;
+import jakarta.persistence.Entity;
+
+@Entity
+@Getter @Setter @NoArgsConstructor
+@Access(AccessType.FIELD)
+
+public class Admin {
+
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private String name;
+
+ @OneToOne(mappedBy = "admin")
+ private User user;
+
+ public Admin(String name){
+ this.name = name;
+ }
+ @Override
+ public String toString() {
+ return "Admin [id=" + id + " , name=" + name + "]";
+ }
+}
\ No newline at end of file
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Athlete.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Athlete.java
new file mode 100644
index 0000000..bec731d
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Athlete.java
@@ -0,0 +1,54 @@
+package hackathon.FrisbYEE.jpa.metier;
+
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.OneToOne;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import java.util.ArrayList;
+import java.util.List;
+import jakarta.persistence.Access;
+import jakarta.persistence.AccessType;
+import jakarta.persistence.ElementCollection;
+import jakarta.persistence.Entity;
+
+@Entity
+@Data @NoArgsConstructor
+@Access(AccessType.FIELD)
+
+public class Athlete {
+
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private String name;
+ private String categorie;
+ private String niveau;
+ @ElementCollection
+ private List groupe = new ArrayList<>();
+
+
+ @ManyToMany(mappedBy = "athletes")
+ private List sessions = new ArrayList<>(); // plusieurs sessions sont possibles
+
+ @OneToOne(mappedBy = "athlete")
+ private User user;
+
+ public Athlete(String name){
+ this.name = name;
+ }
+
+ public Athlete(String name, String categorie, String niveau, List groupe){
+ this.name = name;
+ this.categorie = categorie;
+ this.niveau = niveau;
+ this.groupe = groupe;
+ }
+
+ @Override
+ public String toString() {
+ return "Athlete [id=" + id + " , name=" + name + "]";
+ }
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Coach.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Coach.java
new file mode 100644
index 0000000..7a11fb5
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Coach.java
@@ -0,0 +1,40 @@
+package hackathon.FrisbYEE.jpa.metier;
+
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OneToOne;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import java.util.ArrayList;
+import java.util.List;
+import jakarta.persistence.Access;
+import jakarta.persistence.AccessType;
+import jakarta.persistence.Entity;
+
+@Entity
+@Getter @Setter @NoArgsConstructor
+@Access(AccessType.FIELD)
+
+public class Coach {
+
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private String name;
+
+ @OneToMany(mappedBy = "coach")
+ private List sessions = new ArrayList<>(); // Un coach peut avoir plusieurs sessions
+
+ @OneToOne(mappedBy = "coach")
+ private User user;
+
+ public Coach(String name){
+ this.name = name;
+ }
+ @Override
+ public String toString() {
+ return "Coach [id=" + id + " , name=" + name + "]";
+ }
+}
\ No newline at end of file
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Role.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Role.java
new file mode 100644
index 0000000..dbdc97e
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Role.java
@@ -0,0 +1,7 @@
+package hackathon.FrisbYEE.jpa.metier;
+
+public enum Role {
+ ADMIN,
+ COACH,
+ ATHLETE
+}
\ No newline at end of file
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Session.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Session.java
new file mode 100644
index 0000000..51b75d2
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Session.java
@@ -0,0 +1,59 @@
+package hackathon.FrisbYEE.jpa.metier;
+
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.OneToMany;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import jakarta.persistence.Access;
+import jakarta.persistence.AccessType;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Entity;
+
+@Entity
+@Getter @Setter @NoArgsConstructor
+@Access(AccessType.FIELD)
+
+public class Session {
+
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private String name;
+ private Boolean isRecurrent;
+ private LocalDateTime creneau;
+ private Long duree;
+ private String groupe;
+
+ @ManyToOne
+ private Coach coach; // un coach par session
+
+ @ManyToMany
+ private List athletes = new ArrayList<>(); // plusieurs athlètes par session
+
+ @OneToMany(mappedBy = "session", cascade = CascadeType.PERSIST)
+ private List activites = new ArrayList<>(); // plusieurs activités par session
+
+ public Session(String name) {
+ this.name = name;
+ }
+
+ public Session(String name, Boolean isRecurrent, LocalDateTime creneau, Long duree, String groupe) {
+ this.name = name;
+ this.isRecurrent = isRecurrent;
+ this.creneau = creneau;
+ this.duree = duree;
+ this.groupe = groupe;
+ }
+
+ @Override
+ public String toString() {
+ return "Session [id=" + id + " , name=" + name + "]";
+ }
+}
\ No newline at end of file
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/User.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/User.java
new file mode 100644
index 0000000..00eb7b0
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/User.java
@@ -0,0 +1,61 @@
+package hackathon.FrisbYEE.jpa.metier;
+
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.OneToOne;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import java.io.Serializable;
+import jakarta.persistence.Access;
+import jakarta.persistence.AccessType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.CascadeType;
+
+@Entity
+@Getter @Setter @NoArgsConstructor
+@Access(AccessType.FIELD)
+
+public class User implements Serializable {
+
+ @Id
+ @GeneratedValue
+ private Integer id;
+ @Column(unique = true, nullable = false) //pas possible d'avoir le même nom
+ private String name;
+ @Column (nullable = false)
+ private String motDePasse;
+ private String email;
+
+ @Enumerated(EnumType.STRING)
+ @Column(nullable = false)
+ private Role role;
+
+ @OneToOne(cascade = CascadeType.ALL)
+ private Coach coach;
+
+ @OneToOne(cascade = CascadeType.ALL)
+ private Athlete athlete;
+
+ @OneToOne(cascade = CascadeType.ALL)
+ private Admin admin;
+
+ public User(String name) {
+ this.name = name;
+ }
+
+ public User(String name, String motDePasse, String email, Role role) {
+ this.name = name;
+ this.motDePasse = motDePasse;
+ this.email = email;
+ this.role = role;
+ }
+
+ @Override
+ public String toString() {
+ return "User [id=" + id + " , name=" + name + "]";
+ }
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/ActiviteDAO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/ActiviteDAO.java
new file mode 100644
index 0000000..94d3e0a
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/ActiviteDAO.java
@@ -0,0 +1,10 @@
+package hackathon.FrisbYEE.jpa.service;
+
+import hackathon.FrisbYEE.jpa.metier.Activite;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ActiviteDAO extends JpaRepository {
+
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/AdminDAO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/AdminDAO.java
new file mode 100644
index 0000000..273dccb
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/AdminDAO.java
@@ -0,0 +1,10 @@
+package hackathon.FrisbYEE.jpa.service;
+
+import hackathon.FrisbYEE.jpa.metier.Admin;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface AdminDAO extends JpaRepository {
+
+}
\ No newline at end of file
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/AthleteDAO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/AthleteDAO.java
new file mode 100644
index 0000000..476acc8
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/AthleteDAO.java
@@ -0,0 +1,11 @@
+package hackathon.FrisbYEE.jpa.service;
+
+import hackathon.FrisbYEE.jpa.metier.Athlete;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface AthleteDAO extends JpaRepository {
+
+}
\ No newline at end of file
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/CoachDAO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/CoachDAO.java
new file mode 100644
index 0000000..8c4266b
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/CoachDAO.java
@@ -0,0 +1,10 @@
+package hackathon.FrisbYEE.jpa.service;
+
+import hackathon.FrisbYEE.jpa.metier.Coach;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CoachDAO extends JpaRepository {
+
+}
\ No newline at end of file
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/SessionDAO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/SessionDAO.java
new file mode 100644
index 0000000..9a68a26
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/SessionDAO.java
@@ -0,0 +1,10 @@
+package hackathon.FrisbYEE.jpa.service;
+
+import hackathon.FrisbYEE.jpa.metier.Session;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SessionDAO extends JpaRepository {
+
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/ActiviteResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/ActiviteResource.java
new file mode 100644
index 0000000..271b4d7
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/ActiviteResource.java
@@ -0,0 +1,127 @@
+package hackathon.FrisbYEE.rest;
+
+import hackathon.FrisbYEE.jpa.dto.ActiviteDTO;
+import hackathon.FrisbYEE.jpa.metier.Activite;
+import hackathon.FrisbYEE.jpa.metier.Session;
+import hackathon.FrisbYEE.jpa.service.ActiviteDAO;
+import hackathon.FrisbYEE.jpa.service.SessionDAO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Controller
+@RequestMapping("/activite")
+
+public class ActiviteResource {
+ @Autowired
+ private ActiviteDAO activiteDAO;
+
+ @Autowired
+ private SessionDAO sessionDAO;
+
+ /*
+ * POST /activite/create
+ * DELETE /activite/delete/{id}
+ *
+ */
+
+ @PostMapping("/create")
+ @ResponseBody
+ @PreAuthorize("hasRole('Coach')")
+ public ResponseEntity create(@RequestBody ActiviteDTO dto) {
+
+ try {
+ Session session = sessionDAO.findById(dto.getSessionId()).get();
+ Activite activite = new Activite();
+ activite.setName(dto.getName());
+ activite.setTheme(dto.getTheme());
+ activite.setDuree(dto.getDuree() != null ? dto.getDuree() : 0L);
+ activite.setDataActivite(dto.getDataActivite());
+ activite.setSession(session);
+ activiteDAO.save(activite);
+ } catch (Exception ex) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error: " + ex.getMessage());
+ }
+ return ResponseEntity.status(HttpStatus.CREATED).body("Activity created");
+ }
+
+ @DeleteMapping("/delete/{id}")
+ @ResponseBody
+ @PreAuthorize("hasRole('Coach')")
+ public ResponseEntity delete(@PathVariable("id") int id) {
+ try {
+ Activite activite = activiteDAO.findById(id).get();
+ activiteDAO.delete(activite);
+ } catch (Exception ex) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error: " + ex.getMessage());
+
+ }
+ return ResponseEntity.ok("Activity deleted");
+ }
+
+ @PostMapping("/update/{id}")
+ @ResponseBody
+ @PreAuthorize("hasRole('Coach')")
+ public ResponseEntity modifyById(@PathVariable("id") int id, @RequestBody ActiviteDTO dto) {
+ try {
+ Session session = sessionDAO.findById(dto.getSessionId()).get();
+ Activite activite = activiteDAO.findById(id).get();
+ activite.setName(dto.getName());
+ activite.setTheme(dto.getTheme());
+ activite.setDuree(dto.getDuree() != null ? dto.getDuree() : 0L);
+ activite.setDataActivite(dto.getDataActivite());
+ activite.setSession(session);
+ activiteDAO.save(activite);
+ } catch (Exception ex) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error: " + ex.getMessage());
+ }
+ return ResponseEntity.ok("Activity modified");
+
+ }
+
+ @GetMapping("/read/{id}")
+ @ResponseBody
+ public ResponseEntity getActivityById(@PathVariable("id") int id) {
+ try {
+ Activite activite = activiteDAO.findById(id).get();
+ ActiviteDTO dto = new ActiviteDTO();
+ dto.setName(activite.getName());
+ dto.setId(activite.getId());
+ dto.setTheme(activite.getTheme());
+ dto.setDuree(activite.getDuree());
+ dto.setDataActivite(activite.getDataActivite());
+ dto.setSessionId(activite.getSession() != null ? activite.getSession().getId() : null);
+
+ return ResponseEntity.ok(dto);
+ } catch (Exception ex) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
+ }
+ }
+
+ @GetMapping("/all")
+ @ResponseBody
+ public ResponseEntity> getAllActivity() {
+ try {
+ List activites = activiteDAO.findAll();
+ List dtos = activites.stream().map(activite -> {
+ ActiviteDTO dto = new ActiviteDTO();
+ dto.setName(activite.getName());
+ dto.setId(activite.getId());
+ dto.setTheme(activite.getTheme());
+ dto.setDuree(activite.getDuree());
+ dto.setDataActivite(activite.getDataActivite());
+ dto.setSessionId(activite.getSession() != null ? activite.getSession().getId() : null);
+ return dto;
+ }).collect(Collectors.toList());
+ return ResponseEntity.ok(dtos);
+ } catch (Exception ex) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
+ }
+
+ }
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/ActiviteResources.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/ActiviteResources.java
deleted file mode 100644
index 405ed1c..0000000
--- a/back_end/src/main/java/hackathon/FrisbYEE/rest/ActiviteResources.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package hackathon.FrisbYEE.rest;
-
-public class ActiviteResources {
-
-}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java
new file mode 100644
index 0000000..1237601
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java
@@ -0,0 +1,95 @@
+package hackathon.FrisbYEE.rest;
+
+import org.apache.el.stream.Optional;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import hackathon.FrisbYEE.jpa.dto.AthleteDTO;
+import hackathon.FrisbYEE.jpa.metier.Athlete;
+import hackathon.FrisbYEE.jpa.service.AthleteDAO;
+
+@RestController
+@RequestMapping("/athletes")
+public class AthleteResource {
+ @Autowired
+ private AthleteDAO athleteDAO;
+
+ @PostMapping("/create")
+ @PreAuthorize("hasRole('Admin')") // Only admin can create??
+ public ResponseEntity create(@RequestBody AthleteDTO dto) {
+ Athlete ahtlete = new Athlete();
+ athlete.setName(dto.getName())
+ athlete.setCategorie(dto.getCategorie())
+ athlete.setNiveau(dto.getNiveau())
+ return ResponseEntity.status(HttpStatus.CREATED).body(mapToDTO(athlete));
+ }
+
+ @PostMapping("/all")
+ @PreAuthorize("hasRole('Admin') or hasRole('Coach') or hasRole('Athlete')")
+ public ReponseEntity> all() {
+ List athletes = athleteDAO.findAll();
+ List dtos = new ArrayList<>();
+ for (Athlete athlete : athletes) {
+ dtos.add(maptoDTO(athlete));
+ }
+ return ResponseEntity.ok(dtos);
+ }
+
+ @GetMapping("/{id}")
+ @PreAuthorize("hasRole('Admin') or hasRole('Coach') or hasRole('Athlete')")
+ public ResponseEntity getById(@PathVariable Integer id) {
+ return athleteDAO.findById(id)
+ .map(athlete -> ResponseEntity.ok(mapToDTO(athlete)))
+ .orElse(ResponseEntity.notFound().build());
+ }
+
+ @PutMapping("/{id}")
+ @PreAuthorize("hasRole('ADMIN') or #id == principal.id")
+ public ResponseEntity update(@PathVariable Integer id,@RequestBody AthleteDTO dto) {
+ try {
+ Athlete athlete = athleteDAO.findById(id).get();
+ athlete.setName(dto.getName());
+ athlete.setCategorie(dto.getCategorie());
+ athlete.setNiveau(dto.getNiveau());
+
+ // Optional
+ athlete.setDuree(dto.getDuree());
+ athlete.setTheme(dto.getTheme());
+
+ // List
+ if (dto.getDataActivite() != null) {
+ athlete.setDataActivite(dto.getDataActivite());
+ }
+
+ // Relationship: sessionId → session
+ if (dto.getSessionId() != null) {
+ Session session = sessionDAO.findById(dto.getSessionId())
+ .orElseThrow(() -> new RuntimeException("Session not found"));
+ athlete.setSession(session);
+ }
+
+ athleteDAO.save(athlete);
+ return ResponseEntity.ok(mapToDTO(athlete));
+ }catch (Exception ex){
+ return ResponseEntity.noContent().build();
+ }
+ }
+
+ @DeleteMapping("/{id}")
+ @PreAuthorize("hasRole('Admin')")
+ public ResponseEntity delete(@PathVariable Integer id) {
+ if (!athleteDAO.existsById(id)) {
+ return ResponseEntity.notFound().build();
+ }
+ athleteDAO.deleteById(id);
+ return ResponseEntity.noContent().build();
+ }
+
+ private AthleteDTO mapToDTO(Athlete athlete) {
+ AthleteDTO dto = new AthleteDTO();
+ dto.setId(athlete.getId());
+ dto.setName(athlete.getName());
+ dto.setCategorie(athlete.getCategorie());
+ dto.setNiveau(athlete.getNiveau());
+ return dto;
+ }
+}
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java
new file mode 100644
index 0000000..ddb8c85
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java
@@ -0,0 +1,74 @@
+package hackathon.FrisbYEE.rest;
+
+import hackathon.FrisbYEE.jpa.dto.CoachDTO;
+import hackathon.FrisbYEE.jpa.metier.Coach;
+import hackathon.FrisbYEE.jpa.service.CoachDAO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.server.ResponseStatusException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CoachResource {
+ @Autowired
+ private CoachDAO coachDAO;
+
+ @PostMapping("/create")
+ @PreAuthorize("hasRole('Admin')") // Only admin can create
+ public ResponseEntity create(@RequestBody CoachDTO dto) {
+ Coach coach = new Coach();
+ coach.setName(dto.getName());
+ coachDAO.save(coach);
+ return ResponseEntity.status(HttpStatus.CREATED).body(mapToDTO(coach));
+ }
+
+ @GetMapping("/all")
+ @PreAuthorize("hasRole('Admin') or hasRole('Coach')")
+ public List getAll() {
+ List coaches = coachDAO.findAll();
+ List dtos = new ArrayList<>();
+ for (Coach coach : coaches) {
+ dtos.add(mapToDTO(coach));
+ }
+ return dtos;
+ }
+
+ @GetMapping("/{id}")
+ @PreAuthorize("hasRole('Admin') or hasRole('Coach')")
+ public CoachDTO getById(@PathVariable Integer id) {
+ Coach coach = coachDAO.findById(id)
+ .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Coach not found"));
+ return mapToDTO(coach);
+ }
+
+ @PutMapping("/update/{id}")
+ @PreAuthorize("hasRole('Admin')")
+ public ResponseEntity update(@PathVariable Integer id, @RequestBody CoachDTO dto) {
+ Coach coach = coachDAO.findById(id)
+ .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Coach not found"));
+ if (dto.getName() != null) coach.setName(dto.getName());
+ coachDAO.save(coach);
+ return ResponseEntity.ok(mapToDTO(coach));
+ }
+
+ @DeleteMapping("/delete/{id}")
+ @PreAuthorize("hasRole('Admin')")
+ public ResponseEntity delete(@PathVariable Integer id) {
+ Coach coach = coachDAO.findById(id)
+ .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Coach not found"));
+ coachDAO.delete(coach);
+ return ResponseEntity.noContent().build();
+ }
+
+ private CoachDTO mapToDTO(Coach coach) {
+ CoachDTO dto = new CoachDTO();
+ dto.setId(coach.getId());
+ dto.setName(coach.getName());
+ return dto;
+ }
+}
+
diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java
new file mode 100644
index 0000000..dfdf6db
--- /dev/null
+++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java
@@ -0,0 +1,146 @@
+package hackathon.FrisbYEE.rest;
+
+import hackathon.FrisbYEE.jpa.dto.SessionDTO;
+import hackathon.FrisbYEE.jpa.metier.Activite;
+import hackathon.FrisbYEE.jpa.metier.Athlete;
+import hackathon.FrisbYEE.jpa.metier.Coach;
+import hackathon.FrisbYEE.jpa.metier.Session;
+import hackathon.FrisbYEE.jpa.service.ActiviteDAO;
+import hackathon.FrisbYEE.jpa.service.AthleteDAO;
+import hackathon.FrisbYEE.jpa.service.CoachDAO;
+import hackathon.FrisbYEE.jpa.service.SessionDAO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.server.ResponseStatusException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("/session")
+
+public class SessionResource {
+ @Autowired
+ private SessionDAO sessionDAO;
+
+ @Autowired
+ private CoachDAO coachDAO;
+
+ @Autowired
+ private AthleteDAO athleteDAO;
+
+ @Autowired
+ private ActiviteDAO activiteDAO;
+
+ @PostMapping("/create")
+ @ResponseBody
+ @PreAuthorize("hasRole('Coach')")
+ public ResponseEntity> create(@RequestBody SessionDTO dto) {
+ try {
+ List athletes = athleteDAO.findAllById(dto.getAthleteIds());
+ Coach coach = coachDAO.findById(dto.getCoachId()).get();
+ Session session = new Session();
+ session.setName(dto.getName());
+ session.setIsRecurrent(dto.getIsRecurrent());
+ session.setCreneau(dto.getCreneau());
+ session.setDuree(dto.getDuree());
+ session.setGroupe(dto.getGroupe());
+ session.setCoach(coach);
+ session.setAthletes(athletes);
+ sessionDAO.save(session);
+ return ResponseEntity.status(HttpStatus.CREATED).body(maptoDTO(session));
+ } catch (Exception ex) {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
+ }
+ }
+
+ @GetMapping("/all")
+ @PreAuthorize("hasRole('Coach') or hasRole('Athlete')")
+ public ResponseEntity> getAll() {
+ List sessions = sessionDAO.findAll();
+ List dtos = new ArrayList<>();
+ for (Session session : sessions) {
+ dtos.add(maptoDTO(session));
+ }
+ return ResponseEntity.ok(dtos);
+ }
+
+ @GetMapping("/{id}")
+ @PreAuthorize("hasRole('Coach') or hasRole('Athlete')")
+ public ResponseEntity> getById(@PathVariable Integer id) {
+ try {
+ Session session = sessionDAO.findById(id).orElseThrow();
+ return ResponseEntity.ok(maptoDTO(session));
+ } catch (Exception ex) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
+ }
+ }
+
+ @DeleteMapping("/delete/{id}")
+ @ResponseBody
+ @PreAuthorize("hasRole('Coach')")
+ public ResponseEntity delete(@PathVariable("id") int id) {
+ try {
+ Session session = sessionDAO.findById(id).get();
+ sessionDAO.delete(session);
+ return ResponseEntity.ok("Session deleted successfully");
+ } catch (Exception ex) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
+ }
+ }
+
+ @PutMapping("/update/{id}")
+ @PreAuthorize("hasRole('Coach')")
+ public ResponseEntity updateSession(@PathVariable Integer id, @RequestBody SessionDTO dto) {
+ Session session = sessionDAO.findById(id).orElseThrow(() -> new ResponseStatusException(
+ HttpStatus.NOT_FOUND, "Session not found with id " + id));
+
+ if (dto.getDuree() != null) {
+ session.setDuree(dto.getDuree());
+ }
+ if (dto.getAthleteIds() != null) {
+ List athletes = athleteDAO.findAllById(dto.getAthleteIds());
+ session.setAthletes(athletes);
+ }
+ if (dto.getActiviteIds() != null) {
+ List activites = activiteDAO.findAllById(dto.getActiviteIds());
+ session.setActivites(activites);
+ }
+ sessionDAO.save(session);
+ return ResponseEntity.noContent().build();
+ }
+
+ private SessionDTO maptoDTO(Session s) {
+ SessionDTO dto = new SessionDTO();
+ dto.setId(s.getId());
+ dto.setName(s.getName());
+ dto.setIsRecurrent(s.getIsRecurrent());
+ dto.setCreneau(s.getCreneau());
+ dto.setDuree(s.getDuree());
+ dto.setGroupe(s.getGroupe());
+ // Coach
+ if (s.getCoach() != null) {
+ dto.setCoachId(s.getCoach().getId());
+ }
+ // Athletes
+ if (s.getAthletes() != null) {
+ List athleteIds = new ArrayList<>();
+ for (Athlete athlete : s.getAthletes()) {
+ athleteIds.add(athlete.getId());
+ }
+ dto.setAthleteIds(athleteIds);
+ }
+ // Activites
+ if (s.getActivites() != null) {
+ List activiteIds = new ArrayList<>();
+ for (Activite activite : s.getActivites()) {
+ activiteIds.add(activite.getId());
+ }
+ dto.setActiviteIds(activiteIds);
+ }
+ return dto;
+ }
+}