From fc92fbb550e0ba6565a07c14a5b250475999eed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CTezz03=E2=80=9D?= <“mmbradley@gmail.com”> Date: Tue, 25 Mar 2025 20:33:39 +0000 Subject: [PATCH 01/11] feat:mbLesson_09 --- .../dataprovider/montezBProviderProvider.java | 25 +++++ .../src/main/resources/data/montezb.json | 92 +++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 lesson_09/types/types_app/src/main/java/com/codedifferently/lesson9/dataprovider/montezBProviderProvider.java create mode 100644 lesson_09/types/types_app/src/main/resources/data/montezb.json diff --git a/lesson_09/types/types_app/src/main/java/com/codedifferently/lesson9/dataprovider/montezBProviderProvider.java b/lesson_09/types/types_app/src/main/java/com/codedifferently/lesson9/dataprovider/montezBProviderProvider.java new file mode 100644 index 000000000..266650d40 --- /dev/null +++ b/lesson_09/types/types_app/src/main/java/com/codedifferently/lesson9/dataprovider/montezBProviderProvider.java @@ -0,0 +1,25 @@ +package com.codedifferently.lesson9.dataprovider; + +import java.util.Map; + +import org.springframework.stereotype.Service; + +@Service +public class montezBProviderProvider extends DataProvider { + public String getProviderName() { + return "montezBProvider"; + } + + public Map getColumnTypeByName() { + return Map.of( + "column1", Boolean.class, + "column2", Float.class, + "column3", Double.class, + "column4", Short.class, + "column5", Integer.class, + "column6", String.class, + "column7", Long.class); + } +} + + diff --git a/lesson_09/types/types_app/src/main/resources/data/montezb.json b/lesson_09/types/types_app/src/main/resources/data/montezb.json new file mode 100644 index 000000000..1d8cbf9a5 --- /dev/null +++ b/lesson_09/types/types_app/src/main/resources/data/montezb.json @@ -0,0 +1,92 @@ +[ + { + "column1": "false", + "column2": "2.0165133E38", + "column3": "2.7989049813330837E307", + "column4": "416", + "column5": "435833166", + "column6": "3cuw2", + "column7": "3530240046379697664" + }, + { + "column1": "true", + "column2": "1.460264E37", + "column3": "2.9225361274287315E307", + "column4": "17516", + "column5": "260615671", + "column6": "8j52s4aq6d", + "column7": "65341810874192888" + }, + { + "column1": "true", + "column2": "2.776658E38", + "column3": "2.0826943783702183E307", + "column4": "31533", + "column5": "161572734", + "column6": "s8yavhue1", + "column7": "4903929290600323072" + }, + { + "column1": "true", + "column2": "1.3027212E38", + "column3": "1.1914573950682302E308", + "column4": "29377", + "column5": "451167147", + "column6": "2at5p9weyni", + "column7": "1756929147146946048" + }, + { + "column1": "true", + "column2": "1.6506819E38", + "column3": "3.7690907310588337E307", + "column4": "23676", + "column5": "405162496", + "column6": "migsey8lk", + "column7": "5227682372169227264" + }, + { + "column1": "true", + "column2": "6.687427E37", + "column3": "1.7507811122323619E308", + "column4": "763", + "column5": "385548066", + "column6": "ni6d58js04u", + "column7": "814327769818061056" + }, + { + "column1": "false", + "column2": "2.6281565E38", + "column3": "3.3046191712251996E307", + "column4": "29441", + "column5": "497419740", + "column6": "7ypumj83a", + "column7": "6639371891920120832" + }, + { + "column1": "false", + "column2": "9.816115E37", + "column3": "1.3824553928097414E308", + "column4": "3537", + "column5": "753736722", + "column6": "68aglu4", + "column7": "1905184695820989696" + }, + { + "column1": "false", + "column2": "2.674275E38", + "column3": "1.562287548934654E308", + "column4": "25482", + "column5": "2121817019", + "column6": "2plvf", + "column7": "8721696529208318976" + }, + { + "column1": "true", + "column2": "7.985794E37", + "column3": "1.377992454751497E308", + "column4": "29060", + "column5": "1516947099", + "column6": "c4685r9", + "column7": "5859838884205409280" + } +] \ No newline at end of file From c57408a27f530a49c41e68e9e8fa1f979efef61e Mon Sep 17 00:00:00 2001 From: Tezz03 <105926982+Tezz03@users.noreply.github.com> Date: Fri, 28 Mar 2025 11:05:16 -0400 Subject: [PATCH 02/11] Delete lesson_09/types/types_app/src/main/java/com/codedifferently/lesson9/dataprovider/montezBProviderProvider.java --- .../dataprovider/montezBProviderProvider.java | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 lesson_09/types/types_app/src/main/java/com/codedifferently/lesson9/dataprovider/montezBProviderProvider.java diff --git a/lesson_09/types/types_app/src/main/java/com/codedifferently/lesson9/dataprovider/montezBProviderProvider.java b/lesson_09/types/types_app/src/main/java/com/codedifferently/lesson9/dataprovider/montezBProviderProvider.java deleted file mode 100644 index 266650d40..000000000 --- a/lesson_09/types/types_app/src/main/java/com/codedifferently/lesson9/dataprovider/montezBProviderProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.codedifferently.lesson9.dataprovider; - -import java.util.Map; - -import org.springframework.stereotype.Service; - -@Service -public class montezBProviderProvider extends DataProvider { - public String getProviderName() { - return "montezBProvider"; - } - - public Map getColumnTypeByName() { - return Map.of( - "column1", Boolean.class, - "column2", Float.class, - "column3", Double.class, - "column4", Short.class, - "column5", Integer.class, - "column6", String.class, - "column7", Long.class); - } -} - - From af8eef31ed00826ff3c0769c2d4651a28a43233e Mon Sep 17 00:00:00 2001 From: Tezz03 <105926982+Tezz03@users.noreply.github.com> Date: Fri, 28 Mar 2025 11:06:34 -0400 Subject: [PATCH 03/11] Delete lesson_09/types/types_app/src/main/resources/data/montezb.json --- .../src/main/resources/data/montezb.json | 92 ------------------- 1 file changed, 92 deletions(-) delete mode 100644 lesson_09/types/types_app/src/main/resources/data/montezb.json diff --git a/lesson_09/types/types_app/src/main/resources/data/montezb.json b/lesson_09/types/types_app/src/main/resources/data/montezb.json deleted file mode 100644 index 1d8cbf9a5..000000000 --- a/lesson_09/types/types_app/src/main/resources/data/montezb.json +++ /dev/null @@ -1,92 +0,0 @@ -[ - { - "column1": "false", - "column2": "2.0165133E38", - "column3": "2.7989049813330837E307", - "column4": "416", - "column5": "435833166", - "column6": "3cuw2", - "column7": "3530240046379697664" - }, - { - "column1": "true", - "column2": "1.460264E37", - "column3": "2.9225361274287315E307", - "column4": "17516", - "column5": "260615671", - "column6": "8j52s4aq6d", - "column7": "65341810874192888" - }, - { - "column1": "true", - "column2": "2.776658E38", - "column3": "2.0826943783702183E307", - "column4": "31533", - "column5": "161572734", - "column6": "s8yavhue1", - "column7": "4903929290600323072" - }, - { - "column1": "true", - "column2": "1.3027212E38", - "column3": "1.1914573950682302E308", - "column4": "29377", - "column5": "451167147", - "column6": "2at5p9weyni", - "column7": "1756929147146946048" - }, - { - "column1": "true", - "column2": "1.6506819E38", - "column3": "3.7690907310588337E307", - "column4": "23676", - "column5": "405162496", - "column6": "migsey8lk", - "column7": "5227682372169227264" - }, - { - "column1": "true", - "column2": "6.687427E37", - "column3": "1.7507811122323619E308", - "column4": "763", - "column5": "385548066", - "column6": "ni6d58js04u", - "column7": "814327769818061056" - }, - { - "column1": "false", - "column2": "2.6281565E38", - "column3": "3.3046191712251996E307", - "column4": "29441", - "column5": "497419740", - "column6": "7ypumj83a", - "column7": "6639371891920120832" - }, - { - "column1": "false", - "column2": "9.816115E37", - "column3": "1.3824553928097414E308", - "column4": "3537", - "column5": "753736722", - "column6": "68aglu4", - "column7": "1905184695820989696" - }, - { - "column1": "false", - "column2": "2.674275E38", - "column3": "1.562287548934654E308", - "column4": "25482", - "column5": "2121817019", - "column6": "2plvf", - "column7": "8721696529208318976" - }, - { - "column1": "true", - "column2": "7.985794E37", - "column3": "1.377992454751497E308", - "column4": "29060", - "column5": "1516947099", - "column6": "c4685r9", - "column7": "5859838884205409280" - } -] \ No newline at end of file From fc73f23c41d0a49a401ca757541d4f28633471ab Mon Sep 17 00:00:00 2001 From: Tezz03 Date: Mon, 5 May 2025 16:58:33 +0000 Subject: [PATCH 04/11] fix: fix debug in mediaitemsController --- .../lesson26/web/MediaItemsController.java | 15 +++++++++++++++ 1 file changed, 15 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 bbbc45e41..057f34d9d 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 @@ -6,7 +6,10 @@ 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.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; @@ -27,8 +30,20 @@ public MediaItemsController(Library library) throws IOException { @GetMapping("/items") public ResponseEntity getItems() { Set items = library.search(SearchCriteria.builder().build()); + if (items.isEmpty()) { + ResponseEntity.noContent(); + } List responseItems = items.stream().map(MediaItemResponse::from).toList(); var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } + @GetMapping(value = "/{id}") + public ResponseEntity getItemById(@PathVariable("id") UUID id) { + + System.out.println(id.toString()); + + Set items = library.search(SearchCriteria.builder().id(id.toString()).build()); + Optional matchedItem = + items.stream().filter(item -> item.getId().equals(id)).findFirst(); + System.out.println("items"); } From acd7b1b0eb6ee2502cb459deb096592256e17e8b Mon Sep 17 00:00:00 2001 From: Tezz03 Date: Mon, 5 May 2025 17:01:46 +0000 Subject: [PATCH 05/11] fix to right branch --- .../com/codedifferently/lesson26/web/MediaItemsController.java | 1 + 1 file changed, 1 insertion(+) 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 057f34d9d..8cc57c450 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 @@ -46,4 +46,5 @@ public ResponseEntity getItemById(@PathVariable("id") UUID id Optional matchedItem = items.stream().filter(item -> item.getId().equals(id)).findFirst(); System.out.println("items"); + // System.out.println(items); } From e7b585b15733da2e94bfb517ebc098a7ec36a97c Mon Sep 17 00:00:00 2001 From: Tezz03 Date: Mon, 12 May 2025 01:30:52 +0000 Subject: [PATCH 06/11] fix:MediaItemsController- still in works --- .../library/search/SearchCriteria.java | 4 + .../lesson26/web/CreateMediaItemRequest.java | 4 + .../lesson26/web/CreateMediaItemResponse.java | 4 + .../lesson26/web/MediaItemRequest.java | 14 +++- .../lesson26/web/MediaItemsController.java | 81 +++++++++++++++---- .../gradle/wrapper/gradle-wrapper.properties | 2 +- lesson_26/api/java/gradlew | 9 +-- lesson_26/api/java/gradlew.bat | 2 +- 8 files changed, 94 insertions(+), 26 deletions(-) diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java index d7e2e0a8b..6fb3d3c5b 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java @@ -10,6 +10,10 @@ @AllArgsConstructor @NoArgsConstructor public class SearchCriteria { + + public static Object builder() { + throw new UnsupportedOperationException("Not supported yet."); + } /** The ID to search for (exact match). */ public String id; diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemRequest.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemRequest.java index 26f7e1a4a..e5a7a722a 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemRequest.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemRequest.java @@ -14,4 +14,8 @@ public class CreateMediaItemRequest { @NotNull(message = "item is required") @Valid private MediaItemRequest item; + + MediaItemRequest getItem() { + throw new UnsupportedOperationException("Not supported yet."); + } } diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java index 01da025e9..c8574b64a 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java @@ -6,5 +6,9 @@ @Data @Builder public class CreateMediaItemResponse { + + static Object builder() { + throw new UnsupportedOperationException("Not supported yet."); + } private MediaItemResponse item; } diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java index 74552dbeb..18874a890 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java @@ -1,13 +1,15 @@ package com.codedifferently.lesson26.web; +import java.util.List; +import java.util.UUID; + import com.codedifferently.lesson26.library.Book; import com.codedifferently.lesson26.library.Dvd; import com.codedifferently.lesson26.library.Magazine; import com.codedifferently.lesson26.library.MediaItem; import com.codedifferently.lesson26.library.Newspaper; + import jakarta.validation.constraints.NotBlank; -import java.util.List; -import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -49,4 +51,12 @@ public static MediaItem asMediaItem(MediaItemRequest request) { default -> throw new IllegalArgumentException("Unknown media item type: " + request.type); } } + + Object getTitle() { + throw new UnsupportedOperationException("Not supported yet."); + } + + Object getType() { + throw new UnsupportedOperationException("Not supported yet."); + } } 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 8cc57c450..3d49aa105 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,50 +1,97 @@ 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 com.codedifferently.lesson26.web.GetMediaItemsResponse.GetMediaItemsResponseBuilder; + +import jakarta.validation.Valid; import java.io.IOException; import java.util.List; -import java.util.Optional; +import java.util.Map; import java.util.Set; import java.util.UUID; - import org.springframework.http.ResponseEntity; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.ExceptionHandler; 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.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.codedifferently.lesson26.library.search.SearchCriteria; + @RestController @CrossOrigin +@RequestMapping("/api") 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()); - if (items.isEmpty()) { - ResponseEntity.noContent(); - } List responseItems = items.stream().map(MediaItemResponse::from).toList(); var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } - @GetMapping(value = "/{id}") - public ResponseEntity getItemById(@PathVariable("id") UUID id) { - System.out.println(id.toString()); + @GetMapping("/items/{id}") + public ResponseEntity getItemById(@PathVariable String id) { + try { + Set items = library.search(((Object) SearchCriteria.builder()).id(id).build()); + if (items.isEmpty()) { + return ResponseEntity.notFound().build(); + } + MediaItemResponse response = MediaItemResponse.from(items.iterator().next()); + return ResponseEntity.ok(response); + } catch (IllegalArgumentException e) { + return ResponseEntity.notFound().build(); + } + } + + @PostMapping("/items") + public ResponseEntity createItem( + @Valid @RequestBody CreateMediaItemRequest request) { + try { + MediaItem item = MediaItemRequest.asMediaItem(request.getItem()); + library.addMediaItem(item, librarian); + var response = ((GetMediaItemsResponseBuilder) CreateMediaItemResponse.builder()).item(MediaItemResponse.from(item)).build(); + return ResponseEntity.ok(response); + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().build(); + } + } - Set items = library.search(SearchCriteria.builder().id(id.toString()).build()); - Optional matchedItem = - items.stream().filter(item -> item.getId().equals(id)).findFirst(); - System.out.println("items"); - // System.out.println(items); -} + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItemById(@PathVariable("id") String id) { + try { + UUID uuid = UUID.fromString(id); + Set items = library.search(SearchCriteria.builder().id(id).build()); + if (items.isEmpty()) { + return ResponseEntity.notFound().build(); + } + library.removeMediaItem(uuid, librarian); + return ResponseEntity.noContent().build(); + } catch (IllegalArgumentException e) { + return ResponseEntity.notFound().build(); + } + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity>> handleValidationErrors( + MethodArgumentNotValidException ex) { + List errors = + ex.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).toList(); + return ResponseEntity.badRequest().body(Map.of("errors", errors)); + } +} \ No newline at end of file diff --git a/lesson_26/api/java/gradle/wrapper/gradle-wrapper.properties b/lesson_26/api/java/gradle/wrapper/gradle-wrapper.properties index e2847c820..ca025c83a 100644 --- a/lesson_26/api/java/gradle/wrapper/gradle-wrapper.properties +++ b/lesson_26/api/java/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/lesson_26/api/java/gradlew b/lesson_26/api/java/gradlew index f5feea6d6..f169f4bb5 100755 --- a/lesson_26/api/java/gradlew +++ b/lesson_26/api/java/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/lesson_26/api/java/gradlew.bat b/lesson_26/api/java/gradlew.bat index 9d21a2183..a319a7e6e 100644 --- a/lesson_26/api/java/gradlew.bat +++ b/lesson_26/api/java/gradlew.bat @@ -74,7 +74,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From 705db5b1479942bae565542cb88ba76372c45fba Mon Sep 17 00:00:00 2001 From: Vicente Vigueras Date: Wed, 21 May 2025 15:02:51 -0400 Subject: [PATCH 07/11] chore: revert changes to gradle files --- .../api/java/gradle/wrapper/gradle-wrapper.properties | 2 +- lesson_26/api/java/gradlew | 10 +++++----- lesson_26/api/java/gradlew.bat | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lesson_26/api/java/gradle/wrapper/gradle-wrapper.properties b/lesson_26/api/java/gradle/wrapper/gradle-wrapper.properties index ca025c83a..e2847c820 100644 --- a/lesson_26/api/java/gradle/wrapper/gradle-wrapper.properties +++ b/lesson_26/api/java/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/lesson_26/api/java/gradlew b/lesson_26/api/java/gradlew index f169f4bb5..e2a9729a6 100755 --- a/lesson_26/api/java/gradlew +++ b/lesson_26/api/java/gradlew @@ -86,8 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit - +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -205,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + org.gradle.wrapper.GradleWrapperMain \ "$@" # Stop when "xargs" is not available. diff --git a/lesson_26/api/java/gradlew.bat b/lesson_26/api/java/gradlew.bat index a319a7e6e..9d21a2183 100644 --- a/lesson_26/api/java/gradlew.bat +++ b/lesson_26/api/java/gradlew.bat @@ -74,7 +74,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From dda9d7b19f2aed761f989b3d20d30bc024f678e6 Mon Sep 17 00:00:00 2001 From: Vicente Vigueras Date: Wed, 21 May 2025 15:05:05 -0400 Subject: [PATCH 08/11] chore: revert changes to gradlew --- lesson_26/api/java/gradlew | 1 + 1 file changed, 1 insertion(+) diff --git a/lesson_26/api/java/gradlew b/lesson_26/api/java/gradlew index e2a9729a6..f5feea6d6 100755 --- a/lesson_26/api/java/gradlew +++ b/lesson_26/api/java/gradlew @@ -88,6 +88,7 @@ APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s ' "$PWD" ) || exit + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum From 2b7be6fd490da7bdf4e38a74380a4a30c23cb629 Mon Sep 17 00:00:00 2001 From: Vicente Vigueras Date: Wed, 21 May 2025 15:08:27 -0400 Subject: [PATCH 09/11] chore: remove methods that were autogenerated --- .../lesson26/library/search/SearchCriteria.java | 3 --- .../lesson26/web/CreateMediaItemRequest.java | 4 ---- .../lesson26/web/CreateMediaItemResponse.java | 3 --- .../codedifferently/lesson26/web/MediaItemRequest.java | 8 -------- 4 files changed, 18 deletions(-) diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java index 6fb3d3c5b..9b8e0a44b 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java @@ -11,9 +11,6 @@ @NoArgsConstructor public class SearchCriteria { - public static Object builder() { - throw new UnsupportedOperationException("Not supported yet."); - } /** The ID to search for (exact match). */ public String id; diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemRequest.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemRequest.java index e5a7a722a..26f7e1a4a 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemRequest.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemRequest.java @@ -14,8 +14,4 @@ public class CreateMediaItemRequest { @NotNull(message = "item is required") @Valid private MediaItemRequest item; - - MediaItemRequest getItem() { - throw new UnsupportedOperationException("Not supported yet."); - } } diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java index c8574b64a..3cbfd4185 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java @@ -7,8 +7,5 @@ @Builder public class CreateMediaItemResponse { - static Object builder() { - throw new UnsupportedOperationException("Not supported yet."); - } private MediaItemResponse item; } diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java index 18874a890..b34aa055b 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java @@ -51,12 +51,4 @@ public static MediaItem asMediaItem(MediaItemRequest request) { default -> throw new IllegalArgumentException("Unknown media item type: " + request.type); } } - - Object getTitle() { - throw new UnsupportedOperationException("Not supported yet."); - } - - Object getType() { - throw new UnsupportedOperationException("Not supported yet."); - } } From 5e4a5e0cd80d30331942a86b8f486ac884292629 Mon Sep 17 00:00:00 2001 From: Vicente Vigueras Date: Wed, 21 May 2025 15:11:12 -0400 Subject: [PATCH 10/11] chore: revert autogenerated methods --- .../lesson26/library/search/SearchCriteria.java | 1 - .../lesson26/web/CreateMediaItemResponse.java | 1 - .../com/codedifferently/lesson26/web/MediaItemRequest.java | 6 ++---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java index 9b8e0a44b..d7e2e0a8b 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java @@ -10,7 +10,6 @@ @AllArgsConstructor @NoArgsConstructor public class SearchCriteria { - /** The ID to search for (exact match). */ public String id; diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java index 3cbfd4185..01da025e9 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java @@ -6,6 +6,5 @@ @Data @Builder public class CreateMediaItemResponse { - private MediaItemResponse item; } diff --git a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java index b34aa055b..74552dbeb 100644 --- a/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java +++ b/lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java @@ -1,15 +1,13 @@ package com.codedifferently.lesson26.web; -import java.util.List; -import java.util.UUID; - import com.codedifferently.lesson26.library.Book; import com.codedifferently.lesson26.library.Dvd; import com.codedifferently.lesson26.library.Magazine; import com.codedifferently.lesson26.library.MediaItem; import com.codedifferently.lesson26.library.Newspaper; - import jakarta.validation.constraints.NotBlank; +import java.util.List; +import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; From d8a17ead3e824bcc25452b42eb49bdc795f6234f Mon Sep 17 00:00:00 2001 From: Vicente Vigueras Date: Wed, 21 May 2025 15:14:46 -0400 Subject: [PATCH 11/11] chore: update MediaItemsController so that it can compile --- .../lesson26/web/MediaItemsController.java | 25 ++++++++++--------- 1 file changed, 13 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 3d49aa105..899e528e5 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,16 +1,11 @@ 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 com.codedifferently.lesson26.web.GetMediaItemsResponse.GetMediaItemsResponseBuilder; -import jakarta.validation.Valid; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; + import org.springframework.http.ResponseEntity; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -23,8 +18,13 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; 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 jakarta.validation.Valid; @RestController @CrossOrigin @@ -33,10 +33,12 @@ 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()); @@ -48,7 +50,7 @@ public ResponseEntity getItems() { @GetMapping("/items/{id}") public ResponseEntity getItemById(@PathVariable String id) { try { - Set items = library.search(((Object) SearchCriteria.builder()).id(id).build()); + Set items = library.search((SearchCriteria.builder().id(id).build())); if (items.isEmpty()) { return ResponseEntity.notFound().build(); } @@ -60,12 +62,11 @@ public ResponseEntity getItemById(@PathVariable String id) { } @PostMapping("/items") - public ResponseEntity createItem( - @Valid @RequestBody CreateMediaItemRequest request) { + public ResponseEntity createItem(@Valid @RequestBody CreateMediaItemRequest request) { try { MediaItem item = MediaItemRequest.asMediaItem(request.getItem()); library.addMediaItem(item, librarian); - var response = ((GetMediaItemsResponseBuilder) CreateMediaItemResponse.builder()).item(MediaItemResponse.from(item)).build(); + var response = (CreateMediaItemResponse.builder()).item(MediaItemResponse.from(item)).build(); return ResponseEntity.ok(response); } catch (IllegalArgumentException e) { return ResponseEntity.badRequest().build(); @@ -73,7 +74,7 @@ public ResponseEntity createItem( } @DeleteMapping("/items/{id}") - public ResponseEntity deleteItemById(@PathVariable("id") String id) { + public ResponseEntity deleteItemById(@PathVariable("id") String id) { try { UUID uuid = UUID.fromString(id); Set items = library.search(SearchCriteria.builder().id(id).build()); @@ -94,4 +95,4 @@ public ResponseEntity>> handleValidationErrors( ex.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).toList(); return ResponseEntity.badRequest().body(Map.of("errors", errors)); } -} \ No newline at end of file +}