From a7532659dd5985d35f246f50dff93de57fcb6365 Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Thu, 8 May 2025 18:22:36 +0000 Subject: [PATCH 1/5] feat: adds getItemById & postItem methods --- .../lesson26/web/MediaItemsController.java | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) 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 index bbbc45e41..449ea39ae 100644 --- 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 @@ -1,17 +1,24 @@ 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 java.util.UUID; + 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.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; +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 io.swagger.v3.oas.annotations.parameters.RequestBody; + @RestController @CrossOrigin public class MediaItemsController { @@ -31,4 +38,28 @@ public ResponseEntity getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } + + @GetMapping("/items/{id}") + public ResponseEntity getItemsById(@PathVariable("id") UUID id) { + Set items = library.search(SearchCriteria.builder().build()); + + if (items.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + MediaItem item = items.iterator().next(); + return ResponseEntity.ok(MediaItemResponse.from(item)); + } + + @PostMapping("/items") + public ResponseEntity postItem(@RequestBody CreateMediaItemRequest request) { + MediaItem newItem = MediaItemRequest.asMediaItem(request.getItem()); + + library.addMediaItem(newItem, librarian); + + MediaItemResponse itemResponse = MediaItemResponse.from(newItem); + CreateMediaItemResponse response = CreateMediaItemResponse.builder().item(itemResponse).build(); + + return ResponseEntity.ok(response); + } } From 90a841d3bc4849a8db8fe6ba997b881b74547935 Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Thu, 8 May 2025 19:00:10 +0000 Subject: [PATCH 2/5] feat: adds deleteItem method --- .../lesson26/web/MediaItemsController.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) 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 index 449ea39ae..75f37898d 100644 --- 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 @@ -7,6 +7,7 @@ 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; @@ -15,6 +16,7 @@ import com.codedifferently.lesson26.library.Librarian; import com.codedifferently.lesson26.library.Library; import com.codedifferently.lesson26.library.MediaItem; +import com.codedifferently.lesson26.library.exceptions.MediaItemCheckedOutException; import com.codedifferently.lesson26.library.search.SearchCriteria; import io.swagger.v3.oas.annotations.parameters.RequestBody; @@ -62,4 +64,22 @@ public ResponseEntity postItem(@RequestBody CreateMedia return ResponseEntity.ok(response); } + + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItem(@PathVariable("id") UUID id) { + Set items = library.search(SearchCriteria.builder().id(id.toString()).build()); + + if (items.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + MediaItem itemToDelete = items.iterator().next(); + + try { + library.removeMediaItem(itemToDelete, librarian); + return ResponseEntity.noContent().build(); + } catch (MediaItemCheckedOutException e) { + return ResponseEntity.badRequest().build(); + } + } } From cf938822592a6920534cbae50d80049447ccd050 Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Fri, 9 May 2025 17:15:59 +0000 Subject: [PATCH 3/5] fix: changed RequestBody import from swagger to spring --- .../lesson26/web/MediaItemsController.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) 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 index 75f37898d..9e2960c00 100644 --- 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 @@ -1,26 +1,23 @@ 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.exceptions.MediaItemCheckedOutException; +import com.codedifferently.lesson26.library.search.SearchCriteria; import java.io.IOException; import java.util.List; 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; -import com.codedifferently.lesson26.library.Librarian; -import com.codedifferently.lesson26.library.Library; -import com.codedifferently.lesson26.library.MediaItem; -import com.codedifferently.lesson26.library.exceptions.MediaItemCheckedOutException; -import com.codedifferently.lesson26.library.search.SearchCriteria; - -import io.swagger.v3.oas.annotations.parameters.RequestBody; - @RestController @CrossOrigin public class MediaItemsController { @@ -54,14 +51,15 @@ public ResponseEntity getItemsById(@PathVariable("id") UUID i } @PostMapping("/items") - public ResponseEntity postItem(@RequestBody CreateMediaItemRequest request) { + public ResponseEntity postItem( + @RequestBody CreateMediaItemRequest request) { MediaItem newItem = MediaItemRequest.asMediaItem(request.getItem()); library.addMediaItem(newItem, librarian); MediaItemResponse itemResponse = MediaItemResponse.from(newItem); CreateMediaItemResponse response = CreateMediaItemResponse.builder().item(itemResponse).build(); - + return ResponseEntity.ok(response); } @@ -72,7 +70,7 @@ public ResponseEntity deleteItem(@PathVariable("id") UUID id) { if (items.isEmpty()) { return ResponseEntity.notFound().build(); } - + MediaItem itemToDelete = items.iterator().next(); try { From 53398357595bda902780a5339dbf02cbbed7d639 Mon Sep 17 00:00:00 2001 From: Evan Philakhong Date: Fri, 9 May 2025 18:31:24 +0000 Subject: [PATCH 4/5] fix: resolves 200!=404 error from getItemsById --- .../lesson26/web/MediaItemsController.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) 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 index 9e2960c00..676dc27f4 100644 --- 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 @@ -1,14 +1,10 @@ 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.exceptions.MediaItemCheckedOutException; -import com.codedifferently.lesson26.library.search.SearchCriteria; import java.io.IOException; import java.util.List; 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; @@ -18,6 +14,12 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import com.codedifferently.lesson26.library.Librarian; +import com.codedifferently.lesson26.library.Library; +import com.codedifferently.lesson26.library.MediaItem; +import com.codedifferently.lesson26.library.exceptions.MediaItemCheckedOutException; +import com.codedifferently.lesson26.library.search.SearchCriteria; + @RestController @CrossOrigin public class MediaItemsController { @@ -40,7 +42,7 @@ public ResponseEntity getItems() { @GetMapping("/items/{id}") public ResponseEntity getItemsById(@PathVariable("id") UUID id) { - Set items = library.search(SearchCriteria.builder().build()); + Set items = library.search(SearchCriteria.builder().id(id.toString()).build()); if (items.isEmpty()) { return ResponseEntity.notFound().build(); @@ -51,15 +53,14 @@ public ResponseEntity getItemsById(@PathVariable("id") UUID i } @PostMapping("/items") - public ResponseEntity postItem( - @RequestBody CreateMediaItemRequest request) { + public ResponseEntity postItem(@RequestBody CreateMediaItemRequest request) { MediaItem newItem = MediaItemRequest.asMediaItem(request.getItem()); library.addMediaItem(newItem, librarian); MediaItemResponse itemResponse = MediaItemResponse.from(newItem); CreateMediaItemResponse response = CreateMediaItemResponse.builder().item(itemResponse).build(); - + return ResponseEntity.ok(response); } @@ -70,7 +71,7 @@ public ResponseEntity deleteItem(@PathVariable("id") UUID id) { if (items.isEmpty()) { return ResponseEntity.notFound().build(); } - + MediaItem itemToDelete = items.iterator().next(); try { From 39380dabc7ef6d87ac5c7ecd1dfe53dc7ff84278 Mon Sep 17 00:00:00 2001 From: VicenteVigueras Date: Sat, 31 May 2025 20:10:48 +0000 Subject: [PATCH 5/5] fix: add @Valid annotation to fix NullPointerException on request --- .../lesson26/web/MediaItemsController.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) 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 index 676dc27f4..e400a1043 100644 --- 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 @@ -1,10 +1,15 @@ 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.exceptions.MediaItemCheckedOutException; +import com.codedifferently.lesson26.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.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.DeleteMapping; @@ -14,12 +19,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.codedifferently.lesson26.library.Librarian; -import com.codedifferently.lesson26.library.Library; -import com.codedifferently.lesson26.library.MediaItem; -import com.codedifferently.lesson26.library.exceptions.MediaItemCheckedOutException; -import com.codedifferently.lesson26.library.search.SearchCriteria; - @RestController @CrossOrigin public class MediaItemsController { @@ -41,7 +40,7 @@ public ResponseEntity getItems() { } @GetMapping("/items/{id}") - public ResponseEntity getItemsById(@PathVariable("id") UUID id) { + public ResponseEntity getItemsById(@Valid @PathVariable("id") UUID id) { Set items = library.search(SearchCriteria.builder().id(id.toString()).build()); if (items.isEmpty()) { @@ -53,14 +52,15 @@ public ResponseEntity getItemsById(@PathVariable("id") UUID i } @PostMapping("/items") - public ResponseEntity postItem(@RequestBody CreateMediaItemRequest request) { + public ResponseEntity postItem( + @Valid @RequestBody CreateMediaItemRequest request) { MediaItem newItem = MediaItemRequest.asMediaItem(request.getItem()); library.addMediaItem(newItem, librarian); MediaItemResponse itemResponse = MediaItemResponse.from(newItem); CreateMediaItemResponse response = CreateMediaItemResponse.builder().item(itemResponse).build(); - + return ResponseEntity.ok(response); } @@ -71,7 +71,7 @@ public ResponseEntity deleteItem(@PathVariable("id") UUID id) { if (items.isEmpty()) { return ResponseEntity.notFound().build(); } - + MediaItem itemToDelete = items.iterator().next(); try {