diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingDefinitionFacade.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingDefinitionFacade.java index 9dff1a6bb0859642307b60a3c3d13d952e36d6ef..16c76509ed1721f7068444f7208e55814ef2d8bf 100644 --- a/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingDefinitionFacade.java +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingDefinitionFacade.java @@ -219,12 +219,6 @@ public class TrainingDefinitionFacade { trainingDefinitionService.update(mappedTrainingDefinition); } - private User createUserRefFromDTO(UserRefDTO userToBeCreated) { - User user = new User(); - user.setUserRefId(userToBeCreated.getUserRefId()); - return user; - } - /** * Clones Training Definition by id * @@ -359,11 +353,8 @@ public class TrainingDefinitionFacade { if (actualAuthorsIds.contains(author.getUserRefId())) { continue; } - try { - trainingDefinition.addAuthor(userService.getUserByUserRefId(author.getUserRefId())); - } catch (EntityNotFoundException ex) { - trainingDefinition.addAuthor(userService.createUserRef(createUserRefFromDTO(author))); - } + User user = userService.createOrGetUserRef(author.getUserRefId()); + trainingDefinition.addAuthor(user); } } diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingInstanceFacade.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingInstanceFacade.java index 26a530561a2de43d4c72ada4c456e3b43f88147f..69c07477ce7530f0d7493c641686f4bca7ce8a5b 100644 --- a/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingInstanceFacade.java +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingInstanceFacade.java @@ -197,11 +197,8 @@ public class TrainingInstanceFacade { if (actualOrganizersIds.contains(organizer.getUserRefId())) { continue; } - try { - trainingInstance.addOrganizer(userService.getUserByUserRefId(organizer.getUserRefId())); - } catch (EntityNotFoundException ex) { - trainingInstance.addOrganizer(userService.createUserRef(createUserRefFromDTO(organizer))); - } + User user = userService.createOrGetUserRef(organizer.getUserRefId()); + trainingInstance.addOrganizer(user); } } @@ -218,12 +215,6 @@ public class TrainingInstanceFacade { return users; } - private User createUserRefFromDTO(UserRefDTO userToBeCreated) { - User user = new User(); - user.setUserRefId(userToBeCreated.getUserRefId()); - return user; - } - /** * Deletes specific training instance based on id * diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepository.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepository.java index c44943f6b5b8a2978911a320b083a0338ded996f..f42c7f7dbd3db113c4f32d97cd9efcfec1c3d4b2 100644 --- a/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepository.java +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepository.java @@ -13,7 +13,7 @@ import java.util.Set; * The JPA repository interface to manage {@link User} instances. */ @Repository -public interface UserRefRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User> { +public interface UserRefRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User>, UserRefRepositoryCustom { /** * Find all users by userRefIds. diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryCustom.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..158c52862c4f19cf7a3a7c0704c070da72b59ce6 --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryCustom.java @@ -0,0 +1,22 @@ +package cz.muni.ics.kypo.training.adaptive.repository; + +import cz.muni.ics.kypo.training.adaptive.domain.User; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.repository.query.Param; + +import javax.transaction.Transactional; + + +public interface UserRefRepositoryCustom { + + /** + * Insert user reference if it does not exist in the database. + * + * @param userRefId the user reference id + * @return the number of rows affected + */ + @Modifying + @Transactional + User createOrGet(@Param("userRefId") Long userRefId); + +} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryImpl.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..4324a20690d10cd00ab6a5c3333f6e3f0fd26c07 --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryImpl.java @@ -0,0 +1,41 @@ +package cz.muni.ics.kypo.training.adaptive.repository; + +import cz.muni.ics.kypo.training.adaptive.domain.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +@Repository +public class UserRefRepositoryImpl implements UserRefRepositoryCustom { + + private static final Logger LOG = LoggerFactory.getLogger(UserRefRepositoryImpl.class); + + @PersistenceContext + private EntityManager entityManager; + + @Override + public User createOrGet(Long userRefId) { + int rowsAffected = entityManager.createNativeQuery("INSERT INTO \"user\" (user_ref_id) VALUES (:userRefId)" + + "ON CONFLICT DO NOTHING") + .setParameter("userRefId", userRefId) + .executeUpdate(); + + if (rowsAffected != 0) { + LOG.info("User with user_ref_id {} created", userRefId); + } + + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class); + Root<User> root = criteriaQuery.from(User.class); + criteriaBuilder.and(criteriaBuilder.equal(root.get("userRefId"), userRefId)); + return entityManager.createQuery(criteriaQuery).getSingleResult(); + } + + +} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/UserService.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/UserService.java index 6e78c324412d0ab99f439ef4d2d82c2af610762b..0a8165f796e7826e4bc831bef33ea3e12fb0f920 100644 --- a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/UserService.java +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/UserService.java @@ -45,15 +45,14 @@ public class UserService { } /** - * Create new user reference + * If user reference with given user id does not exist, it is created and returned. + * Otherwise, the existing one is returned. * - * @param userToCreate user reference to be created - * @return created {@link User} + * @param userRefId id of the referenced user + * @return user reference with given referenced id */ - @TransactionalWO - public User createUserRef(User userToCreate) { - User user = userRefRepository.save(userToCreate); - LOG.info("User ref with user_ref_id: {} created.", user.getUserRefId()); - return user; + public User createOrGetUserRef(Long userRefId) { + return userRefRepository.createOrGet(userRefId); } + } diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingDefinitionService.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingDefinitionService.java index 2648a26c8c6e39d74ab45e1fdb3af3803271d1f3..5005ff31179975a9c4a3a6451df55f0f2aae825d 100644 --- a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingDefinitionService.java +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingDefinitionService.java @@ -456,14 +456,7 @@ public class TrainingDefinitionService { } private void addLoggedInUserToTrainingDefinitionAsAuthor(TrainingDefinition trainingDefinition) { - Long loggedInId = userManagementServiceApi.getLoggedInUserRefId(); - Optional<User> user = userRefRepository.findUserByUserRefId(loggedInId); - if (user.isPresent()) { - trainingDefinition.addAuthor(user.get()); - } else { - User newUser = new User(loggedInId); - userRefRepository.saveAndFlush(newUser); - trainingDefinition.addAuthor(newUser); - } + User user = userRefRepository.createOrGet(userManagementServiceApi.getLoggedInUserRefId()); + trainingDefinition.addAuthor(user); } } diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingInstanceService.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingInstanceService.java index 7aebe488c9409795ccaedd4256be1d248878d55a..67d73f06212b1fe0552f98c2fb8fb4c48f0f0823 100644 --- a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingInstanceService.java +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingInstanceService.java @@ -214,13 +214,8 @@ public class TrainingInstanceService { } private void addLoggedInUserAsOrganizerToTrainingInstance(TrainingInstance trainingInstance) { - Optional<User> authorOfTrainingInstance = organizerRefRepository.findUserByUserRefId(userManagementServiceApi.getLoggedInUserRefId()); - if (authorOfTrainingInstance.isPresent()) { - trainingInstance.addOrganizer(authorOfTrainingInstance.get()); - } else { - User user = new User(userManagementServiceApi.getLoggedInUserRefId()); - trainingInstance.addOrganizer(organizerRefRepository.save(user)); - } + User userRef = organizerRefRepository.createOrGet(userManagementServiceApi.getLoggedInUserRefId()); + trainingInstance.addOrganizer(userRef); } /** diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingRunService.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingRunService.java index fd77628ae9f64bd6ce7f224a944872c3860d5793..b4b955ae315580a9b46c69a32f7d4916b5fea338 100644 --- a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingRunService.java +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingRunService.java @@ -590,12 +590,9 @@ public class TrainingRunService { TrainingRun newTrainingRun = new TrainingRun(); newTrainingRun.setCurrentPhase(currentPhase); - Optional<User> userRefOpt = participantRefRepository.findUserByUserRefId(participantRefId); - if (userRefOpt.isPresent()) { - newTrainingRun.setParticipantRef(userRefOpt.get()); - } else { - newTrainingRun.setParticipantRef(participantRefRepository.save(new User(userManagementServiceApi.getLoggedInUserRefId()))); - } + User userRef = participantRefRepository.createOrGet(participantRefId); + newTrainingRun.setParticipantRef(userRef); + newTrainingRun.setState(TRState.RUNNING); newTrainingRun.setTrainingInstance(trainingInstance); newTrainingRun.setStartTime(startTime);