package com.aperture_software.glados_wiki.webmvc.controllers; import com.aperture_software.glados_wiki.entities.Page; import com.aperture_software.glados_wiki.entities.functions.TeeConsumeFunction; import com.aperture_software.glados_wiki.entities.functions.page.EmptyPageResponseFunction; import com.aperture_software.glados_wiki.entities.functions.page.PageReadablePredicate; import com.aperture_software.glados_wiki.entities.functions.page.PageToPageResponseFunction; import com.aperture_software.glados_wiki.entities.page.PageResponse; import com.aperture_software.glados_wiki.entities.page.PaginatedPagesResponse; import com.aperture_software.glados_wiki.services.PageAclService; import com.aperture_software.glados_wiki.services.PageService; import com.aperture_software.glados_wiki.support.Pagination; import com.google.common.base.Optional; import com.google.common.base.Strings; import com.google.common.collect.Lists; import org.apache.commons.lang3.tuple.ImmutablePair; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import javax.inject.Inject; import java.util.List; /** * Created by jhyun on 14. 3. 15. */ @Controller public class PagesController { @Inject private PageService pageService; @Inject private PageAclService pageAclService; @ResponseBody @RequestMapping(value = "/pages/listPages", produces = MediaType.APPLICATION_JSON_VALUE) public PaginatedPagesResponse list(@RequestParam(value = "searchTerm", required = false, defaultValue = "") final String searchTerm, @RequestParam(value = "offset", required = false, defaultValue = "0") final int offset, @RequestParam(value = "limit", required = false, defaultValue = "25") final int limit) { // Optional<String> searchTerm_ = Strings.isNullOrEmpty(searchTerm) ? Optional.<String>absent() : Optional.of(searchTerm); ImmutablePair<Long, List<Page>> p = pageService.listPages(searchTerm_, offset, limit); Pagination pagination = new Pagination(p.getLeft(), offset, limit); TeeConsumeFunction<Page, PageResponse> f = new TeeConsumeFunction<Page, PageResponse>( new PageReadablePredicate(pageAclService), new PageToPageResponseFunction(), new EmptyPageResponseFunction<Page>() ); List<PageResponse> l = Lists.transform(p.getRight(), f); return new PaginatedPagesResponse(l, pagination); } @RequestMapping("/pages") public ModelAndView list(ModelMap m, @RequestParam(value = "searchTerm", required = false, defaultValue = "") final String searchTerm) { m.put("searchTerm", searchTerm); return new ModelAndView("pages/list", m); } }