Skip to content

Commit 7dc4ead

Browse files
committed
Hacking.
$ Conflicts: $ server/src/test/java/de/odrotbohm/restbucks/payment/PaymentsIntegrationTest.java
1 parent 9797df4 commit 7dc4ead

15 files changed

Lines changed: 247 additions & 228 deletions

File tree

server/pom.xml

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/ma
7171
<artifactId>jmolecules-starter-ddd</artifactId>
7272
</dependency>
7373

74-
<dependency>
75-
<groupId>org.jmolecules.integrations</groupId>
76-
<artifactId>jmolecules-jpa</artifactId>
77-
<scope>runtime</scope>
78-
</dependency>
79-
8074
<dependency>
8175
<groupId>org.jmolecules.integrations</groupId>
8276
<artifactId>jmolecules-jackson3</artifactId>
@@ -104,7 +98,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/ma
10498

10599
<dependency>
106100
<groupId>org.springframework.modulith</groupId>
107-
<artifactId>spring-modulith-starter-jpa</artifactId>
101+
<artifactId>spring-modulith-starter-jdbc</artifactId>
102+
</dependency>
103+
104+
<dependency>
105+
<groupId>org.springframework.modulith</groupId>
106+
<artifactId>spring-modulith-runtime</artifactId>
107+
<scope>runtime</scope>
108108
</dependency>
109109

110110
<dependency>
@@ -139,7 +139,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/ma
139139

140140
<dependency>
141141
<groupId>org.springframework.boot</groupId>
142-
<artifactId>spring-boot-starter-data-jpa</artifactId>
142+
<artifactId>spring-boot-starter-data-jdbc</artifactId>
143+
</dependency>
144+
145+
<dependency>
146+
<groupId>org.liquibase</groupId>
147+
<artifactId>liquibase-core</artifactId>
148+
<scope>runtime</scope>
143149
</dependency>
144150

145151
<dependency>
@@ -167,6 +173,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/ma
167173
<scope>runtime</scope>
168174
</dependency>
169175

176+
<dependency>
177+
<groupId>org.springframework.boot</groupId>
178+
<artifactId>spring-boot-starter-flyway</artifactId>
179+
<scope>runtime</scope>
180+
</dependency>
181+
170182
<!-- Misc -->
171183

172184
<dependency>

server/src/main/java/de/odrotbohm/restbucks/Restbucks.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,28 @@
1515
*/
1616
package de.odrotbohm.restbucks;
1717

