diff --git a/.gitignore b/.gitignore index 2af7cef..ff29930 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ build/ nbbuild/ dist/ nbdist/ -.nb-gradle/ \ No newline at end of file +.nb-gradle/ +.elasticbeanstalk diff --git a/Readme.md b/Readme.md index ecdc1c8..dd07c08 100644 --- a/Readme.md +++ b/Readme.md @@ -15,7 +15,7 @@ Build Restful CRUD API for a simple Note-Taking application using Spring Boot, M **1. Clone the application** ```bash -git@github.com:callicoder/spring-boot-mysql-rest-api-tutorial.git +git clone https://github.com/callicoder/spring-boot-mysql-rest-api-tutorial.git ``` **2. Create Mysql database** @@ -29,7 +29,7 @@ create database notes_app + change `spring.datasource.username` and `spring.datasource.password` as per your mysql installation -**2. Build and run the app using maven** +**4. Build and run the app using maven** ```bash mvn package diff --git a/pom.xml b/pom.xml index 19f9a8a..baec0d9 100644 --- a/pom.xml +++ b/pom.xml @@ -14,14 +14,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.4.RELEASE + 2.5.5 UTF-8 UTF-8 - 1.8 + 11 @@ -33,7 +33,10 @@ org.springframework.boot spring-boot-starter-web - + + org.springframework.boot + spring-boot-starter-validation + org.springframework.boot spring-boot-devtools diff --git a/src/main/java/com/example/easynotes/controller/IndexController.java b/src/main/java/com/example/easynotes/controller/IndexController.java new file mode 100644 index 0000000..f9c5ea4 --- /dev/null +++ b/src/main/java/com/example/easynotes/controller/IndexController.java @@ -0,0 +1,16 @@ +package com.example.easynotes.controller; + + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/") +public class IndexController { + + @GetMapping + public String sayHello() { + return "Hello and Welcome to the EasyNotes application. You can create a new Note by making a POST request to /api/notes endpoint."; + } +} diff --git a/src/main/java/com/example/easynotes/controller/NoteController.java b/src/main/java/com/example/easynotes/controller/NoteController.java index c3663d8..52f2ef0 100644 --- a/src/main/java/com/example/easynotes/controller/NoteController.java +++ b/src/main/java/com/example/easynotes/controller/NoteController.java @@ -1,5 +1,6 @@ package com.example.easynotes.controller; +import com.example.easynotes.exception.ResourceNotFoundException; import com.example.easynotes.model.Note; import com.example.easynotes.repository.NoteRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -24,42 +25,38 @@ public List getAllNotes() { return noteRepository.findAll(); } - @GetMapping("/notes/{id}") - public ResponseEntity getNoteById(@PathVariable(value = "id") Long noteId) { - Note note = noteRepository.findOne(noteId); - if(note == null) { - return ResponseEntity.notFound().build(); - } - return ResponseEntity.ok().body(note); - } - @PostMapping("/notes") public Note createNote(@Valid @RequestBody Note note) { return noteRepository.save(note); } + @GetMapping("/notes/{id}") + public Note getNoteById(@PathVariable(value = "id") Long noteId) { + return noteRepository.findById(noteId) + .orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId)); + } + @PutMapping("/notes/{id}") - public ResponseEntity updateNote(@PathVariable(value = "id") Long noteId, + public Note updateNote(@PathVariable(value = "id") Long noteId, @Valid @RequestBody Note noteDetails) { - Note note = noteRepository.findOne(noteId); - if(note == null) { - return ResponseEntity.notFound().build(); - } + + Note note = noteRepository.findById(noteId) + .orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId)); + note.setTitle(noteDetails.getTitle()); note.setContent(noteDetails.getContent()); Note updatedNote = noteRepository.save(note); - return ResponseEntity.ok(updatedNote); + return updatedNote; } @DeleteMapping("/notes/{id}") - public ResponseEntity deleteNote(@PathVariable(value = "id") Long noteId) { - Note note = noteRepository.findOne(noteId); - if(note == null) { - return ResponseEntity.notFound().build(); - } + public ResponseEntity deleteNote(@PathVariable(value = "id") Long noteId) { + Note note = noteRepository.findById(noteId) + .orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId)); noteRepository.delete(note); + return ResponseEntity.ok().build(); } } diff --git a/src/main/java/com/example/easynotes/exception/ResourceNotFoundException.java b/src/main/java/com/example/easynotes/exception/ResourceNotFoundException.java new file mode 100644 index 0000000..4e4c4f2 --- /dev/null +++ b/src/main/java/com/example/easynotes/exception/ResourceNotFoundException.java @@ -0,0 +1,30 @@ +package com.example.easynotes.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(value = HttpStatus.NOT_FOUND) +public class ResourceNotFoundException extends RuntimeException { + private String resourceName; + private String fieldName; + private Object fieldValue; + + public ResourceNotFoundException( String resourceName, String fieldName, Object fieldValue) { + super(String.format("%s not found with %s : '%s'", resourceName, fieldName, fieldValue)); + this.resourceName = resourceName; + this.fieldName = fieldName; + this.fieldValue = fieldValue; + } + + public String getResourceName() { + return resourceName; + } + + public String getFieldName() { + return fieldName; + } + + public Object getFieldValue() { + return fieldValue; + } +} diff --git a/src/main/java/com/example/easynotes/model/Note.java b/src/main/java/com/example/easynotes/model/Note.java index 093a6b9..4f8b6b1 100644 --- a/src/main/java/com/example/easynotes/model/Note.java +++ b/src/main/java/com/example/easynotes/model/Note.java @@ -1,12 +1,12 @@ package com.example.easynotes.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.hibernate.validator.constraints.NotBlank; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; +import javax.validation.constraints.NotBlank; import java.util.Date; /** @@ -19,7 +19,7 @@ allowGetters = true) public class Note { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotBlank diff --git a/src/main/java/com/example/easynotes/repository/NoteRepository.java b/src/main/java/com/example/easynotes/repository/NoteRepository.java index 1204886..4b7b8b3 100644 --- a/src/main/java/com/example/easynotes/repository/NoteRepository.java +++ b/src/main/java/com/example/easynotes/repository/NoteRepository.java @@ -2,10 +2,13 @@ import com.example.easynotes.model.Note; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; /** * Created by rajeevkumarsingh on 27/06/17. */ + +@Repository public interface NoteRepository extends JpaRepository { } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 41354eb..d357d46 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,13 +1,13 @@ ## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) -spring.datasource.url = jdbc:mysql://localhost:3306/notes_app?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false +spring.datasource.url = jdbc:mysql://localhost:3306/notes_app?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false spring.datasource.username = root -spring.datasource.password = root +spring.datasource.password = callicoder ## Hibernate Properties # The SQL dialect makes Hibernate generate better SQL for the chosen database -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect # Hibernate ddl auto (create, create-drop, validate, update) spring.jpa.hibernate.ddl-auto = update \ No newline at end of file diff --git a/src/test/java/com/example/easynotes/EasyNotesApplicationTests.java b/src/test/java/com/example/easynotes/EasyNotesApplicationTests.java index 4bf539c..298ed22 100644 --- a/src/test/java/com/example/easynotes/EasyNotesApplicationTests.java +++ b/src/test/java/com/example/easynotes/EasyNotesApplicationTests.java @@ -1,11 +1,8 @@ package com.example.easynotes; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -@RunWith(SpringRunner.class) @SpringBootTest public class EasyNotesApplicationTests {