From c633f313b4860e58166e0a8b211ca672413c3774 Mon Sep 17 00:00:00 2001 From: Oyeyemi Jimoh Date: Sun, 24 Nov 2024 17:57:15 -0500 Subject: [PATCH 1/4] feat: added implementation for addItem, deleteItem and postItem endpoints to Web Controller for lesson26 by Yemi --- .../lesson26/web/MediaItemRequest.java | 2 +- .../lesson26/web/MediaItemsController.java | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java index 3cdc9ee9b..74552dbeb 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java @@ -33,7 +33,7 @@ public class MediaItemRequest { public static MediaItem asMediaItem(MediaItemRequest request) { var id = request.id != null ? request.id : UUID.randomUUID(); - switch (request.type.toUpperCase()) { + switch (request.type.toLowerCase()) { case "book" -> { return new Book(id, request.title, request.isbn, List.of(request.authors), request.pages); } diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java index a393a53b9..8d375ec23 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java @@ -7,8 +7,15 @@ import java.io.IOException; import java.util.List; import java.util.Set; +import java.util.UUID; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController @@ -29,4 +36,46 @@ public GetMediaItemsResponse getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return response; } + + @GetMapping("/items/{id}") + public GetMediaItemsResponse getItem(@PathVariable UUID id) { + Set items = library.search(SearchCriteria.builder().build()); + List responseItem = + items.stream() + .map(MediaItemResponse::from) // Transform the original objects + .filter(item -> item.getId().equals(id)) + .toList(); + var response = GetMediaItemsResponse.builder().items(responseItem).build(); + + return response; + } + + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItem(@PathVariable UUID id) { + Set items = library.search(SearchCriteria.builder().build()); + List itemToDelete = + items.stream() + .map(MediaItemResponse::from) // Transform the original objects + .filter(item -> item.getId().equals(id)) + .toList(); + + if (!itemToDelete.isEmpty()) { + library.removeMediaItem(id, librarian); + return ResponseEntity.status(HttpStatus.OK).body("media item deleted successfully"); + } + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Media deletion not successful"); + } + + @PostMapping("/items") + public ResponseEntity addItem(@RequestBody MediaItemRequest mediaItemRequest) { + + MediaItem mediaItem = MediaItemRequest.asMediaItem(mediaItemRequest); + library.addMediaItem(mediaItem, librarian); + + if (null == mediaItem) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body("media item creation not successful"); + } + return ResponseEntity.status(HttpStatus.CREATED).body("new media item created successfully"); + } } From c852b6decb2f22a72754fa41e0eb129f0efbf4f0 Mon Sep 17 00:00:00 2001 From: Oyeyemi Jimoh Date: Mon, 25 Nov 2024 11:01:46 -0500 Subject: [PATCH 2/4] feat: updated controller to conform with test cases requirements --- .../lesson26/web/MediaItemsController.java | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java index 8d375ec23..c09f6baf4 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java @@ -38,44 +38,53 @@ public GetMediaItemsResponse getItems() { } @GetMapping("/items/{id}") - public GetMediaItemsResponse getItem(@PathVariable UUID id) { + public ResponseEntity getItem(@PathVariable UUID id) { Set items = library.search(SearchCriteria.builder().build()); + List responseItem = items.stream() .map(MediaItemResponse::from) // Transform the original objects .filter(item -> item.getId().equals(id)) .toList(); - var response = GetMediaItemsResponse.builder().items(responseItem).build(); - - return response; + if (responseItem.size() == 0) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + } + if (responseItem.size() >= 1) + return ResponseEntity.status(HttpStatus.OK).body("media item found"); + else return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @DeleteMapping("/items/{id}") - public ResponseEntity deleteItem(@PathVariable UUID id) { + public ResponseEntity deleteItem(@PathVariable UUID id) { Set items = library.search(SearchCriteria.builder().build()); List itemToDelete = items.stream() .map(MediaItemResponse::from) // Transform the original objects .filter(item -> item.getId().equals(id)) .toList(); + if (itemToDelete.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + } if (!itemToDelete.isEmpty()) { library.removeMediaItem(id, librarian); - return ResponseEntity.status(HttpStatus.OK).body("media item deleted successfully"); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Media deletion not successful"); + + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @PostMapping("/items") - public ResponseEntity addItem(@RequestBody MediaItemRequest mediaItemRequest) { - - MediaItem mediaItem = MediaItemRequest.asMediaItem(mediaItemRequest); - library.addMediaItem(mediaItem, librarian); - - if (null == mediaItem) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body("media item creation not successful"); + public ResponseEntity addsItem(@RequestBody CreateMediaItemRequest mediaItemRequest) { + if (null == mediaItemRequest.getItem() || null == mediaItemRequest) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } - return ResponseEntity.status(HttpStatus.CREATED).body("new media item created successfully"); + MediaItem mediaItem = MediaItemRequest.asMediaItem(mediaItemRequest.getItem()); + if (null == mediaItem || null == mediaItem.getTitle()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); + } + + library.addMediaItem(mediaItem, librarian); + return ResponseEntity.status(HttpStatus.OK).body(mediaItemRequest); } } From 35cbab1ca774a675e7caa1e8c3540f888ed71f94 Mon Sep 17 00:00:00 2001 From: Oyeyemi Jimoh Date: Mon, 25 Nov 2024 11:06:58 -0500 Subject: [PATCH 3/4] feat: updated controller to conform with test cases requirements --- .../codedifferently/lesson26/web/MediaItemsController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java index c09f6baf4..4cadbee67 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java @@ -63,7 +63,7 @@ public ResponseEntity deleteItem(@PathVariable UUID id) { .filter(item -> item.getId().equals(id)) .toList(); if (itemToDelete.isEmpty()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } if (!itemToDelete.isEmpty()) { @@ -76,14 +76,14 @@ public ResponseEntity deleteItem(@PathVariable UUID id) { @PostMapping("/items") public ResponseEntity addsItem(@RequestBody CreateMediaItemRequest mediaItemRequest) { - if (null == mediaItemRequest.getItem() || null == mediaItemRequest) { + if (null == mediaItemRequest.getItem() || null == mediaItemRequest) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } MediaItem mediaItem = MediaItemRequest.asMediaItem(mediaItemRequest.getItem()); if (null == mediaItem || null == mediaItem.getTitle()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } - + library.addMediaItem(mediaItem, librarian); return ResponseEntity.status(HttpStatus.OK).body(mediaItemRequest); } From ae9d21095ca998d57add059d67ae33d918d83d5e Mon Sep 17 00:00:00 2001 From: Oyeyemi Jimoh Date: Tue, 26 Nov 2024 11:54:18 -0500 Subject: [PATCH 4/4] feat: fix addItem issue in the controller class --- .../lesson26/web/MediaItemsController.java | 42 +++++++------------ 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java index 4cadbee67..31d112382 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java @@ -4,6 +4,7 @@ import com.codedifferently.lesson26.library.Library; import com.codedifferently.lesson26.library.MediaItem; import com.codedifferently.lesson26.library.search.SearchCriteria; +import jakarta.validation.Valid; import java.io.IOException; import java.util.List; import java.util.Set; @@ -38,20 +39,16 @@ public GetMediaItemsResponse getItems() { } @GetMapping("/items/{id}") - public ResponseEntity getItem(@PathVariable UUID id) { - Set items = library.search(SearchCriteria.builder().build()); + public ResponseEntity getItem(@PathVariable UUID id) { + String enteredId = id.toString(); + Set items = library.search(SearchCriteria.builder().id(enteredId).build()); - List responseItem = - items.stream() - .map(MediaItemResponse::from) // Transform the original objects - .filter(item -> item.getId().equals(id)) - .toList(); - if (responseItem.size() == 0) { + if (items.isEmpty()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } - if (responseItem.size() >= 1) - return ResponseEntity.status(HttpStatus.OK).body("media item found"); - else return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + MediaItem item = items.iterator().next(); + MediaItemResponse response = MediaItemResponse.from(item); + return ResponseEntity.ok(response); } @DeleteMapping("/items/{id}") @@ -65,26 +62,19 @@ public ResponseEntity deleteItem(@PathVariable UUID id) { if (itemToDelete.isEmpty()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } - - if (!itemToDelete.isEmpty()) { - library.removeMediaItem(id, librarian); - return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); - } - + library.removeMediaItem(id, librarian); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @PostMapping("/items") - public ResponseEntity addsItem(@RequestBody CreateMediaItemRequest mediaItemRequest) { - if (null == mediaItemRequest.getItem() || null == mediaItemRequest) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); - } - MediaItem mediaItem = MediaItemRequest.asMediaItem(mediaItemRequest.getItem()); - if (null == mediaItem || null == mediaItem.getTitle()) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); - } + public CreateMediaItemResponse addsItem( + @Valid @RequestBody CreateMediaItemRequest mediaItemRequest) { + MediaItem mediaItem = MediaItemRequest.asMediaItem(mediaItemRequest.getItem()); library.addMediaItem(mediaItem, librarian); - return ResponseEntity.status(HttpStatus.OK).body(mediaItemRequest); + var response = + CreateMediaItemResponse.builder().item(getItem(mediaItem.getId()).getBody()).build(); + + return response; } }