Skip to content

Commit c702f35

Browse files
feat: adds completed MediaItemsController
1 parent ad5d3b8 commit c702f35

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

lesson_26/api/java/api_app/build.gradle.kts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ plugins {
55
id("com.diffplug.spotless") version "6.25.0"
66
id("org.springframework.boot") version "3.4.0"
77
id("com.adarshr.test-logger") version "4.0.0"
8-
id("io.freefair.lombok") version "8.6"
98
}
109

1110
apply(plugin = "io.spring.dependency-management")
@@ -39,6 +38,10 @@ dependencies {
3938
implementation("org.apache.commons:commons-csv:1.10.0")
4039
implementation("org.xerial:sqlite-jdbc:3.36.0")
4140
implementation("org.hibernate.orm:hibernate-community-dialects:6.2.7.Final")
41+
compileOnly("org.projectlombok:lombok:1.18.38")
42+
annotationProcessor("org.projectlombok:lombok:1.18.38")
43+
testCompileOnly("org.projectlombok:lombok:1.18.38")
44+
testAnnotationProcessor("org.projectlombok:lombok:1.18.38")
4245
}
4346

4447
application {

lesson_26/api/java/api_app/src/main/java/com/codedifferently/lesson26/web/MediaItemsController.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,21 @@
33
import com.codedifferently.lesson26.library.Librarian;
44
import com.codedifferently.lesson26.library.Library;
55
import com.codedifferently.lesson26.library.MediaItem;
6+
import com.codedifferently.lesson26.library.exceptions.MediaItemCheckedOutException;
67
import com.codedifferently.lesson26.library.search.SearchCriteria;
8+
import jakarta.validation.Valid;
79
import java.io.IOException;
810
import java.util.List;
911
import java.util.Set;
12+
import java.util.UUID;
13+
import org.springframework.http.HttpStatus;
1014
import org.springframework.http.ResponseEntity;
1115
import org.springframework.web.bind.annotation.CrossOrigin;
16+
import org.springframework.web.bind.annotation.DeleteMapping;
1217
import 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;
1321
import 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

Comments
 (0)