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 cc9112e..092fab1 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java @@ -60,7 +60,7 @@ public class AthleteResource { @ApiResponse(responseCode = "200", description = "Récupère tous les athlètes", content = @Content(mediaType = "application/json", schema = @Schema(implementation = List.class))) }) @GetMapping("/all") - @PreAuthorize("hasRole('admin') or hasRole('coach') or hasRole('athlete')") + @PreAuthorize("hasRole('admin') or hasRole('coach')") public ResponseEntity> all() { List athletes = athleteDAO.findAll(); List dtos = new ArrayList<>(); diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/UserSyncResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/UserSyncResource.java new file mode 100644 index 0000000..1f5f302 --- /dev/null +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/UserSyncResource.java @@ -0,0 +1,48 @@ +package hackathon.FrisbYEE.rest; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.core.context.SecurityContextHolder; + +import hackathon.FrisbYEE.jpa.metier.Athlete; +import hackathon.FrisbYEE.jpa.service.AthleteDAO; +import jakarta.transaction.Transactional; + +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/users") +@CrossOrigin(origins = "http://localhost:3000") +public class UserSyncResource { + + @Autowired + private AthleteDAO athleteDAO; + + @PostMapping("/sync") + @Transactional + public ResponseEntity sync() { + Jwt jwt = (Jwt) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + + String keycloakId = jwt.getSubject(); + String firstName = jwt.getClaimAsString("given_name"); + String lastName = jwt.getClaimAsString("family_name"); + + if (!athleteDAO.existsByKeycloakId(keycloakId)) { + System.out.println("New user detected from Keycloak. Syncing: " + firstName + " " + lastName); + Athlete athlete = new Athlete(); + athlete.setKeycloakId(keycloakId); + athlete.setName(lastName); + athlete.setPrenom(firstName); + athlete.setRole(hackathon.FrisbYEE.jpa.metier.Role.athlete); + athleteDAO.save(athlete); + } + + return ResponseEntity.ok().build(); + } +} \ No newline at end of file diff --git a/front_end/src/components/login.tsx b/front_end/src/components/login.tsx index a917c32..11e706f 100644 --- a/front_end/src/components/login.tsx +++ b/front_end/src/components/login.tsx @@ -8,9 +8,18 @@ export const Login =() =>{ const { keycloak } = useKeycloak(); useEffect(() => { - const syncUser = async () => { + const syncAndLoadUser = async () => { if (keycloak.authenticated && keycloak.token) { - console.log("Attempting to sync user with backend..."); + const tokenParsed = keycloak.tokenParsed; + setUser({ + id: 0, + keycloakId: tokenParsed!.sub!, + email: tokenParsed?.email || "", + nom: tokenParsed?.family_name || "", + prenom: tokenParsed?.given_name || "", + role: "athlete", + sessions: [] + }); try { const response = await fetch("http://localhost:8081/api/users/sync", { method: "POST", @@ -26,36 +35,8 @@ export const Login =() =>{ } }; - syncUser(); - }, [keycloak.authenticated, keycloak.token]); - - useEffect(() => { - if (keycloak.authenticated && keycloak.token) { - fetch("http://localhost:8081/api/users/sync", { - method: "POST", - headers: { - Authorization: `Bearer ${keycloak.token}`, - }, - }) - .then(res => console.log("Sync response status:", res.status)) - .catch(err => console.error("Sync error:", err));; - } - }, [keycloak.authenticated]); - - useEffect(() => { - if (keycloak.authenticated) { - const tokenParsed = keycloak.tokenParsed; - setUser({ - id: 0, - keycloakId: tokenParsed!.sub!, - email: tokenParsed?.email, - nom: tokenParsed?.family_name, - prenom: tokenParsed?.given_name, - role: "athlete", - sessions: [] - }); - } - }, [keycloak.authenticated]); + syncAndLoadUser(); + }, [keycloak.authenticated, keycloak.token, setUser]); function handleLogin(): void { diff --git a/front_end/src/components/ressourcePanel.tsx b/front_end/src/components/ressourcePanel.tsx index ad21358..0741daf 100644 --- a/front_end/src/components/ressourcePanel.tsx +++ b/front_end/src/components/ressourcePanel.tsx @@ -16,7 +16,7 @@ import { unescapeLeadingUnderscores } from "typescript"; console.log(user.nom); console.log(user.prenom); console.log(user.email); - if (user.role === "Athlete") return null; + if (user.role === "athlete") return null; const athleteMap: Map = new Map(); @@ -82,7 +82,7 @@ import { unescapeLeadingUnderscores } from "typescript"; }}> - {user.role === "Admin" && } + {user.role === "admin" && }