Leo/Backend #82

Merged
Maxime merged 11 commits from Leo/Backend into master 2024-03-11 19:16:20 +01:00
10 changed files with 244 additions and 14 deletions

View File

@ -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));

View File

@ -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

View File

@ -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);
} }

View File

@ -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;
} }
} }

View File

@ -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){

Calendar.getInstance retourne déjà l'instant ou il est crée
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Calendar.html

Calendar.getInstance retourne déjà l'instant ou il est crée https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Calendar.html

C'est bien vu ca

C'est bien vu ca
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));
Maxime marked this conversation as resolved Outdated

peut être faire des >= au lieu des == pour éviter que le programme ne passe au dessus si imaginons le serveur est fermé pendant 2 jours

Mais encore mieux tu pourrais comparer les deux Calendar avec la fonction ´.compareTo(Calendar)`
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Calendar.html#compareTo(java.util.Calendar) et juste voir si le résultat est négatif

peut être faire des >= au lieu des == pour éviter que le programme ne passe au dessus si imaginons le serveur est fermé pendant 2 jours Mais encore mieux tu pourrais comparer les deux `Calendar` avec la fonction ´.compareTo(Calendar)` https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Calendar.html#compareTo(java.util.Calendar) et juste voir si le résultat est négatif

Excellente remarque ! Ca sera changé dans mon prochain commit !

Excellente remarque ! Ca sera changé dans mon prochain commit !
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);
}
}
};
} }

View File

@ -0,0 +1,108 @@
package ovh.herisson.Clyde.Tables;
import jakarta.persistence.*;
import java.util.Date;
public class InscriptionRequest {
Review

il manque pas le pdf du CESS dedans ?

il manque pas le pdf du CESS dedans ?
Review

(je dirais que dans un premier temps sans l'upload on peut très bien commit ainsi ? Peut être mettre un todo)

(je dirais que dans un premier temps sans l'upload on peut très bien commit ainsi ? Peut être mettre un todo)
Review

oui tout à fait mais il faut pas oublier le champs d'où le comm

oui tout à fait mais il faut pas oublier le champs d'où le comm
Review

Je penses que c'est dans mon extension donc je l'ai pas mis ! Peut être mb ?

Je penses que c'est dans mon extension donc je l'ai pas mis ! Peut être mb ?
Review

dans le doute mets le nan ?(du moins au moins le todo)

dans le doute mets le nan ?(du moins au moins le todo)
@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;
}
}

View File

@ -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;
Review

je comprends pas à quoi type sert (dans le sens où : pourquoi on devrai différencier les demande de réinscriptions dans le même cursus ou non ?)

et le nom " type" est fort abstrait

je comprends pas à quoi type sert (dans le sens où : pourquoi on devrai différencier les demande de réinscriptions dans le même cursus ou non ?) et le nom " type" est fort abstrait
Review

parceque que j'aimerai bien pouvoir séparer les deux dans l'interface par la suite mais que leurs données sont similaires donc j'ai utilisé ca pour les différencier dans la même table ! Je suis d'accord que le nom est fort abstrait on pourrait envisager un truc comme isCursusChange.

parceque que j'aimerai bien pouvoir séparer les deux dans l'interface par la suite mais que leurs données sont similaires donc j'ai utilisé ca pour les différencier dans la même table ! Je suis d'accord que le nom est fort abstrait on pourrait envisager un truc comme isCursusChange.
Review

par pitié fais de l'héritage alors en séparant cursus change et réorientation

par pitié fais de l'héritage alors en séparant cursus change et réorientation
Review

mais le but c'est justement de pas avoir deux tables pour deux données qui ont les mêmes attributs

mais le but c'est justement de pas avoir deux tables pour deux données qui ont les mêmes attributs
Review
https://www.baeldung.com/hibernate-inheritance
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;
}
}

View File

@ -0,0 +1,7 @@
package ovh.herisson.Clyde.Tables;
public enum RequestState {
Accepted,
Refused,
Pending;
}

View File

@ -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){
Review

ça serrait cool de donner une valeur par défault, comme ça on ne doit pas toujours l'envoyer quand on se connecte

ça serrait cool de donner une valeur par défault, comme ça on ne doit pas toujours l'envoyer quand on se connecte
Review

c'est le frontend qui doit nous la donner cette valeur par défaut. (en fct de si leuser veux rester connecté ou non
)

c'est le frontend qui doit nous la donner cette valeur par défaut. (en fct de si leuser veux rester connecté ou non )
Review

Cringe... but ok

Cringe... but ok
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;
}
} }

View File

@ -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;