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..341136f58 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 @@ -4,12 +4,19 @@ import com.codedifferently.lesson23.library.Library; import com.codedifferently.lesson23.library.MediaItem; import com.codedifferently.lesson23.library.search.SearchCriteria; +import jakarta.validation.Valid; 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 +38,45 @@ public ResponseEntity getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } + + @GetMapping("/items/{id}") + public ResponseEntity getItemID(@PathVariable String id) { + Set items = library.search(SearchCriteria.builder().id(id).build()); + // Optional can be an object or null ex. a:string | null; + // Optional here is saying if the first item ID is found grab it but if not keep it empty/null. + Optional itemsId = items.stream().findFirst(); + MediaItemResponse responseItem = null; + if (itemsId.isEmpty()) { + return ResponseEntity.notFound().build(); + } + responseItem = MediaItemResponse.from(itemsId.get()); + var response = GetMediaItemsResponse.builder().item(responseItem).build(); + return ResponseEntity.ok(response); + } + + @DeleteMapping("items/{id}") + public ResponseEntity deleteItemId(@PathVariable String id) { + Set items = library.search(SearchCriteria.builder().id(id).build()); + Optional itemsId = items.stream().findFirst(); + if (itemsId.isPresent()) { + library.removeMediaItem(itemsId.get(), librarian); + return ResponseEntity.noContent().build(); + } + return ResponseEntity.notFound().build(); + } + + @PostMapping("/items") + public ResponseEntity> addItem( + @Valid @RequestBody CreateMediaItemRequest request) { + try { + MediaItem items = MediaItemRequest.asMediaItem(request.getItem()); + library.addMediaItem(items, librarian); + MediaItemResponse responseItem = MediaItemResponse.from(items); + Map response = Map.of("item", responseItem); + + return ResponseEntity.ok(response); + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().build(); + } + } }