From fb74bf67729e829094527a832333c076137b0a9e Mon Sep 17 00:00:00 2001 From: TheKelp1e Date: Tue, 14 Nov 2023 21:40:38 +0300 Subject: [PATCH 1/9] last fix --- .../services/implementations/DepartmentServiceImpl.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/example/caselabproject/services/implementations/DepartmentServiceImpl.java b/src/main/java/com/example/caselabproject/services/implementations/DepartmentServiceImpl.java index 65b8f321..3b46f416 100644 --- a/src/main/java/com/example/caselabproject/services/implementations/DepartmentServiceImpl.java +++ b/src/main/java/com/example/caselabproject/services/implementations/DepartmentServiceImpl.java @@ -200,8 +200,6 @@ private boolean departmentIsActive(Department department) { */ private Department saveInternal(Department department) { try { - // при использовании просто save(), мы не сможем обработать ограничение - // уникальности, поэтому используем saveAndFlush(). return departmentRepository.save(department); } catch (DataIntegrityViolationException ex) { throw new DepartmentNameExistsException(department.getName()); From be889862e0d5783bf717060dc7c8a79641e6a03d Mon Sep 17 00:00:00 2001 From: Ermakov Stepan <110097131+stepansaint@users.noreply.github.com> Date: Wed, 15 Nov 2023 20:34:43 +0300 Subject: [PATCH 2/9] Update .gitignore, added ignoring log-files --- .../CaseLabProjectApplication.java | 1 + .../services/ApplicationStatusScheduler.java | 7 +++ .../ApplicationServiceImpl.java | 4 ++ .../ApplicationStatusSchedulerImpl.java | 61 +++++++++++++++++++ .../ApplicationStatusSchedulerImpl.java | 51 ++++++++++++++++ 5 files changed, 124 insertions(+) create mode 100644 src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java create mode 100644 src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java create mode 100644 src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java diff --git a/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java b/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java index 99d11523..049f74e8 100644 --- a/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java +++ b/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java @@ -4,6 +4,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication +// @EnableScheduling ??? public class CaseLabProjectApplication { public static void main(String[] args) { diff --git a/src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java b/src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java new file mode 100644 index 00000000..142dda9f --- /dev/null +++ b/src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java @@ -0,0 +1,7 @@ +package com.example.caselabproject.services; + +import java.time.LocalDateTime; + +public interface ApplicationStatusScheduler { + void save(Long id, String username, LocalDateTime dateTime); +} diff --git a/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java b/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java index 97605fe1..bfbeec4f 100644 --- a/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java +++ b/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java @@ -17,6 +17,7 @@ import com.example.caselabproject.repositories.ApplicationRepository; import com.example.caselabproject.repositories.UserRepository; import com.example.caselabproject.services.ApplicationService; +import com.example.caselabproject.services.ApplicationStatusScheduler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -30,6 +31,7 @@ public class ApplicationServiceImpl implements ApplicationService { private final ApplicationRepository applicationRepository; private final UserRepository userRepository; private final ApplicationItemRepository applicationItemRepository; + private final ApplicationStatusScheduler scheduler; @Override @@ -42,6 +44,7 @@ public ApplicationCreateResponseDto createApplication(String username, Applicati application.setApplicationStatus(ApplicationStatus.WAITING_FOR_ANSWER); application.setCreatorId(user); applicationRepository.save(application); + scheduler.save(application.getId(), user.getUsername(), application.getDeadlineDate()); return ApplicationCreateResponseDto.mapFromEntity(application); } @@ -60,6 +63,7 @@ public ApplicationUpdateResponseDto updateApplication(Long id, String username, applicationRepository.save(updateApplication); } + // service.update(request.getDead()) return ApplicationUpdateResponseDto.mapFromEntity(application); } diff --git a/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java b/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java new file mode 100644 index 00000000..f33fb957 --- /dev/null +++ b/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java @@ -0,0 +1,61 @@ +package com.example.caselabproject.services.implementations; + +import com.example.caselabproject.services.ApplicationService; +import com.example.caselabproject.services.ApplicationStatusScheduler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Service +//@RequiredArgsConstructor +// async? +public class ApplicationStatusSchedulerImpl implements ApplicationStatusScheduler { + private final ApplicationService applicationService; + // static Map -> + + @Autowired + public ApplicationStatusSchedulerImpl(@Lazy ApplicationService applicationService) { + this.applicationService = applicationService; + } + + +// @Scheduled() +// public void updateStatus() { +// // int n = getVotes() +// // count +// } + +// private void getVotes() { +// +// } + + + @Override + public void save(Long id, String username, LocalDateTime dateTime) { + ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); + try { + LocalDateTime localDateTime = LocalDateTime.now(); + ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault()); + + ZonedDateTime zonedDateTime1 = ZonedDateTime.of(dateTime, ZoneId.systemDefault()); + long millis = zonedDateTime1.toInstant().toEpochMilli() - zonedDateTime.toInstant().toEpochMilli(); + + executor.schedule( + () -> { + applicationService.deleteApplication(id, username); + }, + millis, + TimeUnit.MILLISECONDS); + } finally { + executor.shutdown(); +// executor.close(); ??? + } + } +} diff --git a/src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java b/src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java new file mode 100644 index 00000000..2b577877 --- /dev/null +++ b/src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java @@ -0,0 +1,51 @@ +package com.example.caselabproject.services.implementations; + +import com.example.caselabproject.models.DTOs.request.ApplicationCreateRequestDto; +import com.example.caselabproject.models.entities.User; +import com.example.caselabproject.repositories.ApplicationRepository; +import com.example.caselabproject.repositories.UserRepository; +import com.example.caselabproject.services.ApplicationService; +import com.example.caselabproject.services.ApplicationStatusScheduler; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; + +import java.time.LocalDateTime; +import java.util.Optional; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +//@ExtendWith(MockitoExtension.class) +class ApplicationStatusSchedulerImpl { + @Autowired + private ApplicationService service; + + @Autowired + private ApplicationStatusScheduler scheduler; + + @Mock + private UserRepository userRepository; + + @Mock + private ApplicationRepository applicationRepository; + + + @Test + void test() { + given(userRepository.findByUsername(any())) + .willReturn(Optional.of(new User())); + given(applicationRepository.save(any())) + .willReturn(new Object()); + + ApplicationCreateRequestDto requestDto = new ApplicationCreateRequestDto(); + requestDto.setName("new application"); + requestDto.setDeadlineDate(LocalDateTime.now().plusSeconds(3)); + + service.createApplication("user", + requestDto); + + verify(userRepository.findByUsername(any())); + } +} From f4fb58ce4c4b87a5cfbed1003dfa9d145267859f Mon Sep 17 00:00:00 2001 From: Ermakov Stepan <110097131+stepansaint@users.noreply.github.com> Date: Thu, 16 Nov 2023 14:49:51 +0300 Subject: [PATCH 3/9] Add setScheduler() for a new created application --- .../CaseLabProjectApplication.java | 1 - .../repositories/ApplicationRepository.java | 5 ++ .../services/ApplicationStatusScheduler.java | 2 +- .../ApplicationServiceImpl.java | 5 +- .../ApplicationStatusSchedulerImpl.java | 73 +++++++++---------- 5 files changed, 42 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java b/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java index 049f74e8..99d11523 100644 --- a/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java +++ b/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java @@ -4,7 +4,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -// @EnableScheduling ??? public class CaseLabProjectApplication { public static void main(String[] args) { diff --git a/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java b/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java index 18346e03..8d31d3fd 100644 --- a/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java +++ b/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java @@ -1,7 +1,12 @@ package com.example.caselabproject.repositories; import com.example.caselabproject.models.entities.Application; +import com.example.caselabproject.models.enums.RecordState; import org.springframework.data.jpa.repository.JpaRepository; +import java.time.LocalDateTime; + public interface ApplicationRepository extends JpaRepository { + boolean existsByIdAndRecordStateAndDeadlineDate( + Long id, RecordState state, LocalDateTime deadline); } diff --git a/src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java b/src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java index 142dda9f..7892eaaa 100644 --- a/src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java +++ b/src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java @@ -3,5 +3,5 @@ import java.time.LocalDateTime; public interface ApplicationStatusScheduler { - void save(Long id, String username, LocalDateTime dateTime); + void setScheduler(Long applicationId, LocalDateTime timeToExecute); } diff --git a/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java b/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java index bfbeec4f..711fdf27 100644 --- a/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java +++ b/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java @@ -44,7 +44,7 @@ public ApplicationCreateResponseDto createApplication(String username, Applicati application.setApplicationStatus(ApplicationStatus.WAITING_FOR_ANSWER); application.setCreatorId(user); applicationRepository.save(application); - scheduler.save(application.getId(), user.getUsername(), application.getDeadlineDate()); + scheduler.setScheduler(application.getId(), request.getDeadlineDate()); return ApplicationCreateResponseDto.mapFromEntity(application); } @@ -62,8 +62,7 @@ public ApplicationUpdateResponseDto updateApplication(Long id, String username, updateApplication.setDeadlineDate(application.getDeadlineDate()); applicationRepository.save(updateApplication); } - - // service.update(request.getDead()) + scheduler.setScheduler(updateApplication.getId(), request.getDeadline()); return ApplicationUpdateResponseDto.mapFromEntity(application); } diff --git a/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java b/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java index f33fb957..42d44e07 100644 --- a/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java +++ b/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java @@ -1,9 +1,9 @@ package com.example.caselabproject.services.implementations; -import com.example.caselabproject.services.ApplicationService; +import com.example.caselabproject.models.enums.RecordState; +import com.example.caselabproject.repositories.ApplicationRepository; import com.example.caselabproject.services.ApplicationStatusScheduler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; +import jakarta.annotation.PreDestroy; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -14,48 +14,43 @@ import java.util.concurrent.TimeUnit; @Service -//@RequiredArgsConstructor -// async? public class ApplicationStatusSchedulerImpl implements ApplicationStatusScheduler { - private final ApplicationService applicationService; - // static Map -> + private final ApplicationRepository applicationRepository; + private final ScheduledExecutorService executorService; - @Autowired - public ApplicationStatusSchedulerImpl(@Lazy ApplicationService applicationService) { - this.applicationService = applicationService; + public ApplicationStatusSchedulerImpl(ApplicationRepository applicationRepository) { + this.applicationRepository = applicationRepository; + this.executorService = Executors.newSingleThreadScheduledExecutor(); } + @Override + public void setScheduler(Long applicationId, LocalDateTime deadline) { + LocalDateTime localDateTime = LocalDateTime.now(); + ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault()); + + ZonedDateTime zonedDateTime1 = ZonedDateTime.of(deadline, ZoneId.systemDefault()); + long millis = zonedDateTime1.toInstant().toEpochMilli() - zonedDateTime.toInstant().toEpochMilli(); + executorService.schedule(() -> { + if (applicationRepository.existsByIdAndRecordStateAndDeadlineDate( + applicationId, RecordState.ACTIVE, deadline)) { + // count votes + // result Date + // delete + } + }, + millis, + TimeUnit.MILLISECONDS); + } -// @Scheduled() -// public void updateStatus() { -// // int n = getVotes() -// // count -// } - -// private void getVotes() { -// -// } + private long timer(LocalDateTime deleteTime) { + ZonedDateTime createTimeMillis = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()); + ZonedDateTime deleteTimeMillis = ZonedDateTime.of(deleteTime, ZoneId.systemDefault()); + return deleteTimeMillis.toInstant().toEpochMilli() - createTimeMillis.toInstant().toEpochMilli(); + } - @Override - public void save(Long id, String username, LocalDateTime dateTime) { - ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); - try { - LocalDateTime localDateTime = LocalDateTime.now(); - ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault()); - - ZonedDateTime zonedDateTime1 = ZonedDateTime.of(dateTime, ZoneId.systemDefault()); - long millis = zonedDateTime1.toInstant().toEpochMilli() - zonedDateTime.toInstant().toEpochMilli(); - - executor.schedule( - () -> { - applicationService.deleteApplication(id, username); - }, - millis, - TimeUnit.MILLISECONDS); - } finally { - executor.shutdown(); -// executor.close(); ??? - } + @PreDestroy + private void destroy() { + executorService.shutdownNow(); } } From e1e9373789aa746ae39142036bfe9b2f1baeb4b1 Mon Sep 17 00:00:00 2001 From: fvreeed Date: Thu, 16 Nov 2023 15:53:09 +0300 Subject: [PATCH 4/9] Merge branchs --- .../repositories/ApplicationRepository.java | 6 ++ .../ApplicationServiceImpl.java | 4 ++ .../ApplicationStatusSchedulerImpl.java | 71 ++++++++++++++----- 3 files changed, 63 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java b/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java index 8d31d3fd..46efdb3f 100644 --- a/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java +++ b/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java @@ -6,7 +6,13 @@ import java.time.LocalDateTime; +import java.util.List; + public interface ApplicationRepository extends JpaRepository { + + List findAllByRecordState( + RecordState recordState + ); boolean existsByIdAndRecordStateAndDeadlineDate( Long id, RecordState state, LocalDateTime deadline); } diff --git a/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java b/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java index 711fdf27..046441e8 100644 --- a/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java +++ b/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java @@ -28,9 +28,13 @@ @Service @RequiredArgsConstructor public class ApplicationServiceImpl implements ApplicationService { + private final ApplicationRepository applicationRepository; + private final UserRepository userRepository; + private final ApplicationItemRepository applicationItemRepository; + private final ApplicationStatusScheduler scheduler; diff --git a/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java b/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java index 42d44e07..33a3ef27 100644 --- a/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java +++ b/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java @@ -1,56 +1,91 @@ package com.example.caselabproject.services.implementations; +import com.example.caselabproject.exceptions.ApplicationAlreadyDeletedException; +import com.example.caselabproject.exceptions.ApplicationNotFoundException; +import com.example.caselabproject.models.entities.Application; +import com.example.caselabproject.models.enums.ApplicationStatus; import com.example.caselabproject.models.enums.RecordState; import com.example.caselabproject.repositories.ApplicationRepository; import com.example.caselabproject.services.ApplicationStatusScheduler; +import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @Service +@RequiredArgsConstructor public class ApplicationStatusSchedulerImpl implements ApplicationStatusScheduler { + private final ApplicationRepository applicationRepository; - private final ScheduledExecutorService executorService; - public ApplicationStatusSchedulerImpl(ApplicationRepository applicationRepository) { - this.applicationRepository = applicationRepository; - this.executorService = Executors.newSingleThreadScheduledExecutor(); - } + private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); + + private final ApplicationItemServiceImpl applicationItemServiceImpl; @Override public void setScheduler(Long applicationId, LocalDateTime deadline) { - LocalDateTime localDateTime = LocalDateTime.now(); - ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault()); - ZonedDateTime zonedDateTime1 = ZonedDateTime.of(deadline, ZoneId.systemDefault()); - long millis = zonedDateTime1.toInstant().toEpochMilli() - zonedDateTime.toInstant().toEpochMilli(); executorService.schedule(() -> { if (applicationRepository.existsByIdAndRecordStateAndDeadlineDate( applicationId, RecordState.ACTIVE, deadline)) { - // count votes - // result Date - // delete + deleteApplication(applicationId); } }, - millis, + timer(deadline), TimeUnit.MILLISECONDS); } - private long timer(LocalDateTime deleteTime) { - ZonedDateTime createTimeMillis = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()); - ZonedDateTime deleteTimeMillis = ZonedDateTime.of(deleteTime, ZoneId.systemDefault()); + public void renewSchedulers() { - return deleteTimeMillis.toInstant().toEpochMilli() - createTimeMillis.toInstant().toEpochMilli(); + List applications = applicationRepository.findAllByRecordState( + RecordState.ACTIVE + ); + + for (Application application : applications) { + executorService.schedule( + () -> deleteApplication(application.getId()), + timer(application.getDeadlineDate()), + TimeUnit.MILLISECONDS + ); + } + } + + @PostConstruct + private void init() { + renewSchedulers(); } @PreDestroy private void destroy() { executorService.shutdownNow(); } -} + + private void deleteApplication(Long id) { + Application application = applicationRepository.findById(id) + .orElseThrow(() -> new ApplicationNotFoundException(id)); + if (application.getApplicationStatus().equals(ApplicationStatus.WAITING_FOR_ANSWER)) { + applicationItemServiceImpl.calcApplicationItemsResult(application); + } + if (!application.getRecordState().equals(RecordState.DELETED)) { + application.setRecordState(RecordState.DELETED); + } else { + throw new ApplicationAlreadyDeletedException(application.getId()); + } + applicationRepository.save(application); + } + + private long timer(LocalDateTime deleteTime) { + ZonedDateTime createTimeMillis = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()); + ZonedDateTime deleteTimeMillis = ZonedDateTime.of(deleteTime, ZoneId.systemDefault()); + + return deleteTimeMillis.toInstant().toEpochMilli() - createTimeMillis.toInstant().toEpochMilli(); + } +} \ No newline at end of file From 26cda5e1b74efdfeeac7bf14cd64722fd8e8d4cc Mon Sep 17 00:00:00 2001 From: Ermakov Stepan <110097131+stepansaint@users.noreply.github.com> Date: Thu, 16 Nov 2023 16:28:35 +0300 Subject: [PATCH 5/9] Add package scheduler --- .../example/caselabproject/CaseLabProjectApplication.java | 2 ++ .../caselabproject/scheduler/ApplicationScheduler.java | 5 +++++ 2 files changed, 7 insertions(+) create mode 100644 src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java diff --git a/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java b/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java index 99d11523..7edc2119 100644 --- a/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java +++ b/src/main/java/com/example/caselabproject/CaseLabProjectApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication +@EnableScheduling public class CaseLabProjectApplication { public static void main(String[] args) { diff --git a/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java b/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java new file mode 100644 index 00000000..0d9fb264 --- /dev/null +++ b/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java @@ -0,0 +1,5 @@ +package com.example.caselabproject.scheduler; + +public class ApplicationScheduler { + +} From 7f79f465afe984eedb03e5665fd134b1bf5e99b2 Mon Sep 17 00:00:00 2001 From: fvreeed Date: Thu, 16 Nov 2023 17:43:22 +0300 Subject: [PATCH 6/9] Create Application Scheduler --- .../repositories/ApplicationRepository.java | 7 +- .../scheduler/ApplicationScheduler.java | 30 ++++++ .../services/ApplicationStatusScheduler.java | 7 -- .../ApplicationItemServiceImpl.java | 6 +- .../ApplicationServiceImpl.java | 5 - .../ApplicationStatusSchedulerImpl.java | 91 ------------------- .../ApplicationStatusSchedulerImpl.java | 4 - 7 files changed, 36 insertions(+), 114 deletions(-) delete mode 100644 src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java delete mode 100644 src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java diff --git a/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java b/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java index 46efdb3f..102ae092 100644 --- a/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java +++ b/src/main/java/com/example/caselabproject/repositories/ApplicationRepository.java @@ -1,6 +1,7 @@ package com.example.caselabproject.repositories; import com.example.caselabproject.models.entities.Application; +import com.example.caselabproject.models.enums.ApplicationStatus; import com.example.caselabproject.models.enums.RecordState; import org.springframework.data.jpa.repository.JpaRepository; @@ -10,9 +11,7 @@ public interface ApplicationRepository extends JpaRepository { - List findAllByRecordState( - RecordState recordState + List findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore( + RecordState recordState, ApplicationStatus applicationStatus, LocalDateTime now ); - boolean existsByIdAndRecordStateAndDeadlineDate( - Long id, RecordState state, LocalDateTime deadline); } diff --git a/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java b/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java index 0d9fb264..8d197ade 100644 --- a/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java +++ b/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java @@ -1,5 +1,35 @@ package com.example.caselabproject.scheduler; +import com.example.caselabproject.models.entities.Application; +import com.example.caselabproject.models.enums.ApplicationStatus; +import com.example.caselabproject.models.enums.RecordState; +import com.example.caselabproject.repositories.ApplicationRepository; +import com.example.caselabproject.services.implementations.ApplicationItemServiceImpl; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +@Component +@RequiredArgsConstructor public class ApplicationScheduler { + private final ApplicationRepository applicationRepository; + + private final ApplicationItemServiceImpl applicationItemServiceImpl; + + @Scheduled(cron = "0 */1 * * * *") + public void setScheduler() { + + List applications = applicationRepository + .findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore( + RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, LocalDateTime.now() + ); + + for (Application application : applications) { + applicationItemServiceImpl.calcApplicationItemsResult(application); + } + } } diff --git a/src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java b/src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java deleted file mode 100644 index 7892eaaa..00000000 --- a/src/main/java/com/example/caselabproject/services/ApplicationStatusScheduler.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.example.caselabproject.services; - -import java.time.LocalDateTime; - -public interface ApplicationStatusScheduler { - void setScheduler(Long applicationId, LocalDateTime timeToExecute); -} diff --git a/src/main/java/com/example/caselabproject/services/implementations/ApplicationItemServiceImpl.java b/src/main/java/com/example/caselabproject/services/implementations/ApplicationItemServiceImpl.java index 7c849575..de174040 100644 --- a/src/main/java/com/example/caselabproject/services/implementations/ApplicationItemServiceImpl.java +++ b/src/main/java/com/example/caselabproject/services/implementations/ApplicationItemServiceImpl.java @@ -173,7 +173,7 @@ public ApplicationItemVoteResponseDto voteApplicationItem(Long applicationId, return ApplicationItemVoteResponseDto.mapFromEntity(applicationItem); } - void calcApplicationItemsResult(Application application) { + public void calcApplicationItemsResult(Application application) { AtomicInteger pending = new AtomicInteger(); AtomicInteger accepted = new AtomicInteger(); AtomicInteger denied = new AtomicInteger(); @@ -188,9 +188,9 @@ void calcApplicationItemsResult(Application application) { } }); if(sum * 0.6 >= accepted.get() + denied.get()){ - application.setApplicationStatus(ApplicationStatus.NOT_ENOUGH_VOTES); + application.setApplicationStatus(ApplicationStatus.DENIED); }else if(accepted.get() == denied.get()){ - application.setApplicationStatus(ApplicationStatus.DRAW); + application.setApplicationStatus(ApplicationStatus.DENIED); } else if (accepted.get() > denied.get()) { application.setApplicationStatus(ApplicationStatus.ACCEPTED); }else if (accepted.get() < denied.get()) { diff --git a/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java b/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java index 046441e8..66499ef0 100644 --- a/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java +++ b/src/main/java/com/example/caselabproject/services/implementations/ApplicationServiceImpl.java @@ -17,7 +17,6 @@ import com.example.caselabproject.repositories.ApplicationRepository; import com.example.caselabproject.repositories.UserRepository; import com.example.caselabproject.services.ApplicationService; -import com.example.caselabproject.services.ApplicationStatusScheduler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -35,8 +34,6 @@ public class ApplicationServiceImpl implements ApplicationService { private final ApplicationItemRepository applicationItemRepository; - private final ApplicationStatusScheduler scheduler; - @Override public ApplicationCreateResponseDto createApplication(String username, ApplicationCreateRequestDto request) { @@ -48,7 +45,6 @@ public ApplicationCreateResponseDto createApplication(String username, Applicati application.setApplicationStatus(ApplicationStatus.WAITING_FOR_ANSWER); application.setCreatorId(user); applicationRepository.save(application); - scheduler.setScheduler(application.getId(), request.getDeadlineDate()); return ApplicationCreateResponseDto.mapFromEntity(application); } @@ -66,7 +62,6 @@ public ApplicationUpdateResponseDto updateApplication(Long id, String username, updateApplication.setDeadlineDate(application.getDeadlineDate()); applicationRepository.save(updateApplication); } - scheduler.setScheduler(updateApplication.getId(), request.getDeadline()); return ApplicationUpdateResponseDto.mapFromEntity(application); } diff --git a/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java b/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java deleted file mode 100644 index 33a3ef27..00000000 --- a/src/main/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.example.caselabproject.services.implementations; - -import com.example.caselabproject.exceptions.ApplicationAlreadyDeletedException; -import com.example.caselabproject.exceptions.ApplicationNotFoundException; -import com.example.caselabproject.models.entities.Application; -import com.example.caselabproject.models.enums.ApplicationStatus; -import com.example.caselabproject.models.enums.RecordState; -import com.example.caselabproject.repositories.ApplicationRepository; -import com.example.caselabproject.services.ApplicationStatusScheduler; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.PreDestroy; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.List; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -@Service -@RequiredArgsConstructor -public class ApplicationStatusSchedulerImpl implements ApplicationStatusScheduler { - - private final ApplicationRepository applicationRepository; - - private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); - - private final ApplicationItemServiceImpl applicationItemServiceImpl; - - @Override - public void setScheduler(Long applicationId, LocalDateTime deadline) { - - executorService.schedule(() -> { - if (applicationRepository.existsByIdAndRecordStateAndDeadlineDate( - applicationId, RecordState.ACTIVE, deadline)) { - deleteApplication(applicationId); - } - }, - timer(deadline), - TimeUnit.MILLISECONDS); - } - - public void renewSchedulers() { - - List applications = applicationRepository.findAllByRecordState( - RecordState.ACTIVE - ); - - for (Application application : applications) { - executorService.schedule( - () -> deleteApplication(application.getId()), - timer(application.getDeadlineDate()), - TimeUnit.MILLISECONDS - ); - } - } - - @PostConstruct - private void init() { - renewSchedulers(); - } - - @PreDestroy - private void destroy() { - executorService.shutdownNow(); - } - - private void deleteApplication(Long id) { - Application application = applicationRepository.findById(id) - .orElseThrow(() -> new ApplicationNotFoundException(id)); - if (application.getApplicationStatus().equals(ApplicationStatus.WAITING_FOR_ANSWER)) { - applicationItemServiceImpl.calcApplicationItemsResult(application); - } - if (!application.getRecordState().equals(RecordState.DELETED)) { - application.setRecordState(RecordState.DELETED); - } else { - throw new ApplicationAlreadyDeletedException(application.getId()); - } - applicationRepository.save(application); - } - - private long timer(LocalDateTime deleteTime) { - ZonedDateTime createTimeMillis = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault()); - ZonedDateTime deleteTimeMillis = ZonedDateTime.of(deleteTime, ZoneId.systemDefault()); - - return deleteTimeMillis.toInstant().toEpochMilli() - createTimeMillis.toInstant().toEpochMilli(); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java b/src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java index 2b577877..5c72fb08 100644 --- a/src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java +++ b/src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java @@ -5,7 +5,6 @@ import com.example.caselabproject.repositories.ApplicationRepository; import com.example.caselabproject.repositories.UserRepository; import com.example.caselabproject.services.ApplicationService; -import com.example.caselabproject.services.ApplicationStatusScheduler; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; @@ -22,9 +21,6 @@ class ApplicationStatusSchedulerImpl { @Autowired private ApplicationService service; - @Autowired - private ApplicationStatusScheduler scheduler; - @Mock private UserRepository userRepository; From e5667ab8724ea1e2ec015d7ba3f78c119fd3c4e6 Mon Sep 17 00:00:00 2001 From: Ermakov Stepan <110097131+stepansaint@users.noreply.github.com> Date: Thu, 16 Nov 2023 21:51:09 +0300 Subject: [PATCH 7/9] Add some tests and comments, should be finished later --- .../scheduler/ApplicationScheduler.java | 8 +- .../ApplicationRepositoryTest.java | 110 ++++++++++++++++++ .../ApplicationStatusSchedulerImpl.java | 47 -------- 3 files changed, 114 insertions(+), 51 deletions(-) create mode 100644 src/test/java/com/example/caselabproject/repositories/ApplicationRepositoryTest.java delete mode 100644 src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java diff --git a/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java b/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java index 8d197ade..eacd92bb 100644 --- a/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java +++ b/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java @@ -20,14 +20,14 @@ public class ApplicationScheduler { private final ApplicationItemServiceImpl applicationItemServiceImpl; - @Scheduled(cron = "0 */1 * * * *") + // ? @Transactional + @Scheduled(cron = "5 * * * * *") // every 5-th second of each minute public void setScheduler() { - List applications = applicationRepository .findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore( - RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, LocalDateTime.now() - ); + RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, LocalDateTime.now()); + // check from here for (Application application : applications) { applicationItemServiceImpl.calcApplicationItemsResult(application); } diff --git a/src/test/java/com/example/caselabproject/repositories/ApplicationRepositoryTest.java b/src/test/java/com/example/caselabproject/repositories/ApplicationRepositoryTest.java new file mode 100644 index 00000000..993a2c93 --- /dev/null +++ b/src/test/java/com/example/caselabproject/repositories/ApplicationRepositoryTest.java @@ -0,0 +1,110 @@ +package com.example.caselabproject.repositories; + + +import com.example.caselabproject.models.entities.Application; +import com.example.caselabproject.models.enums.ApplicationStatus; +import com.example.caselabproject.models.enums.RecordState; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +class ApplicationRepositoryTest { + @Autowired + private ApplicationRepository underTest; + +// @BeforeEach +// void setUp(@Autowired ApplicationRepository underTest) { +// this.underTest = underTest; +// } + + @Test /* Application#findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore */ + void shouldReturnNotEmptyList_whenStateIsActiveAndStatusIsWaiting() { + // given + final Application firstApplication = Application.builder() + .name("something") + .recordState(RecordState.ACTIVE) + .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) + .deadlineDate(LocalDateTime.now().minusWeeks(1)) + .build(); + final Application secondApplication = Application.builder() + .name("something") + .recordState(RecordState.ACTIVE) + .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) + .deadlineDate(LocalDateTime.now().minusMinutes(1)) + .build(); + final Application thirdApplication = Application.builder() + .name("something") + .recordState(RecordState.DELETED) + .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) + .deadlineDate(LocalDateTime.now().minusDays(4)) + .build(); + final Application fourthApplication = Application.builder() + .name("something") + .recordState(RecordState.DELETED) + .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) + .deadlineDate(LocalDateTime.now().plusHours(4)) + .build(); + final List givenApplications = List.of(firstApplication, secondApplication, thirdApplication, fourthApplication); + + underTest.saveAll(givenApplications); + + // when + List actualApplications = underTest + .findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore( + RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, LocalDateTime.now()); + // then + assertThat(actualApplications) + .hasSize(2) + .contains(firstApplication, secondApplication); + } + + @Test /* Application#findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore */ + void shouldReturnEmptyList_whenStateIsDeletedOrDeadlineAfterNow() { + // given + final Application firstApplication = Application.builder() + .name("something") + .recordState(RecordState.ACTIVE) + .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) + .deadlineDate(LocalDateTime.now().minusWeeks(1)) + .build(); + final Application secondApplication = Application.builder() + .name("something") + .recordState(RecordState.ACTIVE) + .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) + .deadlineDate(LocalDateTime.now().minusMinutes(1)) + .build(); + final Application thirdApplication = Application.builder() + .name("something") + .recordState(RecordState.DELETED) + .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) + .deadlineDate(LocalDateTime.now().minusDays(4)) + .build(); + final Application fourthApplication = Application.builder() + .name("something") + .recordState(RecordState.DELETED) + .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) + .deadlineDate(LocalDateTime.now().plusHours(4)) + .build(); + final List givenApplications = List.of(firstApplication, secondApplication, thirdApplication, fourthApplication); + + underTest.saveAll(givenApplications); + + // when + List actualApplications = underTest + .findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore( + RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, LocalDateTime.now()); + + // then + assertThat(actualApplications).isEmpty(); +// assertAll( +// () -> assertThat(actualApplications).hasSize(2), +// () -> assertThat(actualApplications).contains(firstApplication, secondApplication) +// ); + } +} diff --git a/src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java b/src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java deleted file mode 100644 index 5c72fb08..00000000 --- a/src/test/java/com/example/caselabproject/services/implementations/ApplicationStatusSchedulerImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.example.caselabproject.services.implementations; - -import com.example.caselabproject.models.DTOs.request.ApplicationCreateRequestDto; -import com.example.caselabproject.models.entities.User; -import com.example.caselabproject.repositories.ApplicationRepository; -import com.example.caselabproject.repositories.UserRepository; -import com.example.caselabproject.services.ApplicationService; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.springframework.beans.factory.annotation.Autowired; - -import java.time.LocalDateTime; -import java.util.Optional; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.verify; - -//@ExtendWith(MockitoExtension.class) -class ApplicationStatusSchedulerImpl { - @Autowired - private ApplicationService service; - - @Mock - private UserRepository userRepository; - - @Mock - private ApplicationRepository applicationRepository; - - - @Test - void test() { - given(userRepository.findByUsername(any())) - .willReturn(Optional.of(new User())); - given(applicationRepository.save(any())) - .willReturn(new Object()); - - ApplicationCreateRequestDto requestDto = new ApplicationCreateRequestDto(); - requestDto.setName("new application"); - requestDto.setDeadlineDate(LocalDateTime.now().plusSeconds(3)); - - service.createApplication("user", - requestDto); - - verify(userRepository.findByUsername(any())); - } -} From 3fc37fcd99aa6fe42ed86867348b1fe609c24e2b Mon Sep 17 00:00:00 2001 From: Ermakov Stepan <110097131+stepansaint@users.noreply.github.com> Date: Fri, 17 Nov 2023 13:43:50 +0300 Subject: [PATCH 8/9] Finish repo tests for ApplicationRepository --- .../ApplicationRepositoryTest.java | 102 +++++------------- 1 file changed, 27 insertions(+), 75 deletions(-) diff --git a/src/test/java/com/example/caselabproject/repositories/ApplicationRepositoryTest.java b/src/test/java/com/example/caselabproject/repositories/ApplicationRepositoryTest.java index 993a2c93..2e6f48c0 100644 --- a/src/test/java/com/example/caselabproject/repositories/ApplicationRepositoryTest.java +++ b/src/test/java/com/example/caselabproject/repositories/ApplicationRepositoryTest.java @@ -18,93 +18,45 @@ class ApplicationRepositoryTest { @Autowired private ApplicationRepository underTest; -// @BeforeEach -// void setUp(@Autowired ApplicationRepository underTest) { -// this.underTest = underTest; -// } - @Test /* Application#findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore */ void shouldReturnNotEmptyList_whenStateIsActiveAndStatusIsWaiting() { // given - final Application firstApplication = Application.builder() - .name("something") - .recordState(RecordState.ACTIVE) - .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) - .deadlineDate(LocalDateTime.now().minusWeeks(1)) - .build(); - final Application secondApplication = Application.builder() - .name("something") - .recordState(RecordState.ACTIVE) - .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) - .deadlineDate(LocalDateTime.now().minusMinutes(1)) - .build(); - final Application thirdApplication = Application.builder() - .name("something") - .recordState(RecordState.DELETED) - .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) - .deadlineDate(LocalDateTime.now().minusDays(4)) - .build(); - final Application fourthApplication = Application.builder() - .name("something") - .recordState(RecordState.DELETED) - .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) - .deadlineDate(LocalDateTime.now().plusHours(4)) - .build(); - final List givenApplications = List.of(firstApplication, secondApplication, thirdApplication, fourthApplication); - - underTest.saveAll(givenApplications); + LocalDateTime now = LocalDateTime.now(); + final Application first = getApplication( + RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, now.minusWeeks(1)); + final Application second = getApplication( + RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, now.minusMinutes(1)); + final Application third = getApplication( + RecordState.DELETED, ApplicationStatus.WAITING_FOR_ANSWER, now.minusWeeks(1)); + final Application fourth = getApplication( + RecordState.DELETED, ApplicationStatus.WAITING_FOR_ANSWER, now.plusHours(4)); + final Application fifth = getApplication( + RecordState.ACTIVE, ApplicationStatus.DENIED, now.minusWeeks(1)); + final Application sixth = getApplication( + RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, now.plusMinutes(1)); + final Application seventh = getApplication( + RecordState.DELETED, ApplicationStatus.WAITING_FOR_ANSWER, now.minusWeeks(1)); + + underTest.saveAll(List.of(first, second, third, fourth, fifth, sixth, seventh)); // when - List actualApplications = underTest + final List actualApplications = underTest .findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore( - RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, LocalDateTime.now()); + RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, now); + // then assertThat(actualApplications) .hasSize(2) - .contains(firstApplication, secondApplication); + .contains(first, second); } - @Test /* Application#findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore */ - void shouldReturnEmptyList_whenStateIsDeletedOrDeadlineAfterNow() { - // given - final Application firstApplication = Application.builder() + private Application getApplication( + RecordState state, ApplicationStatus status, LocalDateTime deadline) { + return Application.builder() .name("something") - .recordState(RecordState.ACTIVE) - .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) - .deadlineDate(LocalDateTime.now().minusWeeks(1)) + .recordState(state) + .applicationStatus(status) + .deadlineDate(deadline) .build(); - final Application secondApplication = Application.builder() - .name("something") - .recordState(RecordState.ACTIVE) - .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) - .deadlineDate(LocalDateTime.now().minusMinutes(1)) - .build(); - final Application thirdApplication = Application.builder() - .name("something") - .recordState(RecordState.DELETED) - .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) - .deadlineDate(LocalDateTime.now().minusDays(4)) - .build(); - final Application fourthApplication = Application.builder() - .name("something") - .recordState(RecordState.DELETED) - .applicationStatus(ApplicationStatus.WAITING_FOR_ANSWER) - .deadlineDate(LocalDateTime.now().plusHours(4)) - .build(); - final List givenApplications = List.of(firstApplication, secondApplication, thirdApplication, fourthApplication); - - underTest.saveAll(givenApplications); - - // when - List actualApplications = underTest - .findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore( - RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, LocalDateTime.now()); - - // then - assertThat(actualApplications).isEmpty(); -// assertAll( -// () -> assertThat(actualApplications).hasSize(2), -// () -> assertThat(actualApplications).contains(firstApplication, secondApplication) -// ); } } From 587ad26ca451651a0eab6af25c8cd6db62c1e074 Mon Sep 17 00:00:00 2001 From: Ermakov Stepan <110097131+stepansaint@users.noreply.github.com> Date: Fri, 17 Nov 2023 14:05:00 +0300 Subject: [PATCH 9/9] Clean up code --- .../caselabproject/scheduler/ApplicationScheduler.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java b/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java index eacd92bb..72bc2d5d 100644 --- a/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java +++ b/src/main/java/com/example/caselabproject/scheduler/ApplicationScheduler.java @@ -15,19 +15,20 @@ @Component @RequiredArgsConstructor public class ApplicationScheduler { - private final ApplicationRepository applicationRepository; - private final ApplicationItemServiceImpl applicationItemServiceImpl; - // ? @Transactional + /** + * + * + * @see Application + */ @Scheduled(cron = "5 * * * * *") // every 5-th second of each minute public void setScheduler() { List applications = applicationRepository .findAllByRecordStateAndApplicationStatusAndDeadlineDateBefore( RecordState.ACTIVE, ApplicationStatus.WAITING_FOR_ANSWER, LocalDateTime.now()); - // check from here for (Application application : applications) { applicationItemServiceImpl.calcApplicationItemsResult(application); }