Skip to content

Commit

Permalink
Further refactoring & fixing logic
Browse files Browse the repository at this point in the history
  • Loading branch information
DomWestAnd committed Jul 6, 2023
1 parent b53a9f1 commit b47c58f
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface RoleRepository extends JpaRepository<Role, Integer> {
Optional<Role> findByName(RoleEnum name);
List<Role> findByUsers_Email(String email);
List<Role> findByUsers_Sub(String sub);
}

Original file line number Diff line number Diff line change
Expand Up @@ -121,29 +121,57 @@ public boolean doesUserExistBySub(final String sub) {
return userRepository.existsBySub(sub);
}

public List<RoleEnum> getUsersRoles(final String sub) {
final User user = userRepository.findBySub(sub).orElseThrow(() -> new UserNotFoundException("Could not get users roles: User with sub '" + sub + "' not found"));
return user.getRoles().stream()
public List<RoleEnum> getUsersRolesByEmail(final String email) {
return roleRepository.findByUsers_Email(email)
.stream()
.map(Role::getName)
.collect(Collectors.toList());
}

public void createUser(final String sub, final String email) {
public List<RoleEnum> getUsersRolesBySub(final String sub) {
return roleRepository.findByUsers_Sub(sub)
.stream()
.map(Role::getName)
.collect(Collectors.toList());
}

public List<RoleEnum> getNewUserRoles() {
final List<RoleEnum> newUserRoles = new ArrayList<>();
newUserRoles.add(RoleEnum.APPLICANT);
newUserRoles.add(RoleEnum.FIND);
return newUserRoles;
}

public boolean isUserAnApplicant(final List<RoleEnum> userRoles) {
return !isUserAnAdmin(userRoles) && userRoles.stream().anyMatch((role) -> role.equals(RoleEnum.APPLICANT));
}

public boolean isUserAnAdmin(final List<RoleEnum> userRoles) {
return userRoles.stream().anyMatch((role) -> role.equals(RoleEnum.ADMIN) || role.equals(RoleEnum.SUPER_ADMIN));
}

public boolean isUserASuperAdmin(final List<RoleEnum> userRoles) {
return userRoles.stream().anyMatch((role) -> role.equals(RoleEnum.SUPER_ADMIN));
}

public List<RoleEnum> createUser(final String sub, final String email) {
final User user = User.builder()
.sub(sub)
.email(email)
.build();
user.addRole(roleRepository.findByName(RoleEnum.APPLICANT)
.orElseThrow(() -> new RoleNotFoundException("Could not create user: 'APPLICANT' role not found")));
user.addRole(roleRepository.findByName(RoleEnum.FIND)
.orElseThrow(() -> new RoleNotFoundException("Could not create user: 'FIND' role not found")));
final List<RoleEnum> newUserRoles = getNewUserRoles();
for (RoleEnum roleEnum : newUserRoles) {
final Role role = roleRepository.findByName(roleEnum)
.orElseThrow(() -> new RoleNotFoundException("Could not create user: '" + roleEnum + "' role not found"));
user.addRole(role);
}
userRepository.save(user);
return newUserRoles;
}

public void addSubToUser(final String sub, final String email) {
final User user = userRepository.findByEmail(email).orElseThrow(() -> new UserNotFoundException("Could not add sub to user: User with email '" + email + "' not found"));
user.setSub(sub);
userRepository.save(user);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -85,21 +85,35 @@ public RedirectView redirectAfterLogin(final @CookieValue(name = REDIRECT_URL_CO
final boolean userExistsByEmail = oneLoginService.doesUserExistByEmail(userInfo.getEmail());
final boolean userExistsBySub = oneLoginService.doesUserExistBySub(userInfo.getSub());

if(!userExistsByEmail) {
oneLoginService.createUser(userInfo.getSub(), userInfo.getEmail());
} else if(!userExistsBySub) {
oneLoginService.addSubToUser(userInfo.getSub(), userInfo.getEmail());
final Cookie customJwtCookie = generateCustomJwtCookie(userInfo);
response.addCookie(customJwtCookie);

if (userExistsBySub) {
final List<RoleEnum> userRoles = oneLoginService.getUsersRolesBySub(userInfo.getSub());
return getRedirectView(userRoles, redirectUrl);
}

final Cookie customJwtCookie = generateCustomJwtCookie(userInfo.getSub(), userInfo.getEmail());
response.addCookie(customJwtCookie);
return new RedirectView(getRedirectUrl(userInfo.getSub(), redirectUrl));
if (userExistsByEmail) {
final List<RoleEnum> userRoles = oneLoginService.getUsersRolesByEmail(userInfo.getEmail());
final boolean isApplicant = oneLoginService.isUserAnApplicant(userRoles);
if (isApplicant) {
// TODO GAP-1922: Create migration page with a yes/no option
return new RedirectView("/should-migrate-data");
} else {
// TODO GAP-1932: Migrate cola user data to this admin
oneLoginService.addSubToUser(userInfo.getSub(), userInfo.getEmail());
return getRedirectView(userRoles, redirectUrl);
}
}

final List<RoleEnum> userRoles = oneLoginService.createUser(userInfo.getSub(), userInfo.getEmail());
return getRedirectView(userRoles, redirectUrl);
}

private Cookie generateCustomJwtCookie(final String sub, final String email) {
private Cookie generateCustomJwtCookie(final OneLoginUserInfoDto userInfo) {
final Map<String, String> claims = new HashMap<>();
claims.put("email", email);
claims.put("sub", sub);
claims.put("email", userInfo.getEmail());
claims.put("sub", userInfo.getSub());

return WebUtil.buildCookie(
new Cookie(userServiceCookieName, customJwtService.generateToken(claims)),
Expand All @@ -110,16 +124,10 @@ private Cookie generateCustomJwtCookie(final String sub, final String email) {
}

@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
private String getRedirectUrl(final String sub, final Optional<String> redirectUrl) {
final List<RoleEnum> usersRoles = oneLoginService.getUsersRoles(sub);

boolean isSuperAdmin = usersRoles.stream().anyMatch((role) -> role.equals(RoleEnum.SUPER_ADMIN));
if(isSuperAdmin) return adminBaseUrl + "/super-admin/dashboard";

boolean isAdmin = usersRoles.stream().anyMatch((role) -> role.equals(RoleEnum.ADMIN));
if(isAdmin) return adminBaseUrl + "/dashboard";

return (redirectUrl.orElse(configProperties.getDefaultRedirectUrl()));
private RedirectView getRedirectView(final List<RoleEnum> userRoles, final Optional<String> redirectUrl) {
if(oneLoginService.isUserASuperAdmin(userRoles)) return new RedirectView(adminBaseUrl + "/super-admin/dashboard");
if(oneLoginService.isUserAnAdmin(userRoles)) return new RedirectView(adminBaseUrl + "/dashboard");
return new RedirectView((redirectUrl.orElse(configProperties.getDefaultRedirectUrl())));
}

}

0 comments on commit b47c58f

Please sign in to comment.