Skip to content

Commit e7b585b

Browse files
committed
fix:MediaItemsController- still in works
1 parent acd7b1b commit e7b585b

File tree

8 files changed

+94
-26
lines changed

8 files changed

+94
-26
lines changed

lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/library/search/SearchCriteria.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
@AllArgsConstructor
1111
@NoArgsConstructor
1212
public class SearchCriteria {
13+
14+
public static Object builder() {
15+
throw new UnsupportedOperationException("Not supported yet.");
16+
}
1317
/** The ID to search for (exact match). */
1418
public String id;
1519

lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemRequest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@
1414
public class CreateMediaItemRequest {
1515
@NotNull(message = "item is required") @Valid
1616
private MediaItemRequest item;
17+
18+
MediaItemRequest getItem() {
19+
throw new UnsupportedOperationException("Not supported yet.");
20+
}
1721
}

lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/CreateMediaItemResponse.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,9 @@
66
@Data
77
@Builder
88
public class CreateMediaItemResponse {
9+
10+
static Object builder() {
11+
throw new UnsupportedOperationException("Not supported yet.");
12+
}
913
private MediaItemResponse item;
1014
}

lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemRequest.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.codedifferently.lesson26.web;
22

3+
import java.util.List;
4+
import java.util.UUID;
5+
36
import com.codedifferently.lesson26.library.Book;
47
import com.codedifferently.lesson26.library.Dvd;
58
import com.codedifferently.lesson26.library.Magazine;
69
import com.codedifferently.lesson26.library.MediaItem;
710
import com.codedifferently.lesson26.library.Newspaper;
11+
812
import jakarta.validation.constraints.NotBlank;
9-
import java.util.List;
10-
import java.util.UUID;
1113
import lombok.AllArgsConstructor;
1214
import lombok.Builder;
1315
import lombok.Data;
@@ -49,4 +51,12 @@ public static MediaItem asMediaItem(MediaItemRequest request) {
4951
default -> throw new IllegalArgumentException("Unknown media item type: " + request.type);
5052
}
5153
}
54+
55+
Object getTitle() {
56+
throw new UnsupportedOperationException("Not supported yet.");
57+
}
58+
59+
Object getType() {
60+
throw new UnsupportedOperationException("Not supported yet.");
61+
}
5262
}
Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,97 @@
11
package com.codedifferently.lesson26.web;
2-
32
import com.codedifferently.lesson26.library.Librarian;
43
import com.codedifferently.lesson26.library.Library;
54
import com.codedifferently.lesson26.library.MediaItem;
65
import com.codedifferently.lesson26.library.search.SearchCriteria;
6+
import com.codedifferently.lesson26.web.GetMediaItemsResponse.GetMediaItemsResponseBuilder;
7+
8+
import jakarta.validation.Valid;
79
import java.io.IOException;
810
import java.util.List;
9-
import java.util.Optional;
11+
import java.util.Map;
1012
import java.util.Set;
1113
import java.util.UUID;
12-
1314
import org.springframework.http.ResponseEntity;
15+
import org.springframework.validation.FieldError;
16+
import org.springframework.web.bind.MethodArgumentNotValidException;
1417
import org.springframework.web.bind.annotation.CrossOrigin;
18+
import org.springframework.web.bind.annotation.DeleteMapping;
19+
import org.springframework.web.bind.annotation.ExceptionHandler;
1520
import org.springframework.web.bind.annotation.GetMapping;
21+
import org.springframework.web.bind.annotation.PathVariable;
22+
import org.springframework.web.bind.annotation.PostMapping;
23+
import org.springframework.web.bind.annotation.RequestBody;
24+
import org.springframework.web.bind.annotation.RequestMapping;
1625
import org.springframework.web.bind.annotation.RestController;
26+
import com.codedifferently.lesson26.library.search.SearchCriteria;
27+
1728

