Skip to content
Snippets Groups Projects

Branch Update

Merged Joshua Gill requested to merge develop into issueThirtyNine
8 files
+ 267
8
Compare changes
  • Side-by-side
  • Inline
Files
8
package com.example.clientproject.web.restControllers;
import com.example.clientproject.data.shops.Shops;
import com.example.clientproject.data.shops.ShopsRepo;
import com.example.clientproject.data.tags.Tags;
import com.example.clientproject.data.tags.TagsRepo;
import com.example.clientproject.services.RecommendationGenerator;
import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
import java.util.*;
import java.util.stream.Collectors;
@RestController
public class ShopSearch {
@Autowired
ShopsRepo shopsRepo;
@Autowired
TagsRepo tagsRepo;
@Autowired
RecommendationGenerator recommendationGenerator;
@GetMapping("/shop/search")
public String searchShops(@RequestParam(value = "q", required = false) String query,
@RequestParam(value = "p", required = false) Integer page,
@RequestParam(value = "t", required = false) List<String> tags,
HttpSession session) throws Exception {
final Integer ITEMS_PER_PAGE = 6;
//Get all the active shops
List<Shops> allShops = shopsRepo.findActiveShops();
//Filter the shops using the query provided
if(query != null){
allShops = allShops
.stream()
.filter(s -> s.getShopName().toLowerCase(Locale.ROOT).strip().contains(query.toLowerCase(Locale.ROOT).strip()))
.collect(Collectors.toList());
}
//Filter using the tags provided
if(tags!=null){
List<Long> validTagIds = new ArrayList<>();
for (String t : tags){
Optional<Tags> tagsOptional = tagsRepo.findByTagNameIgnoreCase(t);
if(tagsOptional.isPresent()){
Long tagId = tagsOptional.get().getTagId();
if (!validTagIds.contains(tagId)){
validTagIds.add(tagId);
}
}
}
List<Shops> validShops = new ArrayList<>();
for (Shops s : allShops){
boolean match = false;
for (Tags t : s.getShopTags()){
if (validTagIds.contains(t.getTagId())){
match = true;
break;
}
}
if (match){
validShops.add(s);
}
}
allShops = validShops;
}
//Paginate
boolean hasNextPage = false;
if (allShops.size() > ITEMS_PER_PAGE){
if(page==null){
page = 1;
}
List<List<Shops>> pages = getPages(allShops, ITEMS_PER_PAGE);
if(page > pages.size()){
page = 1;
}
if (pages.size() >= page){
allShops = pages.get(page-1);
}
if (pages.size() >= page + 1){
hasNextPage = true;
}
}
//Sort in order of relevance
allShops = recommendationGenerator.getRecommendations(session, allShops);
//Convert to required format
List<HashMap<String, String>> formattedShops = new ArrayList<>();
for(Shops shop : allShops){
HashMap<String,String> data = new HashMap<>();
data.put("name",shop.getShopName());
data.put("banner",shop.getShopBanner());
data.put("id", String.valueOf(shop.getShopId()));
data.put("category",shop.getCategory().getCategoryName());
data.put("website",shop.getShopWebsite());
Integer reward_count = shop.getStampBoard().getRewards().size();
data.put("reward_count",String.valueOf(reward_count));
if(reward_count != 0){
data.put("next_reward_name",shop.getStampBoard().getRewards().get(0).getRewardName());
data.put("next_reward_pos",String.valueOf(shop.getStampBoard().getRewards().get(0).getRewardStampLocation()));
}else{
data.put("next_reward_name","No Rewards");
}
formattedShops.add(data);
}
Map<String,Object> returnMap = new HashMap<>();
returnMap.put("shops",formattedShops);
returnMap.put("hasNextPage", hasNextPage);
Gson gson = new Gson();
String json = gson.toJson(returnMap);
return json;
}
public <T> List<List<T>> getPages(Collection<T> c, Integer pageSize) {
if (c == null)
return Collections.emptyList();
List<T> list = new ArrayList<T>(c);
if (pageSize == null || pageSize <= 0 || pageSize > list.size())
pageSize = list.size();
int numPages = (int) Math.ceil((double)list.size() / (double)pageSize);
List<List<T>> pages = new ArrayList<List<T>>(numPages);
for (int pageNum = 0; pageNum < numPages;)
pages.add(list.subList(pageNum * pageSize, Math.min(++pageNum * pageSize, list.size())));
return pages;
}
}
Loading