Merge branch 'master' into Max/Backend/Curriculum
This commit is contained in:
		| @ -1,10 +1,7 @@ | ||||
| package ovh.herisson.Clyde.EndPoints; | ||||
|  | ||||
| import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | ||||
| import org.springframework.web.bind.annotation.CrossOrigin; | ||||
| import org.springframework.web.bind.annotation.DeleteMapping; | ||||
| import org.springframework.web.bind.annotation.PostMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import ovh.herisson.Clyde.Repositories.TokenRepository; | ||||
| import ovh.herisson.Clyde.Repositories.UserRepository; | ||||
| import ovh.herisson.Clyde.Services.*; | ||||
| @ -12,11 +9,10 @@ import ovh.herisson.Clyde.Tables.*; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Calendar; | ||||
| import java.util.Date; | ||||
|  | ||||
| @RestController | ||||
| @CrossOrigin(origins = "http://localhost:5173") | ||||
| @CrossOrigin(originPatterns = "*", allowCredentials = "true") | ||||
|  | ||||
| public class MockController { | ||||
|     private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); | ||||
| @ -24,11 +20,8 @@ public class MockController { | ||||
|     public final UserRepository userRepo; | ||||
|     public final TokenRepository tokenRepo; | ||||
|     public final TokenService tokenService; | ||||
|  | ||||
|     public final CursusCourseService cursusCourseService; | ||||
|  | ||||
|     public final CursusService cursusService; | ||||
|  | ||||
|     public final CourseService courseService; | ||||
|     ArrayList<User> mockUsers; | ||||
|  | ||||
| @ -58,7 +51,6 @@ 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.Teacher,passwordEncoder.encode("secretary")); | ||||
|         User joke = new User("CthemBalls","Lemme","teacher@teacher.com","lab","faculty",new Date(0), null,Role.Teacher,passwordEncoder.encode("teacher")); | ||||
|  | ||||
|         mockUsers = new ArrayList<User>(Arrays.asList(herobrine,joe,meh,joke)); | ||||
|  | ||||
|         userRepo.saveAll(mockUsers); | ||||
| @ -108,3 +100,4 @@ public class MockController { | ||||
|         userRepo.deleteAll(mockUsers); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.RestController; | ||||
| import ovh.herisson.Clyde.Responses.PingResponse; | ||||
|  | ||||
| @RestController | ||||
| @CrossOrigin(origins = "http://localhost:5173") | ||||
| @CrossOrigin(originPatterns = "*", allowCredentials = "true") | ||||
| public class PingController { | ||||
|  | ||||
| 	@GetMapping("/ping") | ||||
|  | ||||
| @ -1,16 +1,15 @@ | ||||
| package ovh.herisson.Clyde.EndPoints; | ||||
|  | ||||
| import org.springframework.http.HttpHeaders; | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.http.ResponseEntity; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| import ovh.herisson.Clyde.Services.StorageService; | ||||
| import org.springframework.core.io.Resource; | ||||
| import ovh.herisson.Clyde.Tables.FileType; | ||||
| import ovh.herisson.Clyde.Tables.StorageFile; | ||||
|  | ||||
| @RestController | ||||
| @CrossOrigin(origins = "http://localhost:5173") | ||||
| @CrossOrigin(originPatterns = "*", allowCredentials = "true") | ||||
| public class StorageController { | ||||
|  | ||||
|     private final StorageService storageServ; | ||||
| @ -21,12 +20,17 @@ public class StorageController { | ||||
|  | ||||
|  | ||||
|     @PostMapping("/upload/{fileType}") | ||||
|     public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file, @PathVariable FileType fileType) { | ||||
|     public ResponseEntity<StorageFile> handleFileUpload(@RequestParam("file") MultipartFile file, @PathVariable FileType fileType) { | ||||
|  | ||||
|         String path = storageServ.store(file,fileType); | ||||
| 		StorageFile fileEntry = null; | ||||
| 		try { | ||||
| 			fileEntry = storageServ.store(file,fileType); | ||||
| 			 | ||||
| 		} catch(Exception e){ | ||||
| 			e.printStackTrace(); | ||||
| 		} | ||||
|  | ||||
|         if (path == null) return new ResponseEntity<>("issue with the file storage", HttpStatus.BAD_REQUEST); | ||||
|  | ||||
|         return  new ResponseEntity<>(path, HttpStatus.OK); | ||||
|         return new ResponseEntity<>(fileEntry, HttpStatus.OK); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -9,7 +9,7 @@ import ovh.herisson.Clyde.Services.TokenService; | ||||
| import ovh.herisson.Clyde.Tables.Token; | ||||
|  | ||||
| @RestController | ||||
| @CrossOrigin(origins = "http://localhost:5173") | ||||
| @CrossOrigin(originPatterns = "*", allowCredentials = "true") | ||||
| public class TokenController { | ||||
|  | ||||
|     private final TokenService tokenServ; | ||||
|  | ||||
| @ -2,17 +2,20 @@ 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.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; | ||||
|  | ||||
|  | ||||
| @RestController | ||||
| @CrossOrigin(origins = "http://localhost:5173") | ||||
| @CrossOrigin(originPatterns = "*", allowCredentials = "true") | ||||
| public class UserController { | ||||
|  | ||||
|     private final UserService userService; | ||||
| @ -23,23 +26,78 @@ public class UserController { | ||||
|     } | ||||
|  | ||||
|     @GetMapping("/user") | ||||
|     public ResponseEntity<User> getUser(@RequestHeader("Cookie") String authorization){ | ||||
|     public ResponseEntity<HashMap<String,Object>> getUser(@RequestHeader("Authorization") String authorization){ | ||||
|  | ||||
|         if (authorization == null) return new UnauthorizedResponse<>(null); | ||||
|         User user = authServ.getUserFromToken(authorization); | ||||
|         if (user == null) return new UnauthorizedResponse<>(null); | ||||
|         return new ResponseEntity<>(user, HttpStatus.OK); | ||||
|  | ||||
|         return new ResponseEntity<>(userWithoutPassword(user), HttpStatus.OK); | ||||
|     } | ||||
|  | ||||
|     @PostMapping("/user") //todo check role | ||||
|     public ResponseEntity<String> postUser(@RequestBody User user){ | ||||
|     @PostMapping("/user") | ||||
|     public ResponseEntity<String> postUser(@RequestBody User user,@RequestHeader("Authorization") String authorization){ | ||||
|  | ||||
|         if (!isSecretaryOrAdmin(authorization)) | ||||
|             return new UnauthorizedResponse<>(null); | ||||
|  | ||||
|         userService.save(user); | ||||
|         return new ResponseEntity<>(String.format("Account created with ID:%s",user.getRegNo()),HttpStatus.CREATED); | ||||
|     } | ||||
|  | ||||
|     @GetMapping("/users") | ||||
|     public Iterable<User> getAllUsers(){ | ||||
|         return userService.getAll(); | ||||
|     public ResponseEntity<Iterable<HashMap<String,Object>>> getAllUsers(@RequestHeader("Authorization") String authorization){ | ||||
|  | ||||
|         if (!isSecretaryOrAdmin(authorization)) | ||||
|             return new UnauthorizedResponse<>(null); | ||||
|  | ||||
|         Iterable<User> users = userService.getAll(); | ||||
|         ArrayList<HashMap<String, Object>> withoutPassword = new ArrayList<>(); | ||||
|  | ||||
|         for (User u :users){ | ||||
|             withoutPassword.add(userWithoutPassword(u)); | ||||
|         } | ||||
|         return new ResponseEntity<>(withoutPassword, HttpStatus.OK); | ||||
|     } | ||||
|     @PatchMapping("/user") | ||||
|     public ResponseEntity<String> patchUser(@RequestBody Map<String,Object> updates, @RequestHeader("Authorization") String authorization) { | ||||
|  | ||||
|         if (authorization == null) return new UnauthorizedResponse<>(null); | ||||
|  | ||||
|         User poster = authServ.getUserFromToken(authorization); | ||||
|         if (poster == null) {return new UnauthorizedResponse<>("bad authorization");} | ||||
|  | ||||
|         if (!userService.modifyData(poster, updates, poster)) | ||||
|             return new UnauthorizedResponse<>("there was an issue with the updates requested"); | ||||
|  | ||||
|         return new ResponseEntity<>("data modified", HttpStatus.OK); | ||||
|     } | ||||
|         /** return user's data except password | ||||
|          * @param user the user to return | ||||
|          * @return all the user data without the password | ||||
|          */ | ||||
|     private HashMap<String,Object> userWithoutPassword(User user){ | ||||
|         HashMap<String,Object> toReturn = new HashMap<>(); | ||||
|  | ||||
|         toReturn.put("regNo",user.getRegNo()); | ||||
|         toReturn.put("firstName",user.getFirstName()); | ||||
|         toReturn.put("lastName",user.getLastName()); | ||||
|         toReturn.put("birthDate",user.getBirthDate()); | ||||
|         toReturn.put("country",user.getCountry()); | ||||
|         toReturn.put("address",user.getAddress()); | ||||
|         toReturn.put("role",user.getRole()); | ||||
|  | ||||
|         return toReturn; | ||||
|     } | ||||
|  | ||||
|     private boolean isSecretaryOrAdmin(String authorization){ | ||||
|         if (authorization ==null) | ||||
|             return false; | ||||
|  | ||||
|         User poster = authServ.getUserFromToken(authorization); | ||||
|         if (poster == null) return false; | ||||
|  | ||||
|         return poster.getRole() == Role.Secretary && poster.getRole() == Role.Admin; | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -1,13 +1,13 @@ | ||||
| package ovh.herisson.Clyde.Services; | ||||
|  | ||||
| import org.springframework.core.io.UrlResource; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| import ovh.herisson.Clyde.Repositories.FileRepository; | ||||
| import ovh.herisson.Clyde.Tables.FileType; | ||||
| import ovh.herisson.Clyde.Tables.StorageFile; | ||||
| import ovh.herisson.Clyde.Tables.*; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import org.springframework.core.io.Resource; | ||||
|  | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | ||||
| @ -24,10 +24,18 @@ public class StorageService { | ||||
|  | ||||
|     public StorageService(FileRepository filerepo){ | ||||
|         this.fileRepo = filerepo; | ||||
|  | ||||
| 		if(!Files.exists(rootLocation)){ | ||||
| 			try { | ||||
| 				Files.createDirectories(rootLocation); | ||||
| 			} catch(IOException e){ | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 		} | ||||
|     } | ||||
|  | ||||
|  | ||||
|     public String store(MultipartFile file, FileType fileType) { | ||||
|     public StorageFile store(MultipartFile file, FileType fileType) { | ||||
|  | ||||
|         if (file.getOriginalFilename().isEmpty()){return null;} | ||||
|  | ||||
| @ -49,8 +57,14 @@ public class StorageService { | ||||
|         String url = this.rootLocation.resolve(Paths.get(Objects.requireNonNull(stringUuid))) | ||||
|                 .normalize().toString(); | ||||
|  | ||||
|         fileRepo.save(new StorageFile(file.getName(),url, fileType)); | ||||
|         return fileRepo.save(new StorageFile(file.getName(),url, fileType)); | ||||
|     } | ||||
|  | ||||
|         return url; | ||||
|     public void delete(StorageFile file) throws SecurityException { | ||||
|         File f = new File(file.getUrl()); | ||||
|         f.delete(); | ||||
|  | ||||
|         //Delete l'entité | ||||
|         fileRepo.delete(file); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -5,16 +5,10 @@ import org.springframework.stereotype.Service; | ||||
| import ovh.herisson.Clyde.Repositories.UserRepository; | ||||
| import ovh.herisson.Clyde.Tables.Role; | ||||
| import ovh.herisson.Clyde.Tables.User; | ||||
|  | ||||
| import java.text.DateFormat; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| import java.util.*; | ||||
|  | ||||
| @Service | ||||
| public class UserService { | ||||
|  | ||||
|     private final UserRepository userRepo; | ||||
|     private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); | ||||
|  | ||||
| @ -34,17 +28,79 @@ public class UserService { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** modify the target data | ||||
|      * verify the permission of modifying from the poster | ||||
|      * | ||||
|      * @param poster the user wanting to modify target's data | ||||
|      * @param updates the changes to be made | ||||
|      * @param target the user to update | ||||
|      * @return if the changes were done or not | ||||
|      */ | ||||
|     public boolean modifyData(User poster, Map<String ,Object> updates, User target){ | ||||
|  | ||||
|         if (poster.getRegNo().equals(target.getRegNo())){ | ||||
|             for (Map.Entry<String, Object> entry : updates.entrySet()){ | ||||
|  | ||||
|                 if ( entry.getKey().equals("regNo") || entry.getKey().equals("role")) {return false;} | ||||
|  | ||||
|                 switch (entry.getKey()){ | ||||
|                     case "firstName": | ||||
|                         target.setFirstName((String) entry.getValue()); | ||||
|                         break; | ||||
|                     case "lastName": | ||||
|                         target.setLastName((String) entry.getValue()); | ||||
|                         break; | ||||
|                     case "email": | ||||
|                         target.setEmail((String) entry.getValue()); | ||||
|                         break; | ||||
|                     case "address": | ||||
|                         target.setAddress((String) entry.getValue()); | ||||
|                         break; | ||||
|                     case "country": | ||||
|                         target.setCountry((String) entry.getValue()); | ||||
|                         break; | ||||
|                     case "birthDate": | ||||
|                         target.setBirthDate((Date) entry.getValue()); | ||||
|                         break; | ||||
|                     case "profilePictureUrl": | ||||
|                         target.setProfilePictureUrl((String) entry.getValue()); | ||||
|                         break; | ||||
|                     case "password": | ||||
|                         target.setPassword(passwordEncoder.encode((String) entry.getValue())); | ||||
|                         break; | ||||
|                 } | ||||
|             } | ||||
|             userRepo.save(target); | ||||
|             return true; | ||||
|         } | ||||
|         // the secretary can change roles (for example if a student becomes a teacher) | ||||
|         else if (poster.getRole() == Role.Secretary) | ||||
|         { | ||||
|             for (Map.Entry<String, Object> entry : updates.entrySet()){ | ||||
|  | ||||
|                 if ( !entry.getKey().equals("role")) {return false;} | ||||
|  | ||||
|                 if (entry.getValue() == Role.Admin){return false;} | ||||
|  | ||||
|                 target.setRole((Role) entry.getValue()); | ||||
|                 userRepo.save(target); | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     public boolean checkPassword(User user, String tryingPassword){ | ||||
|         return passwordEncoder.matches(tryingPassword,  user.getPassword()); | ||||
|     } | ||||
|  | ||||
|     public void save(User  user){ | ||||
|         user.setPassword(passwordEncoder.encode(user.getPassword())); | ||||
|         userRepo.save(user); | ||||
|     } | ||||
|  | ||||
|     public Iterable<User> getAll(){ | ||||
|         return userRepo.findAll(); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -19,7 +19,7 @@ public class ReinscriptionRequest { | ||||
|  | ||||
|     //Permet de différencier les demandes de changement et une réinscription dans le même cursus | ||||
|     //Pour la réinscription on va le mettre a 0 | ||||
|     private boolean type; | ||||
|     private boolean type = false; | ||||
|  | ||||
|     public ReinscriptionRequest(){} | ||||
|  | ||||
| @ -30,6 +30,12 @@ public class ReinscriptionRequest { | ||||
|         this.type = type; | ||||
|     } | ||||
|  | ||||
|     public ReinscriptionRequest(User user, Cursus newCursus, RequestState state){ | ||||
|         this.user = user; | ||||
|         this.newCursus = newCursus; | ||||
|         this.state = state; | ||||
|     } | ||||
|  | ||||
|     public int getId() { | ||||
|         return id; | ||||
|     } | ||||
|  | ||||
| @ -1,9 +1,6 @@ | ||||
| package ovh.herisson.Clyde.Tables; | ||||
|  | ||||
| import jakarta.persistence.Entity; | ||||
| import jakarta.persistence.GeneratedValue; | ||||
| import jakarta.persistence.GenerationType; | ||||
| import jakarta.persistence.Id; | ||||
| import jakarta.persistence.*; | ||||
|  | ||||
|  | ||||
| @Entity | ||||
| @ -19,7 +16,6 @@ public class StorageFile { | ||||
|  | ||||
|     private FileType fileType; | ||||
|  | ||||
|  | ||||
|     public StorageFile(String name, String url, FileType fileType){ | ||||
|         this.name = name; | ||||
|         this.url = url; | ||||
| @ -60,4 +56,5 @@ public class StorageFile { | ||||
|     public void setFileType(FileType fileType) { | ||||
|         this.fileType = fileType; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -8,12 +8,11 @@ import java.util.Date; | ||||
| //et l'attribut tokenApi doit encore être ajouté vu qu'il faut en discuter | ||||
|  | ||||
| @Entity | ||||
| //Je rajoute un s au nom de la table pour éviter les conflits avec les mots réservés | ||||
| @Table(name = "Users") | ||||
| public class User { | ||||
|     @Id | ||||
|     @GeneratedValue(strategy = GenerationType.AUTO) | ||||
|     private int regNo; | ||||
|     private Long regNo; | ||||
|     private String lastName; | ||||
|     private String firstName; | ||||
|     @Column(unique = true) | ||||
| @ -38,9 +37,34 @@ 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) | ||||
|     { | ||||
|         this.lastName = lastName; | ||||
|         this.firstName = firstName; | ||||
|         this.email = email; | ||||
|         this.address = address; | ||||
|         this.country = country; | ||||
|         this.birthDate = birthDate; | ||||
|         this.profilePictureUrl = profilePictureUrl; | ||||
|         this.password = password; | ||||
|         this.role = Role.Student; | ||||
|     } | ||||
|     public User() {} | ||||
|  | ||||
|     public int getRegNo(){ | ||||
|     public Long getRegNo(){ | ||||
|         return this.regNo; | ||||
|     } | ||||
|     public String getLastName() { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user