diff --git a/01.framework-introductions/springboot-in-10-steps/pom.xml b/01.framework-introductions/springboot-in-10-steps/pom.xml
index 3213cd11..9cfaf000 100644
--- a/01.framework-introductions/springboot-in-10-steps/pom.xml
+++ b/01.framework-introductions/springboot-in-10-steps/pom.xml
@@ -35,18 +35,26 @@
spring-boot-starter-actuator
-
- org.springframework.data
- spring-data-rest-hal-browser
-
-
+
+
+
+ com.h2database
+ h2
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+ test
+
+
org.springframework.boot
spring-boot-starter-test
@@ -57,7 +65,27 @@
org.springframework.boot
spring-boot-devtools
+
+ org.projectlombok
+ lombok
+ 1.18.10
+ provided
+
+
+
+
+
+
+ org.springdoc
+ springdoc-openapi-ui
+ 1.5.9
+
+
+ org.mongodb
+ mongo-java-driver
+ 3.12.10
+
diff --git a/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/Book.java b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/Book.java
deleted file mode 100644
index 9bccf3b2..00000000
--- a/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/Book.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.in28minutes.springboot.basics.springbootin10steps;
-
-public class Book {
- long id;
- String name;
- String author;
-
- public Book(long id, String name, String author) {
- super();
- this.id = id;
- this.name = name;
- this.author = author;
- }
-
- public long getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public String getAuthor() {
- return author;
- }
-
- @Override
- public String toString() {
- return String.format("Book [id=%s, name=%s, author=%s]", id, name, author);
- }
-
-}
diff --git a/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/BooksController.java b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/BooksController.java
deleted file mode 100644
index bfdd7c86..00000000
--- a/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/BooksController.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.in28minutes.springboot.basics.springbootin10steps;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class BooksController {
- @GetMapping("/books")
- public List getAllBooks() {
- return Arrays.asList(
- new Book(1l, "Mastering Spring 5.2", "Ranga Karanam"));
- }
-}
\ No newline at end of file
diff --git a/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/Book.java b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/Book.java
new file mode 100644
index 00000000..230256d9
--- /dev/null
+++ b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/Book.java
@@ -0,0 +1,37 @@
+package com.in28minutes.springboot.basics.springbootin10steps;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter @Setter @AllArgsConstructor
+public class Book {
+ long id;
+ String name;
+ String author;
+
+// public Book(long id, String name, String author) {
+// super();
+// this.id = id;
+// this.name = name;
+// this.author = author;
+// }
+
+// public long getId() {
+// return id;
+// }
+//
+// public String getName() {
+// return name;
+// }
+//
+// public String getAuthor() {
+// return author;
+// }
+
+ @Override
+ public String toString() {
+ return String.format("Book [id=%s, name=%s, author=%s]", id, name, author);
+ }
+
+}
diff --git a/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/BookNotFoundException.java b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/BookNotFoundException.java
new file mode 100644
index 00000000..2ca44407
--- /dev/null
+++ b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/BookNotFoundException.java
@@ -0,0 +1,11 @@
+package com.in28minutes.springboot.basics.springbootin10steps;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(HttpStatus.NOT_IMPLEMENTED)
+public class BookNotFoundException extends RuntimeException {
+ BookNotFoundException(){
+ super("Book not found");
+ }
+}
diff --git a/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/BooksController.java b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/BooksController.java
new file mode 100644
index 00000000..1c23b12c
--- /dev/null
+++ b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/BooksController.java
@@ -0,0 +1,74 @@
+package com.in28minutes.springboot.basics.springbootin10steps;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.bson.Document;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.mongodb.MongoClient;
+import com.mongodb.MongoClientURI;
+import com.mongodb.client.AggregateIterable;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+
+
+
+@RestController
+public class BooksController {
+
+
+ @Operation(summary = "Get a book by its id")
+ @ApiResponses(value = {
+ @ApiResponse(responseCode = "200", description = "Found the book",
+ content = { @Content(mediaType = "application/json",
+ schema = @Schema(implementation = Book.class)) }),
+ @ApiResponse(responseCode = "400", description = "Invalid id supplied",
+ content = @Content),
+ @ApiResponse(responseCode = "404", description = "Book not found",
+ content = @Content) })
+
+
+ @GetMapping("/books")
+ public List getAllBooks() {
+
+MongoClient mongoClient = new MongoClient(
+ new MongoClientURI(
+ //MongoDBURL
+ )
+);
+MongoDatabase database = mongoClient.getDatabase("sample_airbnb");
+MongoCollection collection = database.getCollection("listingsAndReviews");
+
+AggregateIterable result = collection.aggregate(Arrays.asList(
+ new Document("$group",new Document("_id", "$address.country").append("c", new Document("$sum", 1L))),
+ new Document("$sort", new Document("c", -1L))));
+
+Document first = result.first();
+
+ return Arrays.asList(
+ new Book(1l, "Mastering Spring 5.2", "Ranga Karanam"));
+ }
+
+ @DeleteMapping("/books")
+ public List getAllBooks1() {
+ throw new BookNotFoundException();
+ }
+
+ @PostMapping("/books")
+ public List getAllBooks1(@Validated @RequestBody Book book) {
+ //throw new BookNotFoundException();
+ return Arrays.asList(book);
+ }
+}
\ No newline at end of file
diff --git a/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/CustomResponseEntityExceptionHandler.java b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/CustomResponseEntityExceptionHandler.java
new file mode 100644
index 00000000..36941a79
--- /dev/null
+++ b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/CustomResponseEntityExceptionHandler.java
@@ -0,0 +1,31 @@
+package com.in28minutes.springboot.basics.springbootin10steps;
+
+import java.util.Date;
+
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.lang.Nullable;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
+import org.springframework.web.util.WebUtils;
+
+@ControllerAdvice
+@RestController
+public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
+ @ExceptionHandler(Exception.class)
+ public final ResponseEntity