package ru.ulstu.timeline.service; import org.apache.commons.lang3.time.DateUtils; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.ulstu.conference.model.Conference; import ru.ulstu.core.model.EventSource; import ru.ulstu.deadline.model.Deadline; import ru.ulstu.grant.model.Grant; import ru.ulstu.paper.model.Paper; import ru.ulstu.project.model.Project; import ru.ulstu.students.model.Task; import ru.ulstu.timeline.model.Event; import ru.ulstu.timeline.model.EventDto; import ru.ulstu.timeline.model.Timeline; import ru.ulstu.timeline.repository.EventRepository; import ru.ulstu.user.model.UserDto; import ru.ulstu.user.service.UserService; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import static ru.ulstu.core.util.StreamApiUtils.convert; @Service public class EventService { private final EventRepository eventRepository; private final TimelineService timelineService; private final UserService userService; public EventService(EventRepository eventRepository, @Lazy TimelineService timelineService, UserService userService) { this.eventRepository = eventRepository; this.timelineService = timelineService; this.userService = userService; } public List findAllDto() { return convert(findAll(), EventDto::new); } public List findAll() { return eventRepository.findAll(); } @Transactional public Integer create(EventDto eventDto) { return eventRepository.save(copyFromDto(new Event(), eventDto)).getId(); } private Event copyFromDto(Event event, EventDto eventDto) { event.setExecuteDate(eventDto.getExecuteDate()); event.setCreateDate(eventDto.getId() == null ? new Date() : eventDto.getCreateDate()); event.setDescription(eventDto.getDescription()); event.setRecipients(userService.findByIds(convert(eventDto.getRecipients(), UserDto::getId))); event.setTitle(eventDto.getTitle()); event.setPeriod(eventDto.getPeriod()); event.setStatus(eventDto.getStatus()); event.setUpdateDate(new Date()); return event; } @Transactional public Integer update(EventDto eventDto) { Event event = eventRepository.getOne(eventDto.getId()); return eventRepository.save(copyFromDto(event, eventDto)).getId(); } @Transactional public Event save(Event event) { return eventRepository.save(event); } @Transactional public void delete(Integer eventId) { Event event = eventRepository.getOne(eventId); event.setParents(null); eventRepository.delete(event); } public List findByIds(List ids) { return eventRepository.findAllById(ids); } public void createBasedOn(Event event, Date executeDate) { //backup event id Integer parentEventId = event.getId(); event.setId(null); event.setStatus(Event.EventStatus.POSSIBLE); event.setExecuteDate(executeDate); event.setCreateDate(new Date()); event.setUpdateDate(new Date()); event = eventRepository.save(event); //set child to parent Event parentEvent = eventRepository.getOne(parentEventId); parentEvent.setChild(event); eventRepository.save(parentEvent); } public void createFromPaper(Paper newPaper) { createFromObject(newPaper, Collections.emptyList(), false, "статьи"); } public void createFromObject(EventSource eventSource, List events, Boolean addCurrentUser, String suffix) { List timelines = timelineService.findAll(); Timeline timeline = timelines.isEmpty() ? new Timeline() : timelines.get(0); timeline.getEvents().removeAll(events); for (Deadline deadline : eventSource.getDeadlines() .stream() .filter(d -> d.getDate().after(new Date()) || DateUtils.isSameDay(d.getDate(), new Date())) .collect(Collectors.toList())) { Event newEvent = new Event(); newEvent.setTitle("Дедлайн " + suffix); newEvent.setStatus(Event.EventStatus.NEW); newEvent.setExecuteDate(deadline.getDate()); newEvent.setCreateDate(new Date()); newEvent.setUpdateDate(new Date()); newEvent.setDescription("Дедлайн '" + deadline.getDescription() + "' " + suffix + " '" + eventSource.getTitle() + "'"); if (addCurrentUser) { newEvent.getRecipients().add(userService.getCurrentUser()); } newEvent.setRecipients(eventSource.getRecipients()); eventSource.addObjectToEvent(newEvent); timeline.getEvents().add(eventRepository.save(newEvent)); } timelineService.save(timeline); } public void updatePaperDeadlines(Paper paper) { List foundEvents = eventRepository.findAllByPaper(paper); eventRepository.deleteAll(foundEvents); createFromObject(paper, foundEvents, false, "статьи"); } public List findByCurrentDate() { return eventRepository.findByCurrentDate(); } private List findAllFuture() { return eventRepository.findAllFuture(); } public List findAllFutureDto() { return convert(findAllFuture(), EventDto::new); } public void updateConferenceDeadlines(Conference conference) { eventRepository.deleteAll(eventRepository.findAllByConference(conference)); createFromObject(conference, Collections.emptyList(), false, "конференции"); } public void updateGrantDeadlines(Grant grant) { eventRepository.deleteAll(eventRepository.findAllByGrant(grant)); createFromObject(grant, Collections.emptyList(), false, "гранта"); } public void updateProjectDeadlines(Project project) { eventRepository.deleteAll(eventRepository.findAllByProject(project)); createFromObject(project, Collections.emptyList(), false, "проекта"); } public void removeConferencesEvent(Conference conference) { List eventList = eventRepository.findAllByConference(conference); eventList.forEach(event -> eventRepository.deleteById(event.getId())); } public void updateTaskDeadlines(Task task) { eventRepository.deleteAll(eventRepository.findAllByTask(task)); createFromObject(task, Collections.emptyList(), true, "задачи"); } }