Skip to content
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.codedifferently.lesson23.config;

import com.codedifferently.lesson23.library.Librarian;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

@Bean
public Librarian librarian() {
return new Librarian("System", "system@library.local");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.codedifferently.lesson23.web;

import com.codedifferently.lesson23.library.Book;
import com.codedifferently.lesson23.library.MediaItem;
import jakarta.validation.constraints.NotNull;
import java.util.List;
import java.util.UUID;
import lombok.Builder;
import lombok.Value;

@Value
@Builder
public class AddMediaItemRequest {
@NotNull Item item;

@Value
@Builder
public static class Item {
String id;
String type;
String title;
String isbn;
List<String> authors;
Integer pages;

public MediaItem toDomain() {
int p = pages == null ? 0 : pages;
return new Book(UUID.fromString(id), title, isbn, authors, p);
}
}

public Item getItem() {
return item;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,32 @@
import com.codedifferently.lesson23.library.Library;
import com.codedifferently.lesson23.library.MediaItem;
import com.codedifferently.lesson23.library.search.SearchCriteria;
import jakarta.validation.Valid;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
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;

@RestController
@CrossOrigin
public class MediaItemsController {
private final Librarian librarian;

private final Library library;
private final Librarian librarian;

public MediaItemsController(Library library) throws IOException {
public MediaItemsController(Library library, Librarian librarian) throws IOException {
this.librarian = librarian;
this.library = library;
this.librarian = library.getLibrarians().stream().findFirst().orElseThrow();
}

@GetMapping("/items")
Expand All @@ -31,4 +39,34 @@ public ResponseEntity<GetMediaItemsResponse> getItems() {
var response = GetMediaItemsResponse.builder().items(responseItems).build();
return ResponseEntity.ok(response);
}

@GetMapping("/items/{id}")
public ResponseEntity<Map<String, MediaItemResponse>> getItem(@PathVariable String id) {
Set<MediaItem> items = library.search(SearchCriteria.builder().id(id).build());
if (items.isEmpty()) {
return ResponseEntity.notFound().build();
}
MediaItem item = items.iterator().next();
var body = Collections.singletonMap("item", MediaItemResponse.from(item));
return ResponseEntity.ok(body);
}

@PostMapping("/items")
public ResponseEntity<Map<String, MediaItemResponse>> addItem(
@Valid @RequestBody AddMediaItemRequest request) {
MediaItem item = request.getItem().toDomain();
library.addMediaItem(item, librarian);
var body = Collections.singletonMap("item", MediaItemResponse.from(item));
return ResponseEntity.ok(body);
}

@DeleteMapping("/items/{id}")
public ResponseEntity<Void> deleteItem(@PathVariable String id) {
Set<MediaItem> items = library.search(SearchCriteria.builder().id(id).build());
if (items.isEmpty()) {
return ResponseEntity.notFound().build();
}
library.removeMediaItem(UUID.fromString(id), librarian);
return ResponseEntity.noContent().build();
}
}