Skip to content

Commit

Permalink
[ALS-4793] Fix User Roles
Browse files Browse the repository at this point in the history
  • Loading branch information
Gcolon021 committed Aug 28, 2023
1 parent 5c0e667 commit 6e1e3a7
Show file tree
Hide file tree
Showing 2 changed files with 189 additions and 187 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,189 +18,196 @@

/**
* <p>Provides operations for the User entity to interact with a database.</p>
*
* @see User
*/
@Transactional
@ApplicationScoped
public class UserRepository extends BaseRepository<User, UUID> {

private Logger logger = LoggerFactory.getLogger(UserRepository.class);

protected UserRepository() {
super(User.class);
}

public User findBySubject(String subject) {
try {
CriteriaQuery<User> query = em.getCriteriaBuilder().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();
return em.createQuery(query
.where(
eq(cb, queryRoot, "subject", subject)))
.getSingleResult();
} catch (NoResultException e){
return null;
}
}

public User findBySubjectAndConnection(String subject, String connectionId){
CriteriaQuery<User> query = em.getCriteriaBuilder().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();
try {
private Logger logger = LoggerFactory.getLogger(UserRepository.class);

protected UserRepository() {
super(User.class);
}

public User findBySubject(String subject) {
try {
CriteriaQuery<User> query = em.getCriteriaBuilder().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();
return em.createQuery(query
.where(
eq(cb, queryRoot, "subject", subject)))
.getSingleResult();
} catch (NoResultException e) {
return null;
}
}

public User findBySubjectAndConnection(String subject, String connectionId) {
CriteriaQuery<User> query = em.getCriteriaBuilder().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();
try {
return em.createQuery(query
.where(
cb.and(
cb.equal(queryRoot.join("connection")
.get("id"), connectionId),
eq(cb, queryRoot, "subject", subject))))
.where(
cb.and(
cb.equal(queryRoot.join("connection")
.get("id"), connectionId),
eq(cb, queryRoot, "subject", subject))))
.getSingleResult();
} catch (NoResultException e){
return null;
} catch (NoResultException e) {
return null;
}
}

public List<User> listUnmatchedByConnectionId(Connection connection) {
CriteriaQuery<User> query = em.getCriteriaBuilder().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();
return em.createQuery(query
.where(
cb.and(
eq(cb, queryRoot, "connection", connection),
eq(cb, queryRoot, "matched", false))))
.getResultList();
}

/**
* @return
*/
public User findOrCreate(User inputUser) {
User user = null;
String subject = inputUser.getSubject();
try {
user = findBySubject(subject);
logger.info("findOrCreate(), trying to find user: {subject: " + subject +
"}, and found a user with uuid: " + user.getUuid()
+ ", subject: " + user.getSubject());
} catch (NoResultException e) {
logger.debug("findOrCreate() subject " + subject +
" could not be found by `entityManager`, going to create a new user.");
user = createUser(inputUser);
} catch (NonUniqueResultException e) {
logger.error("findOrCreate() " + e.getClass().getSimpleName() + ": " + e.getMessage());
}
return user;
}

private User createUser(User inputUser) {
String subject = inputUser.getSubject();
logger.debug("createUser() creating user, subject: " + subject + " ......");
em().persist(inputUser);

User result = getById(inputUser.getUuid());
if (result != null)
logger.info("createUser() created user, uuid: " + result.getUuid()
+ ", subject: " + subject
+ ", role: " + result.getRoleString()
+ ", privilege: " + result.getPrivilegeString());

return result;
}

public User changeRole(User user, Set<Role> roles) {
logger.info("Starting changing the role of user: " + user.getUuid()
+ ", with subject: " + user.getSubject() + ", to " + roles.stream().map(role -> role.getName()).collect(Collectors.joining(",")));
user.setRoles(roles);
em().merge(user);
User updatedUser = getById(user.getUuid());
logger.info("User: " + updatedUser.getUuid() + ", with subject: " +
updatedUser.getSubject() + ", now has a new role: " + updatedUser.getRoleString());
return updatedUser;
}

@Override
public void persist(User user) {
findOrCreate(user);
}

public User findByEmail(String email) {
CriteriaQuery<User> query = em.getCriteriaBuilder().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();
return em.createQuery(query
.where(
eq(cb, queryRoot, "email", email)))
.getSingleResult();
}

public boolean checkAgainstTOSDate(String userId) {
CriteriaQuery<User> query = cb().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();

Subquery<Date> subquery = query.subquery(Date.class);
Root<TermsOfService> tosRoot = subquery.from(TermsOfService.class);
subquery.select(cb.greatest(tosRoot.<Date>get("dateUpdated")));

return !em.createQuery(query
.where(
cb.and(
eq(cb, queryRoot, "subject", userId),
cb.greaterThanOrEqualTo(queryRoot.get("acceptedTOS"), subquery))))
.getResultList().isEmpty();
}

/**
* @param uuid the uuid of the user to find
* @return the user with the given uuid, or null if no user is found
*/
public User findByUUID(UUID uuid) {
CriteriaQuery<User> query = em.getCriteriaBuilder().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();
try {
return em.createQuery(query
.where(
eq(cb, queryRoot, "uuid", uuid)))
.getSingleResult();
} catch (NoResultException e) {
logger.error("findByUUID() " + e.getClass().getSimpleName() + ": " + e.getMessage());
}

return null;
}

/**
* Creates a user with a subject of "open_access|{uuid}"
* and an email of "{uuid}@open_access.com"
*
* @return the created user
*/
public User createOpenAccessUser(Role openAccessRole) {
User user = new User();
em().persist(user);

user = getById(user.getUuid());
user.setSubject("open_access|" + user.getUuid().toString());
if (openAccessRole != null) {
logger.info("createOpenAccessUser() openAccessRole is not null");
logger.info("Adding role: " + openAccessRole.getName() + " to user: " + user.getUuid() + " with subject: " + user.getSubject());

user.setRoles(new HashSet<>(List.of(openAccessRole)));
} else {
logger.error("createOpenAccessUser() openAccessRole is null");
user.setRoles(new HashSet<>());
}
}

public List<User> listUnmatchedByConnectionId(Connection connection) {
CriteriaQuery<User> query = em.getCriteriaBuilder().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();
return em.createQuery(query
.where(
cb.and(
eq(cb, queryRoot, "connection", connection),
eq(cb, queryRoot, "matched", false))))
.getResultList();
}

/**
*
* @return
*/
public User findOrCreate(User inputUser) {
User user = null;
String subject = inputUser.getSubject();
try{
user = findBySubject(subject);
logger.info("findOrCreate(), trying to find user: {subject: " + subject+
"}, and found a user with uuid: " + user.getUuid()
+ ", subject: " + user.getSubject());
} catch (NoResultException e) {
logger.debug("findOrCreate() subject " + subject +
" could not be found by `entityManager`, going to create a new user.");
user = createUser(inputUser);
}catch(NonUniqueResultException e){
logger.error("findOrCreate() " + e.getClass().getSimpleName() + ": " + e.getMessage());
}
return user;
}

private User createUser(User inputUser) {
String subject = inputUser.getSubject();
logger.debug("createUser() creating user, subject: " + subject + " ......");
em().persist(inputUser);

User result = getById(inputUser.getUuid());
if (result != null)
logger.info("createUser() created user, uuid: " + result.getUuid()
+ ", subject: " + subject
+ ", role: " + result.getRoleString()
+ ", privilege: "+ result.getPrivilegeString());

return result;
}

public User changeRole(User user, Set<Role> roles){
logger.info("Starting changing the role of user: " + user.getUuid()
+ ", with subject: " + user.getSubject() + ", to " + roles.stream().map(role -> role.getName()).collect(Collectors.joining(",")));
user.setRoles(roles);
em().merge(user);
User updatedUser = getById(user.getUuid());
logger.info("User: " + updatedUser.getUuid() + ", with subject: " +
updatedUser.getSubject() + ", now has a new role: " + updatedUser.getRoleString());
return updatedUser;
}

@Override
public void persist(User user) {
findOrCreate(user);
}

public User findByEmail(String email) {
CriteriaQuery<User> query = em.getCriteriaBuilder().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();
return em.createQuery(query
.where(
eq(cb, queryRoot, "email", email)))
.getSingleResult();
}

public boolean checkAgainstTOSDate(String userId){
CriteriaQuery<User> query = cb().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();

Subquery<Date> subquery = query.subquery(Date.class);
Root<TermsOfService> tosRoot = subquery.from(TermsOfService.class);
subquery.select(cb.greatest(tosRoot.<Date>get("dateUpdated")));

return !em.createQuery(query
.where(
cb.and(
eq(cb, queryRoot, "subject", userId),
cb.greaterThanOrEqualTo(queryRoot.get("acceptedTOS"), subquery))))
.getResultList().isEmpty();
}

/**
*
* @param uuid the uuid of the user to find
* @return the user with the given uuid, or null if no user is found
*/
public User findByUUID(UUID uuid) {
CriteriaQuery<User> query = em.getCriteriaBuilder().createQuery(User.class);
Root<User> queryRoot = query.from(User.class);
query.select(queryRoot);
CriteriaBuilder cb = cb();
try {
return em.createQuery(query
.where(
eq(cb, queryRoot, "uuid", uuid)))
.getSingleResult();
} catch (NoResultException e){
logger.error("findByUUID() " + e.getClass().getSimpleName() + ": " + e.getMessage());
}

return null;
}

/**
* Creates a user with a subject of "open_access|{uuid}"
* and an email of "{uuid}@open_access.com"
*
* @return the created user
*/
public User createOpenAccessUser() {
User user = new User();
em().persist(user);

user = getById(user.getUuid());
user.setSubject("open_access|" + user.getUuid().toString());
user.setRoles(new HashSet<>());
user.setEmail(user.getUuid() + "@open_access.com");
em().merge(user);

logger.info("createOpenAccessUser() created user, uuid: " + user.getUuid()
+ ", subject: " + user.getSubject()
+ ", role: " + user.getRoleString()
+ ", privilege: "+ user.getPrivilegeString()
+ ", email: " + user.getEmail());
return user;
}
user.setEmail(user.getUuid() + "@open_access.com");
em().merge(user);

logger.info("createOpenAccessUser() created user, uuid: " + user.getUuid()
+ ", subject: " + user.getSubject()
+ ", role: " + user.getRoleString()
+ ", privilege: " + user.getPrivilegeString()
+ ", email: " + user.getEmail());
return user;
}
}
Loading

0 comments on commit 6e1e3a7

Please sign in to comment.