diff --git a/src/main/java/com/example/clientproject/web/restControllers/ShopSearch.java b/src/main/java/com/example/clientproject/web/restControllers/ShopSearch.java index e2c025038cf5019dc6180fc63765e2e59cff57df..7a7dd08aef9d696289c2873a20566e9a403e72d0 100644 --- a/src/main/java/com/example/clientproject/web/restControllers/ShopSearch.java +++ b/src/main/java/com/example/clientproject/web/restControllers/ShopSearch.java @@ -2,13 +2,14 @@ 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 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 java.util.List; -import java.util.Locale; +import java.util.*; import java.util.stream.Collectors; @RestController @@ -16,11 +17,14 @@ public class ShopSearch { @Autowired ShopsRepo shopsRepo; + @Autowired + TagsRepo tagsRepo; + @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){ - final Integer itemsPerPage = 6; + final Integer ITEMS_PER_PAGE = 6; //Get all the active shops List<Shops> allShops = shopsRepo.findActiveShops(); @@ -34,12 +38,70 @@ public class ShopSearch { } //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; + } + } //Convert to required format + + //Add details such as the amount of rewards + return allShops.toString(); } + + 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; + } }