diff --git a/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemRequest.java b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemRequest.java index 3d1c4c1ca..def6ce934 100644 --- a/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemRequest.java +++ b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemRequest.java @@ -32,6 +32,7 @@ public class MediaItemRequest { private int runtime; public static MediaItem asMediaItem(MediaItemRequest request) { + var id = request.id != null ? request.id : UUID.randomUUID(); switch (request.type.toLowerCase()) { case "book" -> { diff --git a/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemsController.java b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemsController.java index 7efa0b2f8..174d446e4 100644 --- a/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemsController.java +++ b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemsController.java @@ -6,10 +6,16 @@ import com.codedifferently.lesson23.library.search.SearchCriteria; import java.io.IOException; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.Set; 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 @@ -31,4 +37,52 @@ public ResponseEntity getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } + + @GetMapping(value = "items/{id}") + public ResponseEntity getItem(@PathVariable String id) { + // gets the media items that matches the id + Set items = library.search(SearchCriteria.builder().id(id).build()); + Optional mediaItemById = items.stream().findFirst(); + MediaItemResponse responseItem = null; + // if the media exists by the idea return an ok response entity otherwise return not found + if (mediaItemById.isPresent()) { + responseItem = MediaItemResponse.from(mediaItemById.get()); + var response = GetMediaItemsResponse.builder().item(responseItem).build(); + return ResponseEntity.ok(response); + } + return ResponseEntity.notFound().build(); + } + + @PostMapping("/items") + public ResponseEntity addItem(@RequestBody CreateMediaItemRequest requestItem) { + if (requestItem == null || requestItem.getItem() == null) { + return ResponseEntity.badRequest().body(Map.of("errors", List.of("item is required"))); + } + try { + MediaItem mediaItem = MediaItemRequest.asMediaItem(requestItem.getItem()); + library.addMediaItem(mediaItem, librarian); + + MediaItemResponse itemResponse = MediaItemResponse.from(mediaItem); + CreateMediaItemResponse response = + CreateMediaItemResponse.builder().item(itemResponse).build(); + return ResponseEntity.ok(response); + + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(Map.of("errors", List.of(e.getMessage()))); + } catch (Exception e) { + return ResponseEntity.badRequest() + .body(Map.of("errors", List.of("An unexpected error occurred"))); + } + } + + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItem(@PathVariable String id) { + Set items = library.search(SearchCriteria.builder().id(id).build()); + Optional mediaItemById = items.stream().findFirst(); + if (mediaItemById.isPresent()) { + library.removeMediaItem(mediaItemById.get(), librarian); + return ResponseEntity.noContent().build(); + } + return ResponseEntity.notFound().build(); + } }