package org.xcolab.view.pages.feedswidget.dataProviders; import org.springframework.ui.Model; import org.xcolab.client.activities.ActivitiesClientUtil; import org.xcolab.client.activities.pojo.ActivityEntry; import org.xcolab.client.members.MembersClient; import org.xcolab.client.members.legacy.enums.MemberRole; import org.xcolab.client.members.pojo.Member; import org.xcolab.client.members.pojo.MemberCategory; import org.xcolab.view.util.entity.ActivityUtil; import org.xcolab.view.pages.feedswidget.FeedTypeDataProvider; import org.xcolab.view.pages.feedswidget.FeedsPreferences; import org.xcolab.view.pages.feedswidget.wrappers.SocialActivityWrapper; import org.xcolab.view.util.pagination.SortFilterPage; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ActivitiesFeedDataProvider implements FeedTypeDataProvider { @Override public String populateModel(HttpServletRequest request, HttpServletResponse response, SortFilterPage sortFilterPage, FeedsPreferences feedsPreferences, Model model) { Map<String, String[]> parameters = request.getParameterMap(); final int pageSize = feedsPreferences.getFeedSize(); String userIdStr = null; if (parameters.containsKey("userId")) { userIdStr = parameters.get("userId")[0]; } else if (request.getParameter("userId") != null) { userIdStr = request.getParameter("userId"); } long filterUserId = 0L; if (userIdStr != null) { try { filterUserId = Long.parseLong(userIdStr); Member filterUser = MembersClient.getMember(filterUserId); model.addAttribute("filterUserId", filterUserId); model.addAttribute("filterUser", filterUser); } catch (Throwable ignored) { } } List <Member> staffList; List <Member> adminList; HashMap<Long, Long> idsToExclude = new HashMap<>(); if(feedsPreferences.getRemoveAdmin()){//STAFF final MemberCategory memberCategory = MembersClient.getMemberCategory(MemberRole.ADMINISTRATOR.getRoleId()); adminList = MembersClient.listMembers(memberCategory.getCategoryName(),null,null, null, true, 0, Integer.MAX_VALUE); if(adminList!= null &&! adminList.isEmpty()) { for (Member m : adminList){ idsToExclude.put(m.getId_(),m.getUserId()); } } } final MemberCategory memberCategory = MembersClient.getMemberCategory(MemberRole.STAFF.getRoleId()); staffList = MembersClient.listMembers(memberCategory.getCategoryName(),null,null, null, true, 0, Integer.MAX_VALUE); if(staffList!= null &&! staffList.isEmpty()) { for (Member m : staffList){ idsToExclude.put(m.getId_(),m.getUserId()); } } List<ActivityEntry> windowedActivities; int startRetrievalAt = sortFilterPage.getPage() * pageSize; int endRetrievalAt = (sortFilterPage.getPage() + 1) * pageSize; if (filterUserId == 0) { windowedActivities = ActivitiesClientUtil .getActivityEntries(startRetrievalAt, endRetrievalAt, null, new ArrayList<>(idsToExclude.keySet())); } else { windowedActivities = ActivitiesClientUtil .getActivityEntries(startRetrievalAt, endRetrievalAt, filterUserId, new ArrayList<>(idsToExclude.keySet())); } int lastDaysBetween = -1; int i = 0; List<SocialActivityWrapper> activities = new ArrayList<>(); Date now = new Date(); for (ActivityEntry activity : windowedActivities) { if (SocialActivityWrapper.isEmpty(activity, request)) { continue; } if (i >= feedsPreferences.getFeedSize()) { break; } int curDaysBetween = getDaysBetween(new Date(activity.getCreateDate().getTime()), now); activities.add(new SocialActivityWrapper(activity, curDaysBetween, lastDaysBetween < curDaysBetween, i % 2 == 1, request, feedsPreferences.getFeedMaxLength())); lastDaysBetween = curDaysBetween; i++; } model.addAttribute("activities", activities); if (filterUserId == 0) { model.addAttribute("isLastPage", ((pageSize * (sortFilterPage.getPage() + 1)) >= ActivityUtil .getAllActivitiesCount())); } else { model.addAttribute("isLastPage", ((pageSize * (sortFilterPage.getPage() + 1) >= ActivityUtil .getActivitiesCount(filterUserId)))); } return "feedswidget/activities"; } private static int getDaysBetween(Date d1, Date d2){ return (int)( (d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24)); } }