From b20ab96b5531028384096d2c4ef2329c31134506 Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Sat, 28 Mar 2020 11:20:29 +0400 Subject: [PATCH] fix check unique name of grant --- .../repository/ConferenceRepository.java | 2 +- .../grant/repository/GrantRepository.java | 4 ++-- .../ru/ulstu/grant/service/GrantService.java | 2 +- .../java/ru/ulstu/name/BaseRepository.java | 4 +++- src/main/java/ru/ulstu/name/BaseService.java | 19 ++++++++++++++++--- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/ulstu/conference/repository/ConferenceRepository.java b/src/main/java/ru/ulstu/conference/repository/ConferenceRepository.java index 5319e37..53a9d84 100644 --- a/src/main/java/ru/ulstu/conference/repository/ConferenceRepository.java +++ b/src/main/java/ru/ulstu/conference/repository/ConferenceRepository.java @@ -28,7 +28,7 @@ public interface ConferenceRepository extends JpaRepository @Override @Query("SELECT title FROM Conference c WHERE (c.title = :name) AND (:id IS NULL OR c.id != :id) ") - String findFirstByNameAndNotId(@Param("name") String name, @Param("id") Integer id); + List findByNameAndNotId(@Param("name") String name, @Param("id") Integer id); @Query("SELECT c FROM Conference c LEFT JOIN c.users u WHERE (:user IS NULL OR u.user = :user) " + "AND (u.participation = 'INTRAMURAL') AND (c.beginDate <= CURRENT_DATE) AND (c.endDate >= CURRENT_DATE)") diff --git a/src/main/java/ru/ulstu/grant/repository/GrantRepository.java b/src/main/java/ru/ulstu/grant/repository/GrantRepository.java index b370bf3..429507f 100644 --- a/src/main/java/ru/ulstu/grant/repository/GrantRepository.java +++ b/src/main/java/ru/ulstu/grant/repository/GrantRepository.java @@ -12,13 +12,13 @@ public interface GrantRepository extends JpaRepository, BaseRepo List findByStatus(Grant.GrantStatus status); - Grant findByTitle(String title); + Grant findFirstByTitle(String title); Grant findGrantById(Integer grantId); @Override @Query("SELECT title FROM Grant g WHERE (g.title = :name) AND (:id IS NULL OR g.id != :id) ") - String findFirstByNameAndNotId(@Param("name") String name, @Param("id") Integer id); + List findByNameAndNotId(@Param("name") String name, @Param("id") Integer id); @Query("SELECT g FROM Grant g WHERE (g.status <> 'SKIPPED') AND (g.status <> 'COMPLETED')") List findAllActive(); diff --git a/src/main/java/ru/ulstu/grant/service/GrantService.java b/src/main/java/ru/ulstu/grant/service/GrantService.java index 28d3f8c..cb4cb32 100644 --- a/src/main/java/ru/ulstu/grant/service/GrantService.java +++ b/src/main/java/ru/ulstu/grant/service/GrantService.java @@ -197,7 +197,7 @@ public class GrantService extends BaseService { grantDto.setName(grantDto.getTitle()); String title = checkUniqueName(grantDto, grantDto.getId()); //проверка уникальности имени if (title != null) { - Grant grantFromDB = grantRepository.findByTitle(title); //грант с таким же названием из бд + Grant grantFromDB = grantRepository.findFirstByTitle(title); //грант с таким же названием из бд if (checkSameDeadline(grantDto, grantFromDB.getId())) { //если дедайны тоже совпадают return false; } else { //иначе грант уже был в системе, но в другом году, поэтому надо создать diff --git a/src/main/java/ru/ulstu/name/BaseRepository.java b/src/main/java/ru/ulstu/name/BaseRepository.java index d36feec..e3b870b 100644 --- a/src/main/java/ru/ulstu/name/BaseRepository.java +++ b/src/main/java/ru/ulstu/name/BaseRepository.java @@ -2,6 +2,8 @@ package ru.ulstu.name; import org.springframework.data.repository.query.Param; +import java.util.List; + public interface BaseRepository { - String findFirstByNameAndNotId(@Param("name") String name, @Param("id") Integer id); + List findByNameAndNotId(@Param("name") String name, @Param("id") Integer id); } diff --git a/src/main/java/ru/ulstu/name/BaseService.java b/src/main/java/ru/ulstu/name/BaseService.java index acad2d9..a8f17ca 100644 --- a/src/main/java/ru/ulstu/name/BaseService.java +++ b/src/main/java/ru/ulstu/name/BaseService.java @@ -3,21 +3,34 @@ package ru.ulstu.name; import org.springframework.stereotype.Service; import org.springframework.validation.Errors; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + @Service public abstract class BaseService { public BaseRepository baseRepository; protected void checkUniqueName(NameContainer nameContainer, Errors errors, Integer id, String errorMessage) { - if (nameContainer.getName().equals(baseRepository.findFirstByNameAndNotId(nameContainer.getName(), id))) { + if (nameContainer.getName().equals(getUnique(baseRepository.findByNameAndNotId(nameContainer.getName(), id)))) { errors.rejectValue("title", "errorCode", errorMessage); } } protected String checkUniqueName(NameContainer nameContainer, Integer id) { - if (nameContainer.getName().equals(baseRepository.findFirstByNameAndNotId(nameContainer.getName(), id))) { - return baseRepository.findFirstByNameAndNotId(nameContainer.getName(), id); + String foundName = getUnique(baseRepository.findByNameAndNotId(nameContainer.getName(), id)); + if (nameContainer.getName().equals(foundName)) { + return foundName; } return null; } + + private String getUnique(List names) { + return Optional.ofNullable(names) + .orElse(new ArrayList<>()) + .stream() + .findAny() + .orElse(null); + } }