Skip to content

Commit

Permalink
Fixes #38 Implement repo.delete
Browse files Browse the repository at this point in the history
  • Loading branch information
daviddawson committed Jun 8, 2017
1 parent 43f538d commit 9d5ae4a
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
import io.muoncore.newton.EventHandler;
import io.muoncore.newton.StreamSubscriptionManager;
import io.muoncore.newton.UniqueAggregateDomainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
@Slf4j
public class UniqueTaskDescriptionDomainService extends UniqueAggregateDomainService<String> {

@Autowired
Expand All @@ -23,6 +25,7 @@ protected String[] eventStreams() {

@EventHandler
public void handle(TaskCreatedEvent event){
log.info("Processing event into view {}", event);
if (event.getDescription().equals("exception")){
throw new RuntimeException("Unique name exception....");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package io.muoncore.newton;

import io.muoncore.newton.eventsource.AggregateDeletedEvent;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

public abstract class AggregateRoot<T> {

@Getter
private boolean deleted;
private long version;
private transient DynamicInvokeEventAdaptor eventAdaptor = new DynamicInvokeEventAdaptor(this, EventHandler.class);

Expand All @@ -26,6 +31,13 @@ public List<NewtonEvent> getNewOperations() {
}

public void handleEvent(NewtonEvent event) {

if (event instanceof AggregateDeletedEvent) {
deleted = true;
version++;
return;
}

boolean eventHandled = eventAdaptor.apply(event);

if (!eventHandled) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.muoncore.newton.eventsource;

import io.muoncore.newton.NewtonEvent;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class AggregateDeletedEvent implements NewtonEvent<Object> {
private Object id;
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ public interface EventSourceRepository<A extends AggregateRoot> {
*/
List<NewtonEvent> save(A aggregate);

/**
* Delete this aggregate root. Its events may still be retrievable via replay, however a call to `load` will throw
* AggregateNotFoundException
* @param aggregate
*/
List<NewtonEvent> delete(A aggregate);

/**
* Cold replay of the event contents of an aggregate root.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@

import io.muoncore.newton.AggregateRoot;
import io.muoncore.newton.NewtonEvent;
import io.muoncore.newton.eventsource.AggregateNotFoundException;
import io.muoncore.newton.eventsource.AggregateRootUtil;
import io.muoncore.newton.eventsource.EventSourceRepository;
import io.muoncore.newton.eventsource.OptimisticLockException;
import io.muoncore.newton.eventsource.*;
import io.muoncore.newton.utils.muon.MuonLookupUtils;
import io.muoncore.protocol.event.ClientEvent;
import io.muoncore.protocol.event.Event;
Expand Down Expand Up @@ -47,6 +44,7 @@ public A load(Object aggregateIdentifier) {
try {
A aggregate = aggregateType.newInstance();
replayEvents(aggregateIdentifier).forEach(aggregate::handleEvent);
if (aggregate.isDeleted()) throw new AggregateNotFoundException(aggregateIdentifier);
return aggregate;
} catch (AggregateNotFoundException e) {
throw e;
Expand Down Expand Up @@ -89,6 +87,12 @@ public List<NewtonEvent> save(A aggregate) {
return events;
}

@Override
public List<NewtonEvent> delete(A aggregate) {
aggregate.getNewOperations().add(new AggregateDeletedEvent(aggregate.getId()));
return save(aggregate);
}

private Publisher<NewtonEvent> subscribe(Object aggregateIdentifier, EventReplayMode mode) {
return sub -> eventClient.replay("/aggregate/" + aggregateIdentifier.toString(), mode, new Subscriber<Event>() {
public void onSubscribe(Subscription s) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import io.muoncore.eventstore.TestEventStore;
import io.muoncore.newton.MuonTestConfiguration;
import io.muoncore.newton.NewtonEvent;
import io.muoncore.newton.eventsource.AggregateDeletedEvent;
import io.muoncore.newton.eventsource.AggregateNotFoundException;
import io.muoncore.newton.eventsource.OptimisticLockException;
import io.muoncore.newton.mongo.MongoConfiguration;
Expand Down Expand Up @@ -62,6 +63,30 @@ public void save() throws Exception {
assertEquals(TestAggregateCreated.class.getSimpleName(), events.get(0).getEventType());
}

@Test
public void deleteCreatesDeletedEvent() throws Exception {
String id = UUID.randomUUID().toString();
TestAggregate customer = new TestAggregate(id);
repository.save(customer);

repository.delete(customer);

List<Event> events = client.loadAggregateRoot(id.toString());

assertEquals(2, events.size());
assertEquals(AggregateDeletedEvent.class.getSimpleName(), events.get(1).getEventType());
}

@Test(expected = AggregateNotFoundException.class)
public void loadDeletedAggregateThrowsException() throws Exception {
String id = UUID.randomUUID().toString();
TestAggregate customer = new TestAggregate(id);
repository.save(customer);
repository.delete(customer);

repository.load(id);
}

@Test(expected = AggregateNotFoundException.class)
public void throwsExceptionOnNonExistingAggregate() {
repository.load("no-such-id-as-this");
Expand Down

0 comments on commit 9d5ae4a

Please sign in to comment.