diff --git a/README.md b/README.md
index fe52cf5..c1c221e 100644
--- a/README.md
+++ b/README.md
@@ -3,13 +3,13 @@
An example implementation of Spring Boot R2DBC REST API with PostgreSQL database.
## Technology stack
-* Java 17
+* Java 21
* Maven
-* PostgreSQL 16.1
+* PostgreSQL 17
* Docker
## Java Dependencies
-* Spring Boot 3.2.1
+* Spring Boot 3.4.1
* Spring Data R2DBC
* R2DBC PostgreSQL Driver
* JUnit 5
@@ -30,7 +30,7 @@ An example implementation of Spring Boot R2DBC REST API with PostgreSQL database
2. Run generated docker image
-`docker run -it -p8080:8080 --network="host" reactive-postgres:0.0.2-SNAPSHOT`
+`docker run -it -p8080:8080 --network="host" reactive-postgres:0.0.3-SNAPSHOT`
diff --git a/docker-compose.yml b/docker-compose.yml
index 41a7777..2834045 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,8 +1,7 @@
-version: '3.8'
services:
postgresql:
container_name: db-postgres
- image: postgres:16.1
+ image: postgres:17
ports:
- "5432:5432"
environment:
diff --git a/mvnw b/mvnw
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
index f346660..73204d8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,17 +15,17 @@
org.springframework.boot
spring-boot-starter-parent
- 3.2.1
+ 3.4.1
dev.kamalhm
reactive-postgres
- 0.0.2-SNAPSHOT
+ 0.0.3-SNAPSHOT
reactive-postgres
- Demo project for Spring Boot
+ Example Spring Boot with R2DBC project
- 17
+ 21
@@ -45,21 +45,15 @@
true
- io.r2dbc
+ org.postgresql
r2dbc-postgresql
- 0.8.6.RELEASE
- runtime
+ 1.0.7.RELEASE
org.postgresql
postgresql
runtime
-
- org.projectlombok
- lombok
- true
-
org.springframework.boot
spring-boot-starter-test
@@ -80,24 +74,10 @@
commons-lang3
3.11
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
- org.projectlombok
- lombok
-
-
-
-
-
-
-
-
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplication.java b/src/main/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplication.java
index 5e8b641..145baae 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplication.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplication.java
@@ -14,17 +14,17 @@
@EnableR2dbcAuditing
public class ReactivePostgresApplication {
- public static void main(String[] args) {
- SpringApplication.run(ReactivePostgresApplication.class, args);
- }
+ public static void main(String[] args) {
+ SpringApplication.run(ReactivePostgresApplication.class, args);
+ }
- @Bean
- ConnectionFactoryInitializer initializer(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) {
- ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
- initializer.setConnectionFactory(connectionFactory);
- ResourceDatabasePopulator resource =
- new ResourceDatabasePopulator(new ClassPathResource("schema.sql"));
- initializer.setDatabasePopulator(resource);
- return initializer;
- }
+ @Bean
+ ConnectionFactoryInitializer initializer(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) {
+ ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
+ initializer.setConnectionFactory(connectionFactory);
+ ResourceDatabasePopulator resource =
+ new ResourceDatabasePopulator(new ClassPathResource("schema.sql"));
+ initializer.setDatabasePopulator(resource);
+ return initializer;
+ }
}
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/config/PostgresAuditorAwareConfiguration.java b/src/main/java/dev/kamalhm/reactivepostgres/config/PostgresAuditorAwareConfiguration.java
index 90d5b81..f87ffb5 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/config/PostgresAuditorAwareConfiguration.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/config/PostgresAuditorAwareConfiguration.java
@@ -9,9 +9,9 @@
@Configuration
public class PostgresAuditorAwareConfiguration {
- @Bean
- ReactiveAuditorAware auditorAware() {
- return () -> Mono.just("AUDITOR");
- }
+ @Bean
+ ReactiveAuditorAware auditorAware() {
+ return () -> Mono.just("AUDITOR");
+ }
}
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/controller/BalanceController.java b/src/main/java/dev/kamalhm/reactivepostgres/controller/BalanceController.java
index 0008cf2..6779157 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/controller/BalanceController.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/controller/BalanceController.java
@@ -3,8 +3,6 @@
import dev.kamalhm.reactivepostgres.dto.CreateBalanceWebRequest;
import dev.kamalhm.reactivepostgres.entity.Balance;
import dev.kamalhm.reactivepostgres.repository.BalanceRepository;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -13,19 +11,18 @@
@RestController
@RequestMapping(value = "/api/balance")
-@RequiredArgsConstructor
-@Slf4j
public class BalanceController {
- private final BalanceRepository balanceRepository;
+ private final BalanceRepository balanceRepository;
- @PostMapping
- public Mono createBalance(@RequestBody CreateBalanceWebRequest request) {
- final Balance balance = Balance.builder()
- .balance(request.getBalance())
- .memberId(request.getMemberId())
- .build();
- return balanceRepository.save(balance);
- }
+ public BalanceController(BalanceRepository balanceRepository) {
+ this.balanceRepository = balanceRepository;
+ }
+
+ @PostMapping
+ public Mono createBalance(@RequestBody CreateBalanceWebRequest request) {
+ final Balance balance = new Balance(request.memberId(), request.balance());
+ return balanceRepository.save(balance);
+ }
}
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/controller/MemberController.java b/src/main/java/dev/kamalhm/reactivepostgres/controller/MemberController.java
index 7fd7726..43f30c3 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/controller/MemberController.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/controller/MemberController.java
@@ -2,8 +2,6 @@
import dev.kamalhm.reactivepostgres.entity.Member;
import dev.kamalhm.reactivepostgres.repository.MemberRepository;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
@@ -19,48 +17,50 @@
@RestController
@RequestMapping(value = "/api/member")
-@RequiredArgsConstructor
-@Slf4j
public class MemberController {
- private final MemberRepository memberRepository;
+ private final MemberRepository memberRepository;
- @GetMapping
- public Flux getAll() {
- return memberRepository.findAll();
- }
+ public MemberController(MemberRepository memberRepository) {
+ this.memberRepository = memberRepository;
+ }
- @GetMapping(value = "/{name}")
- public Mono getOne(@PathVariable String name) {
- return memberRepository.findByName(name);
- }
+ @GetMapping
+ public Flux getAll() {
+ return memberRepository.findAll();
+ }
- @PostMapping
- public Mono createMember(@RequestBody Member member) {
- return memberRepository.save(member);
- }
+ @GetMapping(value = "/{name}")
+ public Mono getOne(@PathVariable String name) {
+ return memberRepository.findByName(name);
+ }
- @PostMapping(value = "/{number}")
- public Flux createMembers(@PathVariable int number) {
- return generateRandomMember(number).subscribeOn(Schedulers.boundedElastic());
- }
+ @PostMapping
+ public Mono createMember(@RequestBody Member member) {
+ return memberRepository.save(member);
+ }
- private Flux generateRandomMember(int number) {
- return Mono.fromSupplier(
- () -> Member.builder().name(RandomStringUtils.randomAlphabetic(5)).build())
- .flatMap(memberRepository::save)
- .repeat(number);
- }
+ @PostMapping(value = "/{number}")
+ public Flux createMembers(@PathVariable int number) {
+ return generateRandomMember(number).subscribeOn(Schedulers.boundedElastic());
+ }
- @PutMapping
- public Mono updateMember(@RequestBody Member member) {
- return memberRepository
- .findByName(member.getName())
- .flatMap(memberResult -> memberRepository.save(member));
- }
+ private Flux generateRandomMember(int number) {
+ return Mono.fromSupplier(
+ () -> new Member(RandomStringUtils.randomAlphabetic(5)))
+ .flatMap(memberRepository::save)
+ .repeat(number);
+ }
- @DeleteMapping
- public Mono deleteMember(@RequestBody Member member) {
- return memberRepository.deleteById(member.getId());
- }
+ @PutMapping
+ public Mono updateMember(@RequestBody Member member) {
+ return memberRepository
+ .findByName(member.name())
+ .flatMap(memberResult -> memberRepository.save(member));
+ }
+
+ @DeleteMapping
+ public Mono deleteMember(@RequestBody Member member) {
+ return memberRepository.deleteById(member.id());
+ }
}
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/controller/TransactionController.java b/src/main/java/dev/kamalhm/reactivepostgres/controller/TransactionController.java
index d0b10c7..c4d3bfd 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/controller/TransactionController.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/controller/TransactionController.java
@@ -3,8 +3,6 @@
import dev.kamalhm.reactivepostgres.dto.CreateTransactionWebRequest;
import dev.kamalhm.reactivepostgres.entity.Balance;
import dev.kamalhm.reactivepostgres.service.TransactionalService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -14,15 +12,17 @@
@RestController
@RequestMapping("/api/transaction")
-@RequiredArgsConstructor
-@Slf4j
public class TransactionController {
- private final TransactionalService transactionalService;
+ private final TransactionalService transactionalService;
- @PostMapping
- @Transactional
- public Mono createTransaction(@RequestBody CreateTransactionWebRequest request) {
- return transactionalService.doTransaction(request);
- }
+ public TransactionController(TransactionalService transactionalService) {
+ this.transactionalService = transactionalService;
+ }
+
+ @PostMapping
+ @Transactional
+ public Mono createTransaction(@RequestBody CreateTransactionWebRequest request) {
+ return transactionalService.doTransaction(request);
+ }
}
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateBalanceWebRequest.java b/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateBalanceWebRequest.java
index ad852b4..45b0489 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateBalanceWebRequest.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateBalanceWebRequest.java
@@ -1,10 +1,5 @@
package dev.kamalhm.reactivepostgres.dto;
-import lombok.Data;
-@Data
-public class CreateBalanceWebRequest {
-
- private String memberId;
- private Long balance;
+public record CreateBalanceWebRequest(Long memberId, Long balance) {
}
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateTransactionWebRequest.java b/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateTransactionWebRequest.java
index ba57a7a..18a0bea 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateTransactionWebRequest.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateTransactionWebRequest.java
@@ -1,11 +1,4 @@
package dev.kamalhm.reactivepostgres.dto;
-import lombok.Data;
-
-@Data
-public class CreateTransactionWebRequest {
-
- private String from;
- private String to;
- private Long amount;
+public record CreateTransactionWebRequest(Long from, Long to, Long amount) {
}
\ No newline at end of file
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/entity/Balance.java b/src/main/java/dev/kamalhm/reactivepostgres/entity/Balance.java
index a05e434..bf81304 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/entity/Balance.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/entity/Balance.java
@@ -1,8 +1,5 @@
package dev.kamalhm.reactivepostgres.entity;
-import java.util.UUID;
-import lombok.Builder;
-import lombok.Data;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
@@ -10,25 +7,17 @@
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.relational.core.mapping.Column;
-@Builder
-@Data
-public class Balance {
-
- @Id
- private UUID id;
- @Column("member_id")
- private String memberId;
- private Long balance;
- @CreatedBy
- @Column("created_by")
- private String createdBy;
- @CreatedDate
- @Column("created_date")
- private Long createdDate;
- @LastModifiedBy
- @Column("last_modified_by")
- private String lastModifiedBy;
- @LastModifiedDate
- @Column("last_modified_date")
- private Long lastModifiedDate;
+public record Balance(
+ @Id Long id,
+ @Column("member_id") Long memberId,
+ Long balance,
+ @CreatedBy @Column("created_by") String createdBy,
+ @CreatedDate @Column("created_date") Long createdDate,
+ @LastModifiedBy @Column("last_modified_by") String lastModifiedBy,
+ @LastModifiedDate @Column("last_modified_date") Long lastModifiedDate
+) {
+ public Balance(Long memberId, Long balance) {
+ this(null, memberId, balance, null, null, null, null);
+ }
}
+
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/entity/Member.java b/src/main/java/dev/kamalhm/reactivepostgres/entity/Member.java
index a092d29..198956c 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/entity/Member.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/entity/Member.java
@@ -1,15 +1,10 @@
package dev.kamalhm.reactivepostgres.entity;
-import lombok.Builder;
-import lombok.Data;
import org.springframework.data.annotation.Id;
+public record Member(@Id Long id, String name) {
+ public Member(String name) {
+ this(null, name); // `id` is null, it will be auto-generated when persisted
+ }
-@Builder
-@Data
-public class Member {
-
- @Id
- private Long id;
- private String name;
}
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/repository/BalanceRepository.java b/src/main/java/dev/kamalhm/reactivepostgres/repository/BalanceRepository.java
index 1c6db1f..196b174 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/repository/BalanceRepository.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/repository/BalanceRepository.java
@@ -4,6 +4,6 @@
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import reactor.core.publisher.Mono;
-public interface BalanceRepository extends R2dbcRepository {
- Mono findByMemberId(String memberId);
+public interface BalanceRepository extends R2dbcRepository {
+ Mono findByMemberId(Long memberId);
}
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/repository/MemberRepository.java b/src/main/java/dev/kamalhm/reactivepostgres/repository/MemberRepository.java
index 33b3dac..dcee974 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/repository/MemberRepository.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/repository/MemberRepository.java
@@ -5,5 +5,5 @@
import reactor.core.publisher.Mono;
public interface MemberRepository extends R2dbcRepository {
- Mono findByName(String name);
+ Mono findByName(String name);
}
diff --git a/src/main/java/dev/kamalhm/reactivepostgres/service/TransactionalService.java b/src/main/java/dev/kamalhm/reactivepostgres/service/TransactionalService.java
index 28835f3..3352567 100644
--- a/src/main/java/dev/kamalhm/reactivepostgres/service/TransactionalService.java
+++ b/src/main/java/dev/kamalhm/reactivepostgres/service/TransactionalService.java
@@ -3,56 +3,72 @@
import dev.kamalhm.reactivepostgres.dto.CreateTransactionWebRequest;
import dev.kamalhm.reactivepostgres.entity.Balance;
import dev.kamalhm.reactivepostgres.repository.BalanceRepository;
+
import java.util.Random;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import reactor.core.publisher.Mono;
import reactor.util.function.Tuple2;
-@RequiredArgsConstructor
@Service
-@Slf4j
public class TransactionalService {
- private final BalanceRepository balanceRepository;
-
- @Transactional
- public Mono doTransaction(CreateTransactionWebRequest request) {
- Long amount = request.getAmount();
-
- return Mono.zip(balanceRepository.findByMemberId(request.getFrom()),
- balanceRepository.findByMemberId(request.getTo()))
- .flatMap(balanceTuple -> executeTransaction(balanceTuple, amount));
- }
-
- private Mono executeTransaction(Tuple2 balanceTuple, Long amount) {
- Balance fromBalance = balanceTuple.getT1();
- Balance toBalance = balanceTuple.getT2();
- return deductBalance(fromBalance, amount).flatMap(
- balance -> increaseBalance(toBalance, amount));
- }
-
- private Mono increaseBalance(Balance toBalance, Long amount) {
- return Mono.fromSupplier(() -> new Random().nextDouble())
- .flatMap(randomValue -> increaseBalance(toBalance, amount, randomValue));
- }
-
- private Mono increaseBalance(Balance toBalance, Long amount, Double randomValue) {
- log.info("random value {}", randomValue);
- if (randomValue > 0.5) {
- toBalance.setBalance(toBalance.getBalance() + amount);
- return balanceRepository.save(toBalance);
+ private final BalanceRepository balanceRepository;
+
+ public TransactionalService(BalanceRepository balanceRepository) {
+ this.balanceRepository = balanceRepository;
+ }
+
+ @Transactional
+ public Mono doTransaction(CreateTransactionWebRequest request) {
+ Long amount = request.amount();
+
+ return Mono.zip(balanceRepository.findByMemberId(request.from()),
+ balanceRepository.findByMemberId(request.to()))
+ .flatMap(balanceTuple -> executeTransaction(balanceTuple, amount));
+ }
+
+ private Mono executeTransaction(Tuple2 balanceTuple, Long amount) {
+ Balance fromBalance = balanceTuple.getT1();
+ Balance toBalance = balanceTuple.getT2();
+ return deductBalance(fromBalance, amount).flatMap(
+ balance -> increaseBalance(toBalance, amount));
+ }
+
+ private Mono increaseBalance(Balance toBalance, Long amount) {
+ return Mono.fromSupplier(() -> new Random().nextDouble())
+ .flatMap(randomValue -> increaseBalance(toBalance, amount, randomValue));
}
- return Mono.error(new RuntimeException("randomized error"));
- }
- private Mono deductBalance(Balance fromBalance, Long amount) {
- fromBalance.setBalance(fromBalance.getBalance() - amount);
- return balanceRepository.save(fromBalance);
- }
+ private Mono increaseBalance(Balance toBalance, Long amount, Double randomValue) {
+ if (randomValue < 0.5) {
+ return Mono.error(new RuntimeException("randomized error"));
+ }
+ Balance updatedBalance = new Balance(
+ toBalance.id(),
+ toBalance.memberId(),
+ toBalance.balance() + amount, // Update balance
+ toBalance.createdBy(),
+ toBalance.createdDate(),
+ toBalance.lastModifiedBy(),
+ toBalance.lastModifiedDate()
+ );
+ return balanceRepository.save(updatedBalance);
+ }
+
+ private Mono deductBalance(Balance fromBalance, Long amount) {
+ Balance updatedBalance = new Balance(
+ fromBalance.id(),
+ fromBalance.memberId(),
+ fromBalance.balance() - amount, // Update balance
+ fromBalance.createdBy(),
+ fromBalance.createdDate(),
+ fromBalance.lastModifiedBy(),
+ fromBalance.lastModifiedDate()
+ );
+ return balanceRepository.save(updatedBalance);
+ }
}
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
index 30c88d3..990e3c8 100644
--- a/src/main/resources/schema.sql
+++ b/src/main/resources/schema.sql
@@ -1,17 +1,17 @@
-CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-
-CREATE TABLE IF NOT EXISTS member (
- id SERIAL PRIMARY KEY,
+CREATE TABLE IF NOT EXISTS member
+(
+ id BIGINT GENERATED ALWAYS AS IDENTITY,
name TEXT NOT NULL
);
-CREATE TABLE IF NOT EXISTS balance (
- id uuid default uuid_generate_v4(),
- member_id TEXT NOT NULL,
- balance integer NOT NULL,
- created_by TEXT NOT NULL,
- created_date bigint NOT NULL,
- last_modified_date bigint NOT NULL,
- last_modified_by TEXT NOT NULL,
- updated_by TEXT
+CREATE TABLE IF NOT EXISTS balance
+(
+ id BIGINT GENERATED ALWAYS AS IDENTITY,
+ member_id BIGINT NOT NULL,
+ balance integer NOT NULL,
+ created_by TEXT NOT NULL,
+ created_date bigint NOT NULL,
+ last_modified_date bigint NOT NULL,
+ last_modified_by TEXT NOT NULL,
+ updated_by TEXT
);
diff --git a/src/test/java/dev/kamalhm/reactivepostgres/MemberControllerTest.java b/src/test/java/dev/kamalhm/reactivepostgres/MemberControllerTest.java
index b3cc823..70816a0 100644
--- a/src/test/java/dev/kamalhm/reactivepostgres/MemberControllerTest.java
+++ b/src/test/java/dev/kamalhm/reactivepostgres/MemberControllerTest.java
@@ -4,7 +4,6 @@
import dev.kamalhm.reactivepostgres.repository.MemberRepository;
import io.r2dbc.spi.ConnectionFactories;
import io.r2dbc.spi.ConnectionFactory;
-import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,71 +21,74 @@
@SpringBootTest
@AutoConfigureWebTestClient
-@Slf4j
@ActiveProfiles(profiles = "test")
class MemberControllerTest {
- @Autowired
- private WebTestClient webTestClient;
+ @Autowired
+ private WebTestClient webTestClient;
- @Autowired
- private MemberRepository memberRepository;
+ @Autowired
+ private MemberRepository memberRepository;
- @Value("${spring.r2dbc.url}")
- private String dbUrl;
+ @Value("${spring.r2dbc.url}")
+ private String dbUrl;
- @BeforeEach
- public void setup() {
- initializeDatabase();
- insertData();
- }
+ @BeforeEach
+ public void setup() {
+ initializeDatabase();
+ insertData();
+ }
- private void initializeDatabase() {
- ConnectionFactory connectionFactory = ConnectionFactories.get(dbUrl);
- R2dbcEntityTemplate template = new R2dbcEntityTemplate(connectionFactory);
- String query = "CREATE TABLE IF NOT EXISTS member (id SERIAL PRIMARY KEY, name TEXT NOT NULL);";
- template.getDatabaseClient().sql(query).fetch().rowsUpdated().block();
- }
+ private void initializeDatabase() {
+ ConnectionFactory connectionFactory = ConnectionFactories.get(dbUrl);
+ R2dbcEntityTemplate template = new R2dbcEntityTemplate(connectionFactory);
+ String query = """
+ CREATE TABLE IF NOT EXISTS member
+ (
+ id BIGINT GENERATED ALWAYS AS IDENTITY,
+ name TEXT NOT NULL
+ );
+ """;
+ template.getDatabaseClient().sql(query).fetch().rowsUpdated().block();
+ }
- private void insertData() {
- Flux memberFlux = Flux.just(
- Member.builder().name("ani").build(),
- Member.builder().name("budi").build(),
- Member.builder().name("cep").build(),
- Member.builder().name("dod").build()
- );
- memberRepository.deleteAll()
- .thenMany(memberFlux)
- .flatMap(memberRepository::save)
- .doOnNext(member -> log.info("inserted {}", member))
- .blockLast();
- }
+ private void insertData() {
+ Flux memberFlux = Flux.just(
+ new Member("ani"),
+ new Member("budi"),
+ new Member("cep"),
+ new Member("dod"));
+ memberRepository.deleteAll()
+ .thenMany(memberFlux)
+ .flatMap(memberRepository::save)
+ .blockLast();
+ }
- @Test
- public void getAll() {
- webTestClient.get()
- .uri("/api/member")
- .accept(MediaType.APPLICATION_JSON)
- .exchange()
- .expectStatus().isOk()
- .expectBody()
- .jsonPath("$[*].name")
- .value(containsInAnyOrder("ani", "budi", "cep", "dod"));
- }
+ @Test
+ public void getAll() {
+ webTestClient.get()
+ .uri("/api/member")
+ .accept(MediaType.APPLICATION_JSON)
+ .exchange()
+ .expectStatus().isOk()
+ .expectBody()
+ .jsonPath("$[*].name")
+ .value(containsInAnyOrder("ani", "budi", "cep", "dod"));
+ }
- @Test
- public void getOne() {
- webTestClient.get()
- .uri("/api/member/ani")
- .accept(MediaType.APPLICATION_JSON)
- .exchange()
- .expectStatus()
- .isOk()
- .expectBody()
- .jsonPath("$.name")
- .isEqualTo("ani")
- .jsonPath("$.id")
- .isNumber();
- }
+ @Test
+ public void getOne() {
+ webTestClient.get()
+ .uri("/api/member/ani")
+ .accept(MediaType.APPLICATION_JSON)
+ .exchange()
+ .expectStatus()
+ .isOk()
+ .expectBody()
+ .jsonPath("$.name")
+ .isEqualTo("ani")
+ .jsonPath("$.id")
+ .isNumber();
+ }
}
diff --git a/src/test/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplicationTests.java b/src/test/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplicationTests.java
index b048670..013144a 100644
--- a/src/test/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplicationTests.java
+++ b/src/test/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplicationTests.java
@@ -6,8 +6,8 @@
@SpringBootTest
class ReactivePostgresApplicationTests {
- @Test
- void contextLoads() {
- }
+ @Test
+ void contextLoads() {
+ }
}
diff --git a/src/test/resources/schema.sql b/src/test/resources/schema.sql
index df243a4..990e3c8 100644
--- a/src/test/resources/schema.sql
+++ b/src/test/resources/schema.sql
@@ -1,9 +1,17 @@
-CREATE TABLE IF NOT EXISTS member (
- id SERIAL PRIMARY KEY,
+CREATE TABLE IF NOT EXISTS member
+(
+ id BIGINT GENERATED ALWAYS AS IDENTITY,
name TEXT NOT NULL
);
-CREATE TABLE IF NOT EXISTS balance (
- id TEXT PRIMARY KEY,
- balance integer NOT NULL
+CREATE TABLE IF NOT EXISTS balance
+(
+ id BIGINT GENERATED ALWAYS AS IDENTITY,
+ member_id BIGINT NOT NULL,
+ balance integer NOT NULL,
+ created_by TEXT NOT NULL,
+ created_date bigint NOT NULL,
+ last_modified_date bigint NOT NULL,
+ last_modified_by TEXT NOT NULL,
+ updated_by TEXT
);