package gov.nysenate.openleg.controller.api.hearing;
import gov.nysenate.openleg.client.response.base.BaseResponse;
import gov.nysenate.openleg.client.response.base.ListViewResponse;
import gov.nysenate.openleg.client.view.base.SearchResultView;
import gov.nysenate.openleg.client.view.hearing.PublicHearingIdView;
import gov.nysenate.openleg.client.view.hearing.PublicHearingInfoView;
import gov.nysenate.openleg.client.view.hearing.PublicHearingView;
import gov.nysenate.openleg.controller.api.base.BaseCtrl;
import gov.nysenate.openleg.dao.base.LimitOffset;
import gov.nysenate.openleg.model.hearing.PublicHearingId;
import gov.nysenate.openleg.model.search.SearchException;
import gov.nysenate.openleg.model.search.SearchResults;
import gov.nysenate.openleg.service.hearing.data.PublicHearingDataService;
import gov.nysenate.openleg.service.hearing.search.PublicHearingSearchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.WebRequest;
import static gov.nysenate.openleg.controller.api.base.BaseCtrl.BASE_API_PATH;
import static java.util.stream.Collectors.toList;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
/**
* Public Hearing Search API.
*/
@RestController
@RequestMapping(value = BASE_API_PATH + "/hearings", method = RequestMethod.GET, produces = APPLICATION_JSON_VALUE)
public class PublicHearingSearchCtrl extends BaseCtrl
{
@Autowired private PublicHearingDataService hearingData;
@Autowired private PublicHearingSearchService hearingSearch;
/**
* Public Hearing Search API.
* ---------------
*
* Search all public hearings: (GET) /api/3/hearings/search
* Request Parameters: term - The lucene query string.
* sort - The lucene sort string (blank by default)
* full - Set to true to retrieve full public hearing responses (false by default)
* limit - Limit the number of results (default 25)
* offset - Start results from offset
*/
@RequestMapping(value = "/search")
public BaseResponse globalSearch(@RequestParam(required = true) String term,
@RequestParam(defaultValue = "") String sort,
@RequestParam(defaultValue = "true") boolean summary,
@RequestParam(defaultValue = "false") boolean full,
WebRequest webRequest) throws SearchException {
LimitOffset limOff = getLimitOffset(webRequest, 25);
SearchResults<PublicHearingId> results = hearingSearch.searchPublicHearings(term, sort, limOff);
return getSearchResponse(full, summary, limOff, results);
}
/**
* Public Hearing Search by Year.
* ---------------
*
* Search all Public Hearings in a given year: (GET) /api/3/hearings/{year}/search
* @see #globalSearch see globalSearch for request params.
*/
@RequestMapping(value = "/{year:[\\d]{4}}/search")
public BaseResponse yearSearch(@PathVariable int year,
@RequestParam(required = true) String term,
@RequestParam(defaultValue = "") String sort,
@RequestParam(defaultValue = "true") boolean summary,
@RequestParam(defaultValue = "false") boolean full,
WebRequest webRequest) throws SearchException {
LimitOffset limOff = getLimitOffset(webRequest, 25);
SearchResults<PublicHearingId> results = hearingSearch.searchPublicHearings(term, year, sort, limOff);
return getSearchResponse(full, summary, limOff, results);
}
private BaseResponse getSearchResponse(boolean full, boolean summary, LimitOffset limOff, SearchResults<PublicHearingId> results) {
return ListViewResponse.of(results.getResults().stream().map(r -> new SearchResultView(
(full) ? new PublicHearingView(hearingData.getPublicHearing(r.getResult()))
: (summary) ? new PublicHearingInfoView(hearingData.getPublicHearing(r.getResult()))
: new PublicHearingIdView(r.getResult()), r.getRank(), r.getHighlights()))
.collect(toList()), results.getTotalResults(), limOff);
}
}