Skip to content

Commit e98e18e

Browse files
committed
feat: enhanced MediaItemsController with CRUD operations and validation error handling
1 parent 9c5a35a commit e98e18e

File tree

1 file changed

+78
-6
lines changed

1 file changed

+78
-6
lines changed
Lines changed: 78 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,106 @@
11
package com.codedifferently.lesson26.web;
22

3-
import com.codedifferently.lesson26.library.Librarian;
3+
import com.codedifferently.lesson26.library.Librarian; // Ensure this import is present
44
import com.codedifferently.lesson26.library.Library;
55
import com.codedifferently.lesson26.library.MediaItem;
66
import com.codedifferently.lesson26.library.search.SearchCriteria;
7-
import java.io.IOException;
7+
import jakarta.validation.Valid;
88
import java.util.List;
9+
import java.util.Map;
910
import java.util.Set;
11+
import java.util.UUID;
1012
import org.springframework.http.ResponseEntity;
13+
import org.springframework.web.bind.MethodArgumentNotValidException;
1114
import org.springframework.web.bind.annotation.CrossOrigin;
15+
import org.springframework.web.bind.annotation.DeleteMapping;
16+
import org.springframework.web.bind.annotation.ExceptionHandler;
1217
import org.springframework.web.bind.annotation.GetMapping;
18+
import org.springframework.web.bind.annotation.PathVariable;
19+
import org.springframework.web.bind.annotation.PostMapping;
20+
import org.springframework.web.bind.annotation.RequestBody;
21+
import org.springframework.web.bind.annotation.RequestMapping;
1322
import org.springframework.web.bind.annotation.RestController;
1423

24+
// DTO imports
25+
1526
@RestController
1627
@CrossOrigin
28+
@RequestMapping("/items")
1729
public class MediaItemsController {
1830

1931
private final Library library;
20-
private final Librarian librarian;
32+
private final Librarian librarian = new Librarian("default-librarian", "default-role");
2133

22-
public MediaItemsController(Library library) throws IOException {
34+
public MediaItemsController(Library library) {
2335
this.library = library;
24-
this.librarian = library.getLibrarians().stream().findFirst().orElseThrow();
2536
}
2637

27-
@GetMapping("/items")
38+
@GetMapping
2839
public ResponseEntity<GetMediaItemsResponse> getItems() {
2940
Set<MediaItem> items = library.search(SearchCriteria.builder().build());
3041
List<MediaItemResponse> responseItems = items.stream().map(MediaItemResponse::from).toList();
42+
3143
var response = GetMediaItemsResponse.builder().items(responseItems).build();
3244
return ResponseEntity.ok(response);
3345
}
46+
47+
@GetMapping("/{id}")
48+
public ResponseEntity<MediaItemResponse> getItemById(@PathVariable String id) {
49+
try {
50+
Set<MediaItem> items = library.search(SearchCriteria.builder().id(id).build());
51+
if (items.isEmpty()) {
52+
return ResponseEntity.notFound().build();
53+
}
54+
MediaItemResponse response = MediaItemResponse.from(items.iterator().next());
55+
return ResponseEntity.ok(response);
56+
} catch (IllegalArgumentException e) {
57+
return ResponseEntity.notFound().build();
58+
}
59+
}
60+
61+
@PostMapping
62+
public ResponseEntity<CreateMediaItemResponse> createItem(
63+
@Valid @RequestBody CreateMediaItemRequest request) {
64+
try {
65+
MediaItem item = MediaItemRequest.asMediaItem(request.getItem());
66+
library.addMediaItem(item, librarian); // Ensure you're passing a Librarian object
67+
var response = CreateMediaItemResponse.builder().item(MediaItemResponse.from(item)).build();
68+
return ResponseEntity.ok(response);
69+
} catch (IllegalArgumentException e) {
70+
return ResponseEntity.badRequest().build();
71+
}
72+
}
73+
74+
@DeleteMapping("/{id}")
75+
public ResponseEntity<Void> deleteItemById(@PathVariable String id) {
76+
try {
77+
UUID uuid = UUID.fromString(id);
78+
Set<MediaItem> items = library.search(SearchCriteria.builder().id(id).build());
79+
if (items.isEmpty()) {
80+
return ResponseEntity.notFound().build();
81+
}
82+
library.removeMediaItem(uuid, librarian); // Ensure you're passing a Librarian object
83+
return ResponseEntity.noContent().build();
84+
} catch (IllegalArgumentException e) {
85+
return ResponseEntity.notFound().build();
86+
}
87+
}
88+
89+
@ExceptionHandler(MethodArgumentNotValidException.class)
90+
public ResponseEntity<Map<String, List<Map<String, String>>>> handleValidationErrors(
91+
MethodArgumentNotValidException ex) {
92+
List<Map<String, String>> errors =
93+
ex.getBindingResult().getFieldErrors().stream()
94+
.map(
95+
fieldError ->
96+
Map.of(
97+
"field", fieldError.getField(),
98+
"message", fieldError.getDefaultMessage()))
99+
.toList();
100+
101+
// Optional: Log the validation errors
102+
System.out.println("Validation errors: " + errors);
103+
104+
return ResponseEntity.badRequest().body(Map.of("errors", errors));
105+
}
34106
}

0 commit comments

Comments
 (0)