Leo/Backend (#82)
Ce merge enverra dans main : le timeout des token, la limite de 5 token par user, les nouvelles tables pour les demandes d'inscriptions Co-authored-by: Anthony Debucquoy <debucquoy.anthony@gmail.com> Reviewed-on: PGL/Clyde#82 Reviewed-by: Debucquoy Anthony <d.tonitch@gmail.com> Reviewed-by: Maxime <231026@umons.ac.be> Reviewed-by: Wal <karpinskiwal@gmail.com> Co-authored-by: LeoMoulin <leomoulin125@gmail.com> Co-committed-by: LeoMoulin <leomoulin125@gmail.com>
This commit is contained in:
		| @ -7,12 +7,14 @@ import org.springframework.web.bind.annotation.PostMapping; | |||||||
| import org.springframework.web.bind.annotation.RestController; | import org.springframework.web.bind.annotation.RestController; | ||||||
| import ovh.herisson.Clyde.Repositories.TokenRepository; | import ovh.herisson.Clyde.Repositories.TokenRepository; | ||||||
| import ovh.herisson.Clyde.Repositories.UserRepository; | import ovh.herisson.Clyde.Repositories.UserRepository; | ||||||
|  | import ovh.herisson.Clyde.Services.TokenService; | ||||||
| import ovh.herisson.Clyde.Tables.Role; | import ovh.herisson.Clyde.Tables.Role; | ||||||
| import ovh.herisson.Clyde.Tables.Token; | import ovh.herisson.Clyde.Tables.Token; | ||||||
| import ovh.herisson.Clyde.Tables.User; | import ovh.herisson.Clyde.Tables.User; | ||||||
|  |  | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
|  | import java.util.Calendar; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
|  |  | ||||||
| @RestController | @RestController | ||||||
| @ -23,13 +25,14 @@ public class MockController { | |||||||
|  |  | ||||||
|     public final UserRepository userRepo; |     public final UserRepository userRepo; | ||||||
|     public final TokenRepository tokenRepo; |     public final TokenRepository tokenRepo; | ||||||
|  |     public final TokenService tokenService; | ||||||
|     ArrayList<User> mockUsers; |     ArrayList<User> mockUsers; | ||||||
|  |  | ||||||
|  |  | ||||||
|     public MockController(UserRepository userRepo, TokenRepository tokenRepo){ |     public MockController(UserRepository userRepo, TokenRepository tokenRepo, TokenService tokenService){ | ||||||
|         this.tokenRepo = tokenRepo; |         this.tokenRepo = tokenRepo; | ||||||
|         this.userRepo = userRepo; |         this.userRepo = userRepo; | ||||||
|  |         this.tokenService = tokenService; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** Saves an example of each user type by : |     /** Saves an example of each user type by : | ||||||
| @ -41,10 +44,10 @@ public class MockController { | |||||||
|     @PostMapping("/mock") |     @PostMapping("/mock") | ||||||
|     public void postMock(){ |     public void postMock(){ | ||||||
|  |  | ||||||
|         User herobrine = new User("brine","hero","admin@admin.com","in your WalLs","ShadowsLand",new Date(0), "none",Role.Admin,passwordEncoder.encode("admin")); |         User herobrine = new User("brine","hero","admin@admin.com","in your WalLs","ShadowsLand",new Date(0), null,Role.Admin,passwordEncoder.encode("admin")); | ||||||
|         User joe = new User("Mama","Joe","student@student.com","roundabout","DaWarudo",new Date(0), "None",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),"none", 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), "none",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)); | ||||||
|  |  | ||||||
|  | |||||||
| @ -6,8 +6,10 @@ import org.springframework.context.annotation.Bean; | |||||||
| import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||||
| import org.springframework.context.annotation.Profile; | import org.springframework.context.annotation.Profile; | ||||||
| import org.springframework.jdbc.datasource.DriverManagerDataSource; | import org.springframework.jdbc.datasource.DriverManagerDataSource; | ||||||
|  | import org.springframework.scheduling.annotation.EnableScheduling; | ||||||
|  |  | ||||||
| @Configuration | @Configuration | ||||||
|  | @EnableScheduling | ||||||
| public class JdbcConfig { | public class JdbcConfig { | ||||||
|  |  | ||||||
| 	@Bean | 	@Bean | ||||||
|  | |||||||
| @ -4,10 +4,13 @@ import org.springframework.data.repository.CrudRepository; | |||||||
| import ovh.herisson.Clyde.Tables.Token; | import ovh.herisson.Clyde.Tables.Token; | ||||||
| import ovh.herisson.Clyde.Tables.User; | import ovh.herisson.Clyde.Tables.User; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  |  | ||||||
| public interface TokenRepository extends CrudRepository<Token,Long> { | public interface TokenRepository extends CrudRepository<Token,Long> { | ||||||
|  |  | ||||||
|     Token getByToken(String token); |     Token getByToken(String token); | ||||||
|  |  | ||||||
|     Iterable<Token> getByUser(User user); |     Iterable<Token> getByUser(User user); | ||||||
|  |  | ||||||
|  |     ArrayList <Token> getByUserOrderByExpirationDate(User user); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| package ovh.herisson.Clyde.Services; | package ovh.herisson.Clyde.Services; | ||||||
|  |  | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
|  | import ovh.herisson.Clyde.Tables.Token; | ||||||
| import ovh.herisson.Clyde.Tables.User; | import ovh.herisson.Clyde.Tables.User; | ||||||
|  |  | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
| @ -26,7 +27,7 @@ public class AuthenticatorService { | |||||||
|         if (user == null){return null;} |         if (user == null){return null;} | ||||||
|         if (!userService.checkPassword(user,password)){return null;} |         if (!userService.checkPassword(user,password)){return null;} | ||||||
|         String token = tokenService.generateNewToken(); |         String token = tokenService.generateNewToken(); | ||||||
|         tokenService.saveToken(token,user,expirationDate); |         tokenService.saveToken(new Token(user, token,expirationDate)); | ||||||
|         return token; |         return token; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,19 +1,19 @@ | |||||||
| package ovh.herisson.Clyde.Services; | package ovh.herisson.Clyde.Services; | ||||||
|  |  | ||||||
|  | import org.springframework.scheduling.annotation.Scheduled; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| import ovh.herisson.Clyde.Repositories.TokenRepository; | import ovh.herisson.Clyde.Repositories.TokenRepository; | ||||||
| import ovh.herisson.Clyde.Tables.Token; | import ovh.herisson.Clyde.Tables.Token; | ||||||
| import ovh.herisson.Clyde.Tables.User; | import ovh.herisson.Clyde.Tables.User; | ||||||
|  |  | ||||||
| import java.io.UnsupportedEncodingException; | import java.io.UnsupportedEncodingException; | ||||||
| import java.nio.charset.StandardCharsets; |  | ||||||
| import java.security.SecureRandom; | import java.security.SecureRandom; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Calendar; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
|  |  | ||||||
| @Service | @Service | ||||||
| public class TokenService { | public class TokenService { | ||||||
|  |  | ||||||
|     TokenRepository tokenRepo; |     TokenRepository tokenRepo; | ||||||
|  |  | ||||||
|     public TokenService(TokenRepository tokenRepo){ |     public TokenService(TokenRepository tokenRepo){ | ||||||
| @ -48,7 +48,28 @@ public class TokenService { | |||||||
|         return tokenRep.getUser(); |         return tokenRep.getUser(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void saveToken(String token, User user, Date expirationDate){// todo faire qlq chose de l'expDate |     public void saveToken(Token token){ | ||||||
|         tokenRepo.save(new Token(user,token)); |         //Si l'utilisateur a déja 5 token delete celui qui devait expirer le plus vite | ||||||
|  |         ArrayList<Token> tokenList = tokenRepo.getByUserOrderByExpirationDate(token.getUser()); | ||||||
|  |         while(tokenList.size() >= 5){ | ||||||
|  |             tokenRepo.delete(tokenList.get(0)); | ||||||
|  |             tokenList.remove(tokenList.get(0)); | ||||||
|  |         } | ||||||
|  |         tokenRepo.save(token); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     //Tous les jours a minuit | ||||||
|  |     @Scheduled(cron = "0 0 0 * * ?") | ||||||
|  |     public void autoDeleteToken() { | ||||||
|  |         for (Token t: tokenRepo.findAll()){ | ||||||
|  |             Calendar cal = Calendar.getInstance(); | ||||||
|  |  | ||||||
|  |             Calendar cal2 = Calendar.getInstance(); | ||||||
|  |             cal2.setTime(t.getExpirationDate()); | ||||||
|  |  | ||||||
|  |             if (cal.compareTo(cal2) >= 0){ | ||||||
|  |                 tokenRepo.delete(t); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }; | ||||||
| } | } | ||||||
| @ -0,0 +1,108 @@ | |||||||
|  | package ovh.herisson.Clyde.Tables; | ||||||
|  |  | ||||||
|  | import jakarta.persistence.*; | ||||||
|  |  | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
|  | public class InscriptionRequest { | ||||||
|  |     @GeneratedValue(strategy = GenerationType.AUTO) | ||||||
|  |     private int id; | ||||||
|  |     private String firstName; | ||||||
|  |     private String lastName; | ||||||
|  |     private String adress; | ||||||
|  |     private String email; | ||||||
|  |     private String country; | ||||||
|  |     private Date birthDate; | ||||||
|  |  | ||||||
|  |     @ManyToOne | ||||||
|  |     @JoinColumn(name="Cursus") | ||||||
|  |     private Cursus cursus; | ||||||
|  |     private RequestState state; | ||||||
|  |     private String profilePicture; | ||||||
|  |     public InscriptionRequest(){} | ||||||
|  |     public InscriptionRequest(String lastName, String firstName, String adress, String email, String country, Date birthDate, RequestState state, String profilePicture){ | ||||||
|  |         this.lastName = lastName; | ||||||
|  |         this.firstName = firstName; | ||||||
|  |         this.adress = adress; | ||||||
|  |         this.email = email; | ||||||
|  |         this.country = country; | ||||||
|  |         this.birthDate = birthDate; | ||||||
|  |         this.state = state; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public int getId() { | ||||||
|  |         return id; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getFirstName() { | ||||||
|  |         return firstName; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setFirstName(String firstName) { | ||||||
|  |         this.firstName = firstName; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getLastName() { | ||||||
|  |         return lastName; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setLastName(String lastName) { | ||||||
|  |         this.lastName = lastName; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getAdress() { | ||||||
|  |         return adress; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setAdress(String adress) { | ||||||
|  |         this.adress = adress; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getEmail() { | ||||||
|  |         return email; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setEmail(String email) { | ||||||
|  |         this.email = email; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getCountry() { | ||||||
|  |         return country; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setCountry(String country) { | ||||||
|  |         this.country = country; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public Date getBirthDate() { | ||||||
|  |         return birthDate; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setBirthDate(Date birthDate) { | ||||||
|  |         this.birthDate = birthDate; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public Cursus getCursus() { | ||||||
|  |         return cursus; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setCursus(Cursus cursus) { | ||||||
|  |         this.cursus = cursus; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public RequestState getState() { | ||||||
|  |         return state; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setState(RequestState state) { | ||||||
|  |         this.state = state; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getProfilePicture() { | ||||||
|  |         return profilePicture; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setProfilePicture(String profilePicture) { | ||||||
|  |         this.profilePicture = profilePicture; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,69 @@ | |||||||
|  | package ovh.herisson.Clyde.Tables; | ||||||
|  |  | ||||||
|  | import jakarta.persistence.GeneratedValue; | ||||||
|  | import jakarta.persistence.GenerationType; | ||||||
|  | import jakarta.persistence.JoinColumn; | ||||||
|  | import jakarta.persistence.ManyToOne; | ||||||
|  |  | ||||||
|  | public class ReinscriptionRequest { | ||||||
|  |     @GeneratedValue(strategy = GenerationType.AUTO) | ||||||
|  |     private int id; | ||||||
|  |  | ||||||
|  |     @ManyToOne | ||||||
|  |     @JoinColumn(name = "User") | ||||||
|  |     private User user; | ||||||
|  |  | ||||||
|  |     @ManyToOne | ||||||
|  |     @JoinColumn(name = "Cursus") | ||||||
|  |     private Cursus newCursus; | ||||||
|  |     private RequestState state; | ||||||
|  |  | ||||||
|  |     //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; | ||||||
|  |  | ||||||
|  |     public ReinscriptionRequest(){} | ||||||
|  |  | ||||||
|  |     public ReinscriptionRequest(User user, Cursus newCursus, RequestState state, boolean type){ | ||||||
|  |         this.user = user; | ||||||
|  |         this.newCursus = newCursus; | ||||||
|  |         this.state = state; | ||||||
|  |         this.type = type; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public int getId() { | ||||||
|  |         return id; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public User getUser() { | ||||||
|  |         return user; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setUser(User user) { | ||||||
|  |         this.user = user; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public Cursus getNewCursus() { | ||||||
|  |         return newCursus; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setNewCursus(Cursus newCursus) { | ||||||
|  |         this.newCursus = newCursus; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public RequestState getState() { | ||||||
|  |         return state; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setState(RequestState state) { | ||||||
|  |         this.state = state; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isType() { | ||||||
|  |         return type; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setType(boolean type) { | ||||||
|  |         this.type = type; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,7 @@ | |||||||
|  | package ovh.herisson.Clyde.Tables; | ||||||
|  |  | ||||||
|  | public enum RequestState { | ||||||
|  |     Accepted, | ||||||
|  |     Refused, | ||||||
|  |     Pending; | ||||||
|  | } | ||||||
| @ -1,6 +1,10 @@ | |||||||
| package ovh.herisson.Clyde.Tables; | package ovh.herisson.Clyde.Tables; | ||||||
|  |  | ||||||
| import jakarta.persistence.*; | import jakarta.persistence.*; | ||||||
|  | import org.springframework.scheduling.annotation.Scheduled; | ||||||
|  | import ovh.herisson.Clyde.Repositories.TokenRepository; | ||||||
|  |  | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
| @Entity | @Entity | ||||||
| public class Token { | public class Token { | ||||||
| @ -12,13 +16,16 @@ public class Token { | |||||||
|     @JoinColumn(name ="Users") |     @JoinColumn(name ="Users") | ||||||
|     private User user; |     private User user; | ||||||
|     private String token; |     private String token; | ||||||
|  |     private Date expirationDate; | ||||||
|  |  | ||||||
|     public Token(User user, String token){ |     public Token(User user, String token, Date expirationDate){ | ||||||
|         this.user = user; |         this.user = user; | ||||||
|         this.token = token; |         this.token = token; | ||||||
|  |         this.expirationDate = expirationDate; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Token(){} |     public Token(){} | ||||||
|  |  | ||||||
|     public int getId() { |     public int getId() { | ||||||
|         return id; |         return id; | ||||||
|     } |     } | ||||||
| @ -37,4 +44,12 @@ public class Token { | |||||||
|     public void setToken(String data) { |     public void setToken(String data) { | ||||||
|         this.token = data; |         this.token = data; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public void setExpirationDate(Date date){ | ||||||
|  |         this.expirationDate = date; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public Date getExpirationDate(){ | ||||||
|  |         return expirationDate; | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -16,6 +16,7 @@ public class User { | |||||||
|     private int regNo; |     private int regNo; | ||||||
|     private String lastName; |     private String lastName; | ||||||
|     private String firstName; |     private String firstName; | ||||||
|  |     @Column(unique = true) | ||||||
|     private String email; |     private String email; | ||||||
|     private String address; |     private String address; | ||||||
|     private String country; |     private String country; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user