diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemWrapper.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemWrapper.java new file mode 100644 index 000000000..b8078ca41 --- /dev/null +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemWrapper.java @@ -0,0 +1,18 @@ +package com.codedifferently.lesson26.web; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; + +public class MediaItemWrapper { + + @NotNull(message = "Item is required") @Valid + private MediaItemRequest item; + + public MediaItemRequest getItem() { + return item; + } + + public void setItem(MediaItemRequest item) { + this.item = item; + } +} 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 bbbc45e41..7e60b58bc 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,12 +4,20 @@ 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.Map; +import java.util.Optional; import java.util.Set; +import java.util.UUID; 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 +39,52 @@ public ResponseEntity getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } + + @PostMapping("/items") + public ResponseEntity> createItem( + @Valid @RequestBody MediaItemWrapper wrapper) { + + MediaItemRequest request = wrapper.getItem(); + if (request == null) { + throw new IllegalArgumentException("Item must be provided in request body"); + } + + MediaItem newItem = MediaItemRequest.asMediaItem(request); + library.addMediaItem(newItem, librarian); + return ResponseEntity.ok(Map.of("item", MediaItemResponse.from(newItem))); + } + + @GetMapping("/items/{id}") + public ResponseEntity getItemById(@PathVariable("id") UUID id) { + + Set allItems = library.search(SearchCriteria.builder().build()); + + Optional itemOpt = + allItems.stream().filter(item -> item.getId().equals(id)).findFirst(); + + if (itemOpt.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + MediaItemResponse response = MediaItemResponse.from(itemOpt.get()); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItemById(@PathVariable("id") UUID id) { + Optional itemOpt = + library.search(SearchCriteria.builder().build()).stream() + .filter(item -> item.getId().equals(id)) + .findFirst(); + + if (itemOpt.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + MediaItem item = itemOpt.get(); + Librarian librarian = new Librarian("system", "system@example.com"); + library.removeMediaItem(item, librarian); + + return ResponseEntity.noContent().build(); + } } diff --git a/lesson_26/davisd b/lesson_26/davisd new file mode 100644 index 000000000..fa40e619b --- /dev/null +++ b/lesson_26/davisd @@ -0,0 +1 @@ +im going to have actual code submitted by end of day sir. \ No newline at end of file