From 97b57b361d00d4c53b9982614a7528974d65ac0a Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sat, 16 Mar 2024 19:13:57 +0100 Subject: [PATCH 01/15] cleaned all controllers --- .../EndPoints/ApplicationsController.java | 18 +++--- .../Clyde/EndPoints/CourseController.java | 34 ++++++----- .../Clyde/EndPoints/CurriculumController.java | 35 +++++------ .../EndPoints/InscriptionController.java | 54 ++++++++++++----- .../Clyde/EndPoints/LoginController.java | 7 +-- .../Clyde/EndPoints/MockController.java | 18 +----- .../Clyde/EndPoints/StorageController.java | 5 +- .../Clyde/EndPoints/TokenController.java | 21 +++++-- .../Clyde/EndPoints/UserController.java | 58 ++++++++++++------- .../Clyde/Services/AuthenticatorService.java | 4 +- .../Clyde/Services/CourseService.java | 7 +++ .../Clyde/Services/CurriculumService.java | 16 ++--- .../Clyde/Services/InscriptionService.java | 11 +++- .../Clyde/Services/TeacherCourseService.java | 3 + .../herisson/Clyde/Services/UserService.java | 12 ++-- .../Clyde/Tables/InscriptionRequest.java | 4 +- 16 files changed, 181 insertions(+), 126 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java index 77b2f3e..20cd8d4 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java @@ -30,7 +30,6 @@ public class ApplicationsController { */ @GetMapping("/apps") public ResponseEntity> getAuthorizedApps(@RequestHeader("Authorization") String token){ - return new ResponseEntity<>(getAuthorizedApplications(token), HttpStatus.OK); } @@ -46,24 +45,29 @@ public class ApplicationsController { public ArrayList getAuthorizedApplications(String token){ ArrayList authorizedApps = new ArrayList<>(); + //if unAuthed authorizedApps.add(Applications.Login); - authorizedApps.add(Applications.Profile); User user = authServ.getUserFromToken(token); if(user == null) - return authorizedApps; + return authorizedApps; + // if authed + authorizedApps.add(Applications.Profile); - Role posterRole = user.getRole(); + Role posterRole = user.getRole(); - if (posterRole == Role.Teacher || posterRole == Role.Student || posterRole == Role.Admin){ + if (!authServ.IsNotIn(new Role[]{Role.Teacher,Role.Student,Role.Admin},token)) { authorizedApps.add(Applications.Msg); authorizedApps.add(Applications.Forum); authorizedApps.add(Applications.Rdv); } - if (posterRole == Role.Teacher || posterRole == Role.Secretary || posterRole == Role.Admin) authorizedApps.add(Applications.ManageCourses); + //if Teacher or Secretary or Admin add ManageCourses App + if (!authServ.IsNotIn(new Role[]{Role.Teacher,Role.Secretary,Role.Admin},token)) + authorizedApps.add(Applications.ManageCourses); - if (posterRole == Role.InscriptionService || posterRole == Role.Admin) authorizedApps.add(Applications.Inscription); + if (!authServ.IsNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)) + authorizedApps.add(Applications.Inscription); return authorizedApps; } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java index 011689f..2a1af6e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java @@ -9,10 +9,6 @@ import ovh.herisson.Clyde.Services.CourseService; import ovh.herisson.Clyde.Services.TeacherCourseService; import ovh.herisson.Clyde.Tables.Course; import ovh.herisson.Clyde.Tables.Role; -import ovh.herisson.Clyde.Tables.TeacherCourse; -import ovh.herisson.Clyde.Tables.User; - -import java.util.ArrayList; import java.util.Map; @RestController @@ -36,13 +32,21 @@ public class CourseController { if (authServ.getUserFromToken(token) == null) return new UnauthorizedResponse<>(null); - return new ResponseEntity<>(courseServ.findById(id), HttpStatus.OK); + Course foundCourse = courseServ.findById(id); + + if (foundCourse == null) + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + + return new ResponseEntity<>(foundCourse, HttpStatus.OK); } @PostMapping("/course") - public ResponseEntity postCourse(@RequestHeader("Authorization") String token, @RequestBody Course course){ - if (authServ.isNotSecretaryOrAdmin(token)) + public ResponseEntity postCourse(@RequestHeader("Authorization") String token, + @RequestBody Course course) + { + + if (authServ.IsNotIn(new Role[]{Role.Secretary,Role.Admin},token)) return new UnauthorizedResponse<>(null); return new ResponseEntity<>(courseServ.save(course), HttpStatus.CREATED); @@ -55,11 +59,15 @@ public class CourseController { @PathVariable long id) { - if (authServ.IsNotIn(new Role[]{Role.Admin,Role.Teacher,Role.Secretary}, token)){ + if (authServ.IsNotIn(new Role[]{Role.Admin,Role.Teacher,Role.Secretary}, token)) return new UnauthorizedResponse<>(null); - } - return new ResponseEntity<>(courseServ.modifyData(id, updates, authServ.getUserFromToken(token).getRole()), HttpStatus.OK); + Course modifiedCourse = courseServ.modifyData(id,updates,authServ.getUserFromToken(token).getRole()); + + if (modifiedCourse == null) + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + + return new ResponseEntity<>(modifiedCourse, HttpStatus.OK); } @PostMapping("/course/{id}") @@ -67,14 +75,14 @@ public class CourseController { @RequestBody Iterable teacherIds, @PathVariable Long id) { + if (authServ.IsNotIn(new Role[]{Role.Admin,Role.Secretary}, token)) return new UnauthorizedResponse<>(null); + if (!teacherCourseServ.saveAll(teacherIds,courseServ.findById(id))) + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - teacherCourseServ.saveAll(teacherIds,courseServ.findById(id)); return new ResponseEntity<>(HttpStatus.OK); - } - } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java index 1892d6c..0b0abb8 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java @@ -4,13 +4,12 @@ package ovh.herisson.Clyde.EndPoints; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import ovh.herisson.Clyde.Responses.UnauthorizedResponse; import ovh.herisson.Clyde.Services.AuthenticatorService; import ovh.herisson.Clyde.Services.CurriculumCourseService; import ovh.herisson.Clyde.Services.CurriculumService; import ovh.herisson.Clyde.Tables.Curriculum; -import ovh.herisson.Clyde.Tables.CurriculumCourse; import ovh.herisson.Clyde.Tables.Role; -import ovh.herisson.Clyde.Tables.User; import java.util.Map; @@ -32,29 +31,25 @@ public class CurriculumController { @GetMapping("/curriculum/{id}") public ResponseEntity findById(@PathVariable long id){ - return new ResponseEntity<>(curriculumServ.findById(id), HttpStatus.OK); + Curriculum foundCurriculum = curriculumServ.findById(id); + + if (foundCurriculum == null) + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + + return new ResponseEntity<>(foundCurriculum, HttpStatus.OK); } @GetMapping("/curriculums") - public ResponseEntity>> findAllindDepth(){ + public ResponseEntity>> findAllIndDepth(){ return new ResponseEntity<>(curriculumCourseServ.getAllDepthCurriculum(),HttpStatus.OK); } - @GetMapping("/curriculum") - public ResponseEntity> findAll(){ - return new ResponseEntity<>(curriculumCourseServ.findAll(),HttpStatus.OK); + @PostMapping("/curriculum") + public ResponseEntity postCurriculum(@RequestHeader("Authorization") String token,@RequestBody Curriculum curriculum){ + + if (authServ.IsNotIn(new Role[]{Role.Secretary,Role.Admin},token)) + return new UnauthorizedResponse<>(null); + + return new ResponseEntity<>(curriculumServ.save(curriculum),HttpStatus.CREATED); } - - /**@PostMapping("/curriculum") //todo now - public ResponseEntity postCurriculum(@RequestHeader("Authorization") String token,@RequestBody Curriculum curriculum){ - - if (!isSecretaryOrAdmin(token)){ - return new UnauthorizedResponse<>("you're not allowed to post a Curriculum"); - } - - CurriculumServ.save(Curriculum); - - return new ResponseEntity<>("created !",HttpStatus.CREATED); - }**/ - } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java index 36946b5..42d6551 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java @@ -9,14 +9,12 @@ import ovh.herisson.Clyde.Services.InscriptionService; import ovh.herisson.Clyde.Tables.InscriptionRequest; import ovh.herisson.Clyde.Tables.RequestState; import ovh.herisson.Clyde.Tables.Role; -import ovh.herisson.Clyde.Tables.User; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @RestController @CrossOrigin(originPatterns = "*", allowCredentials = "true") - public class InscriptionController { @@ -32,7 +30,8 @@ public class InscriptionController { @GetMapping("/requests/register") public ResponseEntity>> getAllRequests(@RequestHeader("Authorization") String token){ - if (authServ.isNotSecretaryOrAdmin(token)){return new UnauthorizedResponse<>(null);} + if (authServ.IsNotIn(new Role[]{Role.Admin,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); Iterable inscriptionRequests = inscriptionServ.getAll(); ArrayList> toReturn = new ArrayList<>(); @@ -46,41 +45,64 @@ public class InscriptionController { @GetMapping("/request/register/{id}") - public ResponseEntity> getById(@PathVariable long id){ - InscriptionRequest inscriptionRequest = inscriptionServ.getById(id); - if (inscriptionRequest == null) {return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);} + public ResponseEntity> getById(@RequestHeader("Authorization") String token, @PathVariable long id){ - return new ResponseEntity<>(requestWithoutPassword(inscriptionRequest), HttpStatus.OK); + if (authServ.IsNotIn(new Role[]{Role.Admin,Role.InscriptionService},token)) + return new UnauthorizedResponse<>(null); + + InscriptionRequest foundInscriptionRequest = inscriptionServ.getById(id); + + if (foundInscriptionRequest == null) + return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); + + return new ResponseEntity<>(requestWithoutPassword(foundInscriptionRequest), HttpStatus.OK); } - @GetMapping("request/user/{id}") - public ResponseEntity getUserInscriptionRequest(@PathVariable long id, @RequestHeader("Authorize") String token){ + /** + @GetMapping("request/user") + public ResponseEntity getUserInscriptionRequest(@RequestHeader("Authorization") String token){ //todo return l'inscriptionRequest ACTUELLE du user (check si le poster est bien le même que id target ou secretariat) + + if (authServ.IsNotIn(new Role[]{Role.Student,Role.Admin},token)) + return new UnauthorizedResponse<>(null); + + User poster = authServ.getUserFromToken(token); + + inscriptionServ.getById() + + return null; - } + } **/ @PatchMapping("/request/register/{id}") public ResponseEntity changeRequestState(@PathVariable long id, - @RequestHeader("Authorize") String token, + @RequestHeader("Authorization") String token, @RequestBody RequestState requestState) { - if (authServ.isNotSecretaryOrAdmin(token)) return new UnauthorizedResponse<>(null); - inscriptionServ.modifyState(id, requestState); - return null; + + if (authServ.IsNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)) + return new UnauthorizedResponse<>(null); + + if (!inscriptionServ.modifyState(id, requestState)) + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + + return new ResponseEntity<>(HttpStatus.OK); } private Map requestWithoutPassword(InscriptionRequest inscriptionRequest) { Map toReturn = new HashMap<>(); toReturn.put("id", inscriptionRequest.getId()); - toReturn.put("firstName", inscriptionRequest.getFirstName()); toReturn.put("lastName", inscriptionRequest.getLastName()); + toReturn.put("firstName", inscriptionRequest.getFirstName()); toReturn.put("address", inscriptionRequest.getAddress()); + toReturn.put("email",inscriptionRequest.getEmail()); toReturn.put("birthDate", inscriptionRequest.getBirthDate()); toReturn.put("country", inscriptionRequest.getCountry()); toReturn.put("curriculum", inscriptionRequest.getCurriculum()); - toReturn.put("profilePictureUrl", inscriptionRequest.getProfilePicture()); toReturn.put("state", inscriptionRequest.getState()); + toReturn.put("profilePictureUrl", inscriptionRequest.getProfilePicture()); + return toReturn; } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java index 2be125d..6e0b4fa 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java @@ -1,4 +1,5 @@ package ovh.herisson.Clyde.EndPoints; + import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -7,7 +8,6 @@ import org.springframework.web.bind.annotation.*; import ovh.herisson.Clyde.Responses.UnauthorizedResponse; import ovh.herisson.Clyde.Services.AuthenticatorService; import ovh.herisson.Clyde.Tables.InscriptionRequest; - import java.util.Date; @RestController @@ -45,8 +45,7 @@ public class LoginController { } @PostMapping("/request/register") - public ResponseEntity register(@RequestBody InscriptionRequest inscriptionRequest){ - authServ.register(inscriptionRequest); - return new ResponseEntity<>("Is OK", HttpStatus.CREATED); + public ResponseEntity register(@RequestBody InscriptionRequest inscriptionRequest){ + return new ResponseEntity<>(authServ.register(inscriptionRequest), HttpStatus.CREATED); } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java index 1750889..358602b 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java @@ -6,7 +6,6 @@ import ovh.herisson.Clyde.Repositories.TokenRepository; import ovh.herisson.Clyde.Repositories.UserRepository; import ovh.herisson.Clyde.Services.*; import ovh.herisson.Clyde.Tables.*; - import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -51,12 +50,11 @@ public class MockController { User joe = new User("Mama","Joe","student@student.com","roundabout","DaWarudo",new Date(0), null,Role.Student,passwordEncoder.encode("student")); User meh = new User("Inspiration","lackOf","secretary@secretary.com","a Box","the street",new Date(0), null,Role.Secretary,passwordEncoder.encode("secretary")); User joke = new User("CthemBalls","Lemme","teacher@teacher.com","lab","faculty",new Date(0), null,Role.Teacher,passwordEncoder.encode("teacher")); - User lena = new User("Louille","Lena","inscriptionService@InscriptionService.com","no","yes",new Date(0), null,Role.Teacher,passwordEncoder.encode("inscriptionService")); - mockUsers = new ArrayList<>(Arrays.asList(herobrine,joe,meh,joke)); + User lena = new User("Louille","Lena","inscriptionService@InscriptionService.com","no","yes",new Date(0), null,Role.InscriptionService,passwordEncoder.encode("inscriptionService")); + mockUsers = new ArrayList<>(Arrays.asList(herobrine,joe,meh,joke,lena)); userRepo.saveAll(mockUsers); - // Course / Curriculum part Curriculum infoBab1 = new Curriculum(1,"info"); @@ -68,7 +66,7 @@ public class MockController { curriculumService.save(psychologyBab1); - Course progra1 = new Course(5,"Programmation et algorithimque 1",joke); + Course progra1 = new Course(5,"Programmation et algorithmique 1",joke); Course chemistry1 = new Course(12, "Thermochimie",joke); Course psycho1 = new Course(21, "rien faire t'as cru c'est psycho",joke); Course commun = new Course(2, "cours commun",joke); @@ -89,16 +87,6 @@ public class MockController { CurriculumCourseService.save(new CurriculumCourse(chemistryBab1,commun)); CurriculumCourseService.save(new CurriculumCourse(chemistryBab1,chemistry1)); - - - } - - @DeleteMapping("/mock") - public void deleteMock(){ - for (User user:mockUsers){ - tokenRepo.deleteAll(tokenRepo.getByUser(user)); - } - userRepo.deleteAll(mockUsers); } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java index 724ae10..d715087 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/StorageController.java @@ -22,12 +22,13 @@ public class StorageController { @PostMapping("/upload/{fileType}") public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file, @PathVariable FileType fileType) { - StorageFile fileEntry = null; + StorageFile fileEntry; try { fileEntry = storageServ.store(file,fileType); } catch(Exception e){ - e.printStackTrace(); + e.printStackTrace(); + return new ResponseEntity<>(null,HttpStatus.BAD_REQUEST); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/TokenController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/TokenController.java index ba07fca..1d18881 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/TokenController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/TokenController.java @@ -1,11 +1,15 @@ package ovh.herisson.Clyde.EndPoints; - - +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RestController; +import ovh.herisson.Clyde.Responses.UnauthorizedResponse; +import ovh.herisson.Clyde.Services.AuthenticatorService; import ovh.herisson.Clyde.Services.TokenService; +import ovh.herisson.Clyde.Tables.Role; import ovh.herisson.Clyde.Tables.Token; @RestController @@ -14,13 +18,20 @@ public class TokenController { private final TokenService tokenServ; - public TokenController(TokenService tokenServ){ + private final AuthenticatorService authServ; + + public TokenController(TokenService tokenServ, AuthenticatorService authServ){ this.tokenServ = tokenServ; + this.authServ = authServ; } @GetMapping("/tokens") - public Iterable getTokens(){ - return tokenServ.getAllTokens(); + public ResponseEntity> getTokens(@RequestHeader("Authorization")String token){ + + if (authServ.IsNotIn(new Role[]{Role.Admin},token)) + return new UnauthorizedResponse<>(null); + + return new ResponseEntity<>(tokenServ.getAllTokens(), HttpStatus.OK); } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java index 8437b81..fd6151e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java @@ -1,6 +1,5 @@ package ovh.herisson.Clyde.EndPoints; - import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -9,8 +8,6 @@ import ovh.herisson.Clyde.Services.AuthenticatorService; import ovh.herisson.Clyde.Services.UserService; import ovh.herisson.Clyde.Tables.Role; import ovh.herisson.Clyde.Tables.User; - -import java.security.Key; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -27,30 +24,33 @@ public class UserController { this.authServ = authServ; } + /** returns information about the connected user + * + * @param token the session token of the user + * @return the user information except his password + */ @GetMapping("/user") - public ResponseEntity> getUser(@RequestHeader("Authorization") String authorization){ + public ResponseEntity> getUser(@RequestHeader("Authorization") String token){ - if (authorization == null) return new UnauthorizedResponse<>(null); - User user = authServ.getUserFromToken(authorization); - if (user == null) return new UnauthorizedResponse<>(null); + User user = authServ.getUserFromToken(token); + if (user == null) return new UnauthorizedResponse<>(null); return new ResponseEntity<>(userWithoutPassword(user), HttpStatus.OK); } @PostMapping("/user") - public ResponseEntity postUser(@RequestBody User user,@RequestHeader("Authorization") String authorization){ + public ResponseEntity> postUser(@RequestBody User user,@RequestHeader("Authorization") String token){ - if (authServ.isNotSecretaryOrAdmin(authorization)) + if (authServ.IsNotIn(new Role[]{Role.Admin,Role.InscriptionService,Role.Secretary},token)) return new UnauthorizedResponse<>(null); - userService.save(user); - return new ResponseEntity<>(String.format("Account created with ID:%s",user.getRegNo()),HttpStatus.CREATED); + return new ResponseEntity<>(userWithoutPassword(userService.save(user)),HttpStatus.CREATED); } @GetMapping("/users") - public ResponseEntity>> getAllUsers(@RequestHeader("Authorization") String authorization){ + public ResponseEntity>> getAllUsers(@RequestHeader("Authorization") String token){ - if (authServ.isNotSecretaryOrAdmin(authorization)) + if (authServ.IsNotIn(new Role[]{Role.Admin,Role.Secretary},token)) return new UnauthorizedResponse<>(null); Iterable users = userService.getAll(); @@ -61,24 +61,36 @@ public class UserController { } return new ResponseEntity<>(withoutPassword, HttpStatus.OK); } - @PatchMapping("/user") - public ResponseEntity patchUser(@RequestBody Map updates, @RequestHeader("Authorization") String authorization) { - if (authorization == null) return new UnauthorizedResponse<>(null); + /** changes the specified user's information + * + * @param updates the changes to be made + * @param token the session token of the user posting the change + * @param id the id of the user to change + * @return a string clarifying the issue (if there is any) + */ + @PatchMapping("/user/{id}") + public ResponseEntity patchUser(@RequestHeader("Authorization") String token, + @RequestBody Map updates, + @PathVariable Long id) { - User poster = authServ.getUserFromToken(authorization); - if (poster == null) {return new UnauthorizedResponse<>("bad authorization");} + if (token == null) return new UnauthorizedResponse<>(null); - if (!userService.modifyData(poster, updates, poster)) + User poster = authServ.getUserFromToken(token); + if (poster == null) {return new UnauthorizedResponse<>("bad token");} + + if (!userService.modifyData(id, updates, poster)) return new UnauthorizedResponse<>("there was an issue with the updates requested"); - return new ResponseEntity<>("data modified", HttpStatus.OK); + return new ResponseEntity<>(null, HttpStatus.OK); } @GetMapping("/teachers") public ResponseEntity>> getAllTeachers(@RequestHeader("Authorization") String token){ + if (authServ.getUserFromToken(token) == null) return new UnauthorizedResponse<>(null); + Iterable teachers = userService.getAllTeachers(); ArrayList> withoutPassword = new ArrayList<>(); @@ -98,11 +110,13 @@ public class UserController { private HashMap userWithoutPassword(User user){ HashMap toReturn = new HashMap<>(); toReturn.put("regNo",user.getRegNo()); - toReturn.put("firstName",user.getFirstName()); toReturn.put("lastName",user.getLastName()); + toReturn.put("firstName",user.getFirstName()); + toReturn.put("email", user.getEmail()); + toReturn.put("address",user.getAddress()); toReturn.put("birthDate",user.getBirthDate()); toReturn.put("country",user.getCountry()); - toReturn.put("address",user.getAddress()); + toReturn.put("profilePictureUrl",user.getProfilePictureUrl()); toReturn.put("role",user.getRole()); return toReturn; } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java index 63ef3c1..a665096 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java @@ -35,8 +35,8 @@ public class AuthenticatorService { return token; } - public void register(InscriptionRequest inscriptionRequest) { - inscriptionService.save(inscriptionRequest); + public InscriptionRequest register(InscriptionRequest inscriptionRequest) { + return inscriptionService.save(inscriptionRequest); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java index 8278bbe..483e865 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java @@ -28,6 +28,9 @@ public class CourseService { public Course modifyData(long id, Map updates, Role role) { Course target = courseRepo.findById(id); + if (target == null) + return null; + if (role == Role.Teacher){ for (Map.Entry entry : updates.entrySet()){ if (entry.getKey().equals("title")){ @@ -52,4 +55,8 @@ public class CourseService { } return courseRepo.save(target); } + + public void delete(Long id) { + courseRepo.deleteById(id); + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java index 6f6d89b..04c6ab2 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java @@ -1,7 +1,6 @@ package ovh.herisson.Clyde.Services; import org.springframework.stereotype.Service; -import ovh.herisson.Clyde.Repositories.CourseRepository; import ovh.herisson.Clyde.Repositories.CurriculumRepository; import ovh.herisson.Clyde.Tables.Curriculum; @@ -10,23 +9,18 @@ public class CurriculumService { private final CurriculumRepository curriculumRepo; - private final CourseRepository courseRepo; - - public CurriculumService(CurriculumRepository curriculumRepo, CourseRepository courseRepo){ + public CurriculumService(CurriculumRepository curriculumRepo){ this.curriculumRepo = curriculumRepo; - this.courseRepo = courseRepo; } - - - public void save(Curriculum curriculum){ - curriculumRepo.save(curriculum); + public Curriculum save(Curriculum curriculum){ + return curriculumRepo.save(curriculum); } public Curriculum findById(long id){ return curriculumRepo.findById(id); } - public Iterable findAll(){ - return curriculumRepo.findAll(); + public void delete(Long id) { + curriculumRepo.deleteById(id); } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java index 6130fe8..31b18a6 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java @@ -14,8 +14,8 @@ public class InscriptionService { this.inscriptionRepo = inscriptionRepo; } - public void save(InscriptionRequest inscriptionRequest){ - inscriptionRepo.save(inscriptionRequest); + public InscriptionRequest save(InscriptionRequest inscriptionRequest){ + return inscriptionRepo.save(inscriptionRequest); } public InscriptionRequest getById(long id){ @@ -26,9 +26,14 @@ public class InscriptionService { return inscriptionRepo.findAll(); } - public void modifyState(long id, RequestState requestState) { + public boolean modifyState(long id, RequestState requestState) { InscriptionRequest inscriptionRequest = getById(id); + + if (inscriptionRequest == null) + return false; + inscriptionRequest.setState(requestState); save(inscriptionRequest); + return true; } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java index 0996adf..83135ea 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java @@ -22,6 +22,9 @@ public class TeacherCourseService { public boolean saveAll(Iterable teacherIds, Course course){ + if (course == null) + return false; + ArrayList addedIds = new ArrayList<>(); for (Long teacherId : teacherIds){ User teacher = userRepo.findById((long) teacherId); diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java index a561512..ee45d90 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java @@ -36,7 +36,11 @@ public class UserService { * @param target the user to update * @return if the changes were done or not */ - public boolean modifyData(User poster, Map updates, User target){ + public boolean modifyData(long targetId, Map updates, User poster){ + + User target = userRepo.findById(targetId); + if (target == null) + return false; if (poster.getRegNo().equals(target.getRegNo())){ for (Map.Entry entry : updates.entrySet()){ @@ -80,7 +84,7 @@ public class UserService { if ( !entry.getKey().equals("role")) {return false;} - if (entry.getValue() == Role.Admin){return false;} + if (entry.getValue() == Role.Admin) {return false;} target.setRole((Role) entry.getValue()); userRepo.save(target); @@ -95,9 +99,9 @@ public class UserService { return passwordEncoder.matches(tryingPassword, user.getPassword()); } - public void save(User user){ + public User save(User user){ user.setPassword(passwordEncoder.encode(user.getPassword())); - userRepo.save(user); + return userRepo.save(user); } public Iterable getAll(){ diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java index dfbf7ed..bc781be 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java @@ -1,7 +1,6 @@ package ovh.herisson.Clyde.Tables; import jakarta.persistence.*; - import java.util.Date; @@ -25,13 +24,14 @@ public class InscriptionRequest { private String password; public InscriptionRequest(){} - public InscriptionRequest(String lastName, String firstName, String address, String email, String country, Date birthDate, RequestState state, String profilePicture, String password){ + public InscriptionRequest(String lastName, String firstName, String address, String email, String country, Date birthDate,Curriculum curriculum, RequestState state, String profilePicture, String password){ this.lastName = lastName; this.firstName = firstName; this.address = address; this.email = email; this.country = country; this.birthDate = birthDate; + this.curriculum = curriculum; this.state = state; this.profilePicture = profilePicture; this.password = password; From 382d3c203aedb51ae54d960f4301b534c274cb40 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sat, 16 Mar 2024 20:25:35 +0100 Subject: [PATCH 02/15] cleaned the services --- .../EndPoints/ApplicationsController.java | 6 ++--- .../Clyde/EndPoints/CourseController.java | 12 +++++----- .../Clyde/EndPoints/CurriculumController.java | 2 +- .../EndPoints/InscriptionController.java | 6 ++--- .../Clyde/EndPoints/TokenController.java | 2 +- .../Clyde/EndPoints/UserController.java | 4 ++-- .../Clyde/Repositories/TokenRepository.java | 2 -- .../Clyde/Repositories/UserRepository.java | 7 ------ .../Clyde/Services/AuthenticatorService.java | 13 +--------- .../Clyde/Services/CourseService.java | 23 ++++++++++-------- .../Services/CurriculumCourseService.java | 21 ++++------------ .../Clyde/Services/CurriculumService.java | 6 +---- .../Clyde/Services/StorageService.java | 3 +++ .../Clyde/Services/TeacherCourseService.java | 12 ++++++---- .../herisson/Clyde/Services/TokenService.java | 11 +++++---- .../herisson/Clyde/Services/UserService.java | 24 ++++++++++++------- 16 files changed, 67 insertions(+), 87 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java index 20cd8d4..a708ec1 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java @@ -56,17 +56,17 @@ public class ApplicationsController { Role posterRole = user.getRole(); - if (!authServ.IsNotIn(new Role[]{Role.Teacher,Role.Student,Role.Admin},token)) { + if (!authServ.isNotIn(new Role[]{Role.Teacher,Role.Student,Role.Admin},token)) { authorizedApps.add(Applications.Msg); authorizedApps.add(Applications.Forum); authorizedApps.add(Applications.Rdv); } //if Teacher or Secretary or Admin add ManageCourses App - if (!authServ.IsNotIn(new Role[]{Role.Teacher,Role.Secretary,Role.Admin},token)) + if (!authServ.isNotIn(new Role[]{Role.Teacher,Role.Secretary,Role.Admin},token)) authorizedApps.add(Applications.ManageCourses); - if (!authServ.IsNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)) + if (!authServ.isNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)) authorizedApps.add(Applications.Inscription); return authorizedApps; diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java index 2a1af6e..ebfa730 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java @@ -46,7 +46,7 @@ public class CourseController { @RequestBody Course course) { - if (authServ.IsNotIn(new Role[]{Role.Secretary,Role.Admin},token)) + if (authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token)) return new UnauthorizedResponse<>(null); return new ResponseEntity<>(courseServ.save(course), HttpStatus.CREATED); @@ -59,15 +59,15 @@ public class CourseController { @PathVariable long id) { - if (authServ.IsNotIn(new Role[]{Role.Admin,Role.Teacher,Role.Secretary}, token)) + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Teacher,Role.Secretary}, token)) return new UnauthorizedResponse<>(null); - Course modifiedCourse = courseServ.modifyData(id,updates,authServ.getUserFromToken(token).getRole()); - if (modifiedCourse == null) + + if (!courseServ.modifyData(id, updates, authServ.getUserFromToken(token).getRole())) return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - return new ResponseEntity<>(modifiedCourse, HttpStatus.OK); + return new ResponseEntity<>(HttpStatus.OK); } @PostMapping("/course/{id}") @@ -76,7 +76,7 @@ public class CourseController { @PathVariable Long id) { - if (authServ.IsNotIn(new Role[]{Role.Admin,Role.Secretary}, token)) + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary}, token)) return new UnauthorizedResponse<>(null); diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java index 0b0abb8..4cb9504 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java @@ -47,7 +47,7 @@ public class CurriculumController { @PostMapping("/curriculum") public ResponseEntity postCurriculum(@RequestHeader("Authorization") String token,@RequestBody Curriculum curriculum){ - if (authServ.IsNotIn(new Role[]{Role.Secretary,Role.Admin},token)) + if (authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token)) return new UnauthorizedResponse<>(null); return new ResponseEntity<>(curriculumServ.save(curriculum),HttpStatus.CREATED); diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java index 42d6551..814c185 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java @@ -30,7 +30,7 @@ public class InscriptionController { @GetMapping("/requests/register") public ResponseEntity>> getAllRequests(@RequestHeader("Authorization") String token){ - if (authServ.IsNotIn(new Role[]{Role.Admin,Role.InscriptionService},token)) + if (authServ.isNotIn(new Role[]{Role.Admin,Role.InscriptionService},token)) return new UnauthorizedResponse<>(null); Iterable inscriptionRequests = inscriptionServ.getAll(); @@ -47,7 +47,7 @@ public class InscriptionController { @GetMapping("/request/register/{id}") public ResponseEntity> getById(@RequestHeader("Authorization") String token, @PathVariable long id){ - if (authServ.IsNotIn(new Role[]{Role.Admin,Role.InscriptionService},token)) + if (authServ.isNotIn(new Role[]{Role.Admin,Role.InscriptionService},token)) return new UnauthorizedResponse<>(null); InscriptionRequest foundInscriptionRequest = inscriptionServ.getById(id); @@ -80,7 +80,7 @@ public class InscriptionController { @RequestBody RequestState requestState) { - if (authServ.IsNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)) + if (authServ.isNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)) return new UnauthorizedResponse<>(null); if (!inscriptionServ.modifyState(id, requestState)) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/TokenController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/TokenController.java index 1d18881..6391b11 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/TokenController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/TokenController.java @@ -29,7 +29,7 @@ public class TokenController { @GetMapping("/tokens") public ResponseEntity> getTokens(@RequestHeader("Authorization")String token){ - if (authServ.IsNotIn(new Role[]{Role.Admin},token)) + if (authServ.isNotIn(new Role[]{Role.Admin},token)) return new UnauthorizedResponse<>(null); return new ResponseEntity<>(tokenServ.getAllTokens(), HttpStatus.OK); diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java index fd6151e..f4782e5 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java @@ -41,7 +41,7 @@ public class UserController { @PostMapping("/user") public ResponseEntity> postUser(@RequestBody User user,@RequestHeader("Authorization") String token){ - if (authServ.IsNotIn(new Role[]{Role.Admin,Role.InscriptionService,Role.Secretary},token)) + if (authServ.isNotIn(new Role[]{Role.Admin,Role.InscriptionService,Role.Secretary},token)) return new UnauthorizedResponse<>(null); return new ResponseEntity<>(userWithoutPassword(userService.save(user)),HttpStatus.CREATED); @@ -50,7 +50,7 @@ public class UserController { @GetMapping("/users") public ResponseEntity>> getAllUsers(@RequestHeader("Authorization") String token){ - if (authServ.IsNotIn(new Role[]{Role.Admin,Role.Secretary},token)) + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token)) return new UnauthorizedResponse<>(null); Iterable users = userService.getAll(); diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/TokenRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/TokenRepository.java index d3b422a..53bf3aa 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/TokenRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/TokenRepository.java @@ -10,7 +10,5 @@ public interface TokenRepository extends CrudRepository { Token getByToken(String token); - Iterable getByUser(User user); - ArrayList getByUserOrderByExpirationDate(User user); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java index b2643e0..2df4919 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java @@ -4,19 +4,12 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import ovh.herisson.Clyde.Tables.User; -import java.util.List; - public interface UserRepository extends CrudRepository { User findById(long id); User findByEmail(String email); - /** - @Query(value = "select a.* from Users a ",nativeQuery = true) - Iterable findAllUsers();**/ - @Query("select u from User u where u.role = ovh.herisson.Clyde.Tables.Role.Teacher") Iterable findAllTeachers(); - } \ No newline at end of file diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java index a665096..15ae7eb 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java @@ -39,18 +39,7 @@ public class AuthenticatorService { return inscriptionService.save(inscriptionRequest); } - - public boolean isNotSecretaryOrAdmin(String authorization){ - if (authorization ==null) - return true; - - User poster = getUserFromToken(authorization); - if (poster == null) return true; - - return poster.getRole() != Role.Secretary || poster.getRole() != Role.Admin; - } - - public boolean IsNotIn(Role[] roles, String token){ + public boolean isNotIn(Role[] roles, String token){ if (token == null) return true; diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java index 483e865..abfa6ae 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java @@ -5,7 +5,6 @@ import ovh.herisson.Clyde.Repositories.CourseRepository; import ovh.herisson.Clyde.Tables.Course; import ovh.herisson.Clyde.Tables.Role; import ovh.herisson.Clyde.Tables.User; - import java.util.Map; @Service @@ -25,21 +24,25 @@ public class CourseService { return courseRepo.findById(id); } - public Course modifyData(long id, Map updates, Role role) { + public boolean modifyData(long id, Map updates, Role role) { Course target = courseRepo.findById(id); if (target == null) - return null; + return false; if (role == Role.Teacher){ for (Map.Entry entry : updates.entrySet()){ if (entry.getKey().equals("title")){ target.setTitle((String) entry.getValue()); - return courseRepo.save(target); + courseRepo.save(target); + return true; } } } + if (role != Role.Secretary) + return false; + for (Map.Entry entry: updates.entrySet()){ switch (entry.getKey()){ case "title": @@ -49,14 +52,14 @@ public class CourseService { target.setCredits((Integer) entry.getValue()); break; case "owner": - target.setOwner((User) entry.getValue()); //todo check if is a teacher ! + if (((User) entry.getValue() ).getRole() != Role.Teacher) + break; + + target.setOwner((User) entry.getValue()); break; } } - return courseRepo.save(target); - } - - public void delete(Long id) { - courseRepo.deleteById(id); + courseRepo.save(target); + return true; } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java index ccf1226..5e1992d 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java @@ -1,13 +1,10 @@ package ovh.herisson.Clyde.Services; import org.springframework.stereotype.Service; -import ovh.herisson.Clyde.Repositories.CourseRepository; import ovh.herisson.Clyde.Repositories.CurriculumCourseRepository; -import ovh.herisson.Clyde.Repositories.CurriculumRepository; import ovh.herisson.Clyde.Tables.Course; import ovh.herisson.Clyde.Tables.Curriculum; import ovh.herisson.Clyde.Tables.CurriculumCourse; - import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -17,27 +14,21 @@ public class CurriculumCourseService { private final CurriculumCourseRepository curriculumCourseRepo; - private final CourseRepository courseRepo; - private final CurriculumRepository curriculumRepo; - - public CurriculumCourseService(CurriculumCourseRepository curriculumCourseRepository, CourseRepository courseRepo, CurriculumRepository curriculumRepo) { + public CurriculumCourseService(CurriculumCourseRepository curriculumCourseRepository) { this.curriculumCourseRepo = curriculumCourseRepository; - this.courseRepo = courseRepo; - this.curriculumRepo = curriculumRepo; } public void save(CurriculumCourse curriculumCourse){ curriculumCourseRepo.save(curriculumCourse); } - public Iterable findAll(){ - return curriculumCourseRepo.findAll(); - } - public Map getDepthCurriculum(Curriculum curriculum){ + if (curriculum == null) + return null; + HashMap toReturn = new HashMap<>(); ArrayList courses = new ArrayList<>(); for (Course c: curriculumCourseRepo.findCoursesByCurriculum(curriculum)){ @@ -61,8 +52,4 @@ public class CurriculumCourseService { } return toReturn; } - - - - } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java index 04c6ab2..0c9dc42 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumService.java @@ -15,12 +15,8 @@ public class CurriculumService { public Curriculum save(Curriculum curriculum){ return curriculumRepo.save(curriculum); } - public Curriculum findById(long id){ return curriculumRepo.findById(id); } - public void delete(Long id) { - curriculumRepo.deleteById(id); - } -} +} \ No newline at end of file diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java index fb04f68..dd0830c 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/StorageService.java @@ -35,6 +35,9 @@ public class StorageService { public StorageFile store(MultipartFile file, FileType fileType) { + if (file == null || file.getOriginalFilename() == null) + return null; + if (file.getOriginalFilename().isEmpty()){return null;} UUID uuid = UUID.randomUUID(); diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java index 83135ea..84900a8 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java @@ -22,21 +22,23 @@ public class TeacherCourseService { public boolean saveAll(Iterable teacherIds, Course course){ - if (course == null) + if (course == null || teacherIds == null) return false; - ArrayList addedIds = new ArrayList<>(); + ArrayList toAdd = new ArrayList<>(); for (Long teacherId : teacherIds){ User teacher = userRepo.findById((long) teacherId); if ( teacher== null){ return false; } - if (!addedIds.contains(teacherId)) + if (!toAdd.contains(teacher)) { - teacherCourseRepo.save(new TeacherCourse(teacher,course)); - addedIds.add(teacherId); + toAdd.add(teacher); } } + for (User teacher: toAdd){ + teacherCourseRepo.save(new TeacherCourse(teacher,course)); + } return true; } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/TokenService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/TokenService.java index 2f746ce..c20977d 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/TokenService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/TokenService.java @@ -40,16 +40,19 @@ public class TokenService { public User getUserFromToken(String token) { Token tokenRep = tokenRepo.getByToken(token); - if (tokenRep == null) return null; + if (tokenRep == null) + return null; + return tokenRep.getUser(); } public void saveToken(Token token){ //Si l'utilisateur a déja 5 token delete celui qui devait expirer le plus vite ArrayList tokenList = tokenRepo.getByUserOrderByExpirationDate(token.getUser()); + while(tokenList.size() >= 5){ - tokenRepo.delete(tokenList.get(0)); - tokenList.remove(tokenList.get(0)); + tokenRepo.delete(tokenList.getFirst()); + tokenList.remove(tokenList.getFirst()); } tokenRepo.save(token); } @@ -67,5 +70,5 @@ public class TokenService { tokenRepo.delete(t); } } - }; + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java index ee45d90..56f3abe 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java @@ -17,8 +17,15 @@ public class UserService { } + /** return the user identified by th identifier + * + * @param identifier can be an email or the RegNo + * @return the identified user + */ public User getUser(String identifier){ - if (identifier == null) return null; + if (identifier == null) + return null; + try { int id = Integer.parseInt(identifier); return userRepo.findById(id); @@ -33,7 +40,7 @@ public class UserService { * * @param poster the user wanting to modify target's data * @param updates the changes to be made - * @param target the user to update + * @param targetId the id of the user to update * @return if the changes were done or not */ public boolean modifyData(long targetId, Map updates, User poster){ @@ -45,8 +52,6 @@ public class UserService { if (poster.getRegNo().equals(target.getRegNo())){ for (Map.Entry entry : updates.entrySet()){ - if ( entry.getKey().equals("regNo") || entry.getKey().equals("role")) {return false;} - switch (entry.getKey()){ case "firstName": target.setFirstName((String) entry.getValue()); @@ -82,13 +87,14 @@ public class UserService { { for (Map.Entry entry : updates.entrySet()){ - if ( !entry.getKey().equals("role")) {return false;} + if ( entry.getKey().equals("role")) { - if (entry.getValue() == Role.Admin) {return false;} + if (entry.getValue() == Role.Admin) {return false;} - target.setRole((Role) entry.getValue()); - userRepo.save(target); - return true; + target.setRole((Role) entry.getValue()); + userRepo.save(target); + return true; + } } } return false; From c5d7ce41785be4156a3fbbbdd7a36fc11bc357b8 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sat, 16 Mar 2024 20:31:03 +0100 Subject: [PATCH 03/15] cleaned the Entities --- .../Clyde/Tables/InscriptionRequest.java | 10 +++++++++- ...Request.java => ReInscriptionRequest.java} | 8 ++++---- .../herisson/Clyde/Tables/StorageFile.java | 1 - .../java/ovh/herisson/Clyde/Tables/Token.java | 2 -- .../java/ovh/herisson/Clyde/Tables/User.java | 19 ++----------------- 5 files changed, 15 insertions(+), 25 deletions(-) rename backend/src/main/java/ovh/herisson/Clyde/Tables/{ReinscriptionRequest.java => ReInscriptionRequest.java} (88%) diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java index bc781be..b7bfea3 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java @@ -16,7 +16,7 @@ public class InscriptionRequest { private String country; private Date birthDate; - @ManyToOne + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name="Curriculum") private Curriculum curriculum; private RequestState state; @@ -112,4 +112,12 @@ public class InscriptionRequest { public void setProfilePicture(String profilePicture) { this.profilePicture = profilePicture; } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/ReinscriptionRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/ReInscriptionRequest.java similarity index 88% rename from backend/src/main/java/ovh/herisson/Clyde/Tables/ReinscriptionRequest.java rename to backend/src/main/java/ovh/herisson/Clyde/Tables/ReInscriptionRequest.java index 57ad53c..9bd3fba 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/ReinscriptionRequest.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/ReInscriptionRequest.java @@ -3,7 +3,7 @@ package ovh.herisson.Clyde.Tables; import jakarta.persistence.*; @Entity -public class ReinscriptionRequest { +public class ReInscriptionRequest { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @@ -21,16 +21,16 @@ public class ReinscriptionRequest { //Pour la réinscription on va le mettre a 0 private boolean type = false; - public ReinscriptionRequest(){} + public ReInscriptionRequest(){} - public ReinscriptionRequest(User user, Curriculum newCurriculum, RequestState state, boolean type){ + public ReInscriptionRequest(User user, Curriculum newCurriculum, RequestState state, boolean type){ this.user = user; this.newCurriculum = newCurriculum; this.state = state; this.type = type; } - public ReinscriptionRequest(User user, Curriculum newCurriculum, RequestState state){ + public ReInscriptionRequest(User user, Curriculum newCurriculum, RequestState state){ this.user = user; this.newCurriculum = newCurriculum; this.state = state; diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java index afa7985..800d99a 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/StorageFile.java @@ -24,7 +24,6 @@ public class StorageFile { public StorageFile(){} - public void setId(Long id) { this.id = id; } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Token.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Token.java index 8aa4c0e..29ef906 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/Token.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Token.java @@ -1,8 +1,6 @@ package ovh.herisson.Clyde.Tables; import jakarta.persistence.*; -import org.springframework.scheduling.annotation.Scheduled; -import ovh.herisson.Clyde.Repositories.TokenRepository; import java.util.Date; diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java index 1f6aa3b..de958df 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/User.java @@ -1,11 +1,8 @@ package ovh.herisson.Clyde.Tables; import jakarta.persistence.*; - import java.util.Date; -//Classe représentant un utilisateur l'attribut password demande surement un peu de rafinement niveau sécurité -//et l'attribut tokenApi doit encore être ajouté vu qu'il faut en discuter @Entity @Table(name = "Users") @@ -37,18 +34,6 @@ public class User { this.password = password; } - - /** Constructor for the first registration request from a student (can't specify a Role) - * - * @param lastName - * @param firstName - * @param email - * @param address - * @param country - * @param birthDate - * @param profilePictureUrl - * @param password - */ public User(String lastName, String firstName, String email, String address, String country, Date birthDate, String profilePictureUrl, String password) { @@ -95,8 +80,8 @@ public class User { return address; } - public void setAddress(String adress) { - this.address = adress; + public void setAddress(String address) { + this.address = address; } public String getCountry() { From 474a8d3f31f1b7da6642ce6f4cf55d3875c75e58 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 02:00:42 +0100 Subject: [PATCH 04/15] added POST /curriculum/{id} endopoint to post courses --- .../Clyde/EndPoints/CurriculumController.java | 19 ++++++++- .../Services/CurriculumCourseService.java | 42 ++++++++++++++++--- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java index 4cb9504..7a1bfe4 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CurriculumController.java @@ -30,13 +30,13 @@ public class CurriculumController { } @GetMapping("/curriculum/{id}") - public ResponseEntity findById(@PathVariable long id){ + public ResponseEntity> findById(@PathVariable long id){ Curriculum foundCurriculum = curriculumServ.findById(id); if (foundCurriculum == null) return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - return new ResponseEntity<>(foundCurriculum, HttpStatus.OK); + return new ResponseEntity<>(curriculumCourseServ.getDepthCurriculum(foundCurriculum), HttpStatus.OK); } @GetMapping("/curriculums") @@ -52,4 +52,19 @@ public class CurriculumController { return new ResponseEntity<>(curriculumServ.save(curriculum),HttpStatus.CREATED); } + + @PostMapping("/curriculum/{id}") + public ResponseEntity postCoursesToCurriculum(@RequestHeader("Authorization") String token, + @RequestBody Iterable coursesIds, + @PathVariable long id) + { + + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token)) + return new UnauthorizedResponse<>(null); + + if (!curriculumCourseServ.saveAll(coursesIds, curriculumServ.findById(id))) + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + + return new ResponseEntity<>(HttpStatus.OK); + } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java index 5e1992d..0173a05 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java @@ -1,10 +1,10 @@ package ovh.herisson.Clyde.Services; import org.springframework.stereotype.Service; +import ovh.herisson.Clyde.Repositories.CourseRepository; import ovh.herisson.Clyde.Repositories.CurriculumCourseRepository; -import ovh.herisson.Clyde.Tables.Course; -import ovh.herisson.Clyde.Tables.Curriculum; -import ovh.herisson.Clyde.Tables.CurriculumCourse; +import ovh.herisson.Clyde.Tables.*; + import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -14,9 +14,11 @@ public class CurriculumCourseService { private final CurriculumCourseRepository curriculumCourseRepo; + private final CourseRepository courseRepo; - public CurriculumCourseService(CurriculumCourseRepository curriculumCourseRepository) { + public CurriculumCourseService(CurriculumCourseRepository curriculumCourseRepository, CourseRepository courseRepo) { this.curriculumCourseRepo = curriculumCourseRepository; + this.courseRepo = courseRepo; } public void save(CurriculumCourse curriculumCourse){ @@ -31,7 +33,9 @@ public class CurriculumCourseService { HashMap toReturn = new HashMap<>(); ArrayList courses = new ArrayList<>(); - for (Course c: curriculumCourseRepo.findCoursesByCurriculum(curriculum)){ + Iterable foundCourses = curriculumCourseRepo.findCoursesByCurriculum(curriculum); + + for (Course c: foundCourses){ courses.add(c); } toReturn.put("courses",courses); @@ -52,4 +56,32 @@ public class CurriculumCourseService { } return toReturn; } + + /** tries to add all courses to the curriculum + * + * @param coursesIds the ids of the courses to be added + * @param curriculum the curriculum to add the courses to + * @return if the changes were made + */ + public boolean saveAll(Iterable coursesIds, Curriculum curriculum) { + + if (curriculum == null || coursesIds == null) + return false; + + ArrayList toAdd = new ArrayList<>(); + for (Long courseId : coursesIds){ + Course course = courseRepo.findById((long) courseId); + if (course == null) + return false; + + if (!toAdd.contains(course)) + toAdd.add(course); + } + + for (Course course : toAdd){ + curriculumCourseRepo.save(new CurriculumCourse(curriculum,course)); + } + return true; + + } } From 6e6bd285afb6a9c55795aee454ce470a666b220a Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 02:15:08 +0100 Subject: [PATCH 05/15] added security to the post of course and GET /courses --- .../Clyde/EndPoints/CourseController.java | 15 ++++++++++++++- .../herisson/Clyde/Services/CourseService.java | 8 ++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java index ebfa730..60e7e1e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java @@ -40,6 +40,15 @@ public class CourseController { return new ResponseEntity<>(foundCourse, HttpStatus.OK); } + @GetMapping("/courses") + public ResponseEntity> getAllCourses(@RequestHeader("Authorization") String token){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token)) + return new UnauthorizedResponse<>(null); + + + return new ResponseEntity<>(courseServ.findAll(),HttpStatus.OK); + } + @PostMapping("/course") public ResponseEntity postCourse(@RequestHeader("Authorization") String token, @@ -49,7 +58,11 @@ public class CourseController { if (authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token)) return new UnauthorizedResponse<>(null); - return new ResponseEntity<>(courseServ.save(course), HttpStatus.CREATED); + Course createdCourse = courseServ.save(course); + if (createdCourse == null) + return new ResponseEntity<>(null,HttpStatus.BAD_REQUEST); + + return new ResponseEntity<>(createdCourse, HttpStatus.CREATED); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java index abfa6ae..bdb9ae8 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java @@ -17,6 +17,8 @@ public class CourseService { } public Course save(Course course){ + if (course.getOwner().getRole() != Role.Teacher) + return null; return courseRepo.save(course); } @@ -24,6 +26,11 @@ public class CourseService { return courseRepo.findById(id); } + + public Iterable findAll() { + return courseRepo.findAll(); + } + public boolean modifyData(long id, Map updates, Role role) { Course target = courseRepo.findById(id); @@ -62,4 +69,5 @@ public class CourseService { courseRepo.save(target); return true; } + } From 4cf2ac1aa8c0bf8ecfd540653519b3d1c4f0205b Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 02:34:00 +0100 Subject: [PATCH 06/15] fixed an issue with the getting of curriculums --- .../Clyde/Services/CurriculumCourseService.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java index 0173a05..a32e9d6 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java @@ -3,6 +3,7 @@ package ovh.herisson.Clyde.Services; import org.springframework.stereotype.Service; import ovh.herisson.Clyde.Repositories.CourseRepository; import ovh.herisson.Clyde.Repositories.CurriculumCourseRepository; +import ovh.herisson.Clyde.Repositories.CurriculumRepository; import ovh.herisson.Clyde.Tables.*; import java.util.ArrayList; @@ -16,9 +17,12 @@ public class CurriculumCourseService { private final CourseRepository courseRepo; - public CurriculumCourseService(CurriculumCourseRepository curriculumCourseRepository, CourseRepository courseRepo) { + private final CurriculumRepository curriculumRepo; + + public CurriculumCourseService(CurriculumCourseRepository curriculumCourseRepository, CourseRepository courseRepo, CurriculumRepository curriculumRepo) { this.curriculumCourseRepo = curriculumCourseRepository; this.courseRepo = courseRepo; + this.curriculumRepo = curriculumRepo; } public void save(CurriculumCourse curriculumCourse){ @@ -51,9 +55,11 @@ public class CurriculumCourseService { ArrayList> toReturn = new ArrayList<>(); - for (Curriculum curriculum : curriculumCourseRepo.findDistinctCurriculums()){ + for (Curriculum curriculum : curriculumRepo.findAll()){ toReturn.add(getDepthCurriculum(curriculum)); } + + return toReturn; } @@ -70,6 +76,7 @@ public class CurriculumCourseService { ArrayList toAdd = new ArrayList<>(); for (Long courseId : coursesIds){ + Course course = courseRepo.findById((long) courseId); if (course == null) return false; From 1d793cef4eae3b62fda3530be8ddf22fad9b3dbb Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 02:40:05 +0100 Subject: [PATCH 07/15] moved UserWithouPaswword to authenticatorService --- .../Clyde/EndPoints/UserController.java | 28 +++---------------- .../Clyde/Services/AuthenticatorService.java | 21 ++++++++++++++ 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java index f4782e5..3f68141 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java @@ -35,7 +35,7 @@ public class UserController { User user = authServ.getUserFromToken(token); if (user == null) return new UnauthorizedResponse<>(null); - return new ResponseEntity<>(userWithoutPassword(user), HttpStatus.OK); + return new ResponseEntity<>(authServ.userWithoutPassword(user), HttpStatus.OK); } @PostMapping("/user") @@ -44,7 +44,7 @@ public class UserController { if (authServ.isNotIn(new Role[]{Role.Admin,Role.InscriptionService,Role.Secretary},token)) return new UnauthorizedResponse<>(null); - return new ResponseEntity<>(userWithoutPassword(userService.save(user)),HttpStatus.CREATED); + return new ResponseEntity<>(authServ.userWithoutPassword(userService.save(user)),HttpStatus.CREATED); } @GetMapping("/users") @@ -57,7 +57,7 @@ public class UserController { ArrayList> withoutPassword = new ArrayList<>(); for (User u :users){ - withoutPassword.add(userWithoutPassword(u)); + withoutPassword.add(authServ.userWithoutPassword(u)); } return new ResponseEntity<>(withoutPassword, HttpStatus.OK); } @@ -95,30 +95,10 @@ public class UserController { ArrayList> withoutPassword = new ArrayList<>(); for (User t: teachers){ - withoutPassword.add(userWithoutPassword(t)); + withoutPassword.add(authServ.userWithoutPassword(t)); } return new ResponseEntity<>(withoutPassword, HttpStatus.OK); } - - - - /** return user's data except password - * @param user the user to return - * @return all the user data without the password - */ - private HashMap userWithoutPassword(User user){ - HashMap toReturn = new HashMap<>(); - toReturn.put("regNo",user.getRegNo()); - toReturn.put("lastName",user.getLastName()); - toReturn.put("firstName",user.getFirstName()); - toReturn.put("email", user.getEmail()); - toReturn.put("address",user.getAddress()); - toReturn.put("birthDate",user.getBirthDate()); - toReturn.put("country",user.getCountry()); - toReturn.put("profilePictureUrl",user.getProfilePictureUrl()); - toReturn.put("role",user.getRole()); - return toReturn; - } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java index 15ae7eb..cbd0a6d 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java @@ -7,6 +7,7 @@ import ovh.herisson.Clyde.Tables.Token; import ovh.herisson.Clyde.Tables.User; import java.util.Date; +import java.util.HashMap; @Service public class AuthenticatorService { @@ -52,5 +53,25 @@ public class AuthenticatorService { } return true; } + + + + /** return user's data except password + * @param user the user to return + * @return all the user data without the password + */ + public HashMap userWithoutPassword(User user){ + HashMap toReturn = new HashMap<>(); + toReturn.put("regNo",user.getRegNo()); + toReturn.put("lastName",user.getLastName()); + toReturn.put("firstName",user.getFirstName()); + toReturn.put("email", user.getEmail()); + toReturn.put("address",user.getAddress()); + toReturn.put("birthDate",user.getBirthDate()); + toReturn.put("country",user.getCountry()); + toReturn.put("profilePictureUrl",user.getProfilePictureUrl()); + toReturn.put("role",user.getRole()); + return toReturn; + } } From a70b05a0ef240cc42b36ab52f367672c9fc248f4 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 02:45:49 +0100 Subject: [PATCH 08/15] protected course'owner password --- .../Clyde/EndPoints/CourseController.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java index ebfa730..c86b46e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java @@ -9,6 +9,8 @@ import ovh.herisson.Clyde.Services.CourseService; import ovh.herisson.Clyde.Services.TeacherCourseService; import ovh.herisson.Clyde.Tables.Course; import ovh.herisson.Clyde.Tables.Role; + +import java.util.HashMap; import java.util.Map; @RestController @@ -28,7 +30,7 @@ public class CourseController { } @GetMapping("/course/{id}") - public ResponseEntity getCourse(@RequestHeader("Authorization") String token, @PathVariable long id){ + public ResponseEntity> getCourse(@RequestHeader("Authorization") String token, @PathVariable long id){ if (authServ.getUserFromToken(token) == null) return new UnauthorizedResponse<>(null); @@ -37,7 +39,7 @@ public class CourseController { if (foundCourse == null) return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - return new ResponseEntity<>(foundCourse, HttpStatus.OK); + return new ResponseEntity<>(courseWithoutPassword(foundCourse), HttpStatus.OK); } @@ -85,4 +87,15 @@ public class CourseController { return new ResponseEntity<>(HttpStatus.OK); } + + + + private HashMap courseWithoutPassword(Course course){ + HashMap toReturn = new HashMap<>(); + + toReturn.put("courseId",course.getCourseID()); + toReturn.put("credits",course.getCredits()); + toReturn.put("title", course.getTitle()); + toReturn.put("owner", authServ.userWithoutPassword(course.getOwner())); + } } From f2507ddcdd6b05d34b5e7f30615b80a4ad8e5c41 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 02:46:33 +0100 Subject: [PATCH 09/15] forgot the return statement --- .../main/java/ovh/herisson/Clyde/EndPoints/CourseController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java index c86b46e..05c9d96 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java @@ -97,5 +97,6 @@ public class CourseController { toReturn.put("credits",course.getCredits()); toReturn.put("title", course.getTitle()); toReturn.put("owner", authServ.userWithoutPassword(course.getOwner())); + return toReturn; } } From f7df234312ebed12e03d100d9578ba08cd356042 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 03:06:19 +0100 Subject: [PATCH 10/15] moved portective method to Static ProtectiveService --- .../Clyde/EndPoints/CourseController.java | 30 +++++++-------- .../Clyde/EndPoints/UserController.java | 9 +++-- .../Clyde/Services/AuthenticatorService.java | 25 +----------- .../Services/CurriculumCourseService.java | 5 +-- .../Clyde/Services/ProtectionService.java | 38 +++++++++++++++++++ 5 files changed, 59 insertions(+), 48 deletions(-) create mode 100644 backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java index a7a9719..82e66da 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java @@ -6,10 +6,12 @@ import org.springframework.web.bind.annotation.*; import ovh.herisson.Clyde.Responses.UnauthorizedResponse; import ovh.herisson.Clyde.Services.AuthenticatorService; import ovh.herisson.Clyde.Services.CourseService; +import ovh.herisson.Clyde.Services.ProtectionService; import ovh.herisson.Clyde.Services.TeacherCourseService; import ovh.herisson.Clyde.Tables.Course; import ovh.herisson.Clyde.Tables.Role; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -39,21 +41,27 @@ public class CourseController { if (foundCourse == null) return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - return new ResponseEntity<>(courseWithoutPassword(foundCourse), HttpStatus.OK); + return new ResponseEntity<>(ProtectionService.courseWithoutPassword(foundCourse), HttpStatus.OK); } @GetMapping("/courses") - public ResponseEntity> getAllCourses(@RequestHeader("Authorization") String token){ + public ResponseEntity>> getAllCourses(@RequestHeader("Authorization") String token){ if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token)) return new UnauthorizedResponse<>(null); + Iterable courses = courseServ.findAll(); + ArrayList> coursesWithoutPassword = new ArrayList<>(); - return new ResponseEntity<>(courseServ.findAll(),HttpStatus.OK); + for (Course course: courses){ + coursesWithoutPassword.add(ProtectionService.courseWithoutPassword(course)); + } + + return new ResponseEntity<>(coursesWithoutPassword,HttpStatus.OK); } @PostMapping("/course") - public ResponseEntity postCourse(@RequestHeader("Authorization") String token, + public ResponseEntity> postCourse(@RequestHeader("Authorization") String token, @RequestBody Course course) { @@ -64,7 +72,7 @@ public class CourseController { if (createdCourse == null) return new ResponseEntity<>(null,HttpStatus.BAD_REQUEST); - return new ResponseEntity<>(createdCourse, HttpStatus.CREATED); + return new ResponseEntity<>(ProtectionService.courseWithoutPassword(createdCourse), HttpStatus.CREATED); } @@ -100,16 +108,4 @@ public class CourseController { return new ResponseEntity<>(HttpStatus.OK); } - - - - private HashMap courseWithoutPassword(Course course){ - HashMap toReturn = new HashMap<>(); - - toReturn.put("courseId",course.getCourseID()); - toReturn.put("credits",course.getCredits()); - toReturn.put("title", course.getTitle()); - toReturn.put("owner", authServ.userWithoutPassword(course.getOwner())); - return toReturn; - } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java index 3f68141..c449a27 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java @@ -5,6 +5,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import ovh.herisson.Clyde.Responses.UnauthorizedResponse; import ovh.herisson.Clyde.Services.AuthenticatorService; +import ovh.herisson.Clyde.Services.ProtectionService; import ovh.herisson.Clyde.Services.UserService; import ovh.herisson.Clyde.Tables.Role; import ovh.herisson.Clyde.Tables.User; @@ -35,7 +36,7 @@ public class UserController { User user = authServ.getUserFromToken(token); if (user == null) return new UnauthorizedResponse<>(null); - return new ResponseEntity<>(authServ.userWithoutPassword(user), HttpStatus.OK); + return new ResponseEntity<>(ProtectionService.userWithoutPassword(user), HttpStatus.OK); } @PostMapping("/user") @@ -44,7 +45,7 @@ public class UserController { if (authServ.isNotIn(new Role[]{Role.Admin,Role.InscriptionService,Role.Secretary},token)) return new UnauthorizedResponse<>(null); - return new ResponseEntity<>(authServ.userWithoutPassword(userService.save(user)),HttpStatus.CREATED); + return new ResponseEntity<>(ProtectionService.userWithoutPassword(userService.save(user)),HttpStatus.CREATED); } @GetMapping("/users") @@ -57,7 +58,7 @@ public class UserController { ArrayList> withoutPassword = new ArrayList<>(); for (User u :users){ - withoutPassword.add(authServ.userWithoutPassword(u)); + withoutPassword.add(ProtectionService.userWithoutPassword(u)); } return new ResponseEntity<>(withoutPassword, HttpStatus.OK); } @@ -95,7 +96,7 @@ public class UserController { ArrayList> withoutPassword = new ArrayList<>(); for (User t: teachers){ - withoutPassword.add(authServ.userWithoutPassword(t)); + withoutPassword.add(ProtectionService.userWithoutPassword(t)); } return new ResponseEntity<>(withoutPassword, HttpStatus.OK); diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java index cbd0a6d..a73182a 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java @@ -1,10 +1,7 @@ package ovh.herisson.Clyde.Services; import org.springframework.stereotype.Service; -import ovh.herisson.Clyde.Tables.InscriptionRequest; -import ovh.herisson.Clyde.Tables.Role; -import ovh.herisson.Clyde.Tables.Token; -import ovh.herisson.Clyde.Tables.User; +import ovh.herisson.Clyde.Tables.*; import java.util.Date; import java.util.HashMap; @@ -53,25 +50,5 @@ public class AuthenticatorService { } return true; } - - - - /** return user's data except password - * @param user the user to return - * @return all the user data without the password - */ - public HashMap userWithoutPassword(User user){ - HashMap toReturn = new HashMap<>(); - toReturn.put("regNo",user.getRegNo()); - toReturn.put("lastName",user.getLastName()); - toReturn.put("firstName",user.getFirstName()); - toReturn.put("email", user.getEmail()); - toReturn.put("address",user.getAddress()); - toReturn.put("birthDate",user.getBirthDate()); - toReturn.put("country",user.getCountry()); - toReturn.put("profilePictureUrl",user.getProfilePictureUrl()); - toReturn.put("role",user.getRole()); - return toReturn; - } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java index a32e9d6..19549d0 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CurriculumCourseService.java @@ -36,11 +36,11 @@ public class CurriculumCourseService { return null; HashMap toReturn = new HashMap<>(); - ArrayList courses = new ArrayList<>(); + ArrayList> courses = new ArrayList<>(); Iterable foundCourses = curriculumCourseRepo.findCoursesByCurriculum(curriculum); for (Course c: foundCourses){ - courses.add(c); + courses.add(ProtectionService.courseWithoutPassword(c)); } toReturn.put("courses",courses); toReturn.put("curriculumId", curriculum.getCurriculumId()); @@ -89,6 +89,5 @@ public class CurriculumCourseService { curriculumCourseRepo.save(new CurriculumCourse(curriculum,course)); } return true; - } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java new file mode 100644 index 0000000..8c778e1 --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java @@ -0,0 +1,38 @@ +package ovh.herisson.Clyde.Services; + +import ovh.herisson.Clyde.Tables.Course; +import ovh.herisson.Clyde.Tables.User; + +import java.util.HashMap; + +public class ProtectionService { + + /** return user's data except password + * @param user the user to return + * @return all the user data without the password + */ + public static HashMap userWithoutPassword(User user){ + HashMap toReturn = new HashMap<>(); + toReturn.put("regNo",user.getRegNo()); + toReturn.put("lastName",user.getLastName()); + toReturn.put("firstName",user.getFirstName()); + toReturn.put("email", user.getEmail()); + toReturn.put("address",user.getAddress()); + toReturn.put("birthDate",user.getBirthDate()); + toReturn.put("country",user.getCountry()); + toReturn.put("profilePictureUrl",user.getProfilePictureUrl()); + toReturn.put("role",user.getRole()); + return toReturn; + } + public static HashMap courseWithoutPassword(Course course){ + HashMap toReturn = new HashMap<>(); + + toReturn.put("courseId",course.getCourseID()); + toReturn.put("credits",course.getCredits()); + toReturn.put("title", course.getTitle()); + toReturn.put("owner", userWithoutPassword(course.getOwner())); + return toReturn; + } + +} + From cf2deb983deae06caacb50243812e92bcbd0533e Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 12:13:03 +0100 Subject: [PATCH 11/15] added security to assistant posting and Get courses/owned for owners --- .../Clyde/EndPoints/CourseController.java | 25 ++++++++++++----- .../Clyde/EndPoints/UserController.java | 14 ++-------- .../Clyde/Repositories/CourseRepository.java | 7 +++++ .../Repositories/TeacherCourseRepository.java | 6 +++++ .../Clyde/Services/CourseService.java | 7 +++++ .../Clyde/Services/ProtectionService.java | 27 +++++++++++++++++++ .../Clyde/Services/TeacherCourseService.java | 11 +++++++- 7 files changed, 77 insertions(+), 20 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java index 82e66da..f3e93d4 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/CourseController.java @@ -10,8 +10,8 @@ import ovh.herisson.Clyde.Services.ProtectionService; import ovh.herisson.Clyde.Services.TeacherCourseService; import ovh.herisson.Clyde.Tables.Course; import ovh.herisson.Clyde.Tables.Role; +import ovh.herisson.Clyde.Tables.User; -import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -49,14 +49,25 @@ public class CourseController { if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token)) return new UnauthorizedResponse<>(null); - Iterable courses = courseServ.findAll(); - ArrayList> coursesWithoutPassword = new ArrayList<>(); + return new ResponseEntity<>(ProtectionService.coursesWithoutPasswords(courseServ.findAll()),HttpStatus.OK); + } - for (Course course: courses){ - coursesWithoutPassword.add(ProtectionService.courseWithoutPassword(course)); - } + @GetMapping("/courses/owned") + public ResponseEntity>> getOwnedCourses(@RequestHeader("Authorization") String token){ + if (authServ.isNotIn(new Role[]{Role.Admin,Role.Teacher},token)) + return new UnauthorizedResponse<>(null); - return new ResponseEntity<>(coursesWithoutPassword,HttpStatus.OK); + return new ResponseEntity<>(ProtectionService.coursesWithoutPasswords(courseServ.findOwnedCourses(authServ.getUserFromToken(token))),HttpStatus.OK); + } + + @GetMapping("/course/{id}/assistants") + public ResponseEntity>> getCourseAssistants(@RequestHeader("Authorization")String token, @PathVariable long id){ + if (authServ.getUserFromToken(token) == null) + return new UnauthorizedResponse<>(null); + + Iterable assistants = teacherCourseServ.findCourseAssistants(courseServ.findById(id)); + + return new ResponseEntity<>(ProtectionService.usersWithoutPasswords(assistants),HttpStatus.OK); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java index c449a27..bcc866f 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java @@ -9,7 +9,6 @@ import ovh.herisson.Clyde.Services.ProtectionService; import ovh.herisson.Clyde.Services.UserService; import ovh.herisson.Clyde.Tables.Role; import ovh.herisson.Clyde.Tables.User; -import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -55,12 +54,8 @@ public class UserController { return new UnauthorizedResponse<>(null); Iterable users = userService.getAll(); - ArrayList> withoutPassword = new ArrayList<>(); - for (User u :users){ - withoutPassword.add(ProtectionService.userWithoutPassword(u)); - } - return new ResponseEntity<>(withoutPassword, HttpStatus.OK); + return new ResponseEntity<>(ProtectionService.usersWithoutPasswords(users), HttpStatus.OK); } /** changes the specified user's information @@ -93,13 +88,8 @@ public class UserController { return new UnauthorizedResponse<>(null); Iterable teachers = userService.getAllTeachers(); - ArrayList> withoutPassword = new ArrayList<>(); - for (User t: teachers){ - withoutPassword.add(ProtectionService.userWithoutPassword(t)); - } - - return new ResponseEntity<>(withoutPassword, HttpStatus.OK); + return new ResponseEntity<>(ProtectionService.usersWithoutPasswords(teachers), HttpStatus.OK); } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/CourseRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/CourseRepository.java index 671a995..aa7564a 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/CourseRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/CourseRepository.java @@ -1,8 +1,15 @@ package ovh.herisson.Clyde.Repositories; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import ovh.herisson.Clyde.Tables.Course; +import ovh.herisson.Clyde.Tables.User; public interface CourseRepository extends CrudRepository { Course findById(long id); + + + @Query("select c from Course c where c.owner = ?1") + Iterable findAllOwnedCoures(User teacher); + } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/TeacherCourseRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/TeacherCourseRepository.java index ffe654a..3dbb7ff 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/TeacherCourseRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/TeacherCourseRepository.java @@ -1,8 +1,14 @@ package ovh.herisson.Clyde.Repositories; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; +import ovh.herisson.Clyde.Tables.Course; import ovh.herisson.Clyde.Tables.TeacherCourse; +import ovh.herisson.Clyde.Tables.User; public interface TeacherCourseRepository extends CrudRepository { + + @Query("select tc.user from TeacherCourse tc where tc.course = ?1") + Iterable findAllAssistantOfCourse(Course course); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java index bdb9ae8..b5dd906 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/CourseService.java @@ -31,6 +31,13 @@ public class CourseService { return courseRepo.findAll(); } + + public Iterable findOwnedCourses(User userFromToken) { + return courseRepo.findAllOwnedCoures(userFromToken); + } + + + public boolean modifyData(long id, Map updates, Role role) { Course target = courseRepo.findById(id); diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java index 8c778e1..7f2bea8 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java @@ -3,6 +3,7 @@ package ovh.herisson.Clyde.Services; import ovh.herisson.Clyde.Tables.Course; import ovh.herisson.Clyde.Tables.User; +import java.util.ArrayList; import java.util.HashMap; public class ProtectionService { @@ -13,6 +14,7 @@ public class ProtectionService { */ public static HashMap userWithoutPassword(User user){ HashMap toReturn = new HashMap<>(); + toReturn.put("regNo",user.getRegNo()); toReturn.put("lastName",user.getLastName()); toReturn.put("firstName",user.getFirstName()); @@ -24,6 +26,19 @@ public class ProtectionService { toReturn.put("role",user.getRole()); return toReturn; } + + public static Iterable>usersWithoutPasswords(Iterable users){ + ArrayList> toReturn = new ArrayList<>(); + + for (User u : users){ + toReturn.add(userWithoutPassword(u)); + } + + return toReturn; + } + + + public static HashMap courseWithoutPassword(Course course){ HashMap toReturn = new HashMap<>(); @@ -34,5 +49,17 @@ public class ProtectionService { return toReturn; } + public static Iterable> coursesWithoutPasswords(Iterable courses){ + ArrayList> toReturn = new ArrayList<>(); + + for (Course course: courses){ + toReturn.add(ProtectionService.courseWithoutPassword(course)); + } + + return toReturn; + + } + + } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java index 84900a8..dee3a7b 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/TeacherCourseService.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Controller; import ovh.herisson.Clyde.Repositories.TeacherCourseRepository; import ovh.herisson.Clyde.Repositories.UserRepository; import ovh.herisson.Clyde.Tables.Course; +import ovh.herisson.Clyde.Tables.Role; import ovh.herisson.Clyde.Tables.TeacherCourse; import ovh.herisson.Clyde.Tables.User; @@ -20,6 +21,13 @@ public class TeacherCourseService { this.userRepo = userRepo; } + public Iterable findCourseAssistants(Course course) { + if (course == null) + return null; + return teacherCourseRepo.findAllAssistantOfCourse(course); + } + + public boolean saveAll(Iterable teacherIds, Course course){ if (course == null || teacherIds == null) @@ -31,7 +39,7 @@ public class TeacherCourseService { if ( teacher== null){ return false; } - if (!toAdd.contains(teacher)) + if (!toAdd.contains(teacher) && teacher.getRole() == Role.Teacher) { toAdd.add(teacher); } @@ -41,4 +49,5 @@ public class TeacherCourseService { } return true; } + } From ea46dd664cd3ea193dfd754c5e6a6199fa84b79e Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 16:02:30 +0100 Subject: [PATCH 12/15] added a todo to send an email for every state changement of request --- .../Clyde/EndPoints/InscriptionController.java | 16 ---------------- .../Clyde/Services/InscriptionService.java | 10 ++++++++++ 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java index 814c185..1c273ba 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java @@ -58,22 +58,6 @@ public class InscriptionController { return new ResponseEntity<>(requestWithoutPassword(foundInscriptionRequest), HttpStatus.OK); } - /** - @GetMapping("request/user") - public ResponseEntity getUserInscriptionRequest(@RequestHeader("Authorization") String token){ - //todo return l'inscriptionRequest ACTUELLE du user (check si le poster est bien le même que id target ou secretariat) - - if (authServ.IsNotIn(new Role[]{Role.Student,Role.Admin},token)) - return new UnauthorizedResponse<>(null); - - User poster = authServ.getUserFromToken(token); - - inscriptionServ.getById() - - - return null; - } **/ - @PatchMapping("/request/register/{id}") public ResponseEntity changeRequestState(@PathVariable long id, @RequestHeader("Authorization") String token, diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java index 31b18a6..4712f8f 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java @@ -32,6 +32,16 @@ public class InscriptionService { if (inscriptionRequest == null) return false; + // if th state is the same we don't send an email + if (requestState == inscriptionRequest.getState()) + return false; + + /** todo send an email to tell the poster of the inscriptionRequest (inscriptionRequest.getEmail()) + * to notify them that the state of their request changed + * FooEmailFormat toSend = (String.format("Your request state changed from %s to %s"), + * inscriptionRequest.getState(), requestState) + * FooEmailSender.send(toSend, inscriptionRequest.getEmail()) + */ inscriptionRequest.setState(requestState); save(inscriptionRequest); return true; From 37f8a3ac4e9170b7ec3a605bf2d0c57596de5903 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 16:25:00 +0100 Subject: [PATCH 13/15] removed an unused variable --- .../ovh/herisson/Clyde/EndPoints/ApplicationsController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java index a708ec1..f09e92e 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/ApplicationsController.java @@ -54,8 +54,6 @@ public class ApplicationsController { // if authed authorizedApps.add(Applications.Profile); - Role posterRole = user.getRole(); - if (!authServ.isNotIn(new Role[]{Role.Teacher,Role.Student,Role.Admin},token)) { authorizedApps.add(Applications.Msg); authorizedApps.add(Applications.Forum); From 76f5a39a8f91c47448182f447374d96d4e1ff6b7 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 16:26:30 +0100 Subject: [PATCH 14/15] GET /users doesn't return Admins if the poster isn't an admin --- .../ovh/herisson/Clyde/EndPoints/UserController.java | 12 +++++++++++- .../herisson/Clyde/Repositories/UserRepository.java | 5 +++++ .../ovh/herisson/Clyde/Services/UserService.java | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java index aee09b6..2ace404 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java @@ -9,6 +9,8 @@ import ovh.herisson.Clyde.Services.ProtectionService; import ovh.herisson.Clyde.Services.UserService; import ovh.herisson.Clyde.Tables.Role; import ovh.herisson.Clyde.Tables.User; + +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -53,7 +55,15 @@ public class UserController { if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token)) return new UnauthorizedResponse<>(null); - Iterable users = userService.getAll(); + Role posterRole = authServ.getUserFromToken(token).getRole(); + + Iterable users = new ArrayList<>(); + + if (posterRole == Role.Admin) + users = userService.getAll(); + + else if (posterRole == Role.Secretary) + users = userService.getAllExceptAdmins(); return new ResponseEntity<>(ProtectionService.usersWithoutPasswords(users), HttpStatus.OK); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java index a275948..413f090 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserRepository.java @@ -10,9 +10,14 @@ public interface UserRepository extends CrudRepository { User findByEmail(String email); + + @Query("select u from User u where u.role = ovh.herisson.Clyde.Tables.Role.Teacher") Iterable findAllTeachers(); @Query("select u from User u where u.role = ovh.herisson.Clyde.Tables.Role.Student") Iterable findAllStudents(); + + @Query("select u from User u where u.role <> ovh.herisson.Clyde.Tables.Role.Admin") + Iterable findAllExceptAdmins(); } \ No newline at end of file diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java index 52078dc..3d30a89 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/UserService.java @@ -114,6 +114,10 @@ public class UserService { return userRepo.findAll(); } + public Iterable getAllExceptAdmins(){ + return userRepo.findAllExceptAdmins(); + } + public Iterable getAllTeachers (){return userRepo.findAllTeachers();} From ea4a0745e0fbc4a835f80361df74ddc9dd035af3 Mon Sep 17 00:00:00 2001 From: Bartha Maxime <231026@umons.ac.be> Date: Sun, 17 Mar 2024 17:15:33 +0100 Subject: [PATCH 15/15] creation of the user when request accepted --- .../EndPoints/InscriptionController.java | 2 +- .../Clyde/EndPoints/LoginController.java | 2 +- .../UserCurriculumRepository.java | 7 +++ .../Clyde/Services/AuthenticatorService.java | 2 - .../Clyde/Services/InscriptionService.java | 61 ++++++++++++++++--- .../Clyde/Tables/InscriptionRequest.java | 16 +++-- 6 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 backend/src/main/java/ovh/herisson/Clyde/Repositories/UserCurriculumRepository.java diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java index 1c273ba..6c71fd3 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/InscriptionController.java @@ -83,7 +83,7 @@ public class InscriptionController { toReturn.put("email",inscriptionRequest.getEmail()); toReturn.put("birthDate", inscriptionRequest.getBirthDate()); toReturn.put("country", inscriptionRequest.getCountry()); - toReturn.put("curriculum", inscriptionRequest.getCurriculum()); + toReturn.put("curriculum", inscriptionRequest.getCurriculumId()); toReturn.put("state", inscriptionRequest.getState()); toReturn.put("profilePictureUrl", inscriptionRequest.getProfilePicture()); diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java index 6e0b4fa..9367484 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java +++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/LoginController.java @@ -44,7 +44,7 @@ public class LoginController { return ResponseEntity.ok().headers(responseHeaders).build(); } - @PostMapping("/request/register") + @PostMapping("/register") public ResponseEntity register(@RequestBody InscriptionRequest inscriptionRequest){ return new ResponseEntity<>(authServ.register(inscriptionRequest), HttpStatus.CREATED); } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserCurriculumRepository.java b/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserCurriculumRepository.java new file mode 100644 index 0000000..93cb10f --- /dev/null +++ b/backend/src/main/java/ovh/herisson/Clyde/Repositories/UserCurriculumRepository.java @@ -0,0 +1,7 @@ +package ovh.herisson.Clyde.Repositories; + +import org.springframework.data.repository.CrudRepository; +import ovh.herisson.Clyde.Tables.UserCurriculum; + +public interface UserCurriculumRepository extends CrudRepository { +} diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java index a73182a..fc29fb6 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/AuthenticatorService.java @@ -2,9 +2,7 @@ package ovh.herisson.Clyde.Services; import org.springframework.stereotype.Service; import ovh.herisson.Clyde.Tables.*; - import java.util.Date; -import java.util.HashMap; @Service public class AuthenticatorService { diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java index 4712f8f..7ae6e74 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Services/InscriptionService.java @@ -1,20 +1,39 @@ package ovh.herisson.Clyde.Services; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; +import ovh.herisson.Clyde.Repositories.CurriculumRepository; import ovh.herisson.Clyde.Repositories.InscriptionRepository; +import ovh.herisson.Clyde.Repositories.UserCurriculumRepository; +import ovh.herisson.Clyde.Repositories.UserRepository; import ovh.herisson.Clyde.Tables.InscriptionRequest; import ovh.herisson.Clyde.Tables.RequestState; +import ovh.herisson.Clyde.Tables.User; +import ovh.herisson.Clyde.Tables.UserCurriculum; @Service public class InscriptionService { - InscriptionRepository inscriptionRepo; + private final InscriptionRepository inscriptionRepo; - public InscriptionService(InscriptionRepository inscriptionRepo){ + private final UserRepository userRepo; + + private final UserCurriculumRepository userCurriculumRepo; + + private final CurriculumRepository curriculumRepo; + + private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + + + public InscriptionService(InscriptionRepository inscriptionRepo, UserRepository userRepo, UserCurriculumRepository userCurriculumRepo, CurriculumRepository curriculumRepo){ this.inscriptionRepo = inscriptionRepo; + this.userRepo = userRepo; + this.userCurriculumRepo = userCurriculumRepo; + this.curriculumRepo = curriculumRepo; } public InscriptionRequest save(InscriptionRequest inscriptionRequest){ + inscriptionRequest.setPassword(passwordEncoder.encode(inscriptionRequest.getPassword())); return inscriptionRepo.save(inscriptionRequest); } @@ -27,23 +46,45 @@ public class InscriptionService { } public boolean modifyState(long id, RequestState requestState) { - InscriptionRequest inscriptionRequest = getById(id); + InscriptionRequest inscrRequest = getById(id); - if (inscriptionRequest == null) + if (inscrRequest == null) return false; // if th state is the same we don't send an email - if (requestState == inscriptionRequest.getState()) + if (requestState == inscrRequest.getState()) return false; - /** todo send an email to tell the poster of the inscriptionRequest (inscriptionRequest.getEmail()) + /** todo send an email to tell the poster of the inscrRequest (inscrRequest.getEmail()) * to notify them that the state of their request changed * FooEmailFormat toSend = (String.format("Your request state changed from %s to %s"), - * inscriptionRequest.getState(), requestState) - * FooEmailSender.send(toSend, inscriptionRequest.getEmail()) + * inscrRequest.getState(), requestState) + * FooEmailSender.send(toSend, inscrRequest.getEmail()) */ - inscriptionRequest.setState(requestState); - save(inscriptionRequest); + + + //saves the user from the request if accepted + if (requestState == RequestState.Accepted) + { + if (curriculumRepo.findById(inscrRequest.getCurriculumId()) == null) + return false; + + User userFromRequest = new User( + inscrRequest.getLastName(), + inscrRequest.getFirstName(), + inscrRequest.getEmail(), + inscrRequest.getAddress(), + inscrRequest.getCountry(), + inscrRequest.getBirthDate(), + inscrRequest.getProfilePicture(), + inscrRequest.getPassword() + ); + + userRepo.save(userFromRequest); + userCurriculumRepo.save(new UserCurriculum(userFromRequest, curriculumRepo.findById(inscrRequest.getCurriculumId()))); + } + inscrRequest.setState(requestState); + save(inscrRequest); return true; } } diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java index b7bfea3..18e20d0 100644 --- a/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java +++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/InscriptionRequest.java @@ -16,22 +16,20 @@ public class InscriptionRequest { private String country; private Date birthDate; - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name="Curriculum") - private Curriculum curriculum; + private Long curriculumId; private RequestState state; private String profilePicture; private String password; public InscriptionRequest(){} - public InscriptionRequest(String lastName, String firstName, String address, String email, String country, Date birthDate,Curriculum curriculum, RequestState state, String profilePicture, String password){ + public InscriptionRequest(String lastName, String firstName, String address, String email, String country, Date birthDate,Long curriculumId, RequestState state, String profilePicture, String password){ this.lastName = lastName; this.firstName = firstName; this.address = address; this.email = email; this.country = country; this.birthDate = birthDate; - this.curriculum = curriculum; + this.curriculumId = curriculumId; this.state = state; this.profilePicture = profilePicture; this.password = password; @@ -89,12 +87,12 @@ public class InscriptionRequest { this.birthDate = birthDate; } - public Curriculum getCurriculum() { - return curriculum; + public long getCurriculumId() { + return curriculumId; } - public void setCurriculum(Curriculum curriculum) { - this.curriculum = curriculum; + public void setCurriculumId(long curriculum) { + this.curriculumId = curriculum; } public RequestState getState() {