From 0503efd75884c56f28cb6f21b4646a736e1f0791 Mon Sep 17 00:00:00 2001 From: mattieweathersby Date: Thu, 23 Oct 2025 18:52:48 +0000 Subject: [PATCH 1/2] feat: adds implementation of MediaItemsController REST API --- .../lesson23/web/MediaItemsController.java | 64 +++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) 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..29c5d0ee5 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,47 @@ public ResponseEntity getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } -} + + @GetMapping("/items/{id}") + public ResponseEntity getItem(@PathVariable String id) { + UUID itemId = UUID.fromString(id); + Set items = library.search(SearchCriteria.builder().id(itemId.toString()).build()); + + if (items.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + MediaItem item = items.iterator().next(); + MediaItemResponse response = MediaItemResponse.from(item); + return ResponseEntity.ok(response); + } + + @PostMapping("/items") + public ResponseEntity createItem(@Valid @RequestBody CreateMediaItemRequest request) { + MediaItem mediaItem = MediaItemRequest.asMediaItem(request.getItem()); + library.addMediaItem(mediaItem, librarian); + + MediaItemResponse responseItem = MediaItemResponse.from(mediaItem); + CreateMediaItemResponse response = CreateMediaItemResponse.builder().item(responseItem).build(); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItem(@PathVariable String id) { + UUID itemId = UUID.fromString(id); + + if (!library.hasMediaItem(itemId)) { + return ResponseEntity.notFound().build(); + } + + try { + library.removeMediaItem(itemId, librarian); + return ResponseEntity.noContent().build(); + } catch (MediaItemCheckedOutException e) { + return ResponseEntity.status(HttpStatus.CONFLICT).build(); + } + } + + } + + From 9bc31a488957b39d33fcee73497795d71a3dc740 Mon Sep 17 00:00:00 2001 From: mattieweathersby Date: Thu, 23 Oct 2025 19:26:26 +0000 Subject: [PATCH 2/2] bugfix: fixs the spotlessApply violation --- .../lesson23/web/MediaItemsController.java | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) 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 29c5d0ee5..89b65fb4f 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,10 +1,15 @@ 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.exceptions.MediaItemCheckedOutException; +import com.codedifferently.lesson23.library.search.SearchCriteria; +import jakarta.validation.Valid; 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; @@ -15,14 +20,6 @@ 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 { @@ -47,21 +44,22 @@ public ResponseEntity getItems() { public ResponseEntity getItem(@PathVariable String id) { UUID itemId = UUID.fromString(id); Set items = library.search(SearchCriteria.builder().id(itemId.toString()).build()); - + if (items.isEmpty()) { return ResponseEntity.notFound().build(); } - + MediaItem item = items.iterator().next(); MediaItemResponse response = MediaItemResponse.from(item); return ResponseEntity.ok(response); } @PostMapping("/items") - public ResponseEntity createItem(@Valid @RequestBody CreateMediaItemRequest request) { + public ResponseEntity createItem( + @Valid @RequestBody CreateMediaItemRequest request) { MediaItem mediaItem = MediaItemRequest.asMediaItem(request.getItem()); library.addMediaItem(mediaItem, librarian); - + MediaItemResponse responseItem = MediaItemResponse.from(mediaItem); CreateMediaItemResponse response = CreateMediaItemResponse.builder().item(responseItem).build(); return ResponseEntity.ok(response); @@ -70,11 +68,11 @@ public ResponseEntity createItem(@Valid @RequestBody Cr @DeleteMapping("/items/{id}") public ResponseEntity deleteItem(@PathVariable String id) { UUID itemId = UUID.fromString(id); - + if (!library.hasMediaItem(itemId)) { return ResponseEntity.notFound().build(); } - + try { library.removeMediaItem(itemId, librarian); return ResponseEntity.noContent().build(); @@ -82,7 +80,4 @@ public ResponseEntity deleteItem(@PathVariable String id) { return ResponseEntity.status(HttpStatus.CONFLICT).build(); } } - - } - - +}