SearchController.java

package edu.rit.coopeval.controller;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import edu.rit.coopeval.dao.*;
import edu.rit.coopeval.model.*;
import edu.rit.coopeval.search.Search;
import edu.rit.coopeval.security.SecurityUser;
import edu.rit.coopeval.viewmodel.search.SearchCriteriaViewModel;
import edu.rit.coopeval.viewmodel.search.SearchResultViewModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(value = "/services/SearchService")
public class SearchController {

    @Autowired
    private TermRepository termRepo;
    @Autowired
    private DepartmentRepository departmentRepo;
    @Autowired
    private DepartmentUserJoinRepository departmentUserJoinRepo;
    @Autowired
    private EvaluationStatusRepository evalStatusRepo;
    @Autowired
    private EvaluationApprovalStatusRepository evalApprovalStatusRepo;
    @Autowired
    private Search search;

    @RequestMapping(value = "/getSearchResults", method = RequestMethod.POST)
    public List<SearchResultViewModel> getSearchResults(@RequestBody SearchCriteriaViewModel searchCriteriaViewModel) {
        ArrayList<SearchResultViewModel> results = new ArrayList<SearchResultViewModel>();
        for (Evaluation eval : search.searchEvaluations(searchCriteriaViewModel)) {
            results.add(new SearchResultViewModel(eval));
        }
        return results;
    }

    @RequestMapping(value = "/getSearchCriteria", method = RequestMethod.GET)
    public SearchCriteriaViewModel getSearchCriteria(@AuthenticationPrincipal SecurityUser sUser) {
        User currentUser = sUser.user();
        SearchCriteriaViewModel criteria = null;

        switch (currentUser.getRoles().stream().findFirst().get().getRole()) {
            case "Administrator":
                criteria = new SearchCriteriaViewModel(termRepo.findAll(), departmentRepo.findAll(),
                                                       evalStatusRepo.findAll(), evalApprovalStatusRepo.findAll());
                break;
            case "Evaluator":
                List<Department> departments = departmentUserJoinRepo
                        .findDepartmentsByDepartmentUserName(currentUser.getUsername())
                        .stream()
                        .map(DepartmentUserJoin::getDepartment)
                        .collect(Collectors.toList());

                criteria = new SearchCriteriaViewModel(termRepo.findAll(), departments,
                                                       evalStatusRepo.findAll(), evalApprovalStatusRepo.findAll());
                break;
        }
        return criteria;
    }
}