diff --git a/src/main/java/edu/tamu/app/controller/NoteController.java b/src/main/java/edu/tamu/app/controller/NoteController.java index 184be56..9c9d0b7 100644 --- a/src/main/java/edu/tamu/app/controller/NoteController.java +++ b/src/main/java/edu/tamu/app/controller/NoteController.java @@ -5,21 +5,15 @@ 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; 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; @@ -34,19 +28,10 @@ public class NoteController { @Autowired private NoteRepo noteRepo; - @Autowired - private ObjectMapper objectMapper; - - @ApiMapping("/all") - @Auth(role = "ROLE_ANONYMOUS") - public ApiResponse getAllNotes() { - return new ApiResponse(SUCCESS, noteRepo.findAll()); - } - - @ApiMapping("/by-service") + @ApiMapping("/query") @Auth(role = "ROLE_ANONYMOUS") - public ApiResponse getAllNotesByService(@ApiModel Service service) { - 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}") @@ -80,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/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..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,16 +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 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 b853090..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,8 +27,14 @@ public FilteredPageRequest() { } - public PageRequest toPageRequest() { - return new PageRequest(pageNumber, pageSize, new Sort(Sort.Direction.fromString(direction), properties)); + @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)); } public int getPageNumber() {