Skip to content

Commit a6f077a

Browse files
committed
#51 Replace shared API classes with codegen from OpenAPI/JSON schema - Defined JSON schema for Restaurant Service events and used them in the Order Service
1 parent b005f81 commit a6f077a

File tree

25 files changed

+325
-76
lines changed

25 files changed

+325
-76
lines changed

build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ subprojects {
3737
mavenCentral()
3838
jcenter()
3939

40+
maven {
41+
url 'https://jitpack.io'
42+
}
43+
4044
maven {
4145
url 'https://repo.spring.io/libs-milestone'
4246
}

ftgo-consumer-service/build.gradle

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22

33
apply plugin: FtgoServicePlugin
44

5-
repositories {
6-
maven {
7-
url 'https://jitpack.io'
8-
}
5+
configurations.all {
6+
// Out of date, conflicting JSON library
7+
exclude group: "com.vaadin.external.google"
98
}
109

1110
dependencies {
@@ -36,6 +35,6 @@ dependencies {
3635

3736
testCompile "com.atlassian.oai:swagger-request-validator-springmvc:${swaggerRequestValidatorVersion}"
3837
testCompile 'io.rest-assured:spring-mock-mvc:3.0.6'
39-
testCompile "com.github.everit-org.json-schema:org.everit.json.schema:1.12.0"
38+
testCompile project(":ftgo-test-util-json-schema")
4039

4140
}

ftgo-consumer-service/src/test/java/net/chrisrichardson/ftgo/consumerservice/api/ValidateOrderByConsumerTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
import net.chrisrichardson.ftgo.common.CommonJsonMapperInitializer;
44
import net.chrisrichardson.ftgo.common.Money;
5-
import org.junit.Test;
6-
5+
import net.chrisrichardson.ftgo.testutil.jsonschema.ValidatingJSONMapper;
76
import org.json.JSONObject;
7+
import org.junit.Test;
88

9-
import static org.junit.Assert.*;
9+
import static org.junit.Assert.assertEquals;
1010

1111
public class ValidateOrderByConsumerTest {
1212

ftgo-order-service/build.gradle

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ buildscript {
2020

2121
classpath "org.jsonschema2pojo:jsonschema2pojo-gradle-plugin:${js2pVersion}"
2222
classpath "io.eventuate.tram.core:eventuate-tram-commands:$eventuateTramVersion"
23+
classpath "io.eventuate.tram.core:eventuate-tram-events:$eventuateTramVersion"
2324

2425
}
2526
}
@@ -117,6 +118,7 @@ dependencies {
117118

118119
ftgoApiSpecification project(":ftgo-consumer-service-api-spec")
119120
ftgoApiSpecification project(":ftgo-accounting-service-api-spec")
121+
ftgoApiSpecification project(":ftgo-restaurant-service-api-spec")
120122

121123
compile project(":common-swagger")
122124
compile project(":ftgo-common-jpa")
@@ -130,7 +132,7 @@ dependencies {
130132
compile project(":ftgo-accounting-service-api")
131133
compile project(":ftgo-consumer-service-api")
132134
compile project(":ftgo-kitchen-service-api")
133-
compile project(":ftgo-restaurant-service-api")
135+
compile project(":ftgo-restaurant-service-api-temp")
134136
compile project(":ftgo-order-service-api")
135137

136138

@@ -196,6 +198,13 @@ ftgoJsonSchema2Pojo {
196198
generateBuilders = true
197199
useLongIntegers = true
198200
}
201+
ftgoRestaurantService {
202+
source = files("${ftgoApiSpecsDir}/ftgo-restaurant-service-api-spec")
203+
targetPackage = "net.chrisrichardson.ftgo.restaurantservice.events"
204+
includeAdditionalProperties = false
205+
generateBuilders = true
206+
useLongIntegers = true
207+
}
199208

200209
}
201210

ftgo-order-service/src/attic/AbstractOrderServiceComponentTest.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,15 @@
66
import io.eventuate.util.test.async.Eventually;
77
import net.chrisrichardson.ftgo.accountservice.api.AuthorizeCommand;
88
import net.chrisrichardson.ftgo.consumerservice.api.ValidateOrderByConsumer;
9+
import net.chrisrichardson.ftgo.kitchenservice.api.ConfirmCreateTicket;
10+
import net.chrisrichardson.ftgo.kitchenservice.api.CreateTicket;
11+
import net.chrisrichardson.ftgo.kitchenservice.api.CreateTicketReply;
912
import net.chrisrichardson.ftgo.orderservice.api.web.CreateOrderRequest;
1013
import net.chrisrichardson.ftgo.orderservice.domain.RestaurantRepository;
1114
import net.chrisrichardson.ftgo.orderservice.messaging.OrderServiceMessagingConfiguration;
1215
import net.chrisrichardson.ftgo.orderservice.sagaparticipants.ApproveOrderCommand;
1316
import net.chrisrichardson.ftgo.orderservice.service.OrderCommandHandlersConfiguration;
1417
import net.chrisrichardson.ftgo.orderservice.web.OrderWebConfiguration;
15-
import net.chrisrichardson.ftgo.kitchenservice.api.ConfirmCreateTicket;
16-
import net.chrisrichardson.ftgo.kitchenservice.api.CreateTicket;
17-
import net.chrisrichardson.ftgo.kitchenservice.api.CreateTicketReply;
18-
import net.chrisrichardson.ftgo.restaurantservice.events.RestaurantCreated;
1918
import org.junit.Before;
2019
import org.junit.Test;
2120
import org.springframework.beans.factory.annotation.Autowired;
@@ -27,7 +26,6 @@
2726

2827
import static io.eventuate.tram.commands.consumer.CommandHandlerReplyBuilder.withSuccess;
2928
import static io.restassured.RestAssured.given;
30-
import static net.chrisrichardson.ftgo.orderservice.RestaurantMother.AJANTA_RESTAURANT_MENU;
3129
import static org.junit.Assert.assertNotNull;
3230

3331
public abstract class AbstractOrderServiceComponentTest {
@@ -92,7 +90,7 @@ public void shouldCreateOrder() {
9290

9391

9492
domainEventPublisher.publish("net.chrisrichardson.ftgo.restaurantservice.domain.Restaurant", RestaurantMother.AJANTA_ID,
95-
Collections.singletonList(new RestaurantCreated(RestaurantMother.AJANTA_RESTAURANT_NAME, AJANTA_RESTAURANT_MENU)));
93+
Collections.singletonList(RestaurantMother.makeAjantaRestaurantCreatedEvent()));
9694

9795

9896
Eventually.eventually(() -> {

ftgo-order-service/src/attic/OrderServiceOutOfProcessComponentV0Test.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
import net.chrisrichardson.ftgo.orderservice.messaging.OrderServiceMessagingConfiguration;
1515
import net.chrisrichardson.ftgo.orderservice.service.OrderCommandHandlersConfiguration;
1616
import net.chrisrichardson.ftgo.orderservice.web.OrderWebConfiguration;
17-
import net.chrisrichardson.ftgo.restaurantservice.events.RestaurantCreated;
18-
import net.chrisrichardson.ftgo.restaurantservice.events.RestaurantMenu;
1917
import org.junit.Test;
2018
import org.junit.runner.RunWith;
2119
import org.springframework.beans.factory.annotation.Autowired;
@@ -105,8 +103,7 @@ private String baseUrl(String path) {
105103
@Test
106104
public void shouldCreateOrder() throws InterruptedException {
107105
domainEventPublisher.publish("net.chrisrichardson.ftgo.restaurantservice.domain.Restaurant", RestaurantMother.AJANTA_ID,
108-
Collections.singletonList(new RestaurantCreated(RestaurantMother.AJANTA_RESTAURANT_NAME,
109-
new RestaurantMenu(Collections.singletonList(RestaurantMother.CHICKEN_VINDALOO_MENU_ITEM)))));
106+
Collections.singletonList(RestaurantMother.makeAjantaRestaurantCreatedEvent()));
110107

111108
Eventually.eventually(() -> {
112109
FtgoTestUtil.assertPresent(restaurantRepository.findById(RestaurantMother.AJANTA_ID));

ftgo-order-service/src/component-test/java/net/chrisrichardson/ftgo/orderservice/cucumber/OrderServiceComponentTestStepDefinitions.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@
55
import cucumber.api.java.en.Given;
66
import cucumber.api.java.en.Then;
77
import cucumber.api.java.en.When;
8-
import io.eventuate.tram.jdbckafka.TramJdbcKafkaConfiguration;
98
import io.eventuate.tram.events.publisher.DomainEventPublisher;
10-
import io.eventuate.tram.messaging.common.ChannelMapping;
11-
import io.eventuate.tram.messaging.common.DefaultChannelMapping;
9+
import io.eventuate.tram.jdbckafka.TramJdbcKafkaConfiguration;
1210
import io.eventuate.tram.messaging.consumer.MessageConsumer;
1311
import io.eventuate.tram.sagas.testing.SagaParticipantChannels;
1412
import io.eventuate.tram.sagas.testing.SagaParticipantStubManager;
@@ -27,7 +25,6 @@
2725
import net.chrisrichardson.ftgo.orderservice.api.web.CreateOrderRequest;
2826
import net.chrisrichardson.ftgo.orderservice.domain.Order;
2927
import net.chrisrichardson.ftgo.orderservice.domain.RestaurantRepository;
30-
import net.chrisrichardson.ftgo.restaurantservice.events.RestaurantCreated;
3128
import net.chrisrichardson.ftgo.testutil.FtgoTestUtil;
3229
import org.springframework.beans.factory.annotation.Autowired;
3330
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -46,8 +43,6 @@
4643
import static io.eventuate.util.test.async.Eventually.eventually;
4744
import static io.restassured.RestAssured.given;
4845
import static java.util.Collections.singleton;
49-
import static net.chrisrichardson.ftgo.orderservice.RestaurantMother.AJANTA_RESTAURANT_MENU;
50-
import static net.chrisrichardson.ftgo.orderservice.RestaurantMother.RESTAURANT_ADDRESS;
5146
import static org.junit.Assert.*;
5247

5348

@@ -145,7 +140,7 @@ public void restaurantAcceptsOrder() {
145140

146141
if (!restaurantRepository.findById(RestaurantMother.AJANTA_ID).isPresent()) {
147142
domainEventPublisher.publish("net.chrisrichardson.ftgo.restaurantservice.domain.Restaurant", RestaurantMother.AJANTA_ID,
148-
Collections.singletonList(new RestaurantCreated(RestaurantMother.AJANTA_RESTAURANT_NAME, RESTAURANT_ADDRESS, AJANTA_RESTAURANT_MENU)));
143+
Collections.singletonList(RestaurantMother.makeAjantaRestaurantCreatedEvent()));
149144

150145
eventually(() -> {
151146
FtgoTestUtil.assertPresent(restaurantRepository.findById(RestaurantMother.AJANTA_ID));

ftgo-order-service/src/integration-test/java/net/chrisrichardson/ftgo/orderservice/domain/OrderServiceIntegrationTest.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import io.eventuate.tram.sagas.inmemory.TramSagaInMemoryConfiguration;
99
import io.eventuate.tram.testutil.TestMessageConsumerFactory;
1010
import io.eventuate.util.test.async.Eventually;
11-
import net.chrisrichardson.ftgo.common.Money;
1211
import net.chrisrichardson.ftgo.consumerservice.api.ConsumerServiceChannels;
1312
import net.chrisrichardson.ftgo.consumerservice.api.ValidateOrderByConsumer;
1413
import net.chrisrichardson.ftgo.orderservice.OrderDetailsMother;
@@ -17,9 +16,6 @@
1716
import net.chrisrichardson.ftgo.orderservice.service.OrderCommandHandlersConfiguration;
1817
import net.chrisrichardson.ftgo.orderservice.web.MenuItemIdAndQuantity;
1918
import net.chrisrichardson.ftgo.orderservice.web.OrderWebConfiguration;
20-
import net.chrisrichardson.ftgo.restaurantservice.events.MenuItem;
21-
import net.chrisrichardson.ftgo.restaurantservice.events.RestaurantCreated;
22-
import net.chrisrichardson.ftgo.restaurantservice.events.RestaurantMenu;
2319
import net.chrisrichardson.ftgo.testutil.FtgoTestUtil;
2420
import org.junit.Test;
2521
import org.junit.runner.RunWith;
@@ -92,8 +88,7 @@ public TestMessageConsumer2 mockConsumerService() {
9288
@Test
9389
public void shouldCreateOrder() {
9490
domainEventPublisher.publish("net.chrisrichardson.ftgo.restaurantservice.domain.Restaurant", RESTAURANT_ID,
95-
Collections.singletonList(new RestaurantCreated("Ajanta", RestaurantMother.RESTAURANT_ADDRESS,
96-
new RestaurantMenu(Collections.singletonList(new MenuItem(CHICKED_VINDALOO_MENU_ITEM_ID, "Chicken Vindaloo", new Money("12.34")))))));
91+
Collections.singletonList(RestaurantMother.makeAjantaRestaurantCreatedEvent()));
9792

9893
Eventually.eventually(() -> {
9994
FtgoTestUtil.assertPresent(restaurantRepository.findById(Long.parseLong(RESTAURANT_ID)));
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package net.chrisrichardson.ftgo.orderservice.domain;
2+
3+
import net.chrisrichardson.ftgo.common.Money;
4+
import org.apache.commons.lang.builder.EqualsBuilder;
5+
import org.apache.commons.lang.builder.HashCodeBuilder;
6+
import org.apache.commons.lang.builder.ToStringBuilder;
7+
8+
import javax.persistence.Access;
9+
import javax.persistence.AccessType;
10+
import javax.persistence.Embeddable;
11+
12+
@Embeddable
13+
@Access(AccessType.FIELD)
14+
public class MenuItem {
15+
16+
private String id;
17+
private String name;
18+
private Money price;
19+
20+
private MenuItem() {
21+
}
22+
23+
public MenuItem(String id, String name, Money price) {
24+
this.id = id;
25+
this.name = name;
26+
this.price = price;
27+
}
28+
29+
@Override
30+
public boolean equals(Object o) {
31+
return EqualsBuilder.reflectionEquals(this, o);
32+
}
33+
34+
@Override
35+
public int hashCode() {
36+
return HashCodeBuilder.reflectionHashCode(this);
37+
}
38+
39+
@Override
40+
public String toString() {
41+
return ToStringBuilder.reflectionToString(this);
42+
}
43+
44+
public String getId() {
45+
return id;
46+
}
47+
48+
public void setId(String id) {
49+
this.id = id;
50+
}
51+
52+
public String getName() {
53+
return name;
54+
}
55+
56+
public void setName(String name) {
57+
this.name = name;
58+
}
59+
60+
public Money getPrice() {
61+
return price;
62+
}
63+
64+
public void setPrice(Money price) {
65+
this.price = price;
66+
}
67+
}

ftgo-order-service/src/main/java/net/chrisrichardson/ftgo/orderservice/domain/OrderService.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@
44
import io.eventuate.tram.events.publisher.DomainEventPublisher;
55
import io.eventuate.tram.sagas.orchestration.SagaManager;
66
import io.micrometer.core.instrument.MeterRegistry;
7-
import net.chrisrichardson.ftgo.common.Address;
87
import net.chrisrichardson.ftgo.orderservice.api.events.OrderDetails;
98
import net.chrisrichardson.ftgo.orderservice.api.events.OrderDomainEvent;
109
import net.chrisrichardson.ftgo.orderservice.api.events.OrderLineItem;
1110
import net.chrisrichardson.ftgo.orderservice.sagas.cancelorder.CancelOrderSagaData;
1211
import net.chrisrichardson.ftgo.orderservice.sagas.createorder.CreateOrderSagaState;
1312
import net.chrisrichardson.ftgo.orderservice.sagas.reviseorder.ReviseOrderSagaData;
1413
import net.chrisrichardson.ftgo.orderservice.web.MenuItemIdAndQuantity;
15-
import net.chrisrichardson.ftgo.restaurantservice.events.MenuItem;
16-
import net.chrisrichardson.ftgo.restaurantservice.events.RestaurantMenu;
1714
import org.slf4j.Logger;
1815
import org.slf4j.LoggerFactory;
1916
import org.springframework.transaction.annotation.Propagation;
@@ -161,15 +158,15 @@ public void confirmRevision(long orderId, OrderRevision revision) {
161158
}
162159

163160
@Transactional(propagation = Propagation.MANDATORY)
164-
public void createMenu(long id, String name, RestaurantMenu menu) {
165-
Restaurant restaurant = new Restaurant(id, name, menu.getMenuItems());
161+
public void createMenu(long id, String name, List<MenuItem> menuItems) {
162+
Restaurant restaurant = new Restaurant(id, name, menuItems);
166163
restaurantRepository.save(restaurant);
167164
}
168165

169166
@Transactional(propagation = Propagation.MANDATORY)
170-
public void reviseMenu(long id, RestaurantMenu revisedMenu) {
167+
public void reviseMenu(long id, List<MenuItem> menuItems) {
171168
restaurantRepository.findById(id).map(restaurant -> {
172-
List<OrderDomainEvent> events = restaurant.reviseMenu(revisedMenu);
169+
List<OrderDomainEvent> events = restaurant.reviseMenu(menuItems);
173170
return restaurant;
174171
}).orElseThrow(RuntimeException::new);
175172
}

0 commit comments

Comments
 (0)