1829
@RestController
1930
@CrossOrigin
31+
@RequestMapping("/api")
2032
public class MediaItemsController {
2133

2234
private final Library library;
2335
private final Librarian librarian;
24-
2536
public MediaItemsController(Library library) throws IOException {
2637
this.library = library;
2738
this.librarian = library.getLibrarians().stream().findFirst().orElseThrow();
2839
}
29-
3040
@GetMapping("/items")
3141
public ResponseEntity<GetMediaItemsResponse> getItems() {
3242
Set<MediaItem> items = library.search(SearchCriteria.builder().build());
33-
if (items.isEmpty()) {
34-
ResponseEntity.noContent();
35-
}
3643
List<MediaItemResponse> responseItems = items.stream().map(MediaItemResponse::from).toList();
3744
var response = GetMediaItemsResponse.builder().items(responseItems).build();
3845
return ResponseEntity.ok(response);
3946
}
40-
@GetMapping(value = "/{id}")
41-
public ResponseEntity<MediaItemResponse> getItemById(@PathVariable("id") UUID id) {
4247

43-
System.out.println(id.toString());
48+
@GetMapping("/items/{id}")
49+
public ResponseEntity<MediaItemResponse> getItemById(@PathVariable String id) {
50+
try {
51+
Set<MediaItem> items = library.search(((Object) SearchCriteria.builder()).id(id).build());
52+
if (items.isEmpty()) {
53+
return ResponseEntity.notFound().build();
54+
}
55+
MediaItemResponse response = MediaItemResponse.from(items.iterator().next());
56+
return ResponseEntity.ok(response);
57+
} catch (IllegalArgumentException e) {
58+
return ResponseEntity.notFound().build();
59+
}
60+
}
61+
62+
@PostMapping("/items")
63+
public ResponseEntity<Object> createItem(
64+
@Valid @RequestBody CreateMediaItemRequest request) {
65+
try {
66+
MediaItem item = MediaItemRequest.asMediaItem(request.getItem());
67+
library.addMediaItem(item, librarian);
68+
var response = ((GetMediaItemsResponseBuilder) CreateMediaItemResponse.builder()).item(MediaItemResponse.from(item)).build();
69+
return ResponseEntity.ok(response);
70+
} catch (IllegalArgumentException e) {
71+
return ResponseEntity.badRequest().build();
72+
}
73+
}
4474

45-
Set<MediaItem> items = library.search(SearchCriteria.builder().id(id.toString()).build());
46-
Optional<MediaItem> matchedItem =
47-
items.stream().filter(item -> item.getId().equals(id)).findFirst();
48-
System.out.println("items");
49-
// System.out.println(items);
50-
}
75+
@DeleteMapping("/items/{id}")
76+
public ResponseEntity<Void> deleteItemById(@PathVariable("id") String id) {
77+
try {
78+
UUID uuid = UUID.fromString(id);
79+
Set<MediaItem> items = library.search(SearchCriteria.builder().id(id).build());
80+
if (items.isEmpty()) {
81+
return ResponseEntity.notFound().build();
82+
}
83+
library.removeMediaItem(uuid, librarian);
84+
return ResponseEntity.noContent().build();
85+
} catch (IllegalArgumentException e) {
86+
return ResponseEntity.notFound().build();
87+
}
88+
}
89+
90+
@ExceptionHandler(MethodArgumentNotValidException.class)
91+
public ResponseEntity<Map<String, List<String>>> handleValidationErrors(
92+
MethodArgumentNotValidException ex) {
93+
List<String> errors =
94+
ex.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).toList();
95+
return ResponseEntity.badRequest().body(Map.of("errors", errors));
96+
}
97+
}

lesson_26/api/java/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME

lesson_26/api/java/gradlew

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,7 @@ done
8686
# shellcheck disable=SC2034
8787
APP_BASE_NAME=${0##*/}
8888
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
89-
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
90-
' "$PWD" ) || exit
89+
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
9190

9291
# Use the maximum available, or set MAX_FD != -1 to use that value.
9392
MAX_FD=maximum
@@ -115,7 +114,7 @@ case "$( uname )" in #(
115114
NONSTOP* ) nonstop=true ;;
116115
esac
117116

118-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
117+
CLASSPATH="\\\"\\\""
119118

120119

121120
# Determine the Java command to use to start the JVM.
@@ -206,15 +205,15 @@ fi
206205
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
207206

208207
# Collect all arguments for the java command:
209-
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
208+
# DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
210209
# and any embedded shellness will be escaped.
211210
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
212211
# treated as '${Hostname}' itself on the command line.
213212

214213
set -- \
215214
"-Dorg.gradle.appname=$APP_BASE_NAME" \
216215
-classpath "$CLASSPATH" \
217-
org.gradle.wrapper.GradleWrapperMain \
216+
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
218217
"$@"
219218

220219
# Stop when "xargs" is not available.

lesson_26/api/java/gradlew.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
7474

7575

7676
@rem Execute Gradle
77-
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
77+
"%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" %*
7878

7979
:end
8080
@rem End local scope for the variables with windows NT shell

0 commit comments

Comments
 (0)