From 0f9f591c6b23a70db57a62b169d0f3d29473b03c Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Sat, 20 Jul 2019 15:36:10 +0400 Subject: [PATCH] work with different version of entity --- .../activity/api/ActivityRepository.java | 6 ++ .../common/model/AbstractActivity.java | 4 ++ .../common/service/ActivityService.java | 21 +++++-- .../activity/conference/model/Conference.java | 6 ++ .../conference/service/ConferenceService.java | 42 +++++++++---- .../grant/controller/GrantController.java | 2 +- .../grant/service/GrantRepository.java | 4 +- .../activity/grant/service/GrantService.java | 20 +++--- .../paper/controller/PaperController.java | 2 +- .../activity/paper/service/PaperService.java | 63 +++---------------- .../project/controller/ProjectController.java | 2 +- .../project/service/ProjectService.java | 9 +-- .../students/controller/TaskController.java | 2 +- .../ulstu/activity/students/model/Task.java | 5 ++ .../students/service/TaskService.java | 40 ++---------- .../timeline/service/EventService.java | 1 - 16 files changed, 102 insertions(+), 127 deletions(-) diff --git a/src/main/java/ru/ulstu/activity/api/ActivityRepository.java b/src/main/java/ru/ulstu/activity/api/ActivityRepository.java index e0be94d..e2feaf8 100644 --- a/src/main/java/ru/ulstu/activity/api/ActivityRepository.java +++ b/src/main/java/ru/ulstu/activity/api/ActivityRepository.java @@ -4,6 +4,8 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.query.Param; +import java.util.Optional; + public interface ActivityRepository { String findByNameAndNotId(@Param("name") String name, @Param("id") Integer id); @@ -14,4 +16,8 @@ public interface ActivityRepository { Page findAll(Pageable pageable); void deleteById(Integer id); + + Optional findById(Integer id); + + void detach(T t); } diff --git a/src/main/java/ru/ulstu/activity/common/model/AbstractActivity.java b/src/main/java/ru/ulstu/activity/common/model/AbstractActivity.java index f4271dc..8796bb0 100644 --- a/src/main/java/ru/ulstu/activity/common/model/AbstractActivity.java +++ b/src/main/java/ru/ulstu/activity/common/model/AbstractActivity.java @@ -1,8 +1,10 @@ package ru.ulstu.activity.common.model; +import ru.ulstu.activity.timeline.model.Event; import ru.ulstu.core.model.BaseEntity; import ru.ulstu.user.model.User; +import java.util.List; import java.util.Set; public abstract class AbstractActivity extends BaseEntity { @@ -17,4 +19,6 @@ public abstract class AbstractActivity extends BaseEntity { } public abstract Set getActivityMembers(); + + public abstract List getEvents(); } diff --git a/src/main/java/ru/ulstu/activity/common/service/ActivityService.java b/src/main/java/ru/ulstu/activity/common/service/ActivityService.java index cc7bb7b..382965b 100644 --- a/src/main/java/ru/ulstu/activity/common/service/ActivityService.java +++ b/src/main/java/ru/ulstu/activity/common/service/ActivityService.java @@ -13,6 +13,7 @@ import ru.ulstu.activity.timeline.service.EventService; import ru.ulstu.core.jpa.OffsetablePageRequest; import ru.ulstu.core.model.response.PageableItems; +import javax.persistence.EntityNotFoundException; import java.io.IOException; import java.util.List; @@ -47,23 +48,31 @@ public abstract class ActivityService getEvents(T entity); @Transactional public D update(D entityDto) { + T oldEntity = activityRepository.getById(entityDto.getId()); + //to init lazy collection + oldEntity.getActivityMembers(); + activityRepository.detach(oldEntity); T newEntity; try { newEntity = copyFromDto(activityRepository.getById(entityDto.getId()), entityDto); } catch (IOException e) { throw new RuntimeException(e); } - return getNewActivityDto(update(newEntity)); + return getNewActivityDto(update(oldEntity, newEntity)); } @Transactional @@ -79,8 +88,13 @@ public abstract class ActivityService new EntityNotFoundException("Entity with id=" + id + " not found")); } public PageableItems findAll(int offset, int count) { @@ -92,7 +106,6 @@ public abstract class ActivityService getActivityListDto(entity)); } - public abstract PageableItems findAllActiveDto(int offset, int count); public abstract PageableItems findAllActive(int offset, int count); diff --git a/src/main/java/ru/ulstu/activity/conference/model/Conference.java b/src/main/java/ru/ulstu/activity/conference/model/Conference.java index 7dfecf5..8a34f4e 100644 --- a/src/main/java/ru/ulstu/activity/conference/model/Conference.java +++ b/src/main/java/ru/ulstu/activity/conference/model/Conference.java @@ -25,6 +25,7 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.validation.constraints.NotBlank; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; @@ -177,4 +178,9 @@ public class Conference extends AbstractActivity implements EventSource { public Set getActivityMembers() { return users.stream().map(conferenceUser -> conferenceUser.getUser()).collect(Collectors.toSet()); } + + @Override + public List getEvents() { + return Collections.emptyList(); + } } diff --git a/src/main/java/ru/ulstu/activity/conference/service/ConferenceService.java b/src/main/java/ru/ulstu/activity/conference/service/ConferenceService.java index 07c99ec..918d273 100644 --- a/src/main/java/ru/ulstu/activity/conference/service/ConferenceService.java +++ b/src/main/java/ru/ulstu/activity/conference/service/ConferenceService.java @@ -2,13 +2,13 @@ package ru.ulstu.activity.conference.service; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import ru.ulstu.activity.common.service.ActivityService; import ru.ulstu.activity.conference.model.Conference; import ru.ulstu.activity.conference.model.ConferenceDashboardDto; import ru.ulstu.activity.conference.model.ConferenceDto; import ru.ulstu.activity.conference.model.ConferenceFilterDto; import ru.ulstu.activity.conference.model.ConferenceListDto; +import ru.ulstu.activity.deadline.model.Deadline; import ru.ulstu.activity.deadline.service.DeadlineService; import ru.ulstu.activity.paper.service.PaperService; import ru.ulstu.activity.ping.service.PingService; @@ -57,18 +57,6 @@ public class ConferenceService extends ActivityService { + if (!oldEntity.getActivityMembers().contains(author)) { + conferenceNotificationService.sendCreateNotification(entity); + } + }); + sendNotificationAfterUpdateDeadlines(entity, oldEntity.getDeadlines()); + } + + private void sendNotificationAfterUpdateDeadlines(Conference conference, List oldDeadlines) { + if (oldDeadlines.size() != conference.getDeadlines().size()) { + conferenceNotificationService.updateDeadlineNotification(conference); + return; + } + + if (conference.getDeadlines() + .stream() + .filter(deadline -> !oldDeadlines.contains(deadline)) + .count() > 0) { + conferenceNotificationService.updateDeadlineNotification(conference); + } + } + @Override protected List getEvents(Conference entity) { return eventService.findByConference(entity); diff --git a/src/main/java/ru/ulstu/activity/grant/controller/GrantController.java b/src/main/java/ru/ulstu/activity/grant/controller/GrantController.java index 93fbba8..21b1d9b 100644 --- a/src/main/java/ru/ulstu/activity/grant/controller/GrantController.java +++ b/src/main/java/ru/ulstu/activity/grant/controller/GrantController.java @@ -53,7 +53,7 @@ public class GrantController implements ActivityController get(@PathVariable("grant-id") Integer entityId) { - return new Response<>(grantService.findGrantById(entityId)); + return new Response<>(grantService.findDtoById(entityId)); } @Override diff --git a/src/main/java/ru/ulstu/activity/grant/service/GrantRepository.java b/src/main/java/ru/ulstu/activity/grant/service/GrantRepository.java index cfc84aa..76961ec 100644 --- a/src/main/java/ru/ulstu/activity/grant/service/GrantRepository.java +++ b/src/main/java/ru/ulstu/activity/grant/service/GrantRepository.java @@ -2,15 +2,15 @@ package ru.ulstu.activity.grant.service; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import ru.ulstu.activity.api.ActivityRepository; import ru.ulstu.activity.grant.model.Grant; +import ru.ulstu.core.repository.JpaDetachableRepository; import java.util.List; -interface GrantRepository extends JpaRepository, ActivityRepository { +interface GrantRepository extends JpaDetachableRepository, ActivityRepository { List findByStatus(Grant.GrantStatus status); diff --git a/src/main/java/ru/ulstu/activity/grant/service/GrantService.java b/src/main/java/ru/ulstu/activity/grant/service/GrantService.java index d3f3a1c..4b350bd 100644 --- a/src/main/java/ru/ulstu/activity/grant/service/GrantService.java +++ b/src/main/java/ru/ulstu/activity/grant/service/GrantService.java @@ -116,6 +116,18 @@ public class GrantService extends ActivityService return grant; } + @Override + protected void doActionsOnDiffObjects(Grant oldEntity, Grant entity) { + entity.getAuthors().forEach(author -> { + if (!oldEntity.getAuthors().contains(author)) { + grantNotificationService.sendAuthorsChangeNotification(entity, oldEntity.getAuthors()); + } + }); + if (!entity.getLeader().equals(oldEntity.getLeader())) { + grantNotificationService.sendLeaderChangeNotification(entity, oldEntity.getLeader()); + } + } + @Override protected List getEvents(Grant entity) { return eventService.findByGrant(entity); @@ -169,14 +181,6 @@ public class GrantService extends ActivityService return new PageableItems<>(activeGrantsPage.getTotalElements(), activeGrantsPage.getContent()); } - public GrantDto findGrantById(Integer id) { - return new GrantDto(findById(id)); - } - - public Grant findById(Integer id) { - return grantRepository.getOne(id); - } - @Transactional public void ping(int grantId) { pingService.addPing(findById(grantId)); diff --git a/src/main/java/ru/ulstu/activity/paper/controller/PaperController.java b/src/main/java/ru/ulstu/activity/paper/controller/PaperController.java index 8a3a71f..ff219e8 100644 --- a/src/main/java/ru/ulstu/activity/paper/controller/PaperController.java +++ b/src/main/java/ru/ulstu/activity/paper/controller/PaperController.java @@ -47,7 +47,7 @@ public class PaperController implements ActivityController get(@PathVariable("paper-id") Integer paperId) { - return new Response<>(paperService.findPaperById(paperId)); + return new Response<>(paperService.findDtoById(paperId)); } @PostMapping diff --git a/src/main/java/ru/ulstu/activity/paper/service/PaperService.java b/src/main/java/ru/ulstu/activity/paper/service/PaperService.java index 3cac351..40e7b48 100644 --- a/src/main/java/ru/ulstu/activity/paper/service/PaperService.java +++ b/src/main/java/ru/ulstu/activity/paper/service/PaperService.java @@ -6,12 +6,10 @@ import org.springframework.transaction.annotation.Transactional; import ru.ulstu.activity.common.service.ActivityService; import ru.ulstu.activity.deadline.model.Deadline; import ru.ulstu.activity.deadline.service.DeadlineService; -import ru.ulstu.activity.file.model.FileDataDto; import ru.ulstu.activity.file.service.FileService; import ru.ulstu.activity.paper.model.Paper; import ru.ulstu.activity.paper.model.PaperDashboardDto; import ru.ulstu.activity.paper.model.PaperDto; -import ru.ulstu.activity.paper.model.PaperFilterListDto; import ru.ulstu.activity.paper.model.PaperListDto; import ru.ulstu.activity.paper.model.PaperStatusDto; import ru.ulstu.activity.paper.model.PaperTypeDto; @@ -23,13 +21,10 @@ import ru.ulstu.core.model.response.PageableItems; import ru.ulstu.user.model.User; import ru.ulstu.user.service.UserService; -import javax.persistence.EntityNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.Date; -import java.util.HashSet; import java.util.List; -import java.util.Set; import static java.util.stream.Collectors.toList; import static org.hibernate.internal.util.collections.CollectionHelper.isNotEmpty; @@ -53,9 +48,6 @@ public class PaperService extends ActivityService private final EventService eventService; private final PingService pingService; - private Paper.PaperStatus oldStatus; - private Set oldAuthors; - public PaperService(PaperRepository paperRepository, FileService fileService, PaperNotificationService paperNotificationService, @@ -108,21 +100,14 @@ public class PaperService extends ActivityService return eventService.findByPaper(entity); } - @Transactional - public PaperDto update(PaperDto paperDto) { - Paper paper = findById(paperDto.getId()); - oldStatus = paper.getStatus(); - oldAuthors = new HashSet<>(paper.getAuthors()); - - //TODO: move to service - if (paperDto.getFiles() != null) { - for (FileDataDto file : paperDto.getFiles().stream() - .filter(f -> f.isDeleted() && f.getId() != null) - .collect(toList())) { - fileService.delete(file.getId()); - } + @Override + protected void doActionsOnDiffObjects(Paper oldEntity, Paper entity) { + if (oldEntity.getStatus() != entity.getStatus()) { + paperNotificationService.statusChangeNotification(entity, oldEntity.getStatus()); + } + if (!oldEntity.getAuthors().equals(entity.getAuthors())) { + paperNotificationService.sendCreateNotification(entity, oldEntity.getAuthors()); } - return new PaperDto(update(copyFromDto(paper, paperDto))); } protected Paper copyFromDto(Paper paper, PaperDto paperDto) { @@ -152,13 +137,6 @@ public class PaperService extends ActivityService return paper; } - @Transactional - public boolean delete(Integer paperId) { - Paper paper = paperRepository.getOne(paperId); - paperRepository.delete(paper); - return true; - } - public List getPaperStatuses() { return convert(Arrays.asList(Paper.PaperStatus.values()), PaperStatusDto::new); } @@ -181,12 +159,6 @@ public class PaperService extends ActivityService return create(paper); } - public List filter(PaperFilterListDto filterDto) { - return convert(sortPapers(paperRepository.filter( - filterDto.getFilterAuthorId() == null ? null : userService.findById(filterDto.getFilterAuthorId()), - filterDto.getYear())), PaperListDto::new); - } - private List sortPapers(List papers) { return papers.stream().sorted((paper1, paper2) -> { int statusCompareResult = @@ -223,28 +195,7 @@ public class PaperService extends ActivityService } } - public PaperDto findPaperById(Integer paperId) { - return new PaperDto(findById(paperId)); - } - - public Paper findById(Integer paperId) { - return paperRepository.findById(paperId) - .orElseThrow(() -> new EntityNotFoundException("Paper with id=" + paperId + " not found")); - } - - public List findAllNotCompleted() { - return convert(paperRepository.findByStatusNot(COMPLETED), PaperDto::new); - } - - public List findAllSelect(List paperIds) { - return convert(paperRepository.findAllByIdIn(paperIds), PaperDto::new); - } - public List getPaperAuthors() { return userService.findAll(); } - - public List findAllCompletedByType(Paper.PaperType type) { - return paperRepository.findByTypeAndStatus(type, Paper.PaperStatus.COMPLETED); - } } diff --git a/src/main/java/ru/ulstu/activity/project/controller/ProjectController.java b/src/main/java/ru/ulstu/activity/project/controller/ProjectController.java index baf0a9b..9a0b16e 100644 --- a/src/main/java/ru/ulstu/activity/project/controller/ProjectController.java +++ b/src/main/java/ru/ulstu/activity/project/controller/ProjectController.java @@ -43,7 +43,7 @@ public class ProjectController implements ActivityController get(@PathVariable("project-id") Integer projectId) { - return new Response<>(projectService.findProjectById(projectId)); + return new Response<>(projectService.findDtoById(projectId)); } @PostMapping diff --git a/src/main/java/ru/ulstu/activity/project/service/ProjectService.java b/src/main/java/ru/ulstu/activity/project/service/ProjectService.java index d0b1087..79c9d47 100644 --- a/src/main/java/ru/ulstu/activity/project/service/ProjectService.java +++ b/src/main/java/ru/ulstu/activity/project/service/ProjectService.java @@ -56,6 +56,11 @@ public class ProjectService extends ActivityService(activeProjectPage.getTotalElements(), activeProjectPage.getContent()); } + @Override + protected void doActionsOnDiffObjects(Project oldEntity, Project entity) { + //TODO + } + @Override protected List getEvents(Project entity) { return eventService.findByProject(entity); @@ -88,8 +93,4 @@ public class ProjectService extends ActivityService get(@PathVariable("task-id") Integer taskId) { - return new Response<>(taskService.findTaskById(taskId)); + return new Response<>(taskService.findDtoById(taskId)); } @PostMapping diff --git a/src/main/java/ru/ulstu/activity/students/model/Task.java b/src/main/java/ru/ulstu/activity/students/model/Task.java index f893ed2..4ae6a56 100644 --- a/src/main/java/ru/ulstu/activity/students/model/Task.java +++ b/src/main/java/ru/ulstu/activity/students/model/Task.java @@ -110,6 +110,11 @@ public class Task extends AbstractActivity implements EventSource { return Collections.emptySet(); } + @Override + public List getEvents() { + return Collections.emptyList(); + } + public TaskStatus getStatus() { return status; } diff --git a/src/main/java/ru/ulstu/activity/students/service/TaskService.java b/src/main/java/ru/ulstu/activity/students/service/TaskService.java index 48c4dbe..5b1a62f 100644 --- a/src/main/java/ru/ulstu/activity/students/service/TaskService.java +++ b/src/main/java/ru/ulstu/activity/students/service/TaskService.java @@ -1,7 +1,6 @@ package ru.ulstu.activity.students.service; import org.springframework.data.domain.Page; -import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.ulstu.activity.common.service.ActivityService; @@ -12,7 +11,6 @@ import ru.ulstu.activity.students.model.Scheduler; import ru.ulstu.activity.students.model.Task; import ru.ulstu.activity.students.model.TaskDashboardDto; import ru.ulstu.activity.students.model.TaskDto; -import ru.ulstu.activity.students.model.TaskFilterDto; import ru.ulstu.activity.students.model.TaskListDto; import ru.ulstu.activity.tags.model.Tag; import ru.ulstu.activity.tags.service.TagService; @@ -22,7 +20,6 @@ import ru.ulstu.core.jpa.OffsetablePageRequest; import ru.ulstu.core.model.response.PageableItems; import ru.ulstu.core.util.DateUtils; -import javax.persistence.EntityNotFoundException; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -34,7 +31,6 @@ import java.util.TreeMap; import java.util.stream.Collectors; import static ru.ulstu.activity.students.model.Task.TaskStatus.IN_WORK; -import static ru.ulstu.core.util.StreamApiUtils.convert; import static ru.ulstu.core.util.StreamApiUtils.convertPageable; @Service @@ -65,10 +61,6 @@ public class TaskService extends ActivityService { this.pingService = pingService; } - public List findAll() { - return taskRepository.findAll(new Sort(Sort.Direction.DESC, "createDate")); - } - public PageableItems findAll(int offset, int count) { final Page page = taskRepository.findAll(new OffsetablePageRequest(offset, count)); return new PageableItems<>(page.getTotalElements(), page.getContent()); @@ -89,18 +81,6 @@ public class TaskService extends ActivityService { return new TaskDto(entity); } - public List filter(TaskFilterDto filterDto) { - if (filterDto.getOrder().compareTo("new") == 0) { - return convert(taskRepository.filterNew( - filterDto.getStatus(), - filterDto.getTag() == null ? null : tagService.findById(filterDto.getTag())), TaskDto::new); - } else { - return convert(taskRepository.filterOld( - filterDto.getStatus(), - filterDto.getTag() == null ? null : tagService.findById(filterDto.getTag())), TaskDto::new); - } - } - protected Task copyFromDto(Task task, TaskDto taskDto) { task.setTitle(taskDto.getTitle()); task.setDescription(taskDto.getDescription()); @@ -113,6 +93,11 @@ public class TaskService extends ActivityService { return task; } + @Override + protected void doActionsOnDiffObjects(Task oldEntity, Task entity) { + //TODO + } + @Override protected List getEvents(Task entity) { return eventService.findByTask(entity); @@ -252,19 +237,4 @@ public class TaskService extends ActivityService { public PageableItems findAllActive(int offset, int count) { return findAll(offset, count); } - - public TaskDto findTaskById(Integer taskId) { - return new TaskDto(findById(taskId)); - } - - public Task findById(Integer taskId) { - return taskRepository.findById(taskId) - .orElseThrow(() -> new EntityNotFoundException("Paper with id=" + taskId + " not found")); - } - - - @Transactional - public void ping(int taskId) { - pingService.addPing(findById(taskId)); - } } diff --git a/src/main/java/ru/ulstu/activity/timeline/service/EventService.java b/src/main/java/ru/ulstu/activity/timeline/service/EventService.java index 99d49b4..a9a3f7d 100644 --- a/src/main/java/ru/ulstu/activity/timeline/service/EventService.java +++ b/src/main/java/ru/ulstu/activity/timeline/service/EventService.java @@ -68,7 +68,6 @@ public class EventService { + eventSource.getTitle() + "'"); eventSource.addObjectToEvent(newEvent); newEvent.setRecipients(eventSource.getRecipients()); - newEvents.add(eventRepository.save(newEvent)); } eventRepository.saveAll(newEvents); }