diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/DatasetController.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/DatasetController.java index 2f7e9ae..e4ede5c 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/DatasetController.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/DatasetController.java @@ -1,17 +1,22 @@ package de.uni_passau.fim.PADAS.group3.DataDash.controler; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.web.bind.annotation.*; - import de.uni_passau.fim.PADAS.group3.DataDash.model.Dataset; import de.uni_passau.fim.PADAS.group3.DataDash.model.DatasetService; import de.uni_passau.fim.PADAS.group3.DataDash.model.Type; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.config.EnableSpringDataWebSupport; +import org.springframework.data.domain.Sort; import java.util.List; import java.util.UUID; @RestController @RequestMapping("/api/v1/datasets") +@EnableSpringDataWebSupport public class DatasetController { @Autowired private DatasetService datasetService; @@ -45,36 +50,6 @@ public class DatasetController { datasetService.deleteDataset(id); } - @GetMapping("/title/{title}") - public List getByTitle(@PathVariable("title") String title) { - return datasetService.getDatasetsByTitleLike(title); - } - - @GetMapping("/description/{description}") - public List getbyDescription(@PathVariable("description") String description) { - return datasetService.findByDescriptionLike(description); - } - - @GetMapping("/author/{author}") - public List getByAuthor(@PathVariable("author") String author) { - return datasetService.getDatasetsByAuthorLike(author); - } - - @GetMapping("/abst/{abst}") - public List getByAbstract(@PathVariable("abst") String abst) { - return datasetService.getDatasetsByAbstLike(abst); - } - - @GetMapping("/type/{type}") - public List getByType(@PathVariable("type") Type type) { - return datasetService.getDatasetsByType(type); - } - - @GetMapping("/rating/{rating}") - public List getByType(@PathVariable("rating") float rating) { - return datasetService.getDatasetsByRaitingGreaterThan(rating); - } - @PostMapping("/id/{id}/upvote") public Dataset upvote(@PathVariable("id") UUID id) { datasetService.upvoteDataset(id); @@ -88,13 +63,30 @@ public class DatasetController { } @GetMapping - public List getDatasetsByDateAfter(@RequestParam(value = "author", required = false) String author, + public Page getDatasetsByDateAfter(@RequestParam(value = "author", required = false) String author, @RequestParam(value = "title", required = false) String title, @RequestParam(value = "description", required = false) String description, @RequestParam(value = "abst", required = false) String abst, @RequestParam(value = "type", required = false) Type type, - @RequestParam(value = "min-raiting", required = false) Float raiting) { - return datasetService.getDatasetsByOptionalCriteria(title, description, author, abst, type, raiting); + @RequestParam(value = "min-raiting", required = false) Float raiting, + @RequestParam(value = "page", required = false, defaultValue = "0") int page, + @RequestParam(value = "size", required = false, defaultValue = "20") int size, + @RequestParam(value = "sort", required = false, defaultValue = "upvotes") String sort, + @RequestParam(value = "direction", required = false, defaultValue = "desc") String direction) { + Pageable pageable = PageRequest.of(page, size, + Sort.by(direction.equals("asc") ? Sort.Direction.ASC : Sort.Direction.DESC, sort)); + return datasetService.getDatasetsByOptionalCriteria(title, description, author, abst, type, raiting, pageable); + } + + @GetMapping("/search") + public Page search(@RequestParam(value = "search", required = false, defaultValue = "%") String search, + @RequestParam(value = "page", required = false, defaultValue = "0") int page, + @RequestParam(value = "size", required = false, defaultValue = "20") int size, + @RequestParam(value = "sort", required = false, defaultValue = "upvotes") String sort, + @RequestParam(value = "direction", required = false, defaultValue = "desc") String direction) { + Pageable pageable = PageRequest.of(page, size, + Sort.by(direction.equals("asc") ? Sort.Direction.ASC : Sort.Direction.DESC, sort)); + return datasetService.searchByOptionalCriteria(search, pageable); } } \ No newline at end of file diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/Dataset.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/Dataset.java index 8088341..5585eff 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/Dataset.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/Dataset.java @@ -1,7 +1,12 @@ package de.uni_passau.fim.PADAS.group3.DataDash.model; +import java.net.URL; import java.sql.Date; +import java.time.LocalDate; import java.util.UUID; + +import org.springframework.cglib.core.Local; + import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; @@ -27,7 +32,7 @@ public class Dataset { private String author; - private Date date; + private LocalDate date; private float raiting; @@ -35,9 +40,11 @@ public class Dataset { private int upvotes; + private URL url; + private String[] categories; - public Dataset(String title, String abst, String description, String author, Date date, String[] categories, Type type) { + public Dataset(String title, String abst, String description, String author, String[] categories, Type type) { this.raiting = 0; this.votes = 0; @@ -46,9 +53,10 @@ public class Dataset { setAbst(abst); setDescription(description); setAuthor(author); - setDate(date); + setDate(LocalDate.now()); setCategories(categories); setType(type); + setUrl(url); } public Dataset() { @@ -67,7 +75,7 @@ public class Dataset { return categories; } - public Date getDate() { + public LocalDate getDate() { return date; } @@ -99,6 +107,10 @@ public class Dataset { return upvotes; } + public URL getUrl() { + return url; + } + public void setAbst(String abst) { this.abst = abst.substring(0, Math.min(abst.length(), 100)); } @@ -111,13 +123,17 @@ public class Dataset { this.categories = categories; } - public void setDate(Date date) { - this.date = date; + public void setDate(LocalDate localDate) { + this.date = localDate; } public void setDescription(String description) { this.description = description; } + + public void setUrl(URL url) { + this.url = url; + } public void setTitle(String title) { this.title = title.substring(0, Math.min(title.length(), 50)); diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/DatasetService.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/DatasetService.java index 71bab92..6832975 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/DatasetService.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/DatasetService.java @@ -4,7 +4,11 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.apache.juli.logging.Log; +import org.springframework.data.domain.Page; + @Service public class DatasetService { @@ -75,11 +79,19 @@ public class DatasetService { datasetRepository.save(dataset); } - public List getDatasetsByOptionalCriteria(String title, String description, String author, String abst, - Type type, Float raiting) { + public Page getDatasetsByOptionalCriteria(String title, String description, String author, String abst, + Type type, Float raiting, Pageable pageable) { String[] categories = null; return datasetRepository.findByOptionalCriteria(Optional.ofNullable(title), Optional.ofNullable(description), Optional.ofNullable(author), Optional.ofNullable(abst), Optional.ofNullable(type), - Optional.ofNullable(categories), Optional.ofNullable(raiting)); + Optional.ofNullable(categories), Optional.ofNullable(raiting), pageable); + } + + public Page searchByOptionalCriteria(String search, Pageable pageable) { + if (search.equals("%")) { + System.out.println("searching for all datasets"); + return datasetRepository.findAll(pageable); + } + return datasetRepository.searchByOptionalCriteria(Optional.ofNullable(search), pageable); } } \ No newline at end of file diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/dataRepository.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/dataRepository.java index 87b0687..b2934d8 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/dataRepository.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/dataRepository.java @@ -5,10 +5,13 @@ import java.util.Optional; import java.util.UUID; import java.sql.Date; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; + public interface dataRepository extends JpaRepository{ Dataset getDatasetById(UUID id); @@ -25,7 +28,8 @@ public interface dataRepository extends JpaRepository{ List findByDateAfter(Date date); List findByDateBefore(Date date); List findByDateBetween(Date date1, Date date2); - List findAll(); + @SuppressWarnings("null") + Page findAll(Pageable pageable); @Query("SELECT d FROM Dataset d WHERE " + "(COALESCE(:title, '') = '' OR d.title LIKE :title) AND " + @@ -35,12 +39,21 @@ public interface dataRepository extends JpaRepository{ "(:type IS NULL OR d.type = :type) AND"+ "(:categories IS NULL OR d.categories = :categories) AND" + "(:raiting IS NULL OR d.raiting > :raiting)") - List findByOptionalCriteria(@Param("title") Optional title, + PagefindByOptionalCriteria(@Param("title") Optional title, @Param("description") Optional description, @Param("author") Optional author, @Param("abst") Optional abst, @Param("type") Optional type, @Param("categories") Optional categories, - @Param("raiting") Optional raiting); + @Param("raiting") Optional raiting, + Pageable pageable); + + + @Query("SELECT d FROM Dataset d WHERE " + + "(LOWER(d.title) LIKE LOWER(:search)) OR " + + "(LOWER(d.description) LIKE LOWER(:search)) OR " + + "(LOWER(d.author) LIKE LOWER(:search))") + PagesearchByOptionalCriteria(@Param("search") Optional search, + Pageable pageable); } \ No newline at end of file