18+
import lombok.RequiredArgsConstructor;
19+
20+
import java.time.Year;
21+
import java.util.ArrayList;
22+
import java.util.List;
23+
import java.util.Locale;
24+
25+
import javax.money.MonetaryAmount;
26+
import javax.money.format.MonetaryAmountFormat;
27+
import javax.money.format.MonetaryFormats;
28+
29+
import org.javamoney.moneta.Money;
30+
import org.jspecify.annotations.Nullable;
1831
import org.springframework.boot.SpringApplication;
1932
import org.springframework.boot.autoconfigure.SpringBootApplication;
2033
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
34+
import org.springframework.context.ApplicationContext;
2135
import org.springframework.context.annotation.Bean;
36+
import org.springframework.context.annotation.Configuration;
37+
import org.springframework.data.convert.ConverterBuilder;
38+
import org.springframework.data.convert.ConverterBuilder.ConverterAware;
39+
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
2240
import org.springframework.hateoas.UriTemplate;
2341
import org.springframework.hateoas.mediatype.hal.CurieProvider;
2442
import org.springframework.hateoas.mediatype.hal.DefaultCurieProvider;
@@ -54,4 +72,64 @@ CurieProvider curieProvider() {
5472
public static void main(String[] args) {
5573
SpringApplication.run(Restbucks.class, args);
5674
}
75+
76+
@Configuration(proxyBeanMethods = false)
77+
@RequiredArgsConstructor
78+
static class PersistenceCustomizations extends AbstractJdbcConfiguration {
79+
80+
private static final MonetaryAmountFormat FORMAT = MonetaryFormats.getAmountFormat(Locale.ROOT);
81+
82+
private final ApplicationContext context;
83+
84+
@Bean
85+
ConverterAware monetaryAmountConverter() {
86+
87+
return ConverterBuilder.writing(MonetaryAmount.class, String.class, this::convert)
88+
.andReading(this::convertToEntityAttribute);
89+
}
90+
91+
@Bean
92+
ConverterAware yearAttributeConverter() {
93+
return ConverterBuilder.writing(Year.class, Integer.class, Year::getValue).andReading(Year::of);
94+
}
95+
96+
/*
97+
* (non-Javadoc)
98+
* @see org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration#userConverters()
99+
*/
100+
@Override
101+
protected List<?> userConverters() {
102+
103+
context.getBeansOfType(ConverterAware.class).values();
104+
105+
return new ArrayList<>(context.getBeansOfType(ConverterAware.class).values());
106+
}
107+
108+
@Nullable
109+
String convert(MonetaryAmount amount) {
110+
111+
return amount == null ? null
112+
: String.format("%s %s", amount.getCurrency().toString(), amount.getNumber().toString());
113+
}
114+
115+
Money convertToEntityAttribute(String source) {
116+
117+
if (source == null) {
118+
return null;
119+
}
120+
121+
try {
122+
return Money.parse(source);
123+
} catch (RuntimeException e) {
124+
125+
try {
126+
return Money.parse(source, FORMAT);
127+
} catch (RuntimeException inner) {
128+
129+
// Propagate the original exception in case the fallback fails
130+
throw e;
131+
}
132+
}
133+
}
134+
}
57135
}

server/src/main/java/de/odrotbohm/restbucks/core/MonetaryAmountAttributeConverter.java

Lines changed: 0 additions & 68 deletions
This file was deleted.

server/src/main/java/de/odrotbohm/restbucks/core/YearAttributeConverter.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

server/src/main/java/de/odrotbohm/restbucks/order/LineItem.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
package de.odrotbohm.restbucks.order;
1717

1818
import de.odrotbohm.restbucks.drinks.Drink;
19+
import de.odrotbohm.restbucks.drinks.Drink.DrinkIdentifier;
1920
import de.odrotbohm.restbucks.drinks.Milk;
2021
import de.odrotbohm.restbucks.drinks.Size;
21-
import de.odrotbohm.restbucks.drinks.Drink.DrinkIdentifier;
2222
import de.odrotbohm.restbucks.order.LineItem.LineItemIdentifier;
2323
import lombok.AllArgsConstructor;
2424
import lombok.Getter;
@@ -30,14 +30,15 @@
3030
import org.jmolecules.ddd.types.Association;
3131
import org.jmolecules.ddd.types.Entity;
3232
import org.jmolecules.ddd.types.Identifier;
33+
import org.springframework.data.annotation.PersistenceCreator;
3334

