11package com .codedifferently .lesson26 .web ;
2-
32import com .codedifferently .lesson26 .library .Librarian ;
43import com .codedifferently .lesson26 .library .Library ;
54import com .codedifferently .lesson26 .library .MediaItem ;
65import com .codedifferently .lesson26 .library .search .SearchCriteria ;
6+ import com .codedifferently .lesson26 .web .GetMediaItemsResponse .GetMediaItemsResponseBuilder ;
7+
8+ import jakarta .validation .Valid ;
79import java .io .IOException ;
810import java .util .List ;
9- import java .util .Optional ;
11+ import java .util .Map ;
1012import java .util .Set ;
1113import java .util .UUID ;
12-
1314import org .springframework .http .ResponseEntity ;
15+ import org .springframework .validation .FieldError ;
16+ import org .springframework .web .bind .MethodArgumentNotValidException ;
1417import org .springframework .web .bind .annotation .CrossOrigin ;
18+ import org .springframework .web .bind .annotation .DeleteMapping ;
19+ import org .springframework .web .bind .annotation .ExceptionHandler ;
1520import 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 ;
1625import org .springframework .web .bind .annotation .RestController ;
26+ import com .codedifferently .lesson26 .library .search .SearchCriteria ;
27+
1728
1829@ RestController
1930@ CrossOrigin
31+ @ RequestMapping ("/api" )
2032public 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+ }
0 commit comments