diff --git a/README.md b/README.md index 8a577c8..4a6762c 100644 --- a/README.md +++ b/README.md @@ -27,4 +27,11 @@ npm install npm start #### Docker -sudo docker stop $(sudo docker ps -a -q) \ No newline at end of file +sudo docker stop $(sudo docker ps -a -q) + +#### Pour acceder sur docker +sudo docker exec -it frisbyee-postgres psql -U frisbyee_user -d frisbyee + +#### Voir les données: +\dt +SELECT * FROM session; 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 bac7b21..77d41e3 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java @@ -14,7 +14,7 @@ import org.springframework.web.server.ResponseStatusException; import java.util.ArrayList; import java.util.List; -@Controller +@RestController @RequestMapping("/coach") public class CoachResource { @Autowired @@ -29,8 +29,8 @@ public class CoachResource { } @GetMapping("/all") - @PreAuthorize("hasRole('Admin') or hasRole('Coach')") public List getAll() { + System.out.println("GET /coach/all called"); List coaches = coachDAO.findAll(); List dtos = new ArrayList<>(); for (Coach coach : coaches) { diff --git a/back_end/src/main/resources/application.properties b/back_end/src/main/resources/application.properties index f81f9e4..a0fc7cf 100644 --- a/back_end/src/main/resources/application.properties +++ b/back_end/src/main/resources/application.properties @@ -7,5 +7,7 @@ spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect server.port=8081 +server.servlet.context-path=/api + spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8080/realms/Frisbyee_realm spring.security.oauth2.resourceserver.jwt.jwk-set-uri: http://localhost:8080/realms/Frisbyee_realm/protocol/openid-connect/certs \ No newline at end of file diff --git a/front_end/src/App.tsx b/front_end/src/App.tsx index c0d42c8..a4b5b7f 100644 --- a/front_end/src/App.tsx +++ b/front_end/src/App.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import React from 'react'; import './App.css'; import { ReactKeycloakProvider } from '@react-keycloak/web' import keycloak from './keycloak' @@ -7,8 +7,15 @@ import { LocalDataProvider } from './provider/LocalDataProvider'; import EDT from './components/edt'; import SwitchThemeColor from './components/SwitchThemeColor'; import CreateSession from './components/createSession' +import EdtCoach from './components/edt_coach' +import { Coach } from "./classes"; import RessourcePanel from './components/ressourcePanel'; +import TestAPI from './components/test_api'; +// Test +const testCoach = new Coach(); +testCoach.id = 1; +testCoach.nom = "Coach Test"; const keycloakInitOptions = { onLoad: 'login-required', @@ -29,6 +36,8 @@ function App() { + + diff --git a/front_end/src/classes.tsx b/front_end/src/classes.tsx index c3b8364..180072e 100644 --- a/front_end/src/classes.tsx +++ b/front_end/src/classes.tsx @@ -135,8 +135,8 @@ export function getUserTest():User{ s1.activites.push(act2); s2.activites.push(act3); s2.activites.push(act4); - s3.activites.push(act5); - s3.activites.push(act6); + s2.activites.push(act5); + s2.activites.push(act6); user.sessions.push(s1); user.sessions.push(s2); diff --git a/front_end/src/components/edt_coach.tsx b/front_end/src/components/edt_coach.tsx new file mode 100644 index 0000000..0c8b6bd --- /dev/null +++ b/front_end/src/components/edt_coach.tsx @@ -0,0 +1,50 @@ +import { useState } from "react"; +import { coachService } from "../api"; + +export default function EdtCoach() { + const [name, setName] = useState(""); + const [error, setError] = useState(""); + const [statusCode, setStatusCode] = useState(null); + + const handleCreate = async () => { + try { + const response = await coachService.create({ name }); + console.log("Success:", response.status, response.data); + alert(`Coach created! Status: ${response.status}`); + setError(""); + setStatusCode(response.status); + } catch (err: any) { + if (err.response) { + // This is the HTTP response from the server + console.error("HTTP status:", err.response.status); + console.error("Response data:", err.response.data); + setError(`Failed to create coach: ${err.response.data}`); + setStatusCode(err.response.status); + } else if (err.request) { + console.error("No response received", err.request); + setError("No response from server!"); + setStatusCode(null); + } else { + console.error("Error", err.message); + setError(err.message); + setStatusCode(null); + } + } + }; + + return ( +
+

Create Coach

