package com.qprogramming.tasq.home; import com.qprogramming.tasq.account.Account; import com.qprogramming.tasq.account.Roles; import com.qprogramming.tasq.events.Event; import com.qprogramming.tasq.events.EventsService; import com.qprogramming.tasq.manage.AppService; import com.qprogramming.tasq.projects.Project; import com.qprogramming.tasq.projects.ProjectService; import com.qprogramming.tasq.support.ResultData; import com.qprogramming.tasq.support.Utils; import com.qprogramming.tasq.support.sorters.TaskSorter; import com.qprogramming.tasq.support.web.MessageHelper; import com.qprogramming.tasq.task.Task; import com.qprogramming.tasq.task.TaskService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.i18n.SessionLocaleResolver; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; @Controller public class HomeController { private TaskService taskSrv; private ProjectService projSrv; private EventsService eventSrv; private AppService appSrv; private SessionLocaleResolver localeResolver; @Value("${skip.landing.page}") private String skipLandingPage; @Value("1.3.0") private String version; @Autowired public HomeController(TaskService taskSrv, ProjectService projSrv, AppService appSrv, EventsService eventSrv, SessionLocaleResolver localeResolver) { this.taskSrv = taskSrv; this.projSrv = projSrv; this.appSrv = appSrv; this.eventSrv = eventSrv; this.localeResolver = localeResolver; } @SuppressWarnings("ConstantConditions") @RequestMapping(value = "/", method = RequestMethod.GET) public String index(Account account, Model model) { if (account == null) { localeResolver.setDefaultLocale(new Locale(appSrv.getProperty(AppService.DEFAULTLANG))); if (Boolean.parseBoolean(skipLandingPage)) { return "signin"; } else { return "homeNotSignedIn"; } } else { List<Project> usersProjects = projSrv.findAllByUser(account.getId()); if (usersProjects.size() == 0 && (account.getRole().equals(Roles.ROLE_VIEWER) || account.getRole().equals(Roles.ROLE_USER))) { return "homeNewUser"; } List<Task> allTasks = new LinkedList<>(); for (Project project : usersProjects) { allTasks.addAll(taskSrv.findByProjectAndOpen(project)); } List<Task> currentAccTasks = allTasks.stream().filter(task -> Utils.getCurrentAccount().equals(task.getAssignee())).collect(Collectors.toList()); List<Task> unassignedTasks = allTasks.stream().filter(task -> task.getAssignee() == null).collect(Collectors.toList()); Collections.sort(currentAccTasks, new TaskSorter(TaskSorter.SORTBY.PRIORITY, true)); Collections.sort(unassignedTasks, new TaskSorter(TaskSorter.SORTBY.PRIORITY, true)); model.addAttribute("myTasks", currentAccTasks); model.addAttribute("unassignedTasks", unassignedTasks); return "homeSignedIn"; } } @RequestMapping(value = "/eventCount", method = RequestMethod.GET) @ResponseBody public ResponseEntity<Integer> getEventCount() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (!(authentication instanceof AnonymousAuthenticationToken)) { List<Event> events = eventSrv.getUnread(); return ResponseEntity.ok(events.size()); } return ResponseEntity.ok(0); } @RequestMapping(value = "/help", method = RequestMethod.GET) public String help(Model model, HttpServletRequest request) { // Utils.setHttpRequest(request); //Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String lang = "en"; // if (!(authentication instanceof AnonymousAuthenticationToken)) { // lang = Utils.getCurrentAccount().getLanguage(); // if (lang == null) { // } // } model.addAttribute("version", version); model.addAttribute("projHome", appSrv.getProperty(AppService.TASQROOTDIR)); return "help/" + lang; } @RequestMapping(value = "/tour") public String taskTour(@RequestParam(required = false) String page) { if (StringUtils.isBlank(page)) { return "help/tour_tasker"; } else { return "help/tour_" + page; } } /** * Special mapping to redirect to some other page with extra messages . Page must be valid mapping * * @param page page where it shoud be redirected to. Must be correctly mapped starting with / * @param type {@link com.qprogramming.tasq.support.ResultData.Code} * @param message Message to be added in alert * @param ra RedirectAttributes * @return redirects */ @RequestMapping(value = "/redirect") public String redirect(@RequestParam String page, @RequestParam ResultData.Code type, @RequestParam String message, RedirectAttributes ra) { switch (type) { case OK: MessageHelper.addSuccessAttribute(ra, message); break; case WARNING: MessageHelper.addWarningAttribute(ra, message); break; case ERROR: MessageHelper.addErrorAttribute(ra, message); break; default: return "redirect:/"; } return "redirect:" + page; } }