Skip to content

Commit d54d0af

Browse files
committed
Send events over rabbitmq [ACC-2107]
1 parent e47aed7 commit d54d0af

File tree

11 files changed

+122
-162
lines changed

11 files changed

+122
-162
lines changed

contentgrid-appserver-app/src/main/resources/application-bootRun.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ contentgrid:
1111
system:
1212
policyPackage: xfb0e9318f3894300a64edba3532e6ac0
1313

14+
spring:
15+
rabbitmq:
16+
host: localhost
17+
port: 5672
18+
username: guest
19+
password: guest
20+
1421
# When unauthenticated, you get HTTP 403 instead of 401 if you don't have the following
1522

1623
#spring:

contentgrid-appserver-autoconfigure/src/main/java/com/contentgrid/appserver/autoconfigure/events/ContentGridEventsAutoConfiguration.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,30 @@
33
import com.contentgrid.appserver.autoconfigure.query.engine.JOOQQueryEngineAutoConfiguration;
44
import com.contentgrid.appserver.domain.events.DomainEventDispatcher;
55
import com.contentgrid.appserver.domain.events.EntityFormatter;
6+
import com.contentgrid.appserver.events.RabbitMqEventHandlers;
7+
import org.springframework.beans.factory.ObjectProvider;
68
import com.contentgrid.appserver.events.EventHandlerConfiguration;
79
import com.contentgrid.appserver.query.engine.api.EventConsumer;
810
import org.springframework.boot.autoconfigure.AutoConfiguration;
11+
import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
912
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
1013
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
1114
import org.springframework.context.annotation.Bean;
1215
import org.springframework.context.annotation.Import;
1316

