From 0ca9579949e8e1e897fa39986fcc38288af6b6fc Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Wed, 3 Jul 2024 15:03:14 +0200 Subject: [PATCH 1/5] feat: Add error handling for dataset endpoints & return dataset that is beeing returend for the abilty to get the id --- .../DataDash/controler/DatasetController.java | 72 +++++++++++-------- .../group3/DataDash/model/DatasetService.java | 4 +- 2 files changed, 43 insertions(+), 33 deletions(-) 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 8a69a50..6bdc396 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 @@ -9,8 +9,11 @@ import de.uni_passau.fim.PADAS.group3.DataDash.model.Category; 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.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.data.domain.Sort; import java.util.UUID; @@ -23,59 +26,65 @@ import org.springframework.web.bind.annotation.RequestBody; public class DatasetController { @Autowired private DatasetService datasetService; - - // @GetMapping - // public List getAllDatasets() { - // return datasetService.getAllDatasets(); - // } - + @GetMapping("/id/{id}") - public Dataset getDatasetById(@PathVariable("id") UUID id) { - return datasetService.getDatasetById(id); + public ResponseEntity getDatasetById(@PathVariable("id") UUID id) { + Dataset d = datasetService.getDatasetById(id); + if (d == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + return new ResponseEntity<>(d , HttpStatus.OK); } + @ResponseStatus(HttpStatus.CREATED) @PostMapping public Dataset createDataset(@RequestBody Dataset dataset) { - datasetService.addDataset(dataset); - // TODO: figure out what the fuck i need to do here - return null; + return datasetService.addDataset(dataset); } - // @PutMapping("/{id}") - // public Dataset updateDataset(@PathVariable("id") Long id, @RequestBody - // Dataset dataset) { - // return datasetService.updateDataset(id, dataset); - // } - // - @DeleteMapping("/id/{id}") - public void deleteDataset(@PathVariable("id") UUID id) { + public ResponseEntity deleteDataset(@PathVariable("id") UUID id) { + if (datasetService.getDatasetById(id) == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } datasetService.deleteDataset(id); + return new ResponseEntity<>(HttpStatus.OK); } @PutMapping("/id/{id}/upvote") - public Dataset upvote(@PathVariable("id") UUID id) { + public ResponseEntity upvote(@PathVariable("id") UUID id) { + if (datasetService.getDatasetById(id) == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + datasetService.upvoteDataset(id); - return datasetService.getDatasetById(id); + return new ResponseEntity<>(datasetService.getDatasetById(id), HttpStatus.OK); } @PutMapping("/id/{id}/downvote") - public Dataset downvote(@PathVariable("id") UUID id) { + public ResponseEntity downvote(@PathVariable("id") UUID id) { + if (datasetService.getDatasetById(id) == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } datasetService.downvoteDataset(id); - return getDatasetById(id); // new ResponseEntity<>(null, HttpStatus.OK); + return new ResponseEntity<>(getDatasetById(id), HttpStatus.OK); } @PutMapping("/id/{id}/vote") - public Dataset postMethodName(@PathVariable("id") UUID id, + public ResponseEntity postMethodName(@PathVariable("id") UUID id, @RequestParam("stars") int stars) { - if (stars > 0 && stars < 6) { - datasetService.voteDataset(id, stars); + if (datasetService.getDatasetById(id) == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - return datasetService.getDatasetById(id); + if (!(stars > 0 && stars < 6)) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + datasetService.voteDataset(id, stars); + return new ResponseEntity<>(datasetService.getDatasetById(id), HttpStatus.OK); } @GetMapping - public Page 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, @@ -88,7 +97,8 @@ public class DatasetController { @RequestParam(value = "category", required = false) Category category) { 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, rating, category,pageable); + return datasetService.getDatasetsByOptionalCriteria(title, description, author, abst, type, rating, category, + pageable); } @GetMapping("/search") @@ -98,10 +108,10 @@ public class DatasetController { @RequestParam(value = "sort", required = false, defaultValue = "upvotes") String sort, @RequestParam(value = "direction", required = false, defaultValue = "desc") String direction, @RequestParam(value = "category", required = false, defaultValue = "%") String category, - @RequestParam(value = "type", required = false, defaultValue = "%") String type){ + @RequestParam(value = "type", required = false, defaultValue = "%") String type) { Pageable pageable = PageRequest.of(page, size, Sort.by(direction.equals("asc") ? Sort.Direction.ASC : Sort.Direction.DESC, sort)); return datasetService.searchByOptionalCriteria(search, category, type, pageable); } -} \ No newline at end of file +} \ No newline at end of file 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 6694907..990bd54 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 @@ -28,9 +28,9 @@ public class DatasetService { return datasetRepository.getDatasetById(id); } - public void addDataset(Dataset dataset) { + public Dataset addDataset(Dataset dataset) { dataset.setDate(LocalDate.now()); - datasetRepository.save(dataset); + return datasetRepository.save(dataset); } public void updateDatasetTitle(UUID id, String title) { From 31fc359d5592b816edb4cb1b9598ab0e64f7b239 Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Thu, 4 Jul 2024 14:42:58 +0200 Subject: [PATCH 2/5] chore: Refactor CategoryController to improve code structure and error handling --- .../DataDash/controler/CategoryController.java | 16 +++++++++++----- .../group3/DataDash/model/CategoryService.java | 8 +++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/CategoryController.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/CategoryController.java index 5f725a3..69a162e 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/CategoryController.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/CategoryController.java @@ -3,12 +3,15 @@ import java.util.List; import java.util.UUID; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import de.uni_passau.fim.PADAS.group3.DataDash.model.CategoryDto; import de.uni_passau.fim.PADAS.group3.DataDash.model.CategoryService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -29,14 +32,17 @@ public class CategoryController { } @GetMapping("/id/{id}") - public CategoryDto getMethodName(@PathVariable("id") UUID id) { - return categoryService.getCategoryById(id); + public ResponseEntity fetchCategoryById(@PathVariable("id") UUID id) { + CategoryDto category = categoryService.getCategoryById(id); + if(category == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + return new ResponseEntity<>(category, HttpStatus.OK); } - + @ResponseStatus(HttpStatus.CREATED) @PostMapping - public String postMethodName(@RequestBody CategoryDto dto) { + public void createCategory(@RequestBody CategoryDto dto) { categoryService.addCategory(dto); - return null; } diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/CategoryService.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/CategoryService.java index ba36dc0..d975497 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/CategoryService.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/model/CategoryService.java @@ -4,7 +4,6 @@ import org.springframework.stereotype.Service; import java.util.List; import java.util.UUID; - @Service public class CategoryService { private CategoryRepository categoryRepository; @@ -25,8 +24,11 @@ public class CategoryService { } public CategoryDto getCategoryById(UUID id) { - return CategoryDtoMapper.toDto(categoryRepository.getCategoryById(id)); + Category c = categoryRepository.getCategoryById(id); + if (c == null) { + return null; + } + return CategoryDtoMapper.toDto(c); } - } From 027528909dff35c2994b691f9160f58fd1e587aa Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Thu, 4 Jul 2024 14:46:10 +0200 Subject: [PATCH 3/5] chore: Refactor DatasetService to improve code structure and readability --- .../group3/DataDash/model/DatasetService.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) 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 990bd54..ea1fe96 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 @@ -9,7 +9,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.data.domain.Page; - @Service public class DatasetService { private dataRepository datasetRepository; @@ -91,20 +90,22 @@ public class DatasetService { public Page getDatasetsByOptionalCriteria(String title, String description, String author, String abst, Type type, Float raiting, Category category, Pageable pageable) { return datasetRepository.findByOptionalCriteria(Optional.ofNullable(title), Optional.ofNullable(description), - Optional.ofNullable(author), Optional.ofNullable(abst), Optional.ofNullable(type), Optional.ofNullable(category), + Optional.ofNullable(author), Optional.ofNullable(abst), Optional.ofNullable(type), + Optional.ofNullable(category), Optional.ofNullable(raiting), pageable); } public Page searchByOptionalCriteria(String search, String categories, String type, Pageable pageable) { - //TODO: make it not Crash - //TODO: make it do useful stuff - Category category = categories.equals("%") ? null : categoryRepository.getCategoryById(UUID.fromString(categories)) ; + Category category = categories.equals("%") ? null + : categoryRepository.getCategoryById(UUID.fromString(categories)); Type t = type.equals("%") ? null : Type.valueOf(type); - if(category == null){ - return datasetRepository.searchByOptionalCriteria(Optional.ofNullable(search), Optional.ofNullable(t),pageable); + if (category == null) { + return datasetRepository.searchByOptionalCriteria(Optional.ofNullable(search), Optional.ofNullable(t), + pageable); } - return datasetRepository.searchByOptionalCriteriaWithCategory(Optional.ofNullable(search), category, Optional.ofNullable(t),pageable); + return datasetRepository.searchByOptionalCriteriaWithCategory(Optional.ofNullable(search), category, + Optional.ofNullable(t), pageable); } } \ No newline at end of file From cdeb4fc2be8edd1a533cec42ddf7ca3579ec6e40 Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Thu, 4 Jul 2024 15:32:45 +0200 Subject: [PATCH 4/5] refactor: fix internal server errror on bad request --- .../DataDash/controler/DatasetController.java | 35 ++++++++++++------- .../PADAS/group3/DataDash/model/Dataset.java | 8 +++++ 2 files changed, 31 insertions(+), 12 deletions(-) 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 6bdc396..a6f9a06 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 @@ -13,6 +13,7 @@ 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.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.data.domain.Sort; @@ -26,14 +27,14 @@ import org.springframework.web.bind.annotation.RequestBody; public class DatasetController { @Autowired private DatasetService datasetService; - + @GetMapping("/id/{id}") - public ResponseEntity getDatasetById(@PathVariable("id") UUID id) { + public ResponseEntity getDatasetById(@PathVariable("id") UUID id) { Dataset d = datasetService.getDatasetById(id); if (d == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - return new ResponseEntity<>(d , HttpStatus.OK); + return new ResponseEntity<>(d, HttpStatus.OK); } @ResponseStatus(HttpStatus.CREATED) @@ -52,7 +53,7 @@ public class DatasetController { } @PutMapping("/id/{id}/upvote") - public ResponseEntity upvote(@PathVariable("id") UUID id) { + public ResponseEntity upvote(@PathVariable("id") UUID id) { if (datasetService.getDatasetById(id) == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } @@ -62,16 +63,16 @@ public class DatasetController { } @PutMapping("/id/{id}/downvote") - public ResponseEntity downvote(@PathVariable("id") UUID id) { + public ResponseEntity downvote(@PathVariable("id") UUID id) { if (datasetService.getDatasetById(id) == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } datasetService.downvoteDataset(id); - return new ResponseEntity<>(getDatasetById(id), HttpStatus.OK); + return new ResponseEntity<>(datasetService.getDatasetById(id), HttpStatus.OK); } @PutMapping("/id/{id}/vote") - public ResponseEntity postMethodName(@PathVariable("id") UUID id, + public ResponseEntity postMethodName(@PathVariable("id") UUID id, @RequestParam("stars") int stars) { if (datasetService.getDatasetById(id) == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); @@ -96,22 +97,32 @@ public class DatasetController { @RequestParam(value = "direction", required = false, defaultValue = "desc") String direction, @RequestParam(value = "category", required = false) Category category) { Pageable pageable = PageRequest.of(page, size, - Sort.by(direction.equals("asc") ? Sort.Direction.ASC : Sort.Direction.DESC, sort)); + Sort.by(Sort.Direction.fromString(direction), sort)); return datasetService.getDatasetsByOptionalCriteria(title, description, author, abst, type, rating, category, pageable); } @GetMapping("/search") - public Page search(@RequestParam(value = "search", required = false, defaultValue = "%") String search, + public ResponseEntity> 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, @RequestParam(value = "category", required = false, defaultValue = "%") String category, @RequestParam(value = "type", required = false, defaultValue = "%") String type) { - Pageable pageable = PageRequest.of(page, size, - Sort.by(direction.equals("asc") ? Sort.Direction.ASC : Sort.Direction.DESC, sort)); - return datasetService.searchByOptionalCriteria(search, category, type, pageable); + Pageable pageable = null; + if (!Dataset.getSort().contains(sort)) + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + try { + pageable = PageRequest.of(page, size, + Sort.by(Sort.Direction.fromString(direction), sort)); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + + return new ResponseEntity<>(datasetService.searchByOptionalCriteria(search, category, type, pageable), + HttpStatus.OK); } } \ 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 91f71a2..5f28d40 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 @@ -2,6 +2,8 @@ package de.uni_passau.fim.PADAS.group3.DataDash.model; import java.net.URL; import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; import java.util.UUID; import java.sql.Date; @@ -41,6 +43,8 @@ public class Dataset { private URL url; + private static final List sortable = Arrays.asList("author", "title", "upvotes", "date"); + @ManyToOne private Category categorie; @@ -111,6 +115,10 @@ public class Dataset { return url; } + public static List getSort() { + return sortable; + } + public void setAbst(String abst) { this.abst = abst.substring(0, Math.min(abst.length(), 100)); } From 9e5c83dce9ae6f27e9ccfdd2fcbde1cd67b99b0c Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Thu, 4 Jul 2024 15:33:55 +0200 Subject: [PATCH 5/5] chore: Remove unused import statement in DatasetController --- .../fim/PADAS/group3/DataDash/controler/DatasetController.java | 1 - 1 file changed, 1 deletion(-) 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 a6f9a06..947b346 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 @@ -13,7 +13,6 @@ 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.http.HttpStatus; -import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.data.domain.Sort;