From b6783772960377dfbe1e1af8adb985dc1b2ca521 Mon Sep 17 00:00:00 2001 From: davisd Date: Mon, 5 May 2025 16:50:46 +0000 Subject: [PATCH 1/5] feat: add lesson 26 HW (incomplete) --- lesson_26/davisd | 1 + 1 file changed, 1 insertion(+) create mode 100644 lesson_26/davisd diff --git a/lesson_26/davisd b/lesson_26/davisd new file mode 100644 index 000000000..fa40e619b --- /dev/null +++ b/lesson_26/davisd @@ -0,0 +1 @@ +im going to have actual code submitted by end of day sir. \ No newline at end of file From 228dabc4d5c810b838be93d5bbeb70397f780b47 Mon Sep 17 00:00:00 2001 From: davisd Date: Thu, 8 May 2025 21:00:58 +0000 Subject: [PATCH 2/5] feat:add MediaItemsController.java with all features passing For Lesson_26. --- .../lesson26/web/MediaItemsController.java | 63 +++++++++++++++++-- 1 file changed, 59 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..9eac3bbf4 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,26 @@ 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.Optional; 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.lesson26.library.Librarian; +import com.codedifferently.lesson26.library.Library; +import com.codedifferently.lesson26.library.MediaItem; +import com.codedifferently.lesson26.library.search.SearchCriteria; + @RestController @CrossOrigin public class MediaItemsController { @@ -31,4 +40,50 @@ public ResponseEntity getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } + @PostMapping("/items") +public ResponseEntity createItem(@RequestBody MediaItemRequest request) { + MediaItem newItem = MediaItemRequest.asMediaItem(request); + + Librarian librarian = new Librarian("system", "system@example.com"); + + library.addMediaItem(newItem, librarian); + + return new ResponseEntity<>(MediaItemResponse.from(newItem), HttpStatus.CREATED); +} + +@GetMapping("/items/{id}") +public ResponseEntity getItemById(@PathVariable UUID id) { + Set allItems = library.search(SearchCriteria.builder().build()); + + Optional itemOpt = allItems.stream() + .filter(item -> item.getId().equals(id)) + .findFirst(); + + if (itemOpt.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + MediaItemResponse response = MediaItemResponse.from(itemOpt.get()); + return ResponseEntity.ok(response); +} + + +@DeleteMapping("/items/{id}") +public ResponseEntity deleteItemById(@PathVariable UUID id) { + Optional itemOpt = library.search(SearchCriteria.builder().build()) + .stream() + .filter(item -> item.getId().equals(id)) + .findFirst(); + + if (itemOpt.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + MediaItem item = itemOpt.get(); + Librarian librarian = new Librarian("system", "system@example.com"); // placeholder + library.removeMediaItem(item, librarian); + + return ResponseEntity.noContent().build(); // 204 No Content +} + } From d000265e95e30120c7aa30b361c7eba88fd9598a Mon Sep 17 00:00:00 2001 From: davisd Date: Thu, 8 May 2025 21:03:31 +0000 Subject: [PATCH 3/5] chore: fixed formatting with ./gradelw SpotlessApply --- .../lesson26/web/MediaItemsController.java | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 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 9eac3bbf4..9630f5189 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,11 +1,14 @@ 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.Optional; 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; @@ -16,11 +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.search.SearchCriteria; - @RestController @CrossOrigin public class MediaItemsController { @@ -40,8 +38,9 @@ public ResponseEntity getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } + @PostMapping("/items") -public ResponseEntity createItem(@RequestBody MediaItemRequest request) { + public ResponseEntity createItem(@RequestBody MediaItemRequest request) { MediaItem newItem = MediaItemRequest.asMediaItem(request); Librarian librarian = new Librarian("system", "system@example.com"); @@ -49,34 +48,32 @@ public ResponseEntity createItem(@RequestBody MediaItemReques library.addMediaItem(newItem, librarian); return new ResponseEntity<>(MediaItemResponse.from(newItem), HttpStatus.CREATED); -} + } -@GetMapping("/items/{id}") -public ResponseEntity getItemById(@PathVariable UUID id) { + @GetMapping("/items/{id}") + public ResponseEntity getItemById(@PathVariable UUID id) { Set allItems = library.search(SearchCriteria.builder().build()); - Optional itemOpt = allItems.stream() - .filter(item -> item.getId().equals(id)) - .findFirst(); + Optional itemOpt = + allItems.stream().filter(item -> item.getId().equals(id)).findFirst(); if (itemOpt.isEmpty()) { - return ResponseEntity.notFound().build(); + return ResponseEntity.notFound().build(); } MediaItemResponse response = MediaItemResponse.from(itemOpt.get()); return ResponseEntity.ok(response); -} - + } -@DeleteMapping("/items/{id}") -public ResponseEntity deleteItemById(@PathVariable UUID id) { - Optional itemOpt = library.search(SearchCriteria.builder().build()) - .stream() - .filter(item -> item.getId().equals(id)) - .findFirst(); + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItemById(@PathVariable UUID id) { + Optional itemOpt = + library.search(SearchCriteria.builder().build()).stream() + .filter(item -> item.getId().equals(id)) + .findFirst(); if (itemOpt.isEmpty()) { - return ResponseEntity.notFound().build(); + return ResponseEntity.notFound().build(); } MediaItem item = itemOpt.get(); @@ -84,6 +81,5 @@ public ResponseEntity deleteItemById(@PathVariable UUID id) { library.removeMediaItem(item, librarian); return ResponseEntity.noContent().build(); // 204 No Content -} - + } } From ee4a68ab9347516b1a5c66bac3560b697fd46659 Mon Sep 17 00:00:00 2001 From: davisd Date: Thu, 8 May 2025 21:21:45 +0000 Subject: [PATCH 4/5] chore:add final text fix to past all test --- .../lesson26/web/MediaItemsController.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 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 9630f5189..58c37be0f 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 @@ -4,6 +4,7 @@ import com.codedifferently.lesson26.library.Library; import com.codedifferently.lesson26.library.MediaItem; import com.codedifferently.lesson26.library.search.SearchCriteria; +import jakarta.validation.Valid; import java.io.IOException; import java.util.List; import java.util.Optional; @@ -40,13 +41,11 @@ public ResponseEntity getItems() { } @PostMapping("/items") - public ResponseEntity createItem(@RequestBody MediaItemRequest request) { + public ResponseEntity createItem( + @Valid @RequestBody MediaItemRequest request) { MediaItem newItem = MediaItemRequest.asMediaItem(request); - Librarian librarian = new Librarian("system", "system@example.com"); - library.addMediaItem(newItem, librarian); - return new ResponseEntity<>(MediaItemResponse.from(newItem), HttpStatus.CREATED); } @@ -77,9 +76,9 @@ public ResponseEntity deleteItemById(@PathVariable UUID id) { } MediaItem item = itemOpt.get(); - Librarian librarian = new Librarian("system", "system@example.com"); // placeholder + Librarian librarian = new Librarian("system", "system@example.com"); library.removeMediaItem(item, librarian); - return ResponseEntity.noContent().build(); // 204 No Content + return ResponseEntity.noContent().build(); } } From f9e466001a132ac1ef9e38cf0bf6c4cb3d851bac Mon Sep 17 00:00:00 2001 From: davisd Date: Fri, 9 May 2025 01:54:23 +0000 Subject: [PATCH 5/5] FIXEDDD --- .../lesson26/web/MediaItemWrapper.java | 18 +++++++++++++++++ .../lesson26/web/MediaItemsController.java | 20 ++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemWrapper.java diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemWrapper.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemWrapper.java new file mode 100644 index 000000000..b8078ca41 --- /dev/null +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemWrapper.java @@ -0,0 +1,18 @@ +package com.codedifferently.lesson26.web; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; + +public class MediaItemWrapper { + + @NotNull(message = "Item is required") @Valid + private MediaItemRequest item; + + public MediaItemRequest getItem() { + return item; + } + + public void setItem(MediaItemRequest item) { + this.item = item; + } +} 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 58c37be0f..7e60b58bc 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,10 +7,10 @@ import jakarta.validation.Valid; import java.io.IOException; import java.util.List; +import java.util.Map; import java.util.Optional; 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; @@ -41,16 +41,22 @@ public ResponseEntity getItems() { } @PostMapping("/items") - public ResponseEntity createItem( - @Valid @RequestBody MediaItemRequest request) { + public ResponseEntity> createItem( + @Valid @RequestBody MediaItemWrapper wrapper) { + + MediaItemRequest request = wrapper.getItem(); + if (request == null) { + throw new IllegalArgumentException("Item must be provided in request body"); + } + MediaItem newItem = MediaItemRequest.asMediaItem(request); - Librarian librarian = new Librarian("system", "system@example.com"); library.addMediaItem(newItem, librarian); - return new ResponseEntity<>(MediaItemResponse.from(newItem), HttpStatus.CREATED); + return ResponseEntity.ok(Map.of("item", MediaItemResponse.from(newItem))); } @GetMapping("/items/{id}") - public ResponseEntity getItemById(@PathVariable UUID id) { + public ResponseEntity getItemById(@PathVariable("id") UUID id) { + Set allItems = library.search(SearchCriteria.builder().build()); Optional itemOpt = @@ -65,7 +71,7 @@ public ResponseEntity getItemById(@PathVariable UUID id) { } @DeleteMapping("/items/{id}") - public ResponseEntity deleteItemById(@PathVariable UUID id) { + public ResponseEntity deleteItemById(@PathVariable("id") UUID id) { Optional itemOpt = library.search(SearchCriteria.builder().build()).stream() .filter(item -> item.getId().equals(id))