diff --git a/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/AddMediaItemRequest.java b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/AddMediaItemRequest.java new file mode 100644 index 000000000..6b1a3f185 --- /dev/null +++ b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/AddMediaItemRequest.java @@ -0,0 +1,34 @@ +package com.codedifferently.lesson23.web; +import java.util.UUID; + +import com.codedifferently.lesson23.library.MediaItem; +import com.codedifferently.lesson23.library.Book; +import java.util.List; +import lombok.Builder; +import lombok.Value; +import jakarta.validation.constraints.NotNull; + +@Value +@Builder +public class AddMediaItemRequest { + @NotNull + Item item; + + @Value + @Builder + public static class Item { + String id; + String type; + String title; + String isbn; + List authors; + Integer pages; + + public MediaItem toDomain() { + int p = pages == null ? 0 : pages; + return new Book(UUID.fromString(id), title, isbn, authors, p); + } + } + + public Item getItem() { return item; } +} 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..df81e8a18 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 @@ -1,15 +1,23 @@ package com.codedifferently.lesson23.web; - +import java.util.Collections; +import java.util.Map; import com.codedifferently.lesson23.library.Librarian; +import java.util.UUID; + 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.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 @@ -17,11 +25,9 @@ public class MediaItemsController { private final Library library; - private final Librarian librarian; public MediaItemsController(Library library) throws IOException { this.library = library; - this.librarian = library.getLibrarians().stream().findFirst().orElseThrow(); } @GetMapping("/items") @@ -31,4 +37,33 @@ public ResponseEntity getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } + + @GetMapping("/items/{id}") + public ResponseEntity> getItem(@PathVariable String id) { + Set items = library.search(SearchCriteria.builder().id(id).build()); + if (items.isEmpty()) { + return ResponseEntity.notFound().build(); + } + MediaItem item = items.iterator().next(); + var body = Collections.singletonMap("item", MediaItemResponse.from(item)); + return ResponseEntity.ok(body); + } + + @PostMapping("/items") + public ResponseEntity> addItem(@Valid @RequestBody AddMediaItemRequest request) { + MediaItem item = request.getItem().toDomain(); + library.addMediaItem(item, new Librarian("System", "system@library.local")); + var body = Collections.singletonMap("item", MediaItemResponse.from(item)); + return ResponseEntity.ok(body); + } + + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItem(@PathVariable String id) { + Set items = library.search(SearchCriteria.builder().id(id).build()); + if (items.isEmpty()) { + return ResponseEntity.notFound().build(); + } + library.removeMediaItem(UUID.fromString(id), new Librarian("System", "system@library.local")); + return ResponseEntity.noContent().build(); + } }