From 57cd52ca3d45e941e7f0bd61374df17320fb29d2 Mon Sep 17 00:00:00 2001 From: Alexis Leboeuf Date: Wed, 7 Jan 2026 13:52:31 +0100 Subject: [PATCH 1/7] Changed API path for get button --- front_end/src/requetes.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front_end/src/requetes.tsx b/front_end/src/requetes.tsx index 6c00ae1..b6cea91 100644 --- a/front_end/src/requetes.tsx +++ b/front_end/src/requetes.tsx @@ -141,7 +141,7 @@ export async function getSessionsAPI(): Promise { } export async function getUsersAPI(): Promise { try { - const response = await api.get("/users"); + const response = await api.get("/coach/all"); return response.data; } catch (error) { console.error("Error fetching users:", error); From 30b27e742053f2ba090869656f49b95584eeb4d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ama=C3=ABl=20Kesteman?= Date: Wed, 7 Jan 2026 14:23:15 +0100 Subject: [PATCH 2/7] Feat: Ajout de la liste pour les coachs visible que par les admins et la classe de test avec --- front_end/src/classes.tsx | 13 ++++++ front_end/src/components/ressourceList.tsx | 31 ++++++++++----- front_end/src/components/ressourcePanel.tsx | 44 +++++++++++++++++---- front_end/src/components/test_app.tsx | 20 ++++++++++ 4 files changed, 92 insertions(+), 16 deletions(-) create mode 100644 front_end/src/components/test_app.tsx diff --git a/front_end/src/classes.tsx b/front_end/src/classes.tsx index 4021ee2..739e1cf 100644 --- a/front_end/src/classes.tsx +++ b/front_end/src/classes.tsx @@ -1,22 +1,29 @@ export type Groupe = "Entrainement" | "Competition" | "Loisir"| ""; +export type Role = "Admin" | "Athlete" | "Coach"; export class User{ id!: number; nom!: String; sessions: Session[] = []; //nb: Admin liaison non symétrique /!\ + role!: Role; } export class Admin extends User{ + role!: Role; } export class Athlete extends User{ nom!: String; groupe!: Groupe; + role!: Role; + } export class Coach extends User{ + nom!: String; + role!: Role; } @@ -49,6 +56,7 @@ export function getUserTest():User{ const s3 = new Session(); user.id = 0; user.nom = "Emilien-Yee NootNoot"; + user.role = "Coach" s1.creneau = new Date(); s1.id = 1; s1.name = "Entrainement Frisbee" @@ -144,5 +152,10 @@ export function getUserTest():User{ user.sessions.push(s1); user.sessions.push(s2); user.sessions.push(s3); + + athlete1.role = "Athlete"; + athlete2.role = "Athlete"; + athlete3.role = "Athlete"; + return user; } diff --git a/front_end/src/components/ressourceList.tsx b/front_end/src/components/ressourceList.tsx index 66e767f..51ef72b 100644 --- a/front_end/src/components/ressourceList.tsx +++ b/front_end/src/components/ressourceList.tsx @@ -1,12 +1,10 @@ -import { Athlete, Activite } from "../classes"; +import { Athlete, Activite, Coach } from "../classes"; -type Props = { - athletes: Athlete[]; - activites: Activite[]; +type AthleteListProps = { athletes: Athlete[] }; +type ActiviteListProps = { activites: Activite[] }; +type CoachListProps = { coachs: Coach[] }; -}; - -function AthleteList({ athletes }: Props) { +function AthleteList({ athletes }: AthleteListProps) { return (
    {athletes.map((athlete) => ( @@ -19,7 +17,7 @@ function AthleteList({ athletes }: Props) { ); } -function ActiviteList({ activites }: Props) { +function ActiviteList({ activites }: ActiviteListProps) { return (
      {activites.map((activite) => ( @@ -39,4 +37,19 @@ function ActiviteList({ activites }: Props) { ); } -export { AthleteList, ActiviteList }; \ No newline at end of file +function CoachList({ coachs }: CoachListProps) { + return ( +
        + {coachs.map((coachs) => ( +
      • +
        + Nom: {coachs.nom} +
        + +
      • + ))} +
      + ); +} + +export { AthleteList, ActiviteList, CoachList }; \ No newline at end of file diff --git a/front_end/src/components/ressourcePanel.tsx b/front_end/src/components/ressourcePanel.tsx index 6109e9a..1e99690 100644 --- a/front_end/src/components/ressourcePanel.tsx +++ b/front_end/src/components/ressourcePanel.tsx @@ -1,13 +1,15 @@ import { useState } from "react"; import { useLocalData } from "../context/useLocalData"; -import { AthleteList, ActiviteList } from "./ressourceList"; -import { Activite, Athlete } from "../classes"; -// import { Dropdown } from "react-bootstrap"; // not used +import { AthleteList, ActiviteList, CoachList} from "./ressourceList"; +import { Activite, Athlete, Coach } from "../classes"; export default function RessourcePanel() { const { user } = useLocalData(); const [showAthletes, setShowAthletes] = useState(false); const [showActivites, setShowActivites] = useState(false); + const [showCoach,setShowCoach] = useState(false); + console.log("Rôle utilisateur:", user.role); + if (user.role === "Athlete") return null; const athleteMap: Map = new Map(); @@ -22,13 +24,31 @@ export default function RessourcePanel() { }); const allActivites: Activite[] = Array.from(activiteMap.values()); + const coachMap: Map = new Map(); + user.sessions.forEach(session => { + if (session.coach) { + coachMap.set(session.coach.id, session.coach); + } + }); + + const allCoachs: Coach[] = Array.from(coachMap.values()); + function onAthletesClick(): void { setShowAthletes(prev => !prev); setShowActivites(false); + setShowCoach(false); } function onActivitiesClick(): void { setShowActivites(prev => !prev); setShowAthletes(false); + setShowCoach(false); + + } + function onCoachClick(): void { + setShowCoach(prev => !prev); + setShowActivites(false); + setShowAthletes(false); + } @@ -39,28 +59,38 @@ export default function RessourcePanel() { const v = (e.target as HTMLSelectElement).value; if (v === "athletes") onAthletesClick(); else if (v === "activites") onActivitiesClick(); - else {setShowAthletes(false); setShowActivites(false); - } + else if (v === "coach") onCoachClick(); + else {setShowAthletes(false); setShowActivites(false); setShowCoach(false)} }}> + {user.role === "Admin" && } {showAthletes && (

      Liste des athlètes

      - +
      )} {showActivites && (

      Liste des activités

      - +
      )} + {showCoach && ( +
      +

      Liste des coachs

      + +
      + )} + + + ); } diff --git a/front_end/src/components/test_app.tsx b/front_end/src/components/test_app.tsx new file mode 100644 index 0000000..1e13241 --- /dev/null +++ b/front_end/src/components/test_app.tsx @@ -0,0 +1,20 @@ +import React, { useState } from "react"; +import { getUserTest, User, Session } from "../classes"; +import RessourcePanel from "./ressourcePanel"; +import { LocalDataContext } from "../context/LocalDataContext"; + +export default function TestApp() { + const initialUser = getUserTest(); + initialUser.role = "Athlete"; // Change role here for testing + const [user, setUser] = useState(initialUser); + const [sessions, setSessions] = useState(initialUser.sessions || []); + const [users, setUsers] = useState([initialUser]); + + return ( + +

      Test Utilisateur

      +
      Nom: {String(user.nom)}
      + +
      + ); +} From 1a0fc331679eb5a53e2d4ae38c54e91168277688 Mon Sep 17 00:00:00 2001 From: Alexis Leboeuf Date: Wed, 7 Jan 2026 16:06:25 +0100 Subject: [PATCH 3/7] Re-wrote part of object classes --- .../hackathon/FrisbYEE/jpa/metier/Admin.java | 14 +++-------- .../FrisbYEE/jpa/metier/Athlete.java | 15 +++-------- .../hackathon/FrisbYEE/jpa/metier/Coach.java | 14 +++-------- .../FrisbYEE/jpa/metier/Session.java | 2 +- .../hackathon/FrisbYEE/jpa/metier/User.java | 5 +++- .../FrisbYEE/jpa/metier/UserRole.java | 25 +++++++++++++++++++ .../FrisbYEE/jpa/metier/UserRoleId.java | 14 +++++++++++ .../jpa/metier/UtilisateurRoleDetails.java | 23 +++++++++++++++++ 8 files changed, 77 insertions(+), 35 deletions(-) create mode 100644 back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UserRole.java create mode 100644 back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UserRoleId.java create mode 100644 back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UtilisateurRoleDetails.java 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 index 69bcd52..78a98b1 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Admin.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Admin.java @@ -14,21 +14,13 @@ import jakarta.persistence.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 class Admin extends User{ public Admin(String name){ - this.name = name; + super(name); } @Override public String toString() { - return "Admin [id=" + id + " , name=" + name + "]"; + return "Admin [id=" + super.getId() + " , name=" + super.getName() + "]"; } } \ 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 index fb7d318..eed34bd 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Athlete.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Athlete.java @@ -17,12 +17,8 @@ import jakarta.persistence.Entity; @Data @NoArgsConstructor @Access(AccessType.FIELD) -public class Athlete { +public class Athlete extends User{ - @Id - @GeneratedValue - private Integer id; - private String name; private String categorie; private String niveau; @ElementCollection @@ -32,15 +28,12 @@ public class Athlete { @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; + super(name); } public Athlete(String name, String categorie, String niveau, List groupe){ - this.name = name; + super(name); this.categorie = categorie; this.niveau = niveau; this.groupe = groupe; @@ -48,6 +41,6 @@ public class Athlete { @Override public String toString() { - return "Athlete [id=" + id + " , name=" + name + "]"; + return "Athlete [id=" + super.getId() + " , name=" + super.getName() + "]"; } } 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 index 7a11fb5..49228f3 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Coach.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Coach.java @@ -17,24 +17,16 @@ import jakarta.persistence.Entity; @Getter @Setter @NoArgsConstructor @Access(AccessType.FIELD) -public class Coach { - - @Id - @GeneratedValue - private Integer id; - private String name; +public class Coach extends User{ @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; + super(name); } @Override public String toString() { - return "Coach [id=" + id + " , name=" + name + "]"; + return "Coach [id=" + super.getId() + " , name=" + super.getName() + "]"; } } \ 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 index 51b75d2..ba2a14d 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Session.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Session.java @@ -32,7 +32,7 @@ public class Session { private String groupe; @ManyToOne - private Coach coach; // un coach par session + private User coach; // un coach par session @ManyToMany private List athletes = new ArrayList<>(); // plusieurs athlètes par session 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 index 4739278..36614d5 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/User.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/User.java @@ -26,8 +26,11 @@ public class User implements Serializable { @Id @GeneratedValue + @Column(unique = true, nullable = false) private Integer id; - @Column(unique = true, nullable = false) // pas possible d'avoir le même nom + @Column(nullable = false, unique = true) + private String id_keycloak; + private String name; @Column(nullable = false) private String motDePasse; diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UserRole.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UserRole.java new file mode 100644 index 0000000..92ebe82 --- /dev/null +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UserRole.java @@ -0,0 +1,25 @@ +package hackathon.FrisbYEE.jpa.metier; + +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.MapsId; +import jakarta.persistence.Table; + +@Entity +@Table(name = "utilisateur_role") +public class UserRole { + + @EmbeddedId + private UserRoleId id; + + @ManyToOne + @MapsId("utilisateurId") + private User utilisateur; + + @ManyToOne + @MapsId("roleId") + private Role role; + + // getters/setters +} diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UserRoleId.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UserRoleId.java new file mode 100644 index 0000000..56530cf --- /dev/null +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UserRoleId.java @@ -0,0 +1,14 @@ +package hackathon.FrisbYEE.jpa.metier; + +import java.io.Serializable; + +import jakarta.persistence.Embeddable; + +@Embeddable +public class UserRoleId implements Serializable { + + private Long utilisateurId; + private Long roleId; + + // equals() & hashCode() OBLIGATOIRES +} diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UtilisateurRoleDetails.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UtilisateurRoleDetails.java new file mode 100644 index 0000000..743535d --- /dev/null +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/UtilisateurRoleDetails.java @@ -0,0 +1,23 @@ +package hackathon.FrisbYEE.jpa.metier; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.MapsId; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; + +@Entity +@Inheritance(strategy = jakarta.persistence.InheritanceType.JOINED) +@Table(name = "utilisateur_role_details") +public abstract class UtilisateurRoleDetails { + + @Id + private Long utilisateurId; + + @OneToOne + @MapsId + @JoinColumn(name = "utilisateur_id") + private User utilisateur; +} From 9878357c71288b139daf6bf40d6f69e46e3e0609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ama=C3=ABl=20Kesteman?= Date: Wed, 7 Jan 2026 16:19:31 +0100 Subject: [PATCH 4/7] Feat: Ajout liste des sessions pour admin et coach --- front_end/src/components/edt_session.tsx | 2 +- front_end/src/components/ressourceList.tsx | 29 +++++++++++- front_end/src/components/ressourcePanel.tsx | 49 ++++++++++++++++----- 3 files changed, 67 insertions(+), 13 deletions(-) diff --git a/front_end/src/components/edt_session.tsx b/front_end/src/components/edt_session.tsx index 48e34db..7459e85 100644 --- a/front_end/src/components/edt_session.tsx +++ b/front_end/src/components/edt_session.tsx @@ -51,7 +51,7 @@ function EdtSession({session}:Props){
      handleOpen()}>
      {hoursToString(sDate)}
      - {!session.isRecurrent &&
      recurrent
      } + {session.isRecurrent &&
      recurrent
      }
      {session.name}
      diff --git a/front_end/src/components/ressourceList.tsx b/front_end/src/components/ressourceList.tsx index 51ef72b..c597865 100644 --- a/front_end/src/components/ressourceList.tsx +++ b/front_end/src/components/ressourceList.tsx @@ -1,8 +1,9 @@ -import { Athlete, Activite, Coach } from "../classes"; +import { Athlete, Activite, Coach, Session } from "../classes"; type AthleteListProps = { athletes: Athlete[] }; type ActiviteListProps = { activites: Activite[] }; type CoachListProps = { coachs: Coach[] }; +type SessionListProps = { sessions: Session[]}; function AthleteList({ athletes }: AthleteListProps) { return ( @@ -52,4 +53,28 @@ function CoachList({ coachs }: CoachListProps) { ); } -export { AthleteList, ActiviteList, CoachList }; \ No newline at end of file +function SessionList({ sessions }: SessionListProps) { + return ( +
        + {sessions.map((sessions) => ( +
      • +
        + Nom: {sessions.name} +
        +
        + Groupe: {sessions.groupe} +
        +
        + Recurrent: {sessions.isRecurrent ? "Oui" : "Non"} +
        +
        + Coach: {sessions.coach ? sessions.coach.nom : "Pas de coach sur la séance"} +
        + +
      • + ))} +
      + ); +} + +export { AthleteList, ActiviteList, CoachList , SessionList }; \ No newline at end of file diff --git a/front_end/src/components/ressourcePanel.tsx b/front_end/src/components/ressourcePanel.tsx index 1e99690..b46469e 100644 --- a/front_end/src/components/ressourcePanel.tsx +++ b/front_end/src/components/ressourcePanel.tsx @@ -1,13 +1,14 @@ import { useState } from "react"; import { useLocalData } from "../context/useLocalData"; -import { AthleteList, ActiviteList, CoachList} from "./ressourceList"; -import { Activite, Athlete, Coach } from "../classes"; +import { AthleteList, ActiviteList, CoachList, SessionList} from "./ressourceList"; +import { Activite, Athlete, Coach , Session } from "../classes"; export default function RessourcePanel() { const { user } = useLocalData(); const [showAthletes, setShowAthletes] = useState(false); const [showActivites, setShowActivites] = useState(false); - const [showCoach,setShowCoach] = useState(false); + const [showCoachs,setShowCoachs] = useState(false); + const [showSessions, setShowSessions] = useState(false); console.log("Rôle utilisateur:", user.role); if (user.role === "Athlete") return null; @@ -33,21 +34,41 @@ export default function RessourcePanel() { const allCoachs: Coach[] = Array.from(coachMap.values()); + const sessionMap: Map = new Map(); + user.sessions.forEach(session => { + sessionMap.set(session.id, session); + }); + + const allSessions: Session[] = Array.from(sessionMap.values()); + function onAthletesClick(): void { setShowAthletes(prev => !prev); setShowActivites(false); - setShowCoach(false); + setShowCoachs(false); + setShowSessions(false); + } function onActivitiesClick(): void { setShowActivites(prev => !prev); setShowAthletes(false); - setShowCoach(false); + setShowCoachs(false); + setShowSessions(false); + } function onCoachClick(): void { - setShowCoach(prev => !prev); + setShowCoachs(prev => !prev); setShowActivites(false); setShowAthletes(false); + setShowSessions(false); + + } + + function onSessionClick(): void { + setShowSessions(prev => !prev); + setShowActivites(false); + setShowAthletes(false); + setShowCoachs(false); } @@ -60,12 +81,13 @@ export default function RessourcePanel() { if (v === "athletes") onAthletesClick(); else if (v === "activites") onActivitiesClick(); else if (v === "coach") onCoachClick(); - else {setShowAthletes(false); setShowActivites(false); setShowCoach(false)} + else if (v === "session") onSessionClick(); + else {setShowAthletes(false); setShowActivites(false); setShowCoachs(false); setShowSessions(false)} }}> - {user.role === "Admin" && } + {showAthletes && ( @@ -82,13 +104,20 @@ export default function RessourcePanel() { )} - {showCoach && ( -
      + {showCoachs && ( +

      Liste des coachs

      )} + {showSessions && ( +
      +

      Liste des sessions

      + +
      + )} +
      From c8d1407bccd197277504e330058b34ce86e8f156 Mon Sep 17 00:00:00 2001 From: Alexis Leboeuf Date: Wed, 7 Jan 2026 17:09:37 +0100 Subject: [PATCH 5/7] Continuing refactoring --- .../FrisbYEE/jpa/metier/Session.java | 19 ++++++++++++++++- .../FrisbYEE/jpa/service/UserDAO.java | 10 +++++++++ .../FrisbYEE/rest/AthleteResource.java | 2 +- .../FrisbYEE/rest/SessionResource.java | 21 ++++++++----------- 4 files changed, 38 insertions(+), 14 deletions(-) create mode 100644 back_end/src/main/java/hackathon/FrisbYEE/jpa/service/UserDAO.java 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 index ba2a14d..7711c2a 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Session.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Session.java @@ -32,7 +32,7 @@ public class Session { private String groupe; @ManyToOne - private User coach; // un coach par session + private Coach coach; // un coach par session @ManyToMany private List athletes = new ArrayList<>(); // plusieurs athlètes par session @@ -56,4 +56,21 @@ public class Session { public String toString() { return "Session [id=" + id + " , name=" + name + "]"; } + + public void setCoach(Coach coach) { + if (coach.getRole() != Role.COACH) { + throw new IllegalArgumentException("L'utilisateur n'est pas un coach"); + } + this.coach = coach; + } + + public void setAthletes(List athletes) { + for (Athlete athlete : athletes) { + if (athlete.getRole() != Role.ATHLETE) { + throw new IllegalArgumentException("L'utilisateur n'est pas un athlète"); + } + } + this.athletes = athletes; + } + } \ No newline at end of file diff --git a/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/UserDAO.java b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/UserDAO.java new file mode 100644 index 0000000..5481dbe --- /dev/null +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/service/UserDAO.java @@ -0,0 +1,10 @@ +package hackathon.FrisbYEE.jpa.service; + +import hackathon.FrisbYEE.jpa.metier.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserDAO extends JpaRepository { + +} diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java index f539950..d3681a1 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java @@ -47,7 +47,7 @@ public class AthleteResource { @PostMapping("/create") @PreAuthorize("hasRole('Admin')") // Only admin can create?? public ResponseEntity create(@RequestBody AthleteDTO dto) { - Athlete athlete = mapToEntity(dto); + User athlete = mapToEntity(dto); athleteDAO.save(athlete); return ResponseEntity.status(HttpStatus.CREATED).body(mapToDTO(athlete)); } diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java index 5ea60dd..9d8a86c 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java @@ -3,12 +3,12 @@ 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.metier.User; 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 hackathon.FrisbYEE.jpa.service.UserDAO; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -29,10 +29,7 @@ public class SessionResource { private SessionDAO sessionDAO; @Autowired - private CoachDAO coachDAO; - - @Autowired - private AthleteDAO athleteDAO; + private UserDAO userDAO; @Autowired private ActiviteDAO activiteDAO; @@ -43,7 +40,7 @@ public class SessionResource { public ResponseEntity create(@RequestBody SessionDTO dto) { try { Session session = maptoEntity(dto); - session.setCoach(coachDAO.findById(dto.getCoachId()).orElse(null)); + session.setCoach(userDAO.findById(dto.getCoachId()).orElse(null)); sessionDAO.save(session); return ResponseEntity.status(HttpStatus.CREATED).body(maptoDTO(session)); } catch (Exception ex) { @@ -96,7 +93,7 @@ public class SessionResource { session.setDuree(dto.getDuree()); } if (dto.getAthleteIds() != null) { - List athletes = athleteDAO.findAllById(dto.getAthleteIds()); + List athletes = userDAO.findAllById(dto.getAthleteIds()); session.setAthletes(athletes); } if (dto.getActiviteIds() != null) { @@ -122,7 +119,7 @@ public class SessionResource { // Athletes if (s.getAthletes() != null) { List athleteIds = new ArrayList<>(); - for (Athlete athlete : s.getAthletes()) { + for (User athlete : s.getAthletes()) { athleteIds.add(athlete.getId()); } dto.setAthleteIds(athleteIds); @@ -148,13 +145,13 @@ public class SessionResource { session.setGroupe(dto.getGroupe()); // Coach if (dto.getCoachId() != null) { - Coach coach = new Coach(); + User coach = new User(); coach.setId(dto.getCoachId()); session.setCoach(coach); } // Athletes if (dto.getAthleteIds() != null) { - List athletes = athleteDAO.findAllById(dto.getAthleteIds()); + List athletes = userDAO.findAllById(dto.getAthleteIds()); session.setAthletes(athletes); } // Activites From 203d0fe157cae2aa637e64b9f045a69718d8f583 Mon Sep 17 00:00:00 2001 From: Alexis Leboeuf Date: Wed, 7 Jan 2026 17:40:41 +0100 Subject: [PATCH 6/7] Finished refactoring classes, DTOs, endpoints I guess ? --- .../hackathon/FrisbYEE/jpa/dto/AdminDTO.java | 4 ++- .../FrisbYEE/jpa/dto/AthleteDTO.java | 4 +-- .../hackathon/FrisbYEE/jpa/dto/CoachDTO.java | 7 ++++-- .../FrisbYEE/jpa/dto/SessionDTO.java | 1 - .../hackathon/FrisbYEE/jpa/dto/UserDTO.java | 3 ++- .../hackathon/FrisbYEE/jpa/metier/Admin.java | 5 ++-- .../FrisbYEE/jpa/metier/Athlete.java | 11 ++------ .../hackathon/FrisbYEE/jpa/metier/Coach.java | 5 ++-- .../hackathon/FrisbYEE/jpa/metier/User.java | 25 ++++--------------- .../FrisbYEE/rest/AthleteResource.java | 12 ++------- .../FrisbYEE/rest/CoachResource.java | 5 ++-- .../FrisbYEE/rest/SessionResource.java | 22 ++++++++-------- 12 files changed, 41 insertions(+), 63 deletions(-) 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 index 3656be2..f07fe8c 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/AdminDTO.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/AdminDTO.java @@ -3,6 +3,8 @@ import lombok.Data; @Data public class AdminDTO { + private String id_keycloak; private Integer id; - private String name; + private String name; + private String prenom; } 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 index d950475..572e2df 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/AthleteDTO.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/AthleteDTO.java @@ -7,12 +7,12 @@ import java.util.List; @Data public class AthleteDTO { - private Integer id; + private String id_keycloak; private String name; + private String prenom; 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 index 32fb5f2..7c33230 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/CoachDTO.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/CoachDTO.java @@ -1,10 +1,13 @@ package hackathon.FrisbYEE.jpa.dto; +import java.util.List; + import lombok.Data; @Data public class CoachDTO { - private Integer id; + private String id_keycloak; private String name; - + private String prenom; + private List sessionIds; } 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 index 73f2b3c..2e44668 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/SessionDTO.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/SessionDTO.java @@ -8,7 +8,6 @@ import java.util.List; @Data public class SessionDTO { - private Integer id; private String name; private Boolean isRecurrent; private LocalDateTime creneau; 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 index 239977f..d7a9278 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/UserDTO.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/dto/UserDTO.java @@ -5,8 +5,9 @@ import lombok.Data; @Data public class UserDTO { - private Integer id; + private String id_keycloak; private String name; + private String prenom; private String email; private Role role; } 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 index 78a98b1..6870a17 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Admin.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Admin.java @@ -16,9 +16,10 @@ import jakarta.persistence.Entity; public class Admin extends User{ - public Admin(String name){ - super(name); + public Admin(String id_keycloak, String name, String prenom){ + super(name, id_keycloak, prenom, Role.ADMIN ); } + @Override public String toString() { return "Admin [id=" + super.getId() + " , name=" + super.getName() + "]"; 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 index eed34bd..475dcdf 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Athlete.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Athlete.java @@ -28,15 +28,8 @@ public class Athlete extends User{ @ManyToMany(mappedBy = "athletes") private List sessions = new ArrayList<>(); // plusieurs sessions sont possibles - public Athlete(String name){ - super(name); - } - - public Athlete(String name, String categorie, String niveau, List groupe){ - super(name); - this.categorie = categorie; - this.niveau = niveau; - this.groupe = groupe; + public Athlete(String name, String id_keycloak, String prenom){ + super(name, id_keycloak, prenom, Role.ATHLETE); } @Override 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 index 49228f3..b209d7f 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Coach.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/Coach.java @@ -22,9 +22,10 @@ public class Coach extends User{ @OneToMany(mappedBy = "coach") private List sessions = new ArrayList<>(); // Un coach peut avoir plusieurs sessions - public Coach(String name){ - super(name); + public Coach(String name, String id_keycloak, String prenom){ + super(name, id_keycloak, prenom, Role.COACH ); } + @Override public String toString() { return "Coach [id=" + super.getId() + " , name=" + super.getName() + "]"; 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 index 36614d5..c31aeb1 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/User.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/jpa/metier/User.java @@ -30,33 +30,18 @@ public class User implements Serializable { private Integer id; @Column(nullable = false, unique = true) private String id_keycloak; - + private String name; - @Column(nullable = false) - private String motDePasse; - private String email; + private String prenom; @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) { + public User(String name, String id_keycloak, String prenom, Role role) { this.name = name; - } - - public User(String name, String motDePasse, String email, Role role) { - this.name = name; - this.motDePasse = motDePasse; - this.email = email; + this.id_keycloak = id_keycloak; + this.prenom = prenom; this.role = role; } diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java index d3681a1..b4372ee 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java @@ -47,7 +47,7 @@ public class AthleteResource { @PostMapping("/create") @PreAuthorize("hasRole('Admin')") // Only admin can create?? public ResponseEntity create(@RequestBody AthleteDTO dto) { - User athlete = mapToEntity(dto); + Athlete athlete = mapToEntity(dto); athleteDAO.save(athlete); return ResponseEntity.status(HttpStatus.CREATED).body(mapToDTO(athlete)); } @@ -126,7 +126,7 @@ public class AthleteResource { private AthleteDTO mapToDTO(Athlete athlete) { AthleteDTO dto = new AthleteDTO(); - dto.setId(athlete.getId()); + dto.setId_keycloak(athlete.getId_keycloak()); dto.setName(athlete.getName()); dto.setCategorie(athlete.getCategorie()); dto.setNiveau(athlete.getNiveau()); @@ -135,10 +135,6 @@ public class AthleteResource { private Athlete mapToEntity(AthleteDTO dto) { Athlete athlete = new Athlete(); - athlete.setId(dto.getId()); - athlete.setName(dto.getName()); - athlete.setCategorie(dto.getCategorie()); - athlete.setNiveau(dto.getNiveau()); return athlete; } @@ -156,7 +152,6 @@ public class AthleteResource { for (Session s : sessions) { if (s.getAthletes().contains(j.get())) { SessionDTO dto = new SessionDTO(); - dto.setId(s.getId()); dto.setName(s.getName()); // Map other fields as necessary athleteSessions.add(dto); @@ -177,7 +172,6 @@ public class AthleteResource { List sessionDTOs = new ArrayList<>(); for (Session session : sessions) { SessionDTO dto = new SessionDTO(); - dto.setId(session.getId()); dto.setName(session.getName()); // Map other fields as necessary sessionDTOs.add(dto); @@ -229,7 +223,6 @@ public class AthleteResource { // sympa les // dates SessionDTO dto = new SessionDTO(); - dto.setId(session.getId()); dto.setName(session.getName()); // Map other fields as necessary filteredSessions.add(dto); @@ -259,7 +252,6 @@ public class AthleteResource { && session.getCreneau().isAfter(ChronoLocalDateTime.from(LocalDate.parse(startDate))) && session.getCreneau().isBefore(ChronoLocalDateTime.from(LocalDate.parse(endDate)))) { SessionDTO dto = new SessionDTO(); - dto.setId(session.getId()); dto.setName(session.getName()); // Map other fields as necessary filteredSessions.add(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 index 7d7d1fa..706a777 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java @@ -7,7 +7,6 @@ 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 org.springframework.web.server.ResponseStatusException; @@ -71,14 +70,14 @@ public class CoachResource { private CoachDTO mapToDTO(Coach coach) { CoachDTO dto = new CoachDTO(); - dto.setId(coach.getId()); + dto.setId_keycloak(coach.getId_keycloak()); dto.setName(coach.getName()); return dto; } private Coach mapToEntity(CoachDTO dto) { Coach coach = new Coach(); - coach.setId(dto.getId()); + coach.setId_keycloak(dto.getId_keycloak()); coach.setName(dto.getName()); return coach; } diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java index 9d8a86c..b620d73 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java @@ -3,11 +3,12 @@ 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.metier.User; 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 hackathon.FrisbYEE.jpa.service.UserDAO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -29,7 +30,10 @@ public class SessionResource { private SessionDAO sessionDAO; @Autowired - private UserDAO userDAO; + private CoachDAO coachDAO; + + @Autowired + private AthleteDAO athleteDAO; @Autowired private ActiviteDAO activiteDAO; @@ -40,7 +44,7 @@ public class SessionResource { public ResponseEntity create(@RequestBody SessionDTO dto) { try { Session session = maptoEntity(dto); - session.setCoach(userDAO.findById(dto.getCoachId()).orElse(null)); + session.setCoach(coachDAO.findById(dto.getCoachId()).orElse(null)); sessionDAO.save(session); return ResponseEntity.status(HttpStatus.CREATED).body(maptoDTO(session)); } catch (Exception ex) { @@ -93,7 +97,7 @@ public class SessionResource { session.setDuree(dto.getDuree()); } if (dto.getAthleteIds() != null) { - List athletes = userDAO.findAllById(dto.getAthleteIds()); + List athletes = athleteDAO.findAllById(dto.getAthleteIds()); session.setAthletes(athletes); } if (dto.getActiviteIds() != null) { @@ -106,7 +110,6 @@ public class SessionResource { 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()); @@ -119,7 +122,7 @@ public class SessionResource { // Athletes if (s.getAthletes() != null) { List athleteIds = new ArrayList<>(); - for (User athlete : s.getAthletes()) { + for (Athlete athlete : s.getAthletes()) { athleteIds.add(athlete.getId()); } dto.setAthleteIds(athleteIds); @@ -137,7 +140,6 @@ public class SessionResource { private Session maptoEntity(SessionDTO dto) { Session session = new Session(); - session.setId(dto.getId()); session.setName(dto.getName()); session.setIsRecurrent(dto.getIsRecurrent()); session.setCreneau(dto.getCreneau()); @@ -145,13 +147,13 @@ public class SessionResource { session.setGroupe(dto.getGroupe()); // Coach if (dto.getCoachId() != null) { - User coach = new User(); + Coach coach = new Coach(); coach.setId(dto.getCoachId()); session.setCoach(coach); } // Athletes if (dto.getAthleteIds() != null) { - List athletes = userDAO.findAllById(dto.getAthleteIds()); + List athletes = athleteDAO.findAllById(dto.getAthleteIds()); session.setAthletes(athletes); } // Activites From c760510ffb81c46af431ef821ba5b8d92efb40dd Mon Sep 17 00:00:00 2001 From: Alexis Leboeuf Date: Wed, 7 Jan 2026 17:44:22 +0100 Subject: [PATCH 7/7] Activity creation connection between front and API --- front_end/src/components/createSession.tsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/front_end/src/components/createSession.tsx b/front_end/src/components/createSession.tsx index 051f46a..d7a10b9 100644 --- a/front_end/src/components/createSession.tsx +++ b/front_end/src/components/createSession.tsx @@ -15,7 +15,7 @@ export const CreateSession = () => { const [activiteDuree, setActiviteDuree] = useState(0); const [isRecurent, setIsRecurent] = useState(false); - function addAcitivte(){ + async function addAcitivte(){ if (!activiteNom) return; const newActivite = new Activite(); @@ -23,11 +23,18 @@ export const CreateSession = () => { newActivite.theme=activiteTheme; newActivite.duree= activiteDuree; newActivite.data= new Map(); - setActivities([...activities, newActivite]); + try{ + await sessionService.create(newActivite); + console.log("Session créée"); - setActiviteNom(""); - setActiviteTheme(""); - setActiviteDuree(0); + setActivities([...activities, newActivite]); + + setActiviteNom(""); + setActiviteTheme(""); + setActiviteDuree(0); + } catch (error) { + console.error("Erreur lors de la création de la session", error); + } } async function handleCreateSession() {