This commit is contained in:
parent
623b5b0ee6
commit
292825d1a8
1
.gitignore
vendored
1
.gitignore
vendored
@ -19,3 +19,4 @@ drivers/
|
|||||||
# Error screenshots generated by TestBench for failed integration tests
|
# Error screenshots generated by TestBench for failed integration tests
|
||||||
error-screenshots/
|
error-screenshots/
|
||||||
webpack.generated.js
|
webpack.generated.js
|
||||||
|
*.env
|
||||||
|
9
pom.xml
9
pom.xml
@ -119,6 +119,10 @@
|
|||||||
<artifactId>commons-beanutils</artifactId>
|
<artifactId>commons-beanutils</artifactId>
|
||||||
<version>1.9.4</version>
|
<version>1.9.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-core</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mockito</groupId>
|
<groupId>org.mockito</groupId>
|
||||||
<artifactId>mockito-core</artifactId>
|
<artifactId>mockito-core</artifactId>
|
||||||
@ -240,6 +244,11 @@
|
|||||||
<artifactId>freemarker</artifactId>
|
<artifactId>freemarker</artifactId>
|
||||||
<version>2.3.32</version>
|
<version>2.3.32</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.auth0</groupId>
|
||||||
|
<artifactId>java-jwt</artifactId>
|
||||||
|
<version>4.4.0</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
@ -1,147 +1,144 @@
|
|||||||
package com.primefactorsolutions.model;
|
package com.primefactorsolutions.model;
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import org.springframework.security.core.GrantedAuthority;
|
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import com.google.common.collect.Lists;
|
||||||
import java.util.Collection;
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
|
||||||
@Data
|
import java.time.LocalDate;
|
||||||
@Entity
|
import java.util.Collection;
|
||||||
@AllArgsConstructor
|
|
||||||
@NoArgsConstructor
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
public class Employee extends BaseEntity implements UserDetails {
|
|
||||||
private String username;
|
|
||||||
private String firstName;
|
|
||||||
private String lastName;
|
|
||||||
private LocalDate birthday;
|
|
||||||
private String birthCity;
|
|
||||||
private String age;
|
|
||||||
|
|
||||||
private String residenceAddress;
|
@Data
|
||||||
private String localAddress;
|
@Entity
|
||||||
private String phoneNumber;
|
@AllArgsConstructor
|
||||||
private String personalEmail;
|
@NoArgsConstructor
|
||||||
private String position;
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ManyToOne
|
public class Employee extends BaseEntity implements UserDetails {
|
||||||
@JoinColumn(name = "team_id", nullable = false)
|
private String username;
|
||||||
private Team team;
|
private String firstName;
|
||||||
private String emergencyCName;
|
private String lastName;
|
||||||
private String emergencyCAddress;
|
private LocalDate birthday;
|
||||||
private String emergencyCPhone;
|
private String birthCity;
|
||||||
private String emergencyCEmail;
|
private String age;
|
||||||
private String numberOfChildren;
|
|
||||||
|
|
||||||
private String ci;
|
private String residenceAddress;
|
||||||
private String issuedIn;
|
private String localAddress;
|
||||||
|
private String phoneNumber;
|
||||||
|
private String personalEmail;
|
||||||
|
private String position;
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "team_id", nullable = false)
|
||||||
|
private Team team;
|
||||||
|
private String emergencyCName;
|
||||||
|
private String emergencyCAddress;
|
||||||
|
private String emergencyCPhone;
|
||||||
|
private String emergencyCEmail;
|
||||||
|
private String numberOfChildren;
|
||||||
|
|
||||||
private String pTitle1;
|
private String ci;
|
||||||
private String pTitle2;
|
private String issuedIn;
|
||||||
private String pTitle3;
|
|
||||||
|
|
||||||
private String pStudy1;
|
private String pTitle1;
|
||||||
private String pStudy2;
|
private String pTitle2;
|
||||||
private String pStudy3;
|
private String pTitle3;
|
||||||
|
|
||||||
private String certification1;
|
private String pStudy1;
|
||||||
private String certification2;
|
private String pStudy2;
|
||||||
private String certification3;
|
private String pStudy3;
|
||||||
private String certification4;
|
|
||||||
|
|
||||||
private String recognition;
|
private String certification1;
|
||||||
private String achievements;
|
private String certification2;
|
||||||
|
private String certification3;
|
||||||
|
private String certification4;
|
||||||
|
|
||||||
private String language;
|
private String recognition;
|
||||||
private String languageLevel;
|
private String achievements;
|
||||||
|
|
||||||
private String cod;
|
private String language;
|
||||||
private String leadManager;
|
private String languageLevel;
|
||||||
private String project;
|
|
||||||
|
|
||||||
private LocalDate dateOfEntry;
|
private String cod;
|
||||||
private LocalDate dateOfExit;
|
private String leadManager;
|
||||||
|
private String project;
|
||||||
|
|
||||||
private String contractType;
|
private LocalDate dateOfEntry;
|
||||||
private String seniority;
|
private LocalDate dateOfExit;
|
||||||
private String salary;
|
|
||||||
|
|
||||||
private String bankName;
|
private String contractType;
|
||||||
private String accountNumber;
|
private String seniority;
|
||||||
|
private String salary;
|
||||||
|
|
||||||
private String gpss;
|
private String bankName;
|
||||||
private String sss;
|
private String accountNumber;
|
||||||
private String beneficiaries;
|
|
||||||
|
|
||||||
@Column(columnDefinition = "TEXT")
|
private String gpss;
|
||||||
private String profileImage;
|
private String sss;
|
||||||
@Enumerated(EnumType.STRING)
|
private String beneficiaries;
|
||||||
private Status status;
|
|
||||||
|
|
||||||
@Override
|
@Column(columnDefinition = "TEXT")
|
||||||
public Collection<? extends GrantedAuthority> getAuthorities() {
|
private String profileImage;
|
||||||
return Lists.newArrayList();
|
@Enumerated(EnumType.STRING)
|
||||||
}
|
private Status status;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPassword() {
|
public Collection<? extends GrantedAuthority> getAuthorities() {
|
||||||
return null;
|
return Lists.newArrayList();
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getUsername() {
|
|
||||||
return this.username;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAccountNonExpired() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAccountNonLocked() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCredentialsNonExpired() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum Status {
|
|
||||||
ACTIVE,
|
|
||||||
INACTIVE
|
|
||||||
}
|
|
||||||
@Enumerated(EnumType.STRING)
|
|
||||||
private MaritalStatus maritalStatus;
|
|
||||||
public enum MaritalStatus {
|
|
||||||
SINGLE,
|
|
||||||
MARRIED,
|
|
||||||
WIDOWED,
|
|
||||||
DIVORCED
|
|
||||||
}
|
|
||||||
@Enumerated(EnumType.STRING)
|
|
||||||
private Gender gender;
|
|
||||||
public enum Gender {
|
|
||||||
MALE,
|
|
||||||
FEMALE
|
|
||||||
}
|
|
||||||
|
|
||||||
public Status getStatus() {
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
public void setStatus(final Status status) {
|
|
||||||
this.status = status;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPassword() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUsername() {
|
||||||
|
return this.username;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAccountNonExpired() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAccountNonLocked() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCredentialsNonExpired() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Status {
|
||||||
|
ACTIVE,
|
||||||
|
INACTIVE
|
||||||
|
}
|
||||||
|
|
||||||
|
@Enumerated(EnumType.STRING)
|
||||||
|
private MaritalStatus maritalStatus;
|
||||||
|
|
||||||
|
public enum MaritalStatus {
|
||||||
|
SINGLE,
|
||||||
|
MARRIED,
|
||||||
|
WIDOWED,
|
||||||
|
DIVORCED
|
||||||
|
}
|
||||||
|
|
||||||
|
@Enumerated(EnumType.STRING)
|
||||||
|
private Gender gender;
|
||||||
|
|
||||||
|
public enum Gender {
|
||||||
|
MALE,
|
||||||
|
FEMALE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -8,4 +8,6 @@ import java.util.UUID;
|
|||||||
|
|
||||||
public interface EmployeeRepository extends JpaRepository<Employee, UUID> {
|
public interface EmployeeRepository extends JpaRepository<Employee, UUID> {
|
||||||
Optional<Employee> findByUsername(String username);
|
Optional<Employee> findByUsername(String username);
|
||||||
|
|
||||||
|
Optional<Employee> findByPersonalEmail(String personalEmail);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,101 @@
|
|||||||
|
package com.primefactorsolutions.service;
|
||||||
|
|
||||||
|
import com.auth0.jwt.JWT;
|
||||||
|
import com.auth0.jwt.algorithms.Algorithm;
|
||||||
|
import com.auth0.jwt.exceptions.JWTCreationException;
|
||||||
|
import com.auth0.jwt.exceptions.JWTVerificationException;
|
||||||
|
import com.auth0.jwt.interfaces.DecodedJWT;
|
||||||
|
import com.auth0.jwt.interfaces.JWTVerifier;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.primefactorsolutions.model.Employee;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Slf4j
|
||||||
|
public class AccountService {
|
||||||
|
private final EmailService emailService;
|
||||||
|
private final EmployeeService employeeService;
|
||||||
|
private final ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
private final String secret;
|
||||||
|
|
||||||
|
public AccountService(final EmailService emailService, final EmployeeService employeeService,
|
||||||
|
@Value("${application.jwtSecret}") final String secret) {
|
||||||
|
this.emailService = emailService;
|
||||||
|
this.employeeService = employeeService;
|
||||||
|
this.secret = secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendResetPasswordEmail(final String personalEmail) {
|
||||||
|
final Employee employee = employeeService.getEmployeeByPersonalEmail(personalEmail);
|
||||||
|
|
||||||
|
if (employee == null) {
|
||||||
|
log.warn("Could not find employee for email {}", personalEmail);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final String link = createResetPasswordLink(employee.getUsername());
|
||||||
|
final String content = "Visit this link to reset your password: " + link;
|
||||||
|
emailService.sendEmail(personalEmail, "PFS - Reset Password", content);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetPassword(final String username, final String newPassword, final String token) {
|
||||||
|
DecodedJWT decodedJWT;
|
||||||
|
|
||||||
|
try {
|
||||||
|
Algorithm algorithm = Algorithm.HMAC512(secret);
|
||||||
|
JWTVerifier verifier = JWT.require(algorithm)
|
||||||
|
.withIssuer("pfs")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
decodedJWT = verifier.verify(token);
|
||||||
|
final Map<String, ?> payload = (Map<String, ?>) objectMapper.readValue(decodedJWT.getPayload(), Map.class);
|
||||||
|
|
||||||
|
if (Instant.parse((String) payload.get("expire")).isBefore(Instant.now())
|
||||||
|
|| !username.equals(payload.get("username"))) {
|
||||||
|
log.warn("token invalid {} {} {}", username, payload.get("username"), payload.get("expire"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (JWTVerificationException | JsonProcessingException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Employee employee = employeeService.getDetachedEmployeeByUsername(username);
|
||||||
|
|
||||||
|
if (employee == null) {
|
||||||
|
log.warn("Could not find employee for username {}", username);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(newPassword) || newPassword.length() < 8) {
|
||||||
|
throw new IllegalArgumentException("New password should be at least 8 chars long");
|
||||||
|
}
|
||||||
|
|
||||||
|
employeeService.updatePassword(employee, newPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String createResetPasswordLink(final String username) {
|
||||||
|
String token = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
Algorithm algorithm = Algorithm.HMAC512(secret);
|
||||||
|
token = JWT.create()
|
||||||
|
.withIssuer("pfs")
|
||||||
|
.withPayload(objectMapper.writeValueAsString(Map.of("username", username,
|
||||||
|
"expire", Instant.now().plus(1, ChronoUnit.HOURS).toString())))
|
||||||
|
.sign(algorithm);
|
||||||
|
} catch (JWTCreationException | JsonProcessingException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return String.format("https://intra.primefactorsolutions.com/reset-password?username=%s&token=%s", username,
|
||||||
|
token);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.primefactorsolutions.service;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.mail.SimpleMailMessage;
|
||||||
|
import org.springframework.mail.javamail.JavaMailSender;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
public class EmailService {
|
||||||
|
public static final String NO_REPLY_PRIMEFACTORSOLUTIONS_COM = "no-reply@primefactorsolutions.com";
|
||||||
|
private final JavaMailSender emailSender;
|
||||||
|
|
||||||
|
public void sendEmail(final String email, final String title, final String messageContent) {
|
||||||
|
try {
|
||||||
|
final SimpleMailMessage message = new SimpleMailMessage();
|
||||||
|
message.setFrom(NO_REPLY_PRIMEFACTORSOLUTIONS_COM);
|
||||||
|
message.setBcc(NO_REPLY_PRIMEFACTORSOLUTIONS_COM);
|
||||||
|
message.setTo(email);
|
||||||
|
message.setSubject(title);
|
||||||
|
message.setText(messageContent);
|
||||||
|
|
||||||
|
emailSender.send(message);
|
||||||
|
log.info("Sent email to {}", email);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Error sending email to {}", email, e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,12 +18,18 @@ import java.util.Collections;
|
|||||||
@Service
|
@Service
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class EmployeeService {
|
public class EmployeeService {
|
||||||
|
private static final String USERPASSWORD = "userpassword";
|
||||||
|
private static final String OBJECTCLASS = "objectclass";
|
||||||
|
private static final String ORGANIZATIONAL_PERSON = "organizationalPerson";
|
||||||
|
private static final String INET_ORG_PERSON = "inetOrgPerson";
|
||||||
|
private static final String TOP = "top";
|
||||||
|
private static final String PERSON = "person";
|
||||||
|
public static final String BASE_DN = "dc=primefactorsolutions,dc=com";
|
||||||
|
|
||||||
private final EmployeeRepository employeeRepository;
|
private final EmployeeRepository employeeRepository;
|
||||||
private final LdapTemplate ldapTemplate;
|
private final LdapTemplate ldapTemplate;
|
||||||
private final EntityManager entityManager;
|
private final EntityManager entityManager;
|
||||||
|
|
||||||
public static final String BASE_DN = "dc=primefactorsolutions,dc=com";
|
|
||||||
|
|
||||||
protected Name buildDn(final Employee employee) {
|
protected Name buildDn(final Employee employee) {
|
||||||
return LdapNameBuilder.newInstance(BASE_DN)
|
return LdapNameBuilder.newInstance(BASE_DN)
|
||||||
.add("ou", "users")
|
.add("ou", "users")
|
||||||
@ -63,6 +69,10 @@ public class EmployeeService {
|
|||||||
return employees.subList(start, end);
|
return employees.subList(start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Employee getEmployeeByPersonalEmail(final String email) {
|
||||||
|
return employeeRepository.findByPersonalEmail(email).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
public Employee createOrUpdate(final Employee employee) {
|
public Employee createOrUpdate(final Employee employee) {
|
||||||
if (employee.getId() == null) {
|
if (employee.getId() == null) {
|
||||||
final Name dn = buildDn(employee);
|
final Name dn = buildDn(employee);
|
||||||
@ -74,28 +84,29 @@ public class EmployeeService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Employee getEmployee(final UUID id) {
|
public Employee getEmployee(final UUID id) {
|
||||||
Optional<Employee> employee = employeeRepository.findById(id);
|
final Optional<Employee> employee = employeeRepository.findById(id);
|
||||||
|
|
||||||
return employee.orElse(null);
|
return employee.orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Attributes buildAttributes(final Employee employee) {
|
private Attributes buildAttributes(final Employee employee) {
|
||||||
final Attributes attrs = new BasicAttributes();
|
final Attributes attrs = new BasicAttributes();
|
||||||
final BasicAttribute ocattr = new BasicAttribute("objectclass");
|
final BasicAttribute ocattr = new BasicAttribute(OBJECTCLASS);
|
||||||
ocattr.add("top");
|
ocattr.add(TOP);
|
||||||
ocattr.add("person");
|
ocattr.add(PERSON);
|
||||||
ocattr.add("organizationalPerson");
|
ocattr.add(ORGANIZATIONAL_PERSON);
|
||||||
ocattr.add("inetOrgPerson");
|
ocattr.add(INET_ORG_PERSON);
|
||||||
attrs.put(ocattr);
|
attrs.put(ocattr);
|
||||||
attrs.put("cn", String.format("%s %s", employee.getFirstName(), employee.getLastName()));
|
attrs.put("cn", String.format("%s %s", employee.getFirstName(), employee.getLastName()));
|
||||||
attrs.put("sn", String.format("%s %s", employee.getFirstName(), employee.getLastName()));
|
attrs.put("sn", String.format("%s %s", employee.getFirstName(), employee.getLastName()));
|
||||||
attrs.put("uid", employee.getUsername());
|
attrs.put("uid", employee.getUsername());
|
||||||
attrs.put("userpassword", String.format("%s%s", employee.getUsername(), 123));
|
attrs.put(USERPASSWORD, String.format("%s%s", employee.getUsername(), 123));
|
||||||
|
|
||||||
return attrs;
|
return attrs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updatePassword(final Employee employee) {
|
public void updatePassword(final Employee employee, final String newPassword) {
|
||||||
final Attribute attr = new BasicAttribute("userpassword", employee.getUsername() + "123");
|
final Attribute attr = new BasicAttribute(USERPASSWORD, newPassword);
|
||||||
final ModificationItem item = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr);
|
final ModificationItem item = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr);
|
||||||
|
|
||||||
ldapTemplate.modifyAttributes(buildDn(employee), new ModificationItem[] {item});
|
ldapTemplate.modifyAttributes(buildDn(employee), new ModificationItem[] {item});
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.primefactorsolutions.views;
|
package com.primefactorsolutions.views;
|
||||||
|
|
||||||
import com.primefactorsolutions.model.Employee;
|
import com.primefactorsolutions.model.Employee;
|
||||||
|
import com.primefactorsolutions.model.Team;
|
||||||
import com.primefactorsolutions.service.EmployeeService;
|
import com.primefactorsolutions.service.EmployeeService;
|
||||||
import com.primefactorsolutions.service.ReportService;
|
import com.primefactorsolutions.service.ReportService;
|
||||||
import com.vaadin.componentfactory.pdfviewer.PdfViewer;
|
import com.vaadin.componentfactory.pdfviewer.PdfViewer;
|
||||||
@ -22,6 +23,9 @@ import com.vaadin.flow.component.textfield.EmailField;
|
|||||||
import com.vaadin.flow.component.textfield.TextField;
|
import com.vaadin.flow.component.textfield.TextField;
|
||||||
import com.vaadin.flow.component.upload.Upload;
|
import com.vaadin.flow.component.upload.Upload;
|
||||||
import com.vaadin.flow.component.upload.receivers.MemoryBuffer;
|
import com.vaadin.flow.component.upload.receivers.MemoryBuffer;
|
||||||
|
import com.vaadin.flow.data.binder.Result;
|
||||||
|
import com.vaadin.flow.data.binder.ValueContext;
|
||||||
|
import com.vaadin.flow.data.converter.Converter;
|
||||||
import com.vaadin.flow.data.value.ValueChangeMode;
|
import com.vaadin.flow.data.value.ValueChangeMode;
|
||||||
import com.vaadin.flow.router.*;
|
import com.vaadin.flow.router.*;
|
||||||
import com.vaadin.flow.server.StreamResource;
|
import com.vaadin.flow.server.StreamResource;
|
||||||
@ -143,6 +147,18 @@ public class EmployeeView extends BeanValidationForm<Employee> implements HasUrl
|
|||||||
|
|
||||||
configureComponents();
|
configureComponents();
|
||||||
addClassName("main-layout");
|
addClassName("main-layout");
|
||||||
|
|
||||||
|
getBinder().setConverter("team", new Converter<Object, Object>() {
|
||||||
|
@Override
|
||||||
|
public Result<Object> convertToModel(final Object o, final ValueContext valueContext) {
|
||||||
|
return Result.ok(new Team((String) o));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object convertToPresentation(final Object o, final ValueContext valueContext) {
|
||||||
|
return ((Team) o).getName();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureComponents() {
|
private void configureComponents() {
|
||||||
|
@ -196,7 +196,6 @@ public class EvaluationView extends Main implements HasUrlParameter<String> {
|
|||||||
final MenuBar navMenuBar = new MenuBar();
|
final MenuBar navMenuBar = new MenuBar();
|
||||||
prev = navMenuBar.addItem("Anterior pregunta",
|
prev = navMenuBar.addItem("Anterior pregunta",
|
||||||
(ComponentEventListener<ClickEvent<MenuItem>>) menuItemClickEvent -> {
|
(ComponentEventListener<ClickEvent<MenuItem>>) menuItemClickEvent -> {
|
||||||
log.info(">>> prev");
|
|
||||||
this.currSubmission.setResponse(this.questionEditor.getValue());
|
this.currSubmission.setResponse(this.questionEditor.getValue());
|
||||||
this.assessmentService.saveSubmission(assessment.getId(), this.currSubmission);
|
this.assessmentService.saveSubmission(assessment.getId(), this.currSubmission);
|
||||||
this.currSubmission = this.assessmentService.getPrevSubmission(assessment.getId(), this.currSubmission);
|
this.currSubmission = this.assessmentService.getPrevSubmission(assessment.getId(), this.currSubmission);
|
||||||
@ -253,7 +252,6 @@ public class EvaluationView extends Main implements HasUrlParameter<String> {
|
|||||||
start = new Button("Empezar");
|
start = new Button("Empezar");
|
||||||
start.addThemeVariants(ButtonVariant.LUMO_PRIMARY, ButtonVariant.LUMO_SUCCESS);
|
start.addThemeVariants(ButtonVariant.LUMO_PRIMARY, ButtonVariant.LUMO_SUCCESS);
|
||||||
start.addClickListener((ComponentEventListener<ClickEvent<Button>>) buttonClickEvent -> {
|
start.addClickListener((ComponentEventListener<ClickEvent<Button>>) buttonClickEvent -> {
|
||||||
log.info(">>> start");
|
|
||||||
this.assessment = this.assessmentService.startAssessment(this.assessment.getId());
|
this.assessment = this.assessmentService.startAssessment(this.assessment.getId());
|
||||||
|
|
||||||
if (tf.getValue().trim().equalsIgnoreCase(this.assessment.getCandidate().getEmail())) {
|
if (tf.getValue().trim().equalsIgnoreCase(this.assessment.getCandidate().getEmail())) {
|
||||||
@ -318,7 +316,6 @@ public class EvaluationView extends Main implements HasUrlParameter<String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void goToNext() {
|
private void goToNext() {
|
||||||
log.info(">>> next");
|
|
||||||
Submission found = this.assessmentService.getNextSubmission(assessment.getId(),
|
Submission found = this.assessmentService.getNextSubmission(assessment.getId(),
|
||||||
this.currSubmission.getId());
|
this.currSubmission.getId());
|
||||||
|
|
||||||
|
@ -0,0 +1,53 @@
|
|||||||
|
package com.primefactorsolutions.views;
|
||||||
|
|
||||||
|
import com.vaadin.flow.component.button.Button;
|
||||||
|
import com.vaadin.flow.component.button.ButtonVariant;
|
||||||
|
import com.vaadin.flow.component.formlayout.FormLayout;
|
||||||
|
import com.vaadin.flow.component.html.H3;
|
||||||
|
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||||
|
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||||
|
import com.vaadin.flow.component.textfield.PasswordField;
|
||||||
|
import com.vaadin.flow.router.BeforeEnterEvent;
|
||||||
|
import com.vaadin.flow.router.BeforeEnterObserver;
|
||||||
|
import com.vaadin.flow.router.PageTitle;
|
||||||
|
import com.vaadin.flow.router.Route;
|
||||||
|
import com.vaadin.flow.server.auth.AnonymousAllowed;
|
||||||
|
|
||||||
|
@Route("init-account")
|
||||||
|
@PageTitle("PFS Intra")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public class InitAccountView extends VerticalLayout implements BeforeEnterObserver {
|
||||||
|
|
||||||
|
public InitAccountView() {
|
||||||
|
setSizeFull();
|
||||||
|
setAlignItems(Alignment.CENTER);
|
||||||
|
setJustifyContentMode(JustifyContentMode.CENTER);
|
||||||
|
|
||||||
|
final VerticalLayout vl = new VerticalLayout();
|
||||||
|
vl.setJustifyContentMode(JustifyContentMode.CENTER);
|
||||||
|
vl.setWidth("400px");
|
||||||
|
|
||||||
|
final PasswordField password = new PasswordField("Password");
|
||||||
|
final PasswordField confirmPassword = new PasswordField("Confirm Password");
|
||||||
|
|
||||||
|
final FormLayout formLayout = new FormLayout(password, confirmPassword);
|
||||||
|
formLayout.setColspan(password, 3);
|
||||||
|
formLayout.setColspan(confirmPassword, 3);
|
||||||
|
|
||||||
|
final Button primaryButton = new Button("Submit");
|
||||||
|
primaryButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
|
||||||
|
|
||||||
|
final Button secondaryButton = new Button("Cancel");
|
||||||
|
HorizontalLayout hl = new HorizontalLayout(secondaryButton, primaryButton);
|
||||||
|
|
||||||
|
vl.add(new H3("Set Account Password"));
|
||||||
|
vl.add(formLayout);
|
||||||
|
vl.add(hl);
|
||||||
|
|
||||||
|
add(vl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void beforeEnter(final BeforeEnterEvent beforeEnterEvent) {
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package com.primefactorsolutions.views;
|
package com.primefactorsolutions.views;
|
||||||
|
|
||||||
|
import com.vaadin.flow.component.html.Anchor;
|
||||||
import com.vaadin.flow.component.html.H1;
|
import com.vaadin.flow.component.html.H1;
|
||||||
import com.vaadin.flow.component.login.LoginForm;
|
import com.vaadin.flow.component.login.LoginForm;
|
||||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||||
@ -23,9 +24,11 @@ public class LoginView extends VerticalLayout implements BeforeEnterObserver {
|
|||||||
setJustifyContentMode(JustifyContentMode.CENTER);
|
setJustifyContentMode(JustifyContentMode.CENTER);
|
||||||
|
|
||||||
login.setAction("login");
|
login.setAction("login");
|
||||||
|
login.setForgotPasswordButtonVisible(false);
|
||||||
|
|
||||||
add(new H1("PFS Intra"));
|
add(new H1("PFS Intra"));
|
||||||
add(login);
|
add(login);
|
||||||
|
add(new Anchor("/password-recovery", "Reset password?"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
package com.primefactorsolutions.views;
|
||||||
|
|
||||||
|
import com.primefactorsolutions.service.AccountService;
|
||||||
|
import com.vaadin.flow.component.ClickEvent;
|
||||||
|
import com.vaadin.flow.component.ComponentEventListener;
|
||||||
|
import com.vaadin.flow.component.button.Button;
|
||||||
|
import com.vaadin.flow.component.button.ButtonVariant;
|
||||||
|
import com.vaadin.flow.component.formlayout.FormLayout;
|
||||||
|
import com.vaadin.flow.component.html.H3;
|
||||||
|
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||||
|
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||||
|
import com.vaadin.flow.component.textfield.EmailField;
|
||||||
|
import com.vaadin.flow.router.BeforeEnterEvent;
|
||||||
|
import com.vaadin.flow.router.BeforeEnterObserver;
|
||||||
|
import com.vaadin.flow.router.PageTitle;
|
||||||
|
import com.vaadin.flow.router.Route;
|
||||||
|
import com.vaadin.flow.server.auth.AnonymousAllowed;
|
||||||
|
|
||||||
|
@Route("password-recovery")
|
||||||
|
@PageTitle("PFS Intra")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public class PasswordRecoveryView extends VerticalLayout implements BeforeEnterObserver {
|
||||||
|
|
||||||
|
public PasswordRecoveryView(final AccountService accountService) {
|
||||||
|
setSizeFull();
|
||||||
|
setAlignItems(Alignment.CENTER);
|
||||||
|
setJustifyContentMode(JustifyContentMode.CENTER);
|
||||||
|
|
||||||
|
final VerticalLayout vl = new VerticalLayout();
|
||||||
|
vl.setJustifyContentMode(JustifyContentMode.CENTER);
|
||||||
|
vl.setWidth("400px");
|
||||||
|
|
||||||
|
final EmailField personalEmail = new EmailField("Personal Email");
|
||||||
|
personalEmail.setRequired(true);
|
||||||
|
|
||||||
|
final EmailField confirmPersonalEmail = new EmailField("Confirm Personal Email");
|
||||||
|
confirmPersonalEmail.setRequired(true);
|
||||||
|
|
||||||
|
final FormLayout formLayout = new FormLayout(personalEmail, confirmPersonalEmail);
|
||||||
|
formLayout.setColspan(personalEmail, 3);
|
||||||
|
formLayout.setColspan(confirmPersonalEmail, 3);
|
||||||
|
|
||||||
|
final Button primaryButton = new Button("Submit");
|
||||||
|
primaryButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
|
||||||
|
primaryButton.addClickListener((ComponentEventListener<ClickEvent<Button>>) buttonClickEvent -> {
|
||||||
|
if (personalEmail.getValue().equals(confirmPersonalEmail.getValue())) {
|
||||||
|
accountService.sendResetPasswordEmail(personalEmail.getValue());
|
||||||
|
getUI().ifPresent(ui -> ui.navigate(MainView.class));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
final Button secondaryButton = new Button("Cancel");
|
||||||
|
final HorizontalLayout hl = new HorizontalLayout(secondaryButton, primaryButton);
|
||||||
|
secondaryButton.addClickListener((ComponentEventListener<ClickEvent<Button>>) buttonClickEvent ->
|
||||||
|
getUI().ifPresent(ui -> ui.navigate(MainView.class)));
|
||||||
|
|
||||||
|
vl.add(new H3("PFS - Password Recovery"));
|
||||||
|
vl.add(formLayout);
|
||||||
|
vl.add(hl);
|
||||||
|
|
||||||
|
add(vl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void beforeEnter(final BeforeEnterEvent beforeEnterEvent) {
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
package com.primefactorsolutions.views;
|
||||||
|
|
||||||
|
import com.primefactorsolutions.service.AccountService;
|
||||||
|
import com.vaadin.flow.component.ClickEvent;
|
||||||
|
import com.vaadin.flow.component.ComponentEventListener;
|
||||||
|
import com.vaadin.flow.component.button.Button;
|
||||||
|
import com.vaadin.flow.component.button.ButtonVariant;
|
||||||
|
import com.vaadin.flow.component.formlayout.FormLayout;
|
||||||
|
import com.vaadin.flow.component.html.H3;
|
||||||
|
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||||
|
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||||
|
import com.vaadin.flow.component.textfield.PasswordField;
|
||||||
|
import com.vaadin.flow.router.*;
|
||||||
|
import com.vaadin.flow.server.auth.AnonymousAllowed;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route("reset-password")
|
||||||
|
@PageTitle("PFS Intra")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public class ResetPasswordView extends VerticalLayout implements BeforeEnterObserver {
|
||||||
|
private String username;
|
||||||
|
private String token;
|
||||||
|
|
||||||
|
public ResetPasswordView(final AccountService accountService) {
|
||||||
|
setSizeFull();
|
||||||
|
setAlignItems(Alignment.CENTER);
|
||||||
|
setJustifyContentMode(JustifyContentMode.CENTER);
|
||||||
|
|
||||||
|
final VerticalLayout vl = new VerticalLayout();
|
||||||
|
vl.setJustifyContentMode(JustifyContentMode.CENTER);
|
||||||
|
vl.setWidth("400px");
|
||||||
|
|
||||||
|
final PasswordField password = new PasswordField("Password");
|
||||||
|
final PasswordField confirmPassword = new PasswordField("Confirm Password");
|
||||||
|
|
||||||
|
final FormLayout formLayout = new FormLayout(password, confirmPassword);
|
||||||
|
formLayout.setColspan(password, 3);
|
||||||
|
formLayout.setColspan(confirmPassword, 3);
|
||||||
|
|
||||||
|
final Button primaryButton = new Button("Submit");
|
||||||
|
primaryButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
|
||||||
|
primaryButton.addClickListener((ComponentEventListener<ClickEvent<Button>>) buttonClickEvent -> {
|
||||||
|
accountService.resetPassword(username, password.getValue(), token);
|
||||||
|
getUI().ifPresent(ui -> ui.navigate(MainView.class));
|
||||||
|
});
|
||||||
|
|
||||||
|
final Button secondaryButton = new Button("Cancel");
|
||||||
|
secondaryButton.addClickListener((ComponentEventListener<ClickEvent<Button>>) buttonClickEvent ->
|
||||||
|
getUI().ifPresent(ui -> ui.navigate(MainView.class)));
|
||||||
|
|
||||||
|
HorizontalLayout hl = new HorizontalLayout(secondaryButton, primaryButton);
|
||||||
|
|
||||||
|
vl.add(new H3("PFS - Reset Password"));
|
||||||
|
vl.add(formLayout);
|
||||||
|
vl.add(hl);
|
||||||
|
|
||||||
|
add(vl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void beforeEnter(final BeforeEnterEvent beforeEnterEvent) {
|
||||||
|
final Location location = beforeEnterEvent.getLocation();
|
||||||
|
final QueryParameters queryParameters = location.getQueryParameters();
|
||||||
|
|
||||||
|
this.username = queryParameters.getParameters().getOrDefault("username", List.of()).stream()
|
||||||
|
.findFirst().orElse(null);
|
||||||
|
this.token = queryParameters.getParameters().getOrDefault("token", List.of()).stream()
|
||||||
|
.findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
}
|
@ -44,3 +44,5 @@ spring.sql.init.mode=${SQL_INIT:embedded}
|
|||||||
|
|
||||||
spring.h2.console.enabled=true
|
spring.h2.console.enabled=true
|
||||||
spring.h2.console.settings.web-allow-others=true
|
spring.h2.console.settings.web-allow-others=true
|
||||||
|
|
||||||
|
application.jwtSecret=${JWT_SECRET}
|
Loading…
Reference in New Issue
Block a user