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..f55d9ef48 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 @@ -6,10 +6,19 @@ import com.codedifferently.lesson26.library.search.SearchCriteria; import java.io.IOException; import java.util.List; +import java.util.Optional; import java.util.Set; +import org.springframework.http.HttpStatus; +import org.springframework.validation.annotation.Validated; 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.ResponseStatus; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.server.ResponseStatusException; @RestController @CrossOrigin @@ -29,4 +38,39 @@ public GetMediaItemsResponse getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return response; } + + // GET a single item by its ID + @GetMapping("/items/{id}") + public MediaItemResponse getItem(@PathVariable String id) { + Optional item = + library.search(SearchCriteria.builder().id(id).build()).stream().findFirst(); + if (item.isPresent()) { + return MediaItemResponse.from(item.get()); + } else { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Unknown media item ID: " + id); + } + } + + // POST a new item to /items + @PostMapping("/items") + public MediaItemResponse addItem(@RequestBody @Validated CreateMediaItemRequest request) { + // Validate the request body and ensure fields are not empty + MediaItemRequest mediaItemRequest = request.getItem(); + MediaItem newItem = MediaItemRequest.asMediaItem(mediaItemRequest); + library.addMediaItem(newItem, librarian); + return MediaItemResponse.from(newItem); + } + + // DELETE an item by its ID + @DeleteMapping("/items/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) // No content when successfully deleted + public void deleteItem(@PathVariable String id) { + Set items = library.search(SearchCriteria.builder().id(id).build()); + if (items.isEmpty()) { + // Return 404 Not Found if item doesn't exist + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Item not found for deletion: " + id); + } + MediaItem itemToDelete = items.iterator().next(); + library.removeMediaItem(itemToDelete, librarian); + } }