3435
/**
3536
* A line item.
3637
*
3738
* @author Oliver Drotbohm
3839
*/
3940
@Getter
40-
@AllArgsConstructor
41+
@AllArgsConstructor(onConstructor = @__(@PersistenceCreator))
4142
public class LineItem implements Entity<Order, LineItemIdentifier> {
4243

4344
private final LineItemIdentifier id;

server/src/main/java/de/odrotbohm/restbucks/order/Order.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@
1717

1818
import de.odrotbohm.restbucks.drinks.Drink;
1919
import de.odrotbohm.restbucks.order.Order.OrderIdentifier;
20-
import jakarta.persistence.Column;
21-
import jakarta.persistence.OrderColumn;
22-
import jakarta.persistence.Table;
23-
import jakarta.persistence.Version;
20+
import lombok.AccessLevel;
21+
import lombok.AllArgsConstructor;
2422
import lombok.Getter;
2523
import lombok.ToString;
2624

@@ -36,7 +34,10 @@
3634
import org.jmolecules.ddd.types.AggregateRoot;
3735
import org.jmolecules.ddd.types.Identifier;
3836
import org.jmolecules.event.types.DomainEvent;
37+
import org.springframework.data.annotation.PersistenceCreator;
38+
import org.springframework.data.annotation.Version;
3939
import org.springframework.data.domain.AbstractAggregateRoot;
40+
import org.springframework.data.relational.core.mapping.Column;
4041

4142
/**
4243
* An order.
@@ -45,7 +46,7 @@
4546
*/
4647
@Getter
4748
@ToString(exclude = "lineItems")
48-
@Table(name = "RBOrder")
49+
@AllArgsConstructor(onConstructor = @__(@PersistenceCreator), access = AccessLevel.PRIVATE)
4950
public class Order extends AbstractAggregateRoot<Order> implements AggregateRoot<Order, OrderIdentifier> {
5051

5152
private final OrderIdentifier id;
@@ -54,9 +55,8 @@ public class Order extends AbstractAggregateRoot<Order> implements AggregateRoot
5455
private Status status;
5556
private @Version Long version;
5657

57-
@OrderColumn //
58-
@Column(unique = true) //
59-
private final List<LineItem> lineItems = new ArrayList<>();
58+
@Column //
59+
private final List<LineItem> lineItems;
6060

6161
/**
6262
* Creates a new {@link Order} for the given {@link LineItem}s and {@link Location}.
@@ -69,7 +69,7 @@ public Order(Collection<LineItem> lineItems, Location location) {
6969
this.id = new OrderIdentifier(UUID.randomUUID());
7070
this.location = location == null ? Location.TAKE_AWAY : location;
7171
this.status = Status.PAYMENT_EXPECTED;
72-
this.lineItems.addAll(lineItems);
72+
this.lineItems = new ArrayList<>(lineItems);
7373
this.orderedDate = LocalDateTime.now();
7474
registerEvent(new OrderCreated(id, location));
7575
}

server/src/main/java/de/odrotbohm/restbucks/payment/CreditCard.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package de.odrotbohm.restbucks.payment;
1717

18-
import jakarta.persistence.Column;
1918
import lombok.AllArgsConstructor;
2019
import lombok.Getter;
2120
import lombok.ToString;
@@ -37,7 +36,7 @@
3736
@AllArgsConstructor(onConstructor = @__(@JsonCreator))
3837
public class CreditCard implements AggregateRoot<CreditCard, CreditCardNumber> {
3938

40-
private final @Getter @Column(unique = true) CreditCardNumber number;
39+
private final @Getter CreditCardNumber number;
4140
private final @Getter String cardHolderName;
4241

4342
private Month expiryMonth;

server/src/main/java/de/odrotbohm/restbucks/payment/Payment.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@
1818
import de.odrotbohm.restbucks.order.Order;
1919
import de.odrotbohm.restbucks.order.Order.OrderIdentifier;
2020
import de.odrotbohm.restbucks.payment.Payment.PaymentIdentifier;
21-
import jakarta.persistence.Column;
22-
import jakarta.persistence.Inheritance;
23-
import jakarta.persistence.InheritanceType;
2421
import lombok.Getter;
2522
import lombok.NoArgsConstructor;
2623
import lombok.ToString;
@@ -32,6 +29,7 @@
3229
import org.jmolecules.ddd.types.AggregateRoot;
3330
import org.jmolecules.ddd.types.Association;
3431
import org.jmolecules.ddd.types.Identifier;
32+
import org.springframework.data.relational.core.mapping.Table;
3533
import org.springframework.util.Assert;
3634

3735
/**
@@ -42,13 +40,11 @@
4240
@Getter
4341
@ToString
4442
@NoArgsConstructor(force = true)
45-
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
43+
@Table("CREDIT_CARD_PAYMENT")
4644
public abstract class Payment<T extends AggregateRoot<T, PaymentIdentifier>>
4745
implements AggregateRoot<T, PaymentIdentifier> {
4846

4947
private final PaymentIdentifier id;
50-
51-
@Column(name = "rborder") //
5248
private final Association<Order, OrderIdentifier> order;
5349
private final LocalDateTime paymentDate;
5450

0 commit comments

Comments
 (0)