package com.plannaplan.entities; import java.sql.Timestamp; import java.util.HashSet; import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import com.plannaplan.models.UserApiResponse; import com.plannaplan.types.UserRoles; /** * Entity of User grouping of state ssociated about * id,name,surname,email,role,token,tokenCreatedDate */ @Entity public class User { private static final float TOKEN_EXPIRE_MINUTES = 15; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private String surname; private String email; private String usosId; private UserRoles role; private String token; private String refreshToken; private Timestamp tokenUsageDate; private Integer ranking; @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinTable private Set studentRegisteredGrups; public Set getStudentRegisteredGrups() { return this.studentRegisteredGrups; } public void removeGroup(Long id) { final Groups groupToDelete = this.studentRegisteredGrups.stream().filter(e -> e.getId().equals(id)).findFirst() .get(); this.studentRegisteredGrups.remove(groupToDelete); } public void claimGroup(Groups group) { if (this.studentRegisteredGrups == null) { this.studentRegisteredGrups = new HashSet<>(); } this.studentRegisteredGrups.add(group); } public User() { } /** * * @param name name given to the user * @param surname surname given to the user * @param mail mail given to the user * @param role user's role */ public User(String name, String surname, String mail, UserRoles role) { this.name = name; this.surname = surname; this.email = mail; this.role = role; } /** * * @param name name given to the user * @param surname surname given to the user * @param mail mail given to the user * @param usosId id in the USOS system * @param role user's role */ public User(String name, String surname, String mail, String usosId, UserRoles role) { this(name, surname, mail, role); this.usosId = usosId; } /** * * @param name name given to the user * @param surname surname given to the user * @param mail mail given to the user * @param usosId id in the USOS system * @param role user's role * @param ranking ranking points [100;500]. It's calculated by * gradesAvg*100*studiesYear */ public User(String name, String surname, String mail, String usosId, UserRoles role, Integer ranking) { this(name, surname, mail, usosId, role); this.ranking = ranking; } /** * usos id getter * * @return usosid */ public String getUsosId() { return usosId; } /** * email getter * * @return mailof user */ public String getEmail() { return email; } /** * email setter * * @param email user email */ public void setEmail(String email) { this.email = email; } /** * token usage getter * * @return Timestamp when token was used */ public Timestamp getTokenUsageDate() { return tokenUsageDate; } /** * token getter * * @return user token */ public String getToken() { return token; } /** * @return token needed to call refresh token after it expired */ public String getRefreshToken() { return refreshToken; } /** * token seter. Sets token and automaticly set time when was set * * @param token token to set */ public void setToken(String token) { this.tokenUsageDate = new Timestamp(System.currentTimeMillis()); this.token = token; this.refreshToken = UUID.randomUUID().toString(); } /** * name setter * * @return String user name */ public String getName() { return name; } /** * user rolse getter * * @return UserRoles of user */ public UserRoles getRole() { return role; } /** * user role setter * * @param role to be set */ public void setRole(UserRoles role) { this.role = role; } /** * surname getter * * @return string surname */ public String getSurname() { return surname; } /** * surname setter * * @param surname string to be set as surnames */ public void setSurname(String surname) { this.surname = surname; } /** * name stter * * @param name stirng to be set as name */ public void setName(String name) { this.name = name; } /** * id getter * * @return id in database */ public Long getId() { return this.id; } /** * Ranking points are [100;500]. It's calculated by gradesAvg*100*studiesYear * * @return ranking points [100;500] */ public Integer getRanking() { if (ranking == null) { return 100; } return ranking; } /** * Ranking points setter. Ranking points are [100;500]. It's calculated by * gradesAvg*100*studiesYear * * @param ranking ranking points [100;500] */ public void setRanking(Integer ranking) { this.ranking = ranking; } /** * updates user entity with data got by UsosApiService::getUserData * * @param usosData UserApiResponse model with needed data */ public void updateWithUsosData(UserApiResponse usosData) { this.name = usosData.getName(); this.surname = usosData.getSurname(); } /** * it checks if given ammount of time passed since last token usage. If not * retunr true and reset time otherwise return false and token won work anymore * * @return boolena if credentials (token) is expired or not */ public boolean isCredentialsNonExpired() { final long diffInMilliseconds = Math .abs(this.tokenUsageDate.getTime() - new Timestamp(System.currentTimeMillis()).getTime()); final long minutes = TimeUnit.MILLISECONDS.toMinutes(diffInMilliseconds); if (minutes > TOKEN_EXPIRE_MINUTES) { return false; } this.tokenUsageDate = new Timestamp(System.currentTimeMillis()); return true; } }