From b7d3786e0cc46ea955be58f37f41844ff3206640 Mon Sep 17 00:00:00 2001 From: William Welling Date: Fri, 4 Aug 2017 14:39:26 -0500 Subject: [PATCH 1/3] removed object mapper, decrement page number from front end --- src/main/java/edu/tamu/app/controller/NoteController.java | 7 ------- .../edu/tamu/app/model/request/FilteredPageRequest.java | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/edu/tamu/app/controller/NoteController.java b/src/main/java/edu/tamu/app/controller/NoteController.java index 184be56..7e93808 100644 --- a/src/main/java/edu/tamu/app/controller/NoteController.java +++ b/src/main/java/edu/tamu/app/controller/NoteController.java @@ -5,13 +5,9 @@ import static edu.tamu.framework.enums.BusinessValidationType.EXISTS; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RestController; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - import edu.tamu.app.model.Note; import edu.tamu.app.model.Service; import edu.tamu.app.model.repo.NoteRepo; @@ -34,9 +30,6 @@ public class NoteController { @Autowired private NoteRepo noteRepo; - @Autowired - private ObjectMapper objectMapper; - @ApiMapping("/all") @Auth(role = "ROLE_ANONYMOUS") public ApiResponse getAllNotes() { diff --git a/src/main/java/edu/tamu/app/model/request/FilteredPageRequest.java b/src/main/java/edu/tamu/app/model/request/FilteredPageRequest.java index b853090..9c48b38 100644 --- a/src/main/java/edu/tamu/app/model/request/FilteredPageRequest.java +++ b/src/main/java/edu/tamu/app/model/request/FilteredPageRequest.java @@ -23,7 +23,7 @@ public FilteredPageRequest() { } public PageRequest toPageRequest() { - return new PageRequest(pageNumber, pageSize, new Sort(Sort.Direction.fromString(direction), properties)); + return new PageRequest(pageNumber - 1, pageSize, new Sort(Sort.Direction.fromString(direction), properties)); } public int getPageNumber() { From 76619cbeead9b59b6e9c59c54b4cae28bb587b00 Mon Sep 17 00:00:00 2001 From: William Welling Date: Fri, 4 Aug 2017 15:22:07 -0500 Subject: [PATCH 2/3] pinnable notes --- .../edu/tamu/app/controller/NoteController.java | 16 +++++++--------- src/main/java/edu/tamu/app/model/Note.java | 12 ++++++++++++ .../java/edu/tamu/app/model/repo/NoteRepo.java | 2 ++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/tamu/app/controller/NoteController.java b/src/main/java/edu/tamu/app/controller/NoteController.java index 7e93808..026f7a0 100644 --- a/src/main/java/edu/tamu/app/controller/NoteController.java +++ b/src/main/java/edu/tamu/app/controller/NoteController.java @@ -30,16 +30,14 @@ public class NoteController { @Autowired private NoteRepo noteRepo; - @ApiMapping("/all") + @ApiMapping("/by-service/{pinned}") @Auth(role = "ROLE_ANONYMOUS") - public ApiResponse getAllNotes() { - return new ApiResponse(SUCCESS, noteRepo.findAll()); - } - - @ApiMapping("/by-service") - @Auth(role = "ROLE_ANONYMOUS") - public ApiResponse getAllNotesByService(@ApiModel Service service) { - return new ApiResponse(SUCCESS, noteRepo.findAllByService(service)); + public ApiResponse getAllNotesByService(@ApiModel Service service, @ApiVariable String pinned) { + if (Boolean.valueOf(pinned)) { + return new ApiResponse(SUCCESS, noteRepo.findAllByServiceAndPinnedTrue(service)); + } else { + return new ApiResponse(SUCCESS, noteRepo.findAllByService(service)); + } } @ApiMapping("/{id}") diff --git a/src/main/java/edu/tamu/app/model/Note.java b/src/main/java/edu/tamu/app/model/Note.java index c7cac22..f562afd 100644 --- a/src/main/java/edu/tamu/app/model/Note.java +++ b/src/main/java/edu/tamu/app/model/Note.java @@ -32,6 +32,9 @@ public class Note extends BaseEntity { @Column(columnDefinition = "text", nullable = true) private String body; + @Column(nullable = false) + private boolean pinned; + @Temporal(TemporalType.DATE) private Calendar scheduledPostingStart; @@ -49,6 +52,7 @@ public class Note extends BaseEntity { private AppUser author; public Note() { + setPinned(false); setModelValidator(new NoteValidator()); setService(new Service()); } @@ -102,6 +106,14 @@ public void setBody(String body) { this.body = body; } + public boolean isPinned() { + return pinned; + } + + public void setPinned(boolean pinned) { + this.pinned = pinned; + } + public Calendar getScheduledPostingStart() { return scheduledPostingStart; } diff --git a/src/main/java/edu/tamu/app/model/repo/NoteRepo.java b/src/main/java/edu/tamu/app/model/repo/NoteRepo.java index 80b5220..c70b8c7 100644 --- a/src/main/java/edu/tamu/app/model/repo/NoteRepo.java +++ b/src/main/java/edu/tamu/app/model/repo/NoteRepo.java @@ -20,6 +20,8 @@ public interface NoteRepo extends JpaRepository, NoteRepoCustom, Jpa public List findAllByService(Service service); + public List findAllByServiceAndPinnedTrue(Service service); + public void delete(Note note); } From 8a7875ded9d8d43749bbf34c0da605efcc5de82d Mon Sep 17 00:00:00 2001 From: William Welling Date: Mon, 7 Aug 2017 09:02:00 -0500 Subject: [PATCH 3/3] using note specification for advanced paging queries --- .../tamu/app/controller/NoteController.java | 14 +++------ .../edu/tamu/app/model/repo/NoteRepo.java | 7 +++-- .../app/model/repo/impl/ServiceRepoImpl.java | 2 +- .../repo/specification/NoteSpecification.java | 29 +++++++++++++++++-- .../model/request/FilteredPageRequest.java | 13 ++++++++- 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/main/java/edu/tamu/app/controller/NoteController.java b/src/main/java/edu/tamu/app/controller/NoteController.java index 026f7a0..9c9d0b7 100644 --- a/src/main/java/edu/tamu/app/controller/NoteController.java +++ b/src/main/java/edu/tamu/app/controller/NoteController.java @@ -9,13 +9,11 @@ import org.springframework.web.bind.annotation.RestController; import edu.tamu.app.model.Note; -import edu.tamu.app.model.Service; import edu.tamu.app.model.repo.NoteRepo; import edu.tamu.app.model.request.FilteredPageRequest; import edu.tamu.framework.aspect.annotation.ApiCredentials; import edu.tamu.framework.aspect.annotation.ApiData; import edu.tamu.framework.aspect.annotation.ApiMapping; -import edu.tamu.framework.aspect.annotation.ApiModel; import edu.tamu.framework.aspect.annotation.ApiValidatedModel; import edu.tamu.framework.aspect.annotation.ApiValidation; import edu.tamu.framework.aspect.annotation.ApiVariable; @@ -30,14 +28,10 @@ public class NoteController { @Autowired private NoteRepo noteRepo; - @ApiMapping("/by-service/{pinned}") + @ApiMapping("/query") @Auth(role = "ROLE_ANONYMOUS") - public ApiResponse getAllNotesByService(@ApiModel Service service, @ApiVariable String pinned) { - if (Boolean.valueOf(pinned)) { - return new ApiResponse(SUCCESS, noteRepo.findAllByServiceAndPinnedTrue(service)); - } else { - return new ApiResponse(SUCCESS, noteRepo.findAllByService(service)); - } + public ApiResponse getAllNotesByService(@ApiData FilteredPageRequest filteredPageRequest) { + return new ApiResponse(SUCCESS, noteRepo.findAll(filteredPageRequest.getSpecification(), filteredPageRequest.getPageRequest())); } @ApiMapping("/{id}") @@ -71,7 +65,7 @@ public ApiResponse remove(@ApiValidatedModel Note note) { @ApiMapping("/page") @Auth(role = "ROLE_ANONYMOUS") public ApiResponse page(@ApiData FilteredPageRequest filteredPageRequest) { - return new ApiResponse(SUCCESS, noteRepo.findAll(filteredPageRequest.toPageRequest())); + return new ApiResponse(SUCCESS, noteRepo.findAll(filteredPageRequest.getPageRequest())); } } diff --git a/src/main/java/edu/tamu/app/model/repo/NoteRepo.java b/src/main/java/edu/tamu/app/model/repo/NoteRepo.java index c70b8c7..d3793e6 100644 --- a/src/main/java/edu/tamu/app/model/repo/NoteRepo.java +++ b/src/main/java/edu/tamu/app/model/repo/NoteRepo.java @@ -9,18 +9,19 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import edu.tamu.app.model.Note; -import edu.tamu.app.model.Service; import edu.tamu.app.model.repo.custom.NoteRepoCustom; public interface NoteRepo extends JpaRepository, NoteRepoCustom, JpaSpecificationExecutor { public Page findAll(Specification specification, Pageable pageable); + public List findAll(Specification specification); + public Page findAll(Pageable pageable); - public List findAllByService(Service service); + public List findAllByServiceId(Long id); - public List findAllByServiceAndPinnedTrue(Service service); + public List findAllByServiceIdAndPinnedTrue(Long id); public void delete(Note note); diff --git a/src/main/java/edu/tamu/app/model/repo/impl/ServiceRepoImpl.java b/src/main/java/edu/tamu/app/model/repo/impl/ServiceRepoImpl.java index 67bae28..7553412 100644 --- a/src/main/java/edu/tamu/app/model/repo/impl/ServiceRepoImpl.java +++ b/src/main/java/edu/tamu/app/model/repo/impl/ServiceRepoImpl.java @@ -45,7 +45,7 @@ public Service update(Service service) { @Override public void delete(Service service) { - noteRepo.findAllByService(service).parallelStream().forEach(note -> { + noteRepo.findAllByServiceId(service.getId()).parallelStream().forEach(note -> { noteRepo.delete(note); }); serviceRepo.delete(service.getId()); diff --git a/src/main/java/edu/tamu/app/model/repo/specification/NoteSpecification.java b/src/main/java/edu/tamu/app/model/repo/specification/NoteSpecification.java index 1553000..6dd5b7c 100644 --- a/src/main/java/edu/tamu/app/model/repo/specification/NoteSpecification.java +++ b/src/main/java/edu/tamu/app/model/repo/specification/NoteSpecification.java @@ -13,7 +13,6 @@ public class NoteSpecification implements Specification { - @SuppressWarnings("unused") private Map filters; public NoteSpecification(Map filters) { @@ -22,8 +21,32 @@ public NoteSpecification(Map filters) { @Override public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { - List datePredicates = new ArrayList(); - return cb.and(datePredicates.toArray(new Predicate[datePredicates.size()])); + + List pinnedPredicates = new ArrayList(); + List servicePredicates = new ArrayList(); + + for (Map.Entry entry : filters.entrySet()) { + String key = entry.getKey(); + String[] values = entry.getValue(); + + switch (key) { + case "pinned": + for (String value : values) { + pinnedPredicates.add(cb.like(cb.lower(root.get(key).as(String.class)), "%" + value.toLowerCase() + "%")); + } + break; + case "service": + for (String value : values) { + servicePredicates.add(cb.like(cb.lower(root.get(key).get("id").as(String.class)), "%" + value.toLowerCase() + "%")); + } + break; + default: + break; + } + + } + + return cb.and(cb.and(pinnedPredicates.toArray(new Predicate[pinnedPredicates.size()])), cb.and(servicePredicates.toArray(new Predicate[servicePredicates.size()]))); } } diff --git a/src/main/java/edu/tamu/app/model/request/FilteredPageRequest.java b/src/main/java/edu/tamu/app/model/request/FilteredPageRequest.java index 9c48b38..d284053 100644 --- a/src/main/java/edu/tamu/app/model/request/FilteredPageRequest.java +++ b/src/main/java/edu/tamu/app/model/request/FilteredPageRequest.java @@ -6,6 +6,11 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; +import com.fasterxml.jackson.annotation.JsonIgnore; + +import edu.tamu.app.model.Note; +import edu.tamu.app.model.repo.specification.NoteSpecification; + public class FilteredPageRequest { private int pageNumber; @@ -22,7 +27,13 @@ public FilteredPageRequest() { } - public PageRequest toPageRequest() { + @JsonIgnore + public NoteSpecification getSpecification() { + return new NoteSpecification(filters); + } + + @JsonIgnore + public PageRequest getPageRequest() { return new PageRequest(pageNumber - 1, pageSize, new Sort(Sort.Direction.fromString(direction), properties)); }