diff --git a/src/main/java/ru/ulstu/grant/controller/GrantController.java b/src/main/java/ru/ulstu/grant/controller/GrantController.java index ad5e992..8f7d760 100644 --- a/src/main/java/ru/ulstu/grant/controller/GrantController.java +++ b/src/main/java/ru/ulstu/grant/controller/GrantController.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; import ru.ulstu.deadline.model.Deadline; import ru.ulstu.grant.model.Grant; import ru.ulstu.grant.model.GrantDto; @@ -139,4 +140,10 @@ public class GrantController { .filter(dto -> dto.getDate() != null || !isEmpty(dto.getDescription())) .collect(Collectors.toList())); } + + @ResponseBody + @PostMapping(value = "/ping") + public void ping(@RequestParam("grantId") int grantId) throws IOException { + grantService.ping(grantId); + } } diff --git a/src/main/java/ru/ulstu/grant/service/GrantService.java b/src/main/java/ru/ulstu/grant/service/GrantService.java index 45f9b2f..031467d 100644 --- a/src/main/java/ru/ulstu/grant/service/GrantService.java +++ b/src/main/java/ru/ulstu/grant/service/GrantService.java @@ -13,6 +13,7 @@ import ru.ulstu.grant.repository.GrantRepository; import ru.ulstu.paper.model.Paper; import ru.ulstu.paper.model.PaperDto; import ru.ulstu.paper.service.PaperService; +import ru.ulstu.ping.service.PingService; import ru.ulstu.project.model.Project; import ru.ulstu.project.model.ProjectDto; import ru.ulstu.project.service.ProjectService; @@ -45,6 +46,7 @@ public class GrantService { private final PaperService paperService; private final EventService eventService; private final GrantNotificationService grantNotificationService; + private final PingService pingService; public GrantService(GrantRepository grantRepository, FileService fileService, @@ -53,7 +55,8 @@ public class GrantService { UserService userService, PaperService paperService, EventService eventService, - GrantNotificationService grantNotificationService) { + GrantNotificationService grantNotificationService, + PingService pingService) { this.grantRepository = grantRepository; this.fileService = fileService; this.deadlineService = deadlineService; @@ -62,6 +65,7 @@ public class GrantService { this.paperService = paperService; this.eventService = eventService; this.grantNotificationService = grantNotificationService; + this.pingService = pingService; } public List findAll() { @@ -261,4 +265,13 @@ public class GrantService { .filter(author -> Collections.frequency(authors, author) > 3) .collect(toList()); } + + public Grant findById(Integer id) { + return grantRepository.findOne(id); + } + + @Transactional + public void ping(int grantId) throws IOException { + pingService.addPing(findById(grantId)); + } } diff --git a/src/main/java/ru/ulstu/paper/controller/PaperRestController.java b/src/main/java/ru/ulstu/paper/controller/PaperRestController.java index 6da009f..7c0d9c5 100644 --- a/src/main/java/ru/ulstu/paper/controller/PaperRestController.java +++ b/src/main/java/ru/ulstu/paper/controller/PaperRestController.java @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import ru.ulstu.configuration.Constants; import ru.ulstu.core.model.response.Response; @@ -72,4 +73,9 @@ public class PaperRestController { public Response getFormattedReference(@RequestBody @Valid ReferenceDto referenceDto) { return new Response<>(paperService.getFormattedReference(referenceDto)); } + + @PostMapping(value = "/ping") + public void ping(@RequestParam("paperId") int paperId) throws IOException { + paperService.ping(paperId); + } } diff --git a/src/main/java/ru/ulstu/paper/service/PaperService.java b/src/main/java/ru/ulstu/paper/service/PaperService.java index 2393af4..912b85e 100644 --- a/src/main/java/ru/ulstu/paper/service/PaperService.java +++ b/src/main/java/ru/ulstu/paper/service/PaperService.java @@ -1,5 +1,6 @@ package ru.ulstu.paper.service; +import com.sun.deploy.pings.Pings; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -15,6 +16,7 @@ import ru.ulstu.paper.model.Reference; import ru.ulstu.paper.model.ReferenceDto; import ru.ulstu.paper.repository.PaperRepository; import ru.ulstu.paper.repository.ReferenceRepository; +import ru.ulstu.ping.service.PingService; import ru.ulstu.timeline.service.EventService; import ru.ulstu.user.model.User; import ru.ulstu.user.service.UserService; @@ -54,6 +56,7 @@ public class PaperService { private final FileService fileService; private final EventService eventService; private final ReferenceRepository referenceRepository; + private final PingService pingService; public PaperService(PaperRepository paperRepository, ReferenceRepository referenceRepository, @@ -61,7 +64,8 @@ public class PaperService { PaperNotificationService paperNotificationService, UserService userService, DeadlineService deadlineService, - EventService eventService) { + EventService eventService, + PingService pingService) { this.paperRepository = paperRepository; this.referenceRepository = referenceRepository; this.fileService = fileService; @@ -69,6 +73,7 @@ public class PaperService { this.userService = userService; this.deadlineService = deadlineService; this.eventService = eventService; + this.pingService = pingService; } public List findAll() { @@ -386,4 +391,9 @@ public class PaperService { autoCompleteData.setPublishers(referenceRepository.findDistinctPublishers()); return autoCompleteData; } + + @Transactional + public void ping(int paperId) throws IOException { + pingService.addPing(findPaperById(paperId)); + } } diff --git a/src/main/java/ru/ulstu/ping/model/Ping.java b/src/main/java/ru/ulstu/ping/model/Ping.java index c7e4c5e..d52bb07 100644 --- a/src/main/java/ru/ulstu/ping/model/Ping.java +++ b/src/main/java/ru/ulstu/ping/model/Ping.java @@ -4,6 +4,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.springframework.format.annotation.DateTimeFormat; import ru.ulstu.conference.model.Conference; import ru.ulstu.core.model.BaseEntity; +import ru.ulstu.grant.model.Grant; +import ru.ulstu.paper.model.Paper; +import ru.ulstu.project.model.Project; import ru.ulstu.user.model.User; import javax.persistence.Entity; @@ -25,10 +28,22 @@ public class Ping extends BaseEntity { @JoinColumn(name = "users_id") private User user; - @ManyToOne(optional = false) + @ManyToOne() @JoinColumn(name = "conference_id") private Conference conference; + @ManyToOne() + @JoinColumn(name = "paper_id") + private Paper paper; + + @ManyToOne() + @JoinColumn(name = "grant_id") + private Grant grant; + + @ManyToOne() + @JoinColumn(name = "project_id") + private Project project; + public Ping() { } @@ -70,4 +85,40 @@ public class Ping extends BaseEntity { public void setConference(Conference conference) { this.conference = conference; } + + public Paper getPaper() { + return paper; + } + + public void setPaper(Paper paper) { + this.paper = paper; + } + + public Grant getGrant() { + return grant; + } + + public void setGrant(Grant grant) { + this.grant = grant; + } + + public Project getProject() { + return project; + } + + public void setProject(Project project) { + this.project = project; + } + + public void setActivity(T object) { + if (object.getClass() == Conference.class) { + this.conference = (Conference) object; + } else if (object.getClass() == Project.class) { + this.project = (Project) object; + } else if (object.getClass() == Grant.class) { + this.grant = (Grant) object; + } else if (object.getClass() == Paper.class) { + this.paper = (Paper) object; + } + } } diff --git a/src/main/java/ru/ulstu/ping/repository/PingRepository.java b/src/main/java/ru/ulstu/ping/repository/PingRepository.java index de79dd7..0a97c31 100644 --- a/src/main/java/ru/ulstu/ping/repository/PingRepository.java +++ b/src/main/java/ru/ulstu/ping/repository/PingRepository.java @@ -6,8 +6,16 @@ import org.springframework.data.repository.query.Param; import ru.ulstu.conference.model.Conference; import ru.ulstu.ping.model.Ping; +import java.util.List; + public interface PingRepository extends JpaRepository { @Query("SELECT count(*) FROM Ping p WHERE (DAY(p.date) = :day) AND (MONTH(p.date) = :month) AND (YEAR(p.date) = :year) AND (p.conference = :conference)") long countByConferenceAndDate(@Param("conference") Conference conference, @Param("day") Integer day, @Param("month") Integer month, @Param("year") Integer year); + + @Query("SELECT p FROM Ping p WHERE (:user IS NULL OR p.user.id = :user) " + + "AND (:activity != 'conferences' OR p.conference IS NOT NULL) AND (:activity != 'papers' OR p.paper IS NOT NULL) " + + "AND (:activity != 'projects' OR p.project IS NOT NULL) AND (:activity != 'grants' OR p.grant IS NOT NULL)") + List getPings(@Param("user") Integer user, + @Param("activity") String activity); } diff --git a/src/main/java/ru/ulstu/ping/service/PingService.java b/src/main/java/ru/ulstu/ping/service/PingService.java index 6666fdd..de61422 100644 --- a/src/main/java/ru/ulstu/ping/service/PingService.java +++ b/src/main/java/ru/ulstu/ping/service/PingService.java @@ -10,6 +10,7 @@ import ru.ulstu.user.service.UserService; import java.io.IOException; import java.util.Calendar; import java.util.Date; +import java.util.List; @Service public class PingService { @@ -23,9 +24,9 @@ public class PingService { } @Transactional - public Ping addPing(Conference conference) throws IOException { + public Ping addPing(T activity) throws IOException { Ping newPing = new Ping(new Date(), userService.getCurrentUser()); - newPing.setConference(conference); + newPing.setActivity(activity); return pingRepository.save(newPing); } @@ -33,4 +34,8 @@ public class PingService { return Math.toIntExact(pingRepository.countByConferenceAndDate(conference, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.YEAR))); } + + public List getPings(Integer userId, String activity) { + return pingRepository.getPings(userId, activity); + } } diff --git a/src/main/java/ru/ulstu/project/controller/ProjectController.java b/src/main/java/ru/ulstu/project/controller/ProjectController.java index ae09658..efaa00b 100644 --- a/src/main/java/ru/ulstu/project/controller/ProjectController.java +++ b/src/main/java/ru/ulstu/project/controller/ProjectController.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; import ru.ulstu.deadline.model.Deadline; import ru.ulstu.project.model.Project; import ru.ulstu.project.model.ProjectDto; @@ -90,4 +91,10 @@ public class ProjectController { .filter(dto -> dto.getDate() != null || !isEmpty(dto.getDescription())) .collect(Collectors.toList())); } + + @ResponseBody + @PostMapping(value = "/ping") + public void ping(@RequestParam("projectId") int projectId) throws IOException { + projectService.ping(projectId); + } } diff --git a/src/main/java/ru/ulstu/project/service/ProjectService.java b/src/main/java/ru/ulstu/project/service/ProjectService.java index 247624d..ecc36b6 100644 --- a/src/main/java/ru/ulstu/project/service/ProjectService.java +++ b/src/main/java/ru/ulstu/project/service/ProjectService.java @@ -6,6 +6,7 @@ import org.thymeleaf.util.StringUtils; import ru.ulstu.deadline.service.DeadlineService; import ru.ulstu.file.service.FileService; import ru.ulstu.grant.repository.GrantRepository; +import ru.ulstu.ping.service.PingService; import ru.ulstu.project.model.Project; import ru.ulstu.project.model.ProjectDto; import ru.ulstu.project.repository.ProjectRepository; @@ -26,15 +27,18 @@ public class ProjectService { private final DeadlineService deadlineService; private final GrantRepository grantRepository; private final FileService fileService; + private final PingService pingService; public ProjectService(ProjectRepository projectRepository, DeadlineService deadlineService, GrantRepository grantRepository, - FileService fileService) { + FileService fileService, + PingService pingService) { this.projectRepository = projectRepository; this.deadlineService = deadlineService; this.grantRepository = grantRepository; this.fileService = fileService; + this.pingService = pingService; } public List findAll() { @@ -108,4 +112,8 @@ public class ProjectService { return projectRepository.findOne(id); } + @Transactional + public void ping(int projectId) throws IOException { + pingService.addPing(findById(projectId)); + } } diff --git a/src/main/java/ru/ulstu/user/controller/UserController.java b/src/main/java/ru/ulstu/user/controller/UserController.java index c40ed8f..3487370 100644 --- a/src/main/java/ru/ulstu/user/controller/UserController.java +++ b/src/main/java/ru/ulstu/user/controller/UserController.java @@ -20,6 +20,7 @@ import ru.ulstu.odin.controller.OdinController; import ru.ulstu.odin.model.OdinMetadata; import ru.ulstu.odin.model.OdinVoid; import ru.ulstu.odin.service.OdinService; +import ru.ulstu.user.model.DiagramElement; import ru.ulstu.user.model.User; import ru.ulstu.user.model.UserDto; import ru.ulstu.user.model.UserListDto; @@ -34,6 +35,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.validation.Valid; +import java.util.List; import java.util.Map; import static ru.ulstu.user.controller.UserController.URL; @@ -171,4 +173,10 @@ public class UserController extends OdinController { public void inviteUser(@RequestParam("email") String email) { userService.inviteUser(email); } + + @GetMapping("/activities/pings") + public Response> getActivitesStats(@RequestParam(value = "userId", required = false) Integer userId, + @RequestParam(value = "activity", required = false) String activity) { + return new Response<>(userService.getActivitiesPings(userId, activity)); + } } diff --git a/src/main/java/ru/ulstu/user/controller/UserMvcController.java b/src/main/java/ru/ulstu/user/controller/UserMvcController.java index 5bcbd13..ac8d955 100644 --- a/src/main/java/ru/ulstu/user/controller/UserMvcController.java +++ b/src/main/java/ru/ulstu/user/controller/UserMvcController.java @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import ru.ulstu.configuration.Constants; @@ -17,6 +18,8 @@ import ru.ulstu.user.service.UserSessionService; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; +import java.util.ArrayList; +import java.util.List; @Controller @RequestMapping(value = "/users") @@ -48,4 +51,19 @@ public class UserMvcController extends OdinController { User user = userSessionService.getUserBySessionId(sessionId); modelMap.addAttribute("userDto", userService.updateUserInformation(user, userDto)); } + + @ModelAttribute("allUsers") + public List getAllUsers() { + return userService.findAll(); + } + + @ModelAttribute("allActivities") + public List getAllActivites() { + return new ArrayList() {{ + add("papers"); + add("projects"); + add("grants"); + add("conferences"); + }}; + } } diff --git a/src/main/java/ru/ulstu/user/model/DiagramElement.java b/src/main/java/ru/ulstu/user/model/DiagramElement.java new file mode 100644 index 0000000..3509110 --- /dev/null +++ b/src/main/java/ru/ulstu/user/model/DiagramElement.java @@ -0,0 +1,86 @@ +package ru.ulstu.user.model; + +import ru.ulstu.ping.model.Ping; + +public class DiagramElement { + private User user; + private int conferences = 0; + private int projects = 0; + private int grants = 0; + private int papers = 0; + + public DiagramElement() { + } + + public DiagramElement(User user) { + this.user = user; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public int getConferences() { + return conferences; + } + + public void setConferences(int conferences) { + this.conferences = conferences; + } + + public int getProjects() { + return projects; + } + + public void setProjects(int projects) { + this.projects = projects; + } + + public int getGrants() { + return grants; + } + + public void setGrants(int grants) { + this.grants = grants; + } + + public int getPapers() { + return papers; + } + + public void setPapers(int papers) { + this.papers = papers; + } + + public void incrementPapers(int value) { + this.papers ++; + } + + public void incrementProjects(int value) { + this.projects ++; + } + + public void incrementConferences(int value) { + this.conferences ++; + } + + public void incrementGrants(int value) { + this.grants ++; + } + + public void incrementActivity(Ping ping) { + if (ping.getConference() != null) { + this.conferences ++; + } else if(ping.getPaper() != null) { + this.papers ++; + } else if(ping.getProject() != null) { + this.projects ++; + } else if(ping.getGrant() != null) { + this.grants ++; + } + } +} diff --git a/src/main/java/ru/ulstu/user/service/UserService.java b/src/main/java/ru/ulstu/user/service/UserService.java index 8089a8e..90a79c0 100644 --- a/src/main/java/ru/ulstu/user/service/UserService.java +++ b/src/main/java/ru/ulstu/user/service/UserService.java @@ -3,6 +3,7 @@ package ru.ulstu.user.service; import com.google.common.collect.ImmutableMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Page; import org.springframework.data.domain.Sort; import org.springframework.mail.MailException; @@ -18,6 +19,8 @@ import ru.ulstu.core.error.EntityIdIsNullException; import ru.ulstu.core.jpa.OffsetablePageRequest; import ru.ulstu.core.model.BaseEntity; import ru.ulstu.core.model.response.PageableItems; +import ru.ulstu.ping.model.Ping; +import ru.ulstu.ping.service.PingService; import ru.ulstu.user.error.UserActivationError; import ru.ulstu.user.error.UserEmailExistsException; import ru.ulstu.user.error.UserIdExistsException; @@ -28,6 +31,7 @@ import ru.ulstu.user.error.UserNotFoundException; import ru.ulstu.user.error.UserPasswordsNotValidOrNotMatchException; import ru.ulstu.user.error.UserResetKeyError; import ru.ulstu.user.error.UserSendingMailException; +import ru.ulstu.user.model.DiagramElement; import ru.ulstu.user.model.User; import ru.ulstu.user.model.UserDto; import ru.ulstu.user.model.UserListDto; @@ -40,6 +44,7 @@ import ru.ulstu.user.repository.UserRoleRepository; import ru.ulstu.user.util.UserUtils; import javax.mail.MessagingException; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -62,19 +67,22 @@ public class UserService implements UserDetailsService { private final UserMapper userMapper; private final MailService mailService; private final ApplicationProperties applicationProperties; + private final PingService pingService; public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder, UserRoleRepository userRoleRepository, UserMapper userMapper, MailService mailService, - ApplicationProperties applicationProperties) { + ApplicationProperties applicationProperties, + @Lazy PingService pingService) { this.userRepository = userRepository; this.passwordEncoder = passwordEncoder; this.userRoleRepository = userRoleRepository; this.userMapper = userMapper; this.mailService = mailService; this.applicationProperties = applicationProperties; + this.pingService = pingService; } private User getUserByEmail(String email) { @@ -236,7 +244,7 @@ public class UserService implements UserDetailsService { mailService.sendChangePasswordMail(user); } - public boolean requestUserPasswordReset(String email) { + public boolean requestUserPasswordReset(String email) { User user = userRepository.findOneByEmailIgnoreCase(email); if (user == null) { throw new UserNotFoundException(email); @@ -348,4 +356,20 @@ public class UserService implements UserDetailsService { throw new UserSendingMailException(email); } } + + public List getActivitiesPings(Integer userId, + String activity) { + List pings = pingService.getPings(userId, activity); + List diagramElements = new ArrayList<>(); + + for (Ping ping:pings) { + DiagramElement diagramElement = diagramElements.stream().filter(element -> element.getUser() == ping.getUser()).findFirst().orElse(null); + if(diagramElement == null) { + diagramElement = new DiagramElement(ping.getUser()); + diagramElements.add(diagramElement); + } + diagramElement.incrementActivity(ping); + } + return diagramElements; + } } diff --git a/src/main/resources/db/changelog-20190525_000000-schema.xml b/src/main/resources/db/changelog-20190525_000000-schema.xml new file mode 100644 index 0000000..51fffe6 --- /dev/null +++ b/src/main/resources/db/changelog-20190525_000000-schema.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog-master.xml b/src/main/resources/db/changelog-master.xml index 5011cc5..d4488f7 100644 --- a/src/main/resources/db/changelog-master.xml +++ b/src/main/resources/db/changelog-master.xml @@ -43,4 +43,5 @@ + \ No newline at end of file diff --git a/src/main/resources/public/js/users.js b/src/main/resources/public/js/users.js index e31d3ad..d0c7c38 100644 --- a/src/main/resources/public/js/users.js +++ b/src/main/resources/public/js/users.js @@ -124,4 +124,42 @@ function resetPassword() { function isEmailValid(email) { re = /\S+@\S+\.\S+/; return re.test(email) +} + +function drawChart() { + userId = $('#author :selected').val() + activity = $('#activity :selected').val() + $.ajax({ + url:`/api/1.0/users/activities?userId=${userId}&activity=${activity}`, + contentType: "application/json; charset=utf-8", + method: "GET", + success: function(response) { + if (response.data.length == 0) { + return; + } + if(userId) { + array = [['Активность', 'Количество'], + ['Конференции', response.data[0].conferences], + ['Статьи', response.data[0].papers], + ['Проекты', response.data[0].projects], + ['Гранты', response.data[0].grants]] + } else { + array = [['Пользователи', 'Количество']] + response.data.forEach(function(element) { + array.push([element.user.firstName, element[`${activity}`]]) + }) + } + var data = google.visualization.arrayToDataTable(array); + var options = { + title: 'Активность', + is3D: true, + pieResidueSliceLabel: 'Остальное' + }; + var chart = new google.visualization.PieChart(document.getElementById('air')); + chart.draw(data, options); + }, + error: function(errorData) { + showFeedbackMessage(errorData.responseJSON.error.message, MessageTypesEnum.WARNING) + } + }) } \ No newline at end of file diff --git a/src/main/resources/templates/grants/grant.html b/src/main/resources/templates/grants/grant.html index 38047bf..4f70a7a 100644 --- a/src/main/resources/templates/grants/grant.html +++ b/src/main/resources/templates/grants/grant.html @@ -23,7 +23,7 @@ th:object="${grantDto}">
- +
+
+ +
@@ -367,6 +373,22 @@ var lid = $("#leaderId option:selected").val(); $("#authors [value='" + lid + "']").attr("disabled", "disabled"); } + + function sendPing() { + id = document.getElementById("grantId").value + + $.ajax({ + url:"/grants/ping?grantId=" + id, + contentType: "application/json; charset=utf-8", + method: "POST", + success: function() { + showFeedbackMessage("Пароль был обновлен", MessageTypesEnum.SUCCESS) + }, + error: function(errorData) { + showFeedbackMessage(errorData.responseJSON.error.message, MessageTypesEnum.WARNING) + } + }) + }
diff --git a/src/main/resources/templates/papers/paper.html b/src/main/resources/templates/papers/paper.html index 2755aba..ea748ef 100644 --- a/src/main/resources/templates/papers/paper.html +++ b/src/main/resources/templates/papers/paper.html @@ -43,7 +43,7 @@