33import com .codedifferently .lesson26 .library .Librarian ;
44import com .codedifferently .lesson26 .library .Library ;
55import com .codedifferently .lesson26 .library .MediaItem ;
6+ import com .codedifferently .lesson26 .library .exceptions .MediaItemCheckedOutException ;
67import com .codedifferently .lesson26 .library .search .SearchCriteria ;
8+ import jakarta .validation .Valid ;
79import java .io .IOException ;
810import java .util .List ;
911import java .util .Set ;
12+ import java .util .UUID ;
13+ import org .springframework .http .HttpStatus ;
1014import org .springframework .http .ResponseEntity ;
1115import org .springframework .web .bind .annotation .CrossOrigin ;
16+ import org .springframework .web .bind .annotation .DeleteMapping ;
1217import 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 ;
1321import org .springframework .web .bind .annotation .RestController ;
1422
1523@ RestController
@@ -31,4 +39,56 @@ public ResponseEntity<GetMediaItemsResponse> getItems() {
3139 var response = GetMediaItemsResponse .builder ().items (responseItems ).build ();
3240 return ResponseEntity .ok (response );
3341 }
42+
43+ @ PostMapping ("/items" )
44+ public ResponseEntity <CreateMediaItemResponse > createItem (
45+ @ Valid @ RequestBody CreateMediaItemRequest createRequest ) {
46+ MediaItemRequest itemRequest = createRequest .getItem ();
47+ MediaItem newItem = MediaItemRequest .asMediaItem (itemRequest );
48+ library .addMediaItem (newItem , this .librarian );
49+ MediaItemResponse itemResponse = MediaItemResponse .from (newItem );
50+ CreateMediaItemResponse response = CreateMediaItemResponse .builder ().item (itemResponse ).build ();
51+ return ResponseEntity .ok (response );
52+ }
53+
54+ @ GetMapping ("/items/{id}" )
55+ public ResponseEntity <MediaItemResponse > getItemById (@ PathVariable UUID id ) {
56+ Set <MediaItem > items = library .search (SearchCriteria .builder ().build ());
57+ MediaItem foundItem =
58+ items .stream ().filter (item -> item .getId ().equals (id )).findFirst ().orElse (null );
59+ if (foundItem != null ) {
60+ MediaItemResponse itemResponse = MediaItemResponse .from (foundItem );
61+ return ResponseEntity .ok (itemResponse );
62+ } else {
63+ return ResponseEntity .notFound ().build ();
64+ }
65+ }
66+
67+ @ DeleteMapping ("/items/{id}" )
68+ public ResponseEntity <Void > deleteItem (@ PathVariable String id ) { // Takes String id
69+ UUID itemUuid ;
70+
71+ try {
72+ itemUuid = UUID .fromString (id );
73+ } catch (IllegalArgumentException e ) {
74+ return ResponseEntity .badRequest ().build ();
75+ }
76+
77+ Set <MediaItem > items = library .search (SearchCriteria .builder ().build ());
78+ MediaItem foundItem =
79+ items .stream ().filter (item -> item .getId ().equals (itemUuid )).findFirst ().orElse (null );
80+
81+ if (foundItem == null ) {
82+ return ResponseEntity .notFound ().build ();
83+ }
84+
85+ try {
86+ library .removeMediaItem (itemUuid , this .librarian );
87+ return ResponseEntity .noContent ().build ();
88+ } catch (MediaItemCheckedOutException ex ) {
89+ return ResponseEntity .status (HttpStatus .CONFLICT ).build ();
90+ } catch (Exception e ) {
91+ return ResponseEntity .status (HttpStatus .INTERNAL_SERVER_ERROR ).build ();
92+ }
93+ }
3494}
0 commit comments