diff --git a/.gitignore b/.gitignore index 7727399f..1fb70919 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build/ .idea *.iml +.gradle diff --git a/README.md b/README.md index bf891332..d16513b1 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,8 @@ Or follow these steps, after installing the [Heroku Toolbelt](https://toolbelt.h ```sh-session $ git clone https://github.com/kissaten/spring-boot-android-service $ cd spring-boot-android-service -$ heroku create +$ git checkout -t origin/db +$ heroku create --addons heroku-postgresql $ git push heroku master $ heroku open ``` diff --git a/app.json b/app.json index bcd9e2cd..0e7c10e1 100644 --- a/app.json +++ b/app.json @@ -1,5 +1,6 @@ { "name": "Spring Boot Demo for Android", "description": "This is a small demo application for showing how to run a Spring Boot application on Heroku.", - "repository": "https://github.com/jkutner/spring-boot-android-service" + "repository": "https://github.com/jkutner/spring-boot-android-service", + "addons" : [ "heroku-postgresql" ] } diff --git a/build.gradle b/build.gradle index 18127e77..65596fc3 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,10 @@ repositories { dependencies { compile('org.springframework.boot:spring-boot-starter-web') + compile('org.springframework.boot:spring-boot-starter-data-jpa') + compile('org.postgresql:postgresql:9.4-1203-jdbc42') + compile('javax.validation:validation-api:1.1.0.Final') + compile('org.liquibase:liquibase-core:3.4.1') testCompile('org.springframework.boot:spring-boot-starter-test') } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b66f3c11..fbf3c0d0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Fri Aug 19 07:43:28 CDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-all.zip diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/com/example/Book.java b/src/main/java/com/example/Book.java new file mode 100644 index 00000000..0bf9a059 --- /dev/null +++ b/src/main/java/com/example/Book.java @@ -0,0 +1,32 @@ +package com.example; + +import org.hibernate.validator.constraints.NotEmpty; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @NotEmpty + private String isbn; + + public Long getId() { + return id; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + +} diff --git a/src/main/java/com/example/BookController.java b/src/main/java/com/example/BookController.java new file mode 100644 index 00000000..a0d11b29 --- /dev/null +++ b/src/main/java/com/example/BookController.java @@ -0,0 +1,40 @@ +package com.example; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/books") +public class BookController { + + private BookRepository repository; + + @Autowired + public BookController(BookRepository repository) { + this.repository = repository; + } + + @RequestMapping(value = "/{id}", method = RequestMethod.GET) + public ResponseEntity get(@PathVariable("id") Long id) { + Book book = repository.findOne(id); + if (null == book) { + return new ResponseEntity(HttpStatus.NOT_FOUND); + } + return new ResponseEntity(book, HttpStatus.OK); + } + + @RequestMapping(value = "/new", method = RequestMethod.POST) + public ResponseEntity update(@RequestBody Book book) { + repository.save(book); + return get(book.getId()); + } + + @RequestMapping + public List all() { + return repository.findAll(); + } +} diff --git a/src/main/java/com/example/BookRepository.java b/src/main/java/com/example/BookRepository.java new file mode 100644 index 00000000..7181e157 --- /dev/null +++ b/src/main/java/com/example/BookRepository.java @@ -0,0 +1,8 @@ +package com.example; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface BookRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/DatabaseConfig.java b/src/main/java/com/example/DatabaseConfig.java new file mode 100644 index 00000000..e6054b61 --- /dev/null +++ b/src/main/java/com/example/DatabaseConfig.java @@ -0,0 +1,18 @@ +package com.example; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +public class DatabaseConfig { + @Bean + @Primary + @ConfigurationProperties(prefix = "spring.datasource") + public DataSource dataSource() { + return new org.apache.tomcat.jdbc.pool.DataSource(); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/DemoApplication.java b/src/main/java/com/example/DemoApplication.java index a56c0cad..9d20cd1f 100644 --- a/src/main/java/com/example/DemoApplication.java +++ b/src/main/java/com/example/DemoApplication.java @@ -12,7 +12,7 @@ public class DemoApplication { @RequestMapping("/") @ResponseBody String home() { - return "Hello! This is a demo application linked to this tutorial: "; + return "Hello! This is a demo application linked to this tutorial: http://jkutner.github.io/2016/08/18/android-backend-api-heroku-retrofit.html"; } @RequestMapping("/hello") diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29b..52a3f392 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=${JDBC_DATABASE_URL} +spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.maxActive=10 +spring.datasource.maxIdle=5 +spring.datasource.minIdle=2 +spring.datasource.initialSize=5 +spring.datasource.removeAbandoned=true \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml new file mode 100644 index 00000000..60eb50e7 --- /dev/null +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -0,0 +1,20 @@ +databaseChangeLog: + - changeSet: + id: 1 + author: jkutner + changes: + - createTable: + tableName: book + columns: + - column: + name: id + type: int + autoIncrement: true + constraints: + primaryKey: true + nullable: false + - column: + name: isbn + type: varchar(255) + constraints: + nullable: false \ No newline at end of file