1417
@AutoConfiguration(before = {
1518
JOOQQueryEngineAutoConfiguration.class,
19+
}, after = {
20+
RabbitAutoConfiguration.class,
1621
})
1722
@ConditionalOnWebApplication
1823
@ConditionalOnClass(EventHandlerConfiguration.class)
1924
@Import(EventHandlerConfiguration.class)
2025
public class ContentGridEventsAutoConfiguration {
2126

2227
@Bean
23-
EventConsumer eventConsumer(EntityFormatter formatter) {
24-
return new DomainEventDispatcher(formatter);
28+
EventConsumer eventConsumer(EntityFormatter formatter, ObjectProvider<RabbitMqEventHandlers> rabbitProvider) {
29+
var rabbit = rabbitProvider.getIfAvailable();
30+
return (rabbit != null) ? new DomainEventDispatcher(formatter, rabbit) : new DomainEventDispatcher(formatter);
2531
}
2632
}

contentgrid-appserver-domain/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ plugins {
77
dependencies {
88
api project(':contentgrid-appserver-application-model')
99
api project(':contentgrid-appserver-query-engine-api')
10+
// api project(':contentgrid-appserver-events')
1011
api 'com.contentgrid.hateoas:contentgrid-pagination-api'
1112
api 'com.fasterxml.jackson.core:jackson-databind'
1213

contentgrid-appserver-domain/src/main/java/com/contentgrid/appserver/domain/events/DomainEventDispatcher.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,21 @@
66
import com.contentgrid.appserver.domain.data.mapper.AttributeDataToDataEntryMapper;
77
import com.contentgrid.appserver.query.engine.api.EventConsumer;
88
import com.contentgrid.appserver.query.engine.api.data.EntityData;
9-
import lombok.RequiredArgsConstructor;
109
import lombok.extern.slf4j.Slf4j;
1110

1211
@Slf4j
13-
@RequiredArgsConstructor
1412
public class DomainEventDispatcher implements EventConsumer {
1513
private final EntityFormatter formatter;
14+
private final FormattedEventDispatcher rabbitMqEventDispatcher;
15+
16+
public DomainEventDispatcher(EntityFormatter formatter) {
17+
this(formatter, null);
18+
}
19+
20+
public DomainEventDispatcher(EntityFormatter formatter, FormattedEventDispatcher formattedEventDispatcher) {
21+
this.formatter = formatter;
22+
this.rabbitMqEventDispatcher = formattedEventDispatcher;
23+
}
1624

1725
@Override
1826
public void dispatchCreate(Application application, EntityName entity, EntityData data) {
@@ -27,15 +35,47 @@ public void dispatchCreate(Application application, EntityName entity, EntityDat
2735
var entityInstance = mapper.mapAttributes(data);
2836
var jsonNode = formatter.format(application, entity, entityInstance);
2937
log.info("[[[ JSON ]]]\n{}", jsonNode);
38+
if (rabbitMqEventDispatcher != null) {
39+
rabbitMqEventDispatcher.dispatchCreate(entity.getValue(), jsonNode);
40+
}
3041
}
3142

3243
@Override
3344
public void dispatchUpdate(Application application, EntityName entity, EntityData oldData, EntityData newData) {
3445
log.info("=== UPDATE === [{}] Was:\n{}\nBecomes:\n{}", entity, oldData, newData);
46+
47+
var ent = application.getRequiredEntityByName(entity);
48+
var mapper = new ResponseOutputDataMapper(
49+
ent.getAttributes(),
50+
new AttributeDataToDataEntryMapper()
51+
);
52+
53+
var oldInstance = mapper.mapAttributes(oldData);
54+
var newInstance = mapper.mapAttributes(newData);
55+
56+
var oldJson = formatter.format(application, entity, oldInstance);
57+
var newJson = formatter.format(application, entity, newInstance);
58+
59+
if (rabbitMqEventDispatcher != null) {
60+
rabbitMqEventDispatcher.dispatchUpdate(entity.getValue(), oldJson, newJson);
61+
}
3562
}
3663

3764
@Override
3865
public void dispatchDelete(Application application, EntityName entity, EntityData oldData) {
3966
log.info("=== DELETE === [{}]: {}", entity, oldData);
67+
68+
var ent = application.getRequiredEntityByName(entity);
69+
var mapper = new ResponseOutputDataMapper(
70+
ent.getAttributes(),
71+
new AttributeDataToDataEntryMapper()
72+
);
73+
74+
var oldInstance = mapper.mapAttributes(oldData);
75+
var oldJson = formatter.format(application, entity, oldInstance);
76+
77+
if (rabbitMqEventDispatcher != null) {
78+
rabbitMqEventDispatcher.dispatchDelete(entity.getValue(), oldJson);
79+
}
4080
}
4181
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.contentgrid.appserver.domain.events;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
5+
public interface FormattedEventDispatcher {
6+
void dispatchCreate(String entity, JsonNode newData);
7+
void dispatchUpdate(String entity, JsonNode oldData, JsonNode newData);
8+
void dispatchDelete(String entity, JsonNode oldData);
9+
}

contentgrid-appserver-events/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ dependencies {
1010

1111
api 'org.springframework.boot:spring-boot-starter'
1212

13-
implementation 'org.springframework.boot:spring-boot-starter-amqp'
13+
api 'org.springframework.boot:spring-boot-starter-amqp'
1414
implementation project(':contentgrid-appserver-rest')
1515
implementation 'com.fasterxml.jackson.core:jackson-databind'
1616

contentgrid-appserver-events/src/main/java/com/contentgrid/appserver/events/EntityChangeEvent.java

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

contentgrid-appserver-events/src/main/java/com/contentgrid/appserver/events/EntityChangeEventPayload.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.fasterxml.jackson.annotation.JsonProperty;
44
import com.fasterxml.jackson.databind.JsonNode;
5-
import java.io.Serializable;
65
import lombok.Getter;
76
import lombok.NonNull;
87
import lombok.RequiredArgsConstructor;
@@ -23,4 +22,26 @@ public class EntityChangeEventPayload {
2322
public JsonNode getNew() {
2423
return _new;
2524
}
25+
26+
@RequiredArgsConstructor
27+
public enum ChangeKind {
28+
CREATE("create"),
29+
UPDATE("update"),
30+
DELETE("delete");
31+
32+
@Getter
33+
private final String value;
34+
}
35+
36+
public static EntityChangeEventPayload forCreate(@NonNull JsonNode newData) {
37+
return new EntityChangeEventPayload(ChangeKind.CREATE.getValue(), null, newData);
38+
}
39+
40+
public static EntityChangeEventPayload forUpdate(@NonNull JsonNode oldData, @NonNull JsonNode newData) {
41+
return new EntityChangeEventPayload(ChangeKind.UPDATE.getValue(), oldData, newData);
42+
}
43+
44+
public static EntityChangeEventPayload forDelete(@NonNull JsonNode oldData) {
45+
return new EntityChangeEventPayload(ChangeKind.DELETE.getValue(), oldData, null);
46+
}
2647
}
Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.contentgrid.appserver.events;
22

3-
import com.fasterxml.jackson.databind.ObjectMapper;
4-
import com.fasterxml.jackson.databind.SerializationFeature;
53
import lombok.RequiredArgsConstructor;
64
import org.springframework.amqp.rabbit.core.RabbitTemplate;
75
import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
6+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
87
import org.springframework.boot.context.properties.ConfigurationProperties;
98
import org.springframework.context.annotation.Bean;
109
import org.springframework.context.annotation.Configuration;
@@ -18,15 +17,13 @@ ContentGridEventHandlerProperties contentgridEventHandlerProperties() {
1817
return new ContentGridEventHandlerProperties();
1918
}
2019

21-
// @Bean
22-
// EventHandlers rabbitEventHandlers(RabbitTemplate rabbitTemplate, RabbitProperties rabbitProperties,
23-
// ContentGridEventHandlerProperties contentGridProps, EventMapper eventMapper) {
24-
// return new RabbitMqEventHandlers(rabbitTemplate, rabbitProperties, contentGridProps, eventMapper);
25-
// }
26-
2720
@Bean
28-
EventMapper eventMapper(ObjectMapper objectMapper) {
29-
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
30-
return new EventMapper(objectMapper);
21+
@ConditionalOnBean({RabbitTemplate.class, RabbitProperties.class})
22+
RabbitMqEventHandlers rabbitEventHandlers(RabbitTemplate rabbitTemplate,
23+
RabbitProperties rabbitProperties,
24+
ContentGridEventHandlerProperties contentGridProps,
25+
com.fasterxml.jackson.databind.ObjectMapper objectMapper) {
26+
return new RabbitMqEventHandlers(rabbitTemplate, rabbitProperties, contentGridProps, objectMapper);
3127
}
28+
3229
}

contentgrid-appserver-events/src/main/java/com/contentgrid/appserver/events/EventMapper.java

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

0 commit comments

Comments
 (0)