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 74552dbeb..d4e78d8a0 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 @@ -18,17 +18,21 @@ @NoArgsConstructor @Builder public class MediaItemRequest { - private UUID id; + private String type; + private String isbn; @NotBlank(message = "Title is required") private String title; private String[] authors; + private String edition; + private int pages; + private int runtime; public static MediaItem asMediaItem(MediaItemRequest request) { 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..2efa9be61 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,11 +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.Optional; import java.util.Set; +import java.util.UUID; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; 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 +38,54 @@ public GetMediaItemsResponse getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return response; } + + @GetMapping("/items/{id}") + public ResponseEntity getItemById(@PathVariable("id") UUID id) { + String stringId = id.toString(); + SearchCriteria searchCriteria = SearchCriteria.builder().id(stringId).build(); + + Set foundItems = library.search(searchCriteria); + + if (foundItems.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + MediaItem item = foundItems.iterator().next(); + MediaItemResponse response = MediaItemResponse.from(item); + + return ResponseEntity.ok(response); + } + + @PostMapping("/items") + public CreateMediaItemResponse createMediaItem(@RequestBody @Valid CreateMediaItemRequest request) + throws MethodArgumentNotValidException { + + MediaItemRequest itemRequest = request.getItem(); + + var item = MediaItemRequest.asMediaItem(itemRequest); + + library.addMediaItem(item, librarian); + + var response = + CreateMediaItemResponse.builder().item(getItemById(item.getId()).getBody()).build(); + + return response; + } + + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItem(@PathVariable("id") UUID id) { + + SearchCriteria query = new SearchCriteria(); + Set items = library.search(query); + Optional item = + items.stream().filter(mediaItem -> mediaItem.getId().equals(id)).findFirst(); + + if (item.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + library.removeMediaItem(id, librarian); + + return ResponseEntity.noContent().build(); + } }