diff --git a/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/config/AppConfig.java b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/config/AppConfig.java new file mode 100644 index 000000000..0417708a0 --- /dev/null +++ b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/config/AppConfig.java @@ -0,0 +1,14 @@ +package com.codedifferently.lesson23.config; + +import com.codedifferently.lesson23.library.Librarian; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AppConfig { + + @Bean + public Librarian librarian() { + return new Librarian("System", "system@library.local"); + } +} 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..e3a206829 --- /dev/null +++ b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/AddMediaItemRequest.java @@ -0,0 +1,35 @@ +package com.codedifferently.lesson23.web; + +import com.codedifferently.lesson23.library.Book; +import com.codedifferently.lesson23.library.MediaItem; +import jakarta.validation.constraints.NotNull; +import java.util.List; +import java.util.UUID; +import lombok.Builder; +import lombok.Value; + +@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..1ae3d8a29 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,24 +4,32 @@ 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.Collections; import java.util.List; +import java.util.Map; 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 @CrossOrigin public class MediaItemsController { + private final Librarian librarian; private final Library library; - private final Librarian librarian; - public MediaItemsController(Library library) throws IOException { + public MediaItemsController(Library library, Librarian librarian) throws IOException { + this.librarian = librarian; this.library = library; - this.librarian = library.getLibrarians().stream().findFirst().orElseThrow(); } @GetMapping("/items") @@ -31,4 +39,34 @@ 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, librarian); + 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), librarian); + return ResponseEntity.noContent().build(); + } }