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 handleExceptionInternal(Exception ex, WebRequest request) { +ExceptionResponse exResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false)); + return new ResponseEntity<>(exResponse, HttpStatus.INTERNAL_SERVER_ERROR); + } + + @ExceptionHandler(BookNotFoundException.class) + public final ResponseEntity handleExceptionInternal1(Exception ex, WebRequest request) { +ExceptionResponse exResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false)); + return new ResponseEntity<>(exResponse, HttpStatus.NOT_IMPLEMENTED); + } +} diff --git a/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/ExceptionResponse.java b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/ExceptionResponse.java new file mode 100644 index 00000000..10e3c54f --- /dev/null +++ b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/ExceptionResponse.java @@ -0,0 +1,14 @@ +package com.in28minutes.springboot.basics.springbootin10steps; + +import java.util.Date; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter @AllArgsConstructor +public class ExceptionResponse { + private Date timestamp; + private String message; + private String details; +} diff --git a/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/SpringbootIn10StepsApplication.java b/01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/SpringbootIn10StepsApplication.java similarity index 100% rename from 01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/SpringbootIn10StepsApplication.java rename to 01.framework-introductions/springboot-in-10-steps/src/main/java/com/in28minutes/springboot/basics/springbootin10steps/com/in28minutes/springboot/basics/springbootin10steps/SpringbootIn10StepsApplication.java diff --git a/01.framework-introductions/springboot-in-10-steps/src/main/resources/application.properties b/01.framework-introductions/springboot-in-10-steps/src/main/resources/application.properties index 4b07b72a..3deacfde 100644 --- a/01.framework-introductions/springboot-in-10-steps/src/main/resources/application.properties +++ b/01.framework-introductions/springboot-in-10-steps/src/main/resources/application.properties @@ -1,2 +1,10 @@ -#logging.level.org.springframework = DEBUG -management.security.enabled=false \ No newline at end of file +logging.level.org.springframework = DEBUG +management.security.enabled=false +management.endpoints.web.exposure.include=* +security.user.name=username +security.user.password=password + +spring.datasource.url=jdbc:h2:mem:testdb +spring.jpa.defer-datasource-initialization=true +spring.jpa.show-sql=true +spring.h2.console.enabled=true \ No newline at end of file diff --git a/02.restful-web-services/src/test/java/com/in28minutes/rest/webservices/restfulwebservices/RestfulWebServicesApplicationTests.java b/02.restful-web-services/src/test/java/com/in28minutes/rest/webservices/restfulwebservices/RestfulWebServicesApplicationTests.java deleted file mode 100644 index 55d01b98..00000000 --- a/02.restful-web-services/src/test/java/com/in28minutes/rest/webservices/restfulwebservices/RestfulWebServicesApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.in28minutes.rest.webservices.restfulwebservices; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class RestfulWebServicesApplicationTests { - - @Test - public void contextLoads() { - } - -}