+ setName(e.target.value)} + placeholder="Coach name" + /> + + + {error &&

{error}

} + {statusCode &&

HTTP Status: {statusCode}

} +
+ ); +} diff --git a/front_end/src/components/edt_session.tsx b/front_end/src/components/edt_session.tsx index 4b23c40..48e34db 100644 --- a/front_end/src/components/edt_session.tsx +++ b/front_end/src/components/edt_session.tsx @@ -20,6 +20,16 @@ function EdtSession({session}:Props){ setOpen(!open); } + function handleDeleteActivite(): void { + session.activites.pop(); //TODO + } + + function handleAddActivite(): void { + const newActivite = new Activite(); + //TODO + session.activites.push(newActivite); + } + async function updateActivites(){ //TODO await delay(2000); @@ -46,19 +56,27 @@ function EdtSession({session}:Props){
{session.name}
{open && - setOpen(false)}> -
-
{session.name}
-
{hoursToString(sDate)}
-
{dateToString(sDate)}
+ setOpen(false)}> +
+
{session.name}
+
{hoursToString(sDate)}
+
{dateToString(sDate)}
+
+ Activités : +
{session.activites.map((activite,index)=>( -
activite
+
+ {activite.nom} + +
))} + {loading &&
}
- - - } +
+
+
+ }
) } diff --git a/front_end/src/components/ressourceList.tsx b/front_end/src/components/ressourceList.tsx index b398a54..66e767f 100644 --- a/front_end/src/components/ressourceList.tsx +++ b/front_end/src/components/ressourceList.tsx @@ -1,4 +1,3 @@ -import ListGroup from "react-bootstrap/ListGroup"; import { Athlete, Activite } from "../classes"; type Props = { @@ -9,26 +8,22 @@ type Props = { function AthleteList({ athletes }: Props) { return ( - +
    {athletes.map((athlete) => ( - -
    - Nom: {athlete.nom} -
    -
    - Groupe: {athlete.groupe} -
    -
    +
  • +
    Nom: {athlete.nom}
    +
    Groupe: {athlete.groupe}
    +
  • ))} - +
); } function ActiviteList({ activites }: Props) { return ( - +
    {activites.map((activite) => ( - +
  • Nom: {activite.nom}
    @@ -38,9 +33,9 @@ function ActiviteList({ activites }: Props) {
    Durée: {activite.duree} minutes
    - +
  • ))} - +
); } diff --git a/front_end/src/components/style/edt.css b/front_end/src/components/style/edt.css index d715519..0f6b70d 100644 --- a/front_end/src/components/style/edt.css +++ b/front_end/src/components/style/edt.css @@ -98,8 +98,24 @@ .edt_session_modal{ background-color: var(--tint2); - padding: 20px; + padding: 10px; border-radius: 20px; position: relative; } +.ent_activite_list{ + padding: 10px; + background-color: var(--tint3); + border-radius: 10px; +} + +.deleteButton{ + background-color: #FF0000; + border-color: #AA0000; + border-radius: 10px; +} + +.addButton{ + background-color: var(--tint5); + border-radius: 10px; +} \ No newline at end of file diff --git a/front_end/src/components/test_api.tsx b/front_end/src/components/test_api.tsx new file mode 100644 index 0000000..1e39c09 --- /dev/null +++ b/front_end/src/components/test_api.tsx @@ -0,0 +1,16 @@ +import { getUsersAPI } from "../requetes" + +function TestAPI(){ + + function handleGetUsers(): void { + getUsersAPI() + } + + return( +
+ +
+ ) +} + +export default TestAPI diff --git a/front_end/src/requetes.tsx b/front_end/src/requetes.tsx index 626a244..6c00ae1 100644 --- a/front_end/src/requetes.tsx +++ b/front_end/src/requetes.tsx @@ -2,7 +2,8 @@ import api from "./api"; import { Activite, Athlete, Coach, Session, User } from "./classes"; //import { useKeycloak } from '@react-keycloak/web' -//const { keycloak } = useKeycloak() +import { useKeycloak } from '@react-keycloak/web' +import { useAuthHeader } from "./hook/useAuthHeader"; /* const useAuthHeader = () => { return keycloak?.token @@ -72,7 +73,7 @@ export async function subscribeSessionAPI(user:User, session:Session):Promise{ try { - await api.post(`/sessions/${session.id}/unsubscribe`, { userId: user.id }); + await api.post(`/session/${session.id}/unsubscribe`, { userId: user.id }); return true; } catch (error) { console.error("Error unsubscribing from session:", error); @@ -93,9 +94,9 @@ export async function updateAllUserAPI(){ // POST ///////////////////////////////////////////////////////// // COACH ADMIN -export async function createSessionAPI(newSession: Session): Promise { +export async function createSessionAPI(sessionDTO: any): Promise { try { - const response = await api.post("/sessions", newSession); + const response = await api.post("/session/create", sessionDTO); return response.data; } catch (error) { console.error("Error creating session:", error); @@ -105,7 +106,7 @@ export async function createSessionAPI(newSession: Session): Promise { export async function postActivityAPI(session: Session, activity: Activite){ try { - const response = await api.post(`/sessions/${session.id}/activities`, activity); + const response = await api.post(`/session/${session.id}/activities`, activity); return response.data; } catch (error) { console.error("Error creating activity:", error); @@ -131,7 +132,7 @@ export async function setSessionCreneauAPI(session: Session, date:Date){ export async function getSessionsAPI(): Promise { try { - const response = await api.get("/sessions"); + const response = await api.get("/session"); return response.data; } catch (error) { console.error("Error fetching sessions:", error);