Merge pull request 'Max/Backend/UserControllerUpdate' (#94) from Max/Backend/UserControllerUpdate into master
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				deploy to production / deploy-frontend (push) Successful in 25s
				
			
		
			
				
	
				Build and test backend / Build-backend (push) Successful in 2m16s
				
			
		
			
				
	
				Build and test backend / Test-backend (push) Successful in 1m22s
				
			
		
			
				
	
				deploy to production / deploy-backend (push) Successful in 2m24s
				
			
		
			
				
	
				Build and test FrontEnd / Build-frontend (push) Successful in 26s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	deploy to production / deploy-frontend (push) Successful in 25s
				
			Build and test backend / Build-backend (push) Successful in 2m16s
				
			Build and test backend / Test-backend (push) Successful in 1m22s
				
			deploy to production / deploy-backend (push) Successful in 2m24s
				
			Build and test FrontEnd / Build-frontend (push) Successful in 26s
				
			Reviewed-on: #94 Reviewed-by: LeoMoulin <leomoulin125@gmail.com> Reviewed-by: Debucquoy Anthony <d.tonitch@gmail.com>
This commit is contained in:
		| @ -43,7 +43,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 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 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")); |         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)); |         mockUsers = new ArrayList<User>(Arrays.asList(herobrine,joe,meh,joke)); | ||||||
|  |  | ||||||
|         userRepo.saveAll(mockUsers); |         userRepo.saveAll(mockUsers); | ||||||
|  | |||||||
| @ -1,15 +1,23 @@ | |||||||
| package ovh.herisson.Clyde.EndPoints; | package ovh.herisson.Clyde.EndPoints; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import jakarta.servlet.http.HttpServletRequest; | ||||||
| import org.springframework.http.HttpStatus; | import org.springframework.http.HttpStatus; | ||||||
|  |  | ||||||
|  | import org.springframework.http.MediaType; | ||||||
| import org.springframework.http.ResponseEntity; | import org.springframework.http.ResponseEntity; | ||||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||||
| import ovh.herisson.Clyde.Responses.UnauthorizedResponse; | import ovh.herisson.Clyde.Responses.UnauthorizedResponse; | ||||||
| import ovh.herisson.Clyde.Services.AuthenticatorService; | import ovh.herisson.Clyde.Services.AuthenticatorService; | ||||||
| import ovh.herisson.Clyde.Services.UserService; | import ovh.herisson.Clyde.Services.UserService; | ||||||
|  | import ovh.herisson.Clyde.Tables.Role; | ||||||
| import ovh.herisson.Clyde.Tables.User; | import ovh.herisson.Clyde.Tables.User; | ||||||
|  |  | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.Map; | ||||||
|  |  | ||||||
|  |  | ||||||
| @RestController | @RestController | ||||||
| @CrossOrigin(origins = "http://localhost:5173") | @CrossOrigin(origins = "http://localhost:5173") | ||||||
| @ -23,25 +31,80 @@ public class UserController { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @GetMapping("/user") |     @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); |         if (authorization == null) return new UnauthorizedResponse<>(null); | ||||||
|         User user = authServ.getUserFromToken(authorization); |         User user = authServ.getUserFromToken(authorization); | ||||||
|         if (user == null) return new UnauthorizedResponse<>(null); |         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 |     @PostMapping("/user") | ||||||
|     public ResponseEntity<String> postUser(@RequestBody User user){ |     public ResponseEntity<String> postUser(@RequestBody User user,@RequestHeader("Authorization") String authorization){ | ||||||
|  |  | ||||||
|  |         if (!isSecretaryOrAdmin(authorization)) | ||||||
|  |             return new UnauthorizedResponse<>(null); | ||||||
|  |  | ||||||
|         userService.save(user); |         userService.save(user); | ||||||
|         return new ResponseEntity<>(String.format("Account created with ID:%s",user.getRegNo()),HttpStatus.CREATED); |         return new ResponseEntity<>(String.format("Account created with ID:%s",user.getRegNo()),HttpStatus.CREATED); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @GetMapping("/users") |     @GetMapping("/users") | ||||||
|     public Iterable<User> getAllUsers(){ |     public ResponseEntity<Iterable<HashMap<String,Object>>> getAllUsers(@RequestHeader("Authorization") String authorization){ | ||||||
|         return userService.getAll(); |  | ||||||
|  |         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; | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -5,16 +5,10 @@ import org.springframework.stereotype.Service; | |||||||
| import ovh.herisson.Clyde.Repositories.UserRepository; | import ovh.herisson.Clyde.Repositories.UserRepository; | ||||||
| import ovh.herisson.Clyde.Tables.Role; | import ovh.herisson.Clyde.Tables.Role; | ||||||
| import ovh.herisson.Clyde.Tables.User; | import ovh.herisson.Clyde.Tables.User; | ||||||
|  | import java.util.*; | ||||||
| import java.text.DateFormat; |  | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.Arrays; |  | ||||||
| import java.util.Date; |  | ||||||
| import java.util.List; |  | ||||||
|  |  | ||||||
| @Service | @Service | ||||||
| public class UserService { | public class UserService { | ||||||
|  |  | ||||||
|     private final UserRepository userRepo; |     private final UserRepository userRepo; | ||||||
|     private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); |     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){ |     public boolean checkPassword(User user, String tryingPassword){ | ||||||
|         return passwordEncoder.matches(tryingPassword,  user.getPassword()); |         return passwordEncoder.matches(tryingPassword,  user.getPassword()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void save(User  user){ |     public void save(User  user){ | ||||||
|  |         user.setPassword(passwordEncoder.encode(user.getPassword())); | ||||||
|         userRepo.save(user); |         userRepo.save(user); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Iterable<User> getAll(){ |     public Iterable<User> getAll(){ | ||||||
|         return userRepo.findAll(); |         return userRepo.findAll(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -8,12 +8,11 @@ import java.util.Date; | |||||||
| //et l'attribut tokenApi doit encore être ajouté vu qu'il faut en discuter | //et l'attribut tokenApi doit encore être ajouté vu qu'il faut en discuter | ||||||
|  |  | ||||||
| @Entity | @Entity | ||||||
| //Je rajoute un s au nom de la table pour éviter les conflits avec les mots réservés |  | ||||||
| @Table(name = "Users") | @Table(name = "Users") | ||||||
| public class User { | public class User { | ||||||
|     @Id |     @Id | ||||||
|     @GeneratedValue(strategy = GenerationType.AUTO) |     @GeneratedValue(strategy = GenerationType.AUTO) | ||||||
|     private int regNo; |     private Long regNo; | ||||||
|     private String lastName; |     private String lastName; | ||||||
|     private String firstName; |     private String firstName; | ||||||
|     @Column(unique = true) |     @Column(unique = true) | ||||||
| @ -38,9 +37,34 @@ public class User { | |||||||
|         this.password = password; |         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 User() {} | ||||||
|  |  | ||||||
|     public int getRegNo(){ |     public Long getRegNo(){ | ||||||
|         return this.regNo; |         return this.regNo; | ||||||
|     } |     } | ||||||
|     public String getLastName() { |     public String getLastName() { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user