Issue
As above this creates two database entries in user table. The process should be following:
- a new user enters their email and password -> saved in login table
- user confirm Email address -> entry in user table with username (email) and first&second name should be null at first.
For second the code would be like that (working)
User user = new User("username", null, null)
public RegistrationConfirmResponse registerNewUser(User user, String password) {
loginRepository.findByUsername(user.getUsername()).get().setUsername(null);
userRepository.save(user);
passwordRepository.save(new Password(user.getUserId(), password));
return new RegistrationConfirmResponse("done", user.getUsername());
}
is returning
{"answer":"done","username":null}
in Database creates this 2 entries
ID | enabled | fistname | locked | secondname | username |
---|---|---|---|---|---|
1 | 0 | NULL | 0 | NULL | [email protected] |
2 | 0 | NULL | 0 | NULL | NULL |
The entry with ID 1 is correct but number 2 must not be created.
RegistrationConfirmResponse
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class RegistrationConfirmResponse {
private String answer;
private String username;
}
Method calling registerNewUser
@Transactional
public RegistrationConfirmResponse confirmToken(String token){
var confirmationToken = confirmationTokenService.getToken(token);
var confirmedAt = confirmationToken.getConfirmedAt();
/* Uncommented due to testing usage
if(confirmedAt != null && Duration.between(LocalDateTime.now(), confirmedAt).toSeconds() < 10) {
System.out.println(Duration.between(LocalDateTime.now(), confirmedAt).toString());
throw new IllegalStateException("email already confirmed confirmed at " + confirmedAt);
}*/
LocalDateTime expiredAt = confirmationToken.getExpiredAt();
if(expiredAt.isBefore(LocalDateTime.now())){
throw new IllegalStateException("token expired");
}
confirmationToken.setConfirmedAt(LocalDateTime.now());
var user = new User(confirmationToken.getLogin().getUsername(), null, null);
confirmationToken.getLogin().setUsername(null);
return userService.registerNewUser(user, confirmationToken.getLogin().getPassword());
}
Solution
Solution:
I removed the Login table and write directly in user table
now everything is working as it should be
Answered By - Johannes Losch