diff --git a/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemsController.java b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemsController.java index 7efa0b2f8..e5a36bfb1 100644 --- a/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemsController.java +++ b/lesson_23/api/java/api_app/src/main/java/com/codedifferently/lesson23/web/MediaItemsController.java @@ -1,17 +1,32 @@ package com.codedifferently.lesson23.web; -import com.codedifferently.lesson23.library.Librarian; -import com.codedifferently.lesson23.library.Library; -import com.codedifferently.lesson23.library.MediaItem; -import com.codedifferently.lesson23.library.search.SearchCriteria; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.UUID; + +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import com.codedifferently.lesson23.library.Librarian; +import com.codedifferently.lesson23.library.Library; +import com.codedifferently.lesson23.library.MediaItem; +import com.codedifferently.lesson23.library.search.SearchCriteria; + +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Data; + @RestController @CrossOrigin public class MediaItemsController { @@ -31,4 +46,80 @@ public ResponseEntity getItems() { var response = GetMediaItemsResponse.builder().items(responseItems).build(); return ResponseEntity.ok(response); } + + private MediaItem findItemById(String id) { + Set items = library.search(SearchCriteria.builder().id(id).build()); + return items.isEmpty() ? null : items.iterator().next(); + } + + @PostMapping("/items") + public ResponseEntity createItem(@Valid @RequestBody CreateMediaItemRequest request, BindingResult bindingResult) { + // Handle validation errors + if (bindingResult.hasErrors() || request.getItem() == null) { + List errors = new ArrayList<>(); + + if (request.getItem() == null) { + errors.add("item is required"); + } else { + for (FieldError error : bindingResult.getFieldErrors()) { + errors.add(error.getDefaultMessage()); + } + } + + return ResponseEntity.badRequest().body(new ErrorResponse(errors)); + } + + try { + // Convert request to MediaItem and add to library + MediaItem item = MediaItemRequest.asMediaItem(request.getItem()); + library.addMediaItem(item, librarian); + + // Create response + MediaItemResponse itemResponse = MediaItemResponse.from(item); + CreateMediaItemResponse response = CreateMediaItemResponse.builder() + .item(itemResponse) + .build(); + + return ResponseEntity.ok(response); + + } catch (Exception e) { + List errors = new ArrayList<>(); + errors.add("Failed to create item: " + e.getMessage()); + return ResponseEntity.badRequest().body(new ErrorResponse(errors)); + } + } + + @GetMapping("/items/{id}") + public ResponseEntity getItem(@PathVariable String id) { + MediaItem item = findItemById(id); + + if (item == null) { + return ResponseEntity.notFound().build(); + } + + MediaItemResponse response = MediaItemResponse.from(item); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/items/{id}") + public ResponseEntity deleteItem(@PathVariable String id) { + MediaItem item = findItemById(id); + + if (item == null) { + return ResponseEntity.notFound().build(); + } + + try { + library.removeMediaItem(UUID.fromString(id), librarian); + return ResponseEntity.noContent().build(); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + @Data + @AllArgsConstructor + private static class ErrorResponse { + private List errors; + } }