11package com .codedifferently .lesson23 .web ;
22
3- import com .codedifferently .lesson23 .library .Librarian ;
4- import com .codedifferently .lesson23 .library .Library ;
5- import com .codedifferently .lesson23 .library .MediaItem ;
6- import com .codedifferently .lesson23 .library .search .SearchCriteria ;
73import java .io .IOException ;
84import java .util .List ;
95import java .util .Set ;
6+ import java .util .UUID ;
7+
8+ import org .springframework .http .HttpStatus ;
109import org .springframework .http .ResponseEntity ;
1110import org .springframework .web .bind .annotation .CrossOrigin ;
11+ import org .springframework .web .bind .annotation .DeleteMapping ;
1212import org .springframework .web .bind .annotation .GetMapping ;
13+ import org .springframework .web .bind .annotation .PathVariable ;
14+ import org .springframework .web .bind .annotation .PostMapping ;
15+ import org .springframework .web .bind .annotation .RequestBody ;
1316import org .springframework .web .bind .annotation .RestController ;
1417
18+ import com .codedifferently .lesson23 .library .Librarian ;
19+ import com .codedifferently .lesson23 .library .Library ;
20+ import com .codedifferently .lesson23 .library .MediaItem ;
21+ import com .codedifferently .lesson23 .library .exceptions .MediaItemCheckedOutException ;
22+ import com .codedifferently .lesson23 .library .search .SearchCriteria ;
23+
24+ import jakarta .validation .Valid ;
25+
1526@ RestController
1627@ CrossOrigin
1728public class MediaItemsController {
@@ -31,4 +42,47 @@ public ResponseEntity<GetMediaItemsResponse> getItems() {
3142 var response = GetMediaItemsResponse .builder ().items (responseItems ).build ();
3243 return ResponseEntity .ok (response );
3344 }
34- }
45+
46+ @ GetMapping ("/items/{id}" )
47+ public ResponseEntity <MediaItemResponse > getItem (@ PathVariable String id ) {
48+ UUID itemId = UUID .fromString (id );
49+ Set <MediaItem > items = library .search (SearchCriteria .builder ().id (itemId .toString ()).build ());
50+
51+ if (items .isEmpty ()) {
52+ return ResponseEntity .notFound ().build ();
53+ }
54+
55+ MediaItem item = items .iterator ().next ();
56+ MediaItemResponse response = MediaItemResponse .from (item );
57+ return ResponseEntity .ok (response );
58+ }
59+
60+ @ PostMapping ("/items" )
61+ public ResponseEntity <CreateMediaItemResponse > createItem (@ Valid @ RequestBody CreateMediaItemRequest request ) {
62+ MediaItem mediaItem = MediaItemRequest .asMediaItem (request .getItem ());
63+ library .addMediaItem (mediaItem , librarian );
64+
65+ MediaItemResponse responseItem = MediaItemResponse .from (mediaItem );
66+ CreateMediaItemResponse response = CreateMediaItemResponse .builder ().item (responseItem ).build ();
67+ return ResponseEntity .ok (response );
68+ }
69+
70+ @ DeleteMapping ("/items/{id}" )
71+ public ResponseEntity <Void > deleteItem (@ PathVariable String id ) {
72+ UUID itemId = UUID .fromString (id );
73+
74+ if (!library .hasMediaItem (itemId )) {
75+ return ResponseEntity .notFound ().build ();
76+ }
77+
78+ try {
79+ library .removeMediaItem (itemId , librarian );
80+ return ResponseEntity .noContent ().build ();
81+ } catch (MediaItemCheckedOutException e ) {
82+ return ResponseEntity .status (HttpStatus .CONFLICT ).build ();
83+ }
84+ }
85+
86+ }
87+
88+
0 commit comments