diff --git a/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/Lesson23.java b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/Lesson23.java index 03fe0423b..bebefef71 100644 --- a/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/Lesson23.java +++ b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/Lesson23.java @@ -1,12 +1,13 @@ package com.codedifferently.lesson23; -import com.codedifferently.lesson23.cli.LibraryApp; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Configuration; +import com.codedifferently.lesson23.cli.LibraryApp; + @Configuration @SpringBootApplication(scanBasePackages = "com.codedifferently") public class Lesson23 implements CommandLineRunner { 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..c25a357fa 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,17 +1,28 @@ package com.codedifferently.lesson23.web; -import com.codedifferently.lesson23.library.Librarian; -import com.codedifferently.lesson23.library.Library; -import com.codedifferently.lesson23.library.MediaItem; -import com.codedifferently.lesson23.library.search.SearchCriteria; import java.io.IOException; import java.util.List; import java.util.Set; +import java.util.UUID; + +import org.springframework.http.HttpStatus; 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; +import com.codedifferently.lesson23.library.Librarian; +import com.codedifferently.lesson23.library.Library; +import com.codedifferently.lesson23.library.MediaItem; +import com.codedifferently.lesson23.library.exceptions.MediaItemCheckedOutException; +import com.codedifferently.lesson23.library.search.SearchCriteria; + +import jakarta.validation.Valid; + @RestController @CrossOrigin public class MediaItemsController { @@ -31,4 +42,56 @@ public ResponseEntity getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } + + @PostMapping("/items") + public ResponseEntity createItem( + @Valid @RequestBody CreateMediaItemRequest request) { + try { + MediaItem newItem = MediaItemRequest.asMediaItem(request.getItem()); + library.addMediaItem(newItem, librarian); + + MediaItemResponse responseItem = MediaItemResponse.from(newItem); + var response = CreateMediaItemResponse.builder().item(responseItem).build(); + return ResponseEntity.status(HttpStatus.CREATED).body(response); + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().build(); + } catch (Exception e) { + return ResponseEntity.internalServerError().build(); + } + } + + @GetMapping("/items/{id}") + public ResponseEntity getItem(@PathVariable UUID id) { + if (!library.hasMediaItem(id)) { + return ResponseEntity.notFound().build(); + } + + // Search for the specific item by ID + Set items = library.search(SearchCriteria.builder().id(id.toString()).build()); + MediaItem item = items.stream().findFirst().orElse(null); + + if (item == null) { + return ResponseEntity.notFound().build(); + } + + MediaItemResponse response = MediaItemResponse.from(item); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItem(@PathVariable UUID id) { + try { + if (!library.hasMediaItem(id)) { + return ResponseEntity.notFound().build(); + } + + library.removeMediaItem(id, librarian); + return ResponseEntity.noContent().build(); + } catch (MediaItemCheckedOutException e) { + // Item is checked out and cannot be deleted + return ResponseEntity.status(HttpStatus.CONFLICT).build(); + } catch (Exception e) { + return ResponseEntity.internalServerError().build(); + } + } }