package controllers;
import controllers.actions.SaveContext;
import forms.ListProducts;
import io.sphere.client.ProductSort;
import io.sphere.client.filters.expressions.FilterExpressions;
import io.sphere.client.model.SearchResult;
import io.sphere.client.shop.model.Category;
import io.sphere.client.shop.model.Product;
import play.mvc.Result;
import play.mvc.With;
import sphere.ShopController;
import sphere.SearchRequest;
import utils.ProductFilters;
import views.html.categories;
import views.html.home;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Categories extends ShopController {
public static int PAGE_SIZE = 20;
@With(SaveContext.class)
public static Result home(String sort, int page) {
SearchRequest<Product> searchRequest = sphere().products().all();
searchRequest = filterBy(searchRequest);
searchRequest = sortBy(searchRequest, sort);
searchRequest = paging(searchRequest, page);
SearchResult<Product> searchResult = searchRequest.fetch();
return ok(home.render(searchResult, page, sort));
}
@With(SaveContext.class)
public static Result select(String categorySlug, String sort, int page) {
// Case category not found
Category category = sphere().categories().getBySlug(categorySlug);
if (category == null) {
//flash("error", "Category not found");
return notFound("Category not found " + categorySlug);
}
SearchRequest<Product> searchRequest = sphere().products().all();
searchRequest = filterBy(searchRequest, category);
searchRequest = sortBy(searchRequest, sort);
searchRequest = paging(searchRequest, page);
SearchResult<Product> searchResult = searchRequest.fetch();
return ok(categories.render(searchResult, page, sort, category));
}
@With(SaveContext.class)
public static Result search(String sort, int page) {
SearchRequest<Product> searchRequest = sphere().products().all();
searchRequest = filterBy(searchRequest);
searchRequest = sortBy(searchRequest, sort);
searchRequest = paging(searchRequest, page);
SearchResult<Product> searchResult = searchRequest.fetch();
// TODO Finish
return ok(home.render(searchResult, page, sort));
}
public static Result listProducts(String categorySlug, String sort, int page) {
Category category = null;
SearchRequest<Product> searchRequest = sphere().products().all();
if (!categorySlug.isEmpty()) {
category = sphere().categories().getBySlug(categorySlug);
}
searchRequest = filterBy(searchRequest, category);
searchRequest = sortBy(searchRequest, sort);
searchRequest = paging(searchRequest, page);
SearchResult<Product> searchResult = searchRequest.fetch();
return ok(ListProducts.getJson(searchResult, category, sort));
}
protected static SearchRequest<Product> filterBy(SearchRequest<Product> searchRequest) {
return filterBy(searchRequest, Collections.<Category>emptyList());
}
protected static SearchRequest<Product> filterBy(SearchRequest<Product> searchRequest, Category category) {
if (category != null) {
return filterBy(searchRequest, Collections.<Category>singletonList(category));
} else {
return filterBy(searchRequest);
}
}
protected static SearchRequest<Product> filterBy(SearchRequest<Product> searchRequest, List<Category> categories) {
// Filter by category
searchRequest = searchRequest.filter(
new FilterExpressions.CategoriesOrSubcategories(categories));
// Filter by request parameters
searchRequest = searchRequest.filter(bindFiltersFromRequest(ProductFilters.filters));
// Facet by request parameters
searchRequest = searchRequest.facet(bindFacetsFromRequest(ProductFilters.facets));
return searchRequest;
}
protected static SearchRequest<Product> sortBy(SearchRequest<Product> searchRequest, String sort) {
if (sort.equals("price_asc")) {
searchRequest = searchRequest.sort(ProductSort.price.asc);
} else if (sort.equals("price_desc")) {
searchRequest = searchRequest.sort(ProductSort.price.desc);
} else if (sort.equals("name_asc")) {
searchRequest = searchRequest.sort(ProductSort.name.asc);
} else if (sort.equals("name_desc")) {
searchRequest = searchRequest.sort(ProductSort.name.desc);
}
return searchRequest;
}
protected static SearchRequest<Product> paging(SearchRequest<Product> searchRequest, int currentPage) {
if (currentPage < 1) currentPage = 1;
// Convert page from 1..N to 0..N-1
currentPage--;
return searchRequest.page(currentPage).pageSize(PAGE_SIZE);
}
}