diff --git a/mozen/src/main/java/mozen/business/IModelManager.java b/mozen/src/main/java/mozen/business/IModelManager.java index 738c7c320fa36f243bce05b94d48798d8641863a..f4de25d36f87f08e71355b932978b6c871fcd1be 100644 --- a/mozen/src/main/java/mozen/business/IModelManager.java +++ b/mozen/src/main/java/mozen/business/IModelManager.java @@ -7,6 +7,7 @@ import org.springframework.web.multipart.MultipartFile; import mozen.messages.ModelMessage; import mozen.messages.TagMessage; import mozen.model.Model; +import mozen.messages.SearchResult; import mozen.model.TagCategory; import mozen.model.User; @@ -23,5 +24,7 @@ public interface IModelManager { Model getModel(long id); Collection<TagCategory> getTags(); - Collection<Model> findModel(String name); + SearchResult findModel(String name, int page, int size, String sort); + + SearchResult findModelWithTags(String name, int page, int size, String sort, Collection<String> tags); } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/business/ModelManager.java b/mozen/src/main/java/mozen/business/ModelManager.java index 6d68263cf9a2915feba58f87c25466e9ad35867f..718f383d435aea15b42c2f7058225be004355f5a 100644 --- a/mozen/src/main/java/mozen/business/ModelManager.java +++ b/mozen/src/main/java/mozen/business/ModelManager.java @@ -1,12 +1,15 @@ package mozen.business; -import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -14,13 +17,14 @@ import mozen.messages.ModelMessage; import mozen.messages.TagMessage; import mozen.model.CustomLayer; import mozen.model.Model; +import mozen.messages.SearchResult; import mozen.model.Tag; import mozen.model.TagCategory; import mozen.model.User; @Service public class ModelManager implements IModelManager { - + @Autowired private ModelRepository modelRepo; @@ -111,31 +115,27 @@ public class ModelManager implements IModelManager { } @Override - public Collection<Model> findModel(String name) { - Collection<Model> result = modelRepo.findByName(name); - + public SearchResult findModel(String name, int page, int size, String sort) { + System.err.println("[MODEL MANAGER] search n:"+name+" p:"+page+" si:"+size+" so:"+sort); + Pageable paging = PageRequest.of(page-1, size, Sort.by(sort)); + Page<Model> resultPage = modelRepo.findByNameContainingIgnoreCase(name, paging); + + System.err.println("[MODEL MANAGER] search result "+resultPage.getTotalElements()); + + SearchResult result = new SearchResult(); + if (resultPage.hasContent()) { + result.setTotalResult((int) resultPage.getTotalElements()); + result.setTotalPage((int) resultPage.getTotalPages()); + result.setPage(resultPage.getNumber()+1); + result.setModels(resultPage.getContent()); + } else { + result.setPage(0); + result.setTotalResult(0); + result.setTotalPage(0); + } return result; } - @Override - public Collection<TagCategory> getTags() { - Collection<TagCategory> categories = new ArrayList<TagCategory>(); - tagCategoryRepo.findAll().forEach(categories::add); - return categories; - } - - @Override - public void removeLayer(long id, User user) throws Exception { - CustomLayer layer = layerRepo.findById(id).get(); - - if (layer == null) - throw new Exception("Unknown layer"); - if (!isLayerAuthor(layer, user)) - throw new Exception("Not the author"); - - layerRepo.deleteById(id); - } - @Override public void addLayerFile(MultipartFile file, long modelId, String name, User user) throws Exception { Model model = modelRepo.findById(modelId).get(); @@ -155,12 +155,16 @@ public class ModelManager implements IModelManager { modelRepo.save(model); } - private boolean isLayerAuthor(CustomLayer layer, User user) { - return layer.getModel().getAuthor() == user; - } + @Override + public void removeLayer(long id, User user) throws Exception { + CustomLayer layer = layerRepo.findById(id).get(); - private boolean isModelAuthor(Model model, User user) { - return model.getAuthor() == user; + if (layer == null) + throw new Exception("Unknown layer"); + if (!isLayerAuthor(layer, user)) + throw new Exception("Not the author"); + + layerRepo.deleteById(id); } @Override @@ -176,4 +180,42 @@ public class ModelManager implements IModelManager { tagRepo.save(tag); } + @Override + public Collection<TagCategory> getTags() { + // Collection<TagCategory> categories = new ArrayList<TagCategory>(); + // tagCategoryRepo.findAll().forEach(categories::add); + return tagCategoryRepo.findAll(); + } + + private boolean isLayerAuthor(CustomLayer layer, User user) { + return layer.getModel().getAuthor() == user; + } + + private boolean isModelAuthor(Model model, User user) { + return model.getAuthor() == user; + } + + @Override + public SearchResult findModelWithTags(String name, int page, int size, String sort, Collection<String> tagsName) { + System.err.println("[MODEL MANAGER] search with tags n:"+name+" p:"+page+" si:"+size+" so:"+sort+" t:"+tagsName); + Pageable paging = PageRequest.of(page-1, size, Sort.by(sort)); + Collection<Tag> tags = tagRepo.findByNameIn(tagsName); + Page<Model> resultPage = modelRepo.findByNameContainingIgnoreCaseAndTagsIn(name, tags, paging); + + System.err.println("[MODEL MANAGER] search result "+resultPage.getTotalElements()); + + SearchResult result = new SearchResult(); + if (resultPage.hasContent()) { + result.setTotalResult((int) resultPage.getTotalElements()); + result.setTotalPage((int) resultPage.getTotalPages()); + result.setPage(resultPage.getNumber()+1); + result.setModels(resultPage.getContent()); + } else { + result.setPage(0); + result.setTotalResult(0); + result.setTotalPage(0); + } + return result; + } + } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/business/ModelRepository.java b/mozen/src/main/java/mozen/business/ModelRepository.java index ec6ef5295acdc9abb22b3134bb92a243784efdbe..18120e02b03d1c6e3dc2abeb978fa870665d881b 100644 --- a/mozen/src/main/java/mozen/business/ModelRepository.java +++ b/mozen/src/main/java/mozen/business/ModelRepository.java @@ -1,11 +1,19 @@ package mozen.business; -import java.util.List; +import java.util.Collection; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.repository.PagingAndSortingRepository; import mozen.model.Model; +import mozen.model.Tag; public interface ModelRepository extends PagingAndSortingRepository<Model, Long> { - List<Model> findByName(String name); + Page<Model> findByNameContainingIgnoreCase(String name, Pageable pageable); + + Page<Model> findByNameContainingIgnoreCaseAndTagsIn(String name, Collection<Tag> tags, Pageable pageable); + + // @Query("SELECT m FROM Model m WHERE m.name LIKE :name AND m.tags CONTAINS (SELECT t FROM Tag WHERE t.name IN :tags)") <- horrible et c'est même pas complet + // Page<Model> findByNameContainingIgnoreCaseTags(@Param("name") String name, @Param("tags") Collection<String> tags, Pageable pageable); } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/business/TagCategoryRepository.java b/mozen/src/main/java/mozen/business/TagCategoryRepository.java index 9d36c4e563620cd50bac8a4ffdb0579bc7dc4c6f..dcf49ea02dad1bd72d9573973cf53cc4703cc6af 100644 --- a/mozen/src/main/java/mozen/business/TagCategoryRepository.java +++ b/mozen/src/main/java/mozen/business/TagCategoryRepository.java @@ -1,9 +1,11 @@ package mozen.business; +import java.util.List; + import org.springframework.data.repository.CrudRepository; import mozen.model.TagCategory; public interface TagCategoryRepository extends CrudRepository<TagCategory, Long>{ - + List<TagCategory> findAll(); } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/business/TagRepository.java b/mozen/src/main/java/mozen/business/TagRepository.java index 5fa98e360f7634ebdcfcbc750dece13db5dc5ad6..219a5797e2deaae9a8fed42c45b3a32e87a3975c 100644 --- a/mozen/src/main/java/mozen/business/TagRepository.java +++ b/mozen/src/main/java/mozen/business/TagRepository.java @@ -1,5 +1,6 @@ package mozen.business; +import java.util.Collection; import java.util.List; import org.springframework.data.repository.CrudRepository; @@ -7,5 +8,6 @@ import org.springframework.data.repository.CrudRepository; import mozen.model.Tag; public interface TagRepository extends CrudRepository<Tag, Long>{ - List<Tag> findByName(String name); + List<Tag> findByName(String name); + List<Tag> findByNameIn(Collection<String> name); } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/model/SearchResult.java b/mozen/src/main/java/mozen/messages/SearchResult.java similarity index 51% rename from mozen/src/main/java/mozen/model/SearchResult.java rename to mozen/src/main/java/mozen/messages/SearchResult.java index d8c81f519325d8eb8346f73830dcee891abc44a4..cd67bb010d2e2e85f68905992a7278c97ed93465 100644 --- a/mozen/src/main/java/mozen/model/SearchResult.java +++ b/mozen/src/main/java/mozen/messages/SearchResult.java @@ -1,33 +1,28 @@ -package mozen.model; +package mozen.messages; import java.io.Serializable; import java.util.Collection; +import mozen.model.Model; + public class SearchResult implements Serializable { private static final long serialVersionUID = 1L; - private int total; private int page; + private int totalResult; + private int totalPage; private Collection<Model> models; - public SearchResult() { } - public SearchResult(int total, int page, Collection<Model> models) { - this.total = total; + public SearchResult(int page, int totalResult, int totalPage, Collection<Model> models) { this.page = page; + this.totalResult = totalResult; + this.totalPage = totalPage; this.models = models; } - public int getTotal() { - return this.total; - } - - public void setTotal(int total) { - this.total = total; - } - public int getPage() { return this.page; } @@ -36,6 +31,22 @@ public class SearchResult implements Serializable { this.page = page; } + public int getTotalResult() { + return this.totalResult; + } + + public void setTotalResult(int totalResult) { + this.totalResult = totalResult; + } + + public int getTotalPage() { + return this.totalPage; + } + + public void setTotalPage(int totalPage) { + this.totalPage = totalPage; + } + public Collection<Model> getModels() { return this.models; } diff --git a/mozen/src/main/java/mozen/web/AdminController.java b/mozen/src/main/java/mozen/web/AdminController.java new file mode 100644 index 0000000000000000000000000000000000000000..8136b1c98851c20d6fcb4ac6a7927a3d2149e320 --- /dev/null +++ b/mozen/src/main/java/mozen/web/AdminController.java @@ -0,0 +1,20 @@ +package mozen.web; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import mozen.business.IModelManager; +import mozen.business.IUserManager; + +@RestController +@RequestMapping("/admin") +@CrossOrigin +public class AdminController { + @Autowired + IModelManager modelManager; + + @Autowired + IUserManager userManager; +} \ No newline at end of file diff --git a/mozen/src/main/java/mozen/web/SearchController.java b/mozen/src/main/java/mozen/web/SearchController.java index 1a8db21145582e34151439ba95d9aaa1ee10f6c3..49ccb20f4c6d8d11467795ecb25c44ba60eb1850 100644 --- a/mozen/src/main/java/mozen/web/SearchController.java +++ b/mozen/src/main/java/mozen/web/SearchController.java @@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import mozen.business.IModelManager; -import mozen.model.SearchResult; +import mozen.messages.SearchResult; @RestController @RequestMapping("/search") @@ -21,18 +21,19 @@ public class SearchController { @GetMapping("") public SearchResult search( - @RequestParam(value = "name", required = false) String name, - @RequestParam(value = "tag", required = false) Collection<String> tag, + @RequestParam(value = "name", required = false, defaultValue = "") String name, + @RequestParam(value = "tags", required = false) Collection<String> tags, @RequestParam(value = "param", required = false) Integer param, @RequestParam(value = "size", required = true) Integer size, @RequestParam(value = "page", required = true) Integer page, - @RequestParam(value = "sort", required = false) String sort + @RequestParam(value = "sort", required = false, defaultValue = "votes") String sort ) { - SearchResult result = new SearchResult(); - result.setModels(modelManager.findModel(name)); - result.setTotal(result.getModels().size()); - result.setPage(page); + SearchResult result; + + if (tags.isEmpty()) result = modelManager.findModel(name, page, size, sort); + else result = modelManager.findModelWithTags(name, page, size, sort, tags); + return result; } } \ No newline at end of file