diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemController.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemController.java new file mode 100644 index 000000000..b72c0c53b --- /dev/null +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemController.java @@ -0,0 +1,57 @@ +package com.codedifferently.lesson26.web; + +import com.codedifferently.lesson26.library.Librarian; +import com.codedifferently.lesson26.library.Library; +import com.codedifferently.lesson26.library.search.SearchCriteria; +import jakarta.validation.Valid; +import java.util.UUID; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/items") +@CrossOrigin +public class MediaItemController { + + private final Library library; + private final Librarian librarian; + + public MediaItemController(Library library, Librarian librarian) { + this.library = library; + this.librarian = librarian; + } + + @GetMapping + public GetMediaItemsResponse getItems() { + var items = library.search(SearchCriteria.builder().build()); + var responseItems = items.stream().map(MediaItemResponse::from).toList(); + return GetMediaItemsResponse.builder().items(responseItems).build(); + } + + @GetMapping("/{id}") + public ResponseEntity getItemById(@PathVariable UUID id) { + var criteria = SearchCriteria.builder().id(id.toString()).build(); + var results = library.search(criteria); + return results.isEmpty() + ? ResponseEntity.notFound().build() + : ResponseEntity.ok(MediaItemResponse.from(results.iterator().next())); + } + + @PostMapping + public CreateMediaItemResponse addItem(@Valid @RequestBody CreateMediaItemRequest request) { + var item = MediaItemRequest.asMediaItem(request.getItem()); + library.addMediaItem(item, librarian); + var response = getItemById(item.getId()).getBody(); + return CreateMediaItemResponse.builder().item(response).build(); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteItem(@PathVariable UUID id) { + var criteria = SearchCriteria.builder().id(id.toString()).build(); + var results = library.search(criteria); + if (results.isEmpty()) return ResponseEntity.notFound().build(); + + library.removeMediaItem(results.iterator().next(), librarian); + return ResponseEntity.noContent().build(); + } +} 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 deleted file mode 100644 index bbbc45e41..000000000 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codedifferently.lesson26.web; - -import com.codedifferently.lesson26.library.Librarian; -import com.codedifferently.lesson26.library.Library; -import com.codedifferently.lesson26.library.MediaItem; -import com.codedifferently.lesson26.library.search.SearchCriteria; -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.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@CrossOrigin -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") - public ResponseEntity getItems() { - Set items = library.search(SearchCriteria.builder().build()); - List responseItems = items.stream().map(MediaItemResponse::from).toList(); - var response = GetMediaItemsResponse.builder().items(responseItems).build(); - return ResponseEntity.ok(response); - } -}