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);
}
}