diff --git a/.travis.yml b/.travis.yml index 97886c7..b8e534a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,3 +25,5 @@ install: true script: - ./gradlew assemble --warning-mode all - ./gradlew check --warning-mode all + # Checks the application is running ok + - ./gradlew :app:run --warning-mode all diff --git a/README.md b/README.md index e42d99f..9d84dfb 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ > You can do awesome stuff with Java 🙂 [![CodelyTV](https://img.shields.io/badge/codely-tv-green.svg?style=flat-square)](https://codely.tv) -[![Build Status](https://travis-ci.com/CodelyTV/cqrs-ddd-java-example.svg?branch=master)](https://travis-ci.com/CodelyTV/cqrs-ddd-java-example) +[![Build Status](https://travis-ci.org/CodelyTV/cqrs-ddd-java-example.svg?branch=master)](https://travis-ci.org/CodelyTV/cqrs-ddd-java-example) Implementation example of a Java application following Domain-Driven Design (DDD) and Command Query Responsibility Segregation (CQRS) principles, keeping the code as simple as possible. diff --git a/applications/build.gradle b/applications/build.gradle new file mode 100644 index 0000000..f21fa92 --- /dev/null +++ b/applications/build.gradle @@ -0,0 +1,9 @@ +apply plugin: 'application' + +mainClassName = 'tv.codely.Starter' + +dependencies { + compile project(":src:backoffice") + compile project(":src:mooc") +} + diff --git a/applications/main/tv/codely/Starter.java b/applications/main/tv/codely/Starter.java new file mode 100644 index 0000000..13e231e --- /dev/null +++ b/applications/main/tv/codely/Starter.java @@ -0,0 +1,7 @@ +package tv.codely; + +public class Starter { + public static void main(String[] args) { + System.out.println("In Works!"); + } +} diff --git a/build.gradle b/build.gradle index 1a08332..8489a4f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,36 +1,58 @@ -apply plugin: 'java' -apply plugin: 'application' - -sourceCompatibility = 1.11 -targetCompatibility = 1.11 - -repositories { - mavenCentral() - jcenter() +buildscript { + repositories { + mavenCentral() + jcenter() + } } -dependencies { - // Prod - implementation 'io.projectreactor:reactor-bus:2.0.8.RELEASE' +allprojects { + apply plugin: 'java' - // Test - testCompile "org.mockito:mockito-core:2.+" - testCompile 'org.junit.jupiter:junit-jupiter-api:5.+' - testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.+' -} + sourceCompatibility = 11 + targetCompatibility = 11 -test { - useJUnitPlatform() + repositories { + mavenCentral() + } - testLogging { - events "passed", "skipped", "failed" + sourceSets { + main { + java { srcDirs = [ 'main' ] } + } + test { + java { srcDirs = [ 'test' ] } + } } - reports { - html.enabled = true + task hello { + doLast { task -> + println "I'm $task.project.name" + } } } -application { - mainClassName = "tv.codely.context.video.module.video.infrastructure.VideoPublisherCliController" +subprojects { + group = "tv.codely.${rootProject.name}" + + dependencies { + // Prod + implementation 'io.projectreactor:reactor-bus:2.0.8.RELEASE' + + // Test + testCompile "org.mockito:mockito-core:2.+" + testCompile 'org.junit.jupiter:junit-jupiter-api:5.+' + testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.+' + } + + test { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed" + } + + reports { + html.enabled = true + } + } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 558870d..a3aad77 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Sun Feb 24 20:05:13 CET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..78b699c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,6 @@ +rootProject.name = 'cqrs-ddd-java-example' + +include 'applications' +include 'src:backoffice' +include 'src:mooc' +include 'src:shared' diff --git a/src/backoffice/build.gradle b/src/backoffice/build.gradle new file mode 100644 index 0000000..986f161 --- /dev/null +++ b/src/backoffice/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile project(":src:shared") +} diff --git a/src/main/java/tv/codely/context/video/module/video/infrastructure/.gitkeep b/src/main/java/tv/codely/context/video/module/video/infrastructure/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/mooc/build.gradle b/src/mooc/build.gradle new file mode 100644 index 0000000..986f161 --- /dev/null +++ b/src/mooc/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile project(":src:shared") +} diff --git a/src/main/java/tv/codely/context/notification/module/push/application/create/SendPushToSubscribersOnVideoPublished.java b/src/mooc/main/tv/codely/mooc/notification/module/push/application/create/SendPushToSubscribersOnVideoPublished.java similarity index 72% rename from src/main/java/tv/codely/context/notification/module/push/application/create/SendPushToSubscribersOnVideoPublished.java rename to src/mooc/main/tv/codely/mooc/notification/module/push/application/create/SendPushToSubscribersOnVideoPublished.java index ce70b4c..496eefc 100644 --- a/src/main/java/tv/codely/context/notification/module/push/application/create/SendPushToSubscribersOnVideoPublished.java +++ b/src/mooc/main/tv/codely/mooc/notification/module/push/application/create/SendPushToSubscribersOnVideoPublished.java @@ -1,7 +1,7 @@ -package tv.codely.context.notification.module.push.application.create; +package tv.codely.mooc.notification.module.push.application.create; -import tv.codely.context.video.module.video.domain.VideoPublished; -import tv.codely.shared.application.DomainEventSubscriber; +import tv.codely.mooc.video.module.video.domain.VideoPublished; +import tv.codely.mooc.shared.application.DomainEventSubscriber; public class SendPushToSubscribersOnVideoPublished implements DomainEventSubscriber { @Override diff --git a/src/main/java/tv/codely/context/notification/module/push/application/find/.gitkeep b/src/mooc/main/tv/codely/mooc/notification/module/push/application/find/.gitkeep similarity index 100% rename from src/main/java/tv/codely/context/notification/module/push/application/find/.gitkeep rename to src/mooc/main/tv/codely/mooc/notification/module/push/application/find/.gitkeep diff --git a/src/main/java/tv/codely/context/notification/module/push/domain/.gitkeep b/src/mooc/main/tv/codely/mooc/notification/module/push/domain/.gitkeep similarity index 100% rename from src/main/java/tv/codely/context/notification/module/push/domain/.gitkeep rename to src/mooc/main/tv/codely/mooc/notification/module/push/domain/.gitkeep diff --git a/src/main/java/tv/codely/context/notification/module/push/infrastructure/.gitkeep b/src/mooc/main/tv/codely/mooc/notification/module/push/infrastructure/.gitkeep similarity index 100% rename from src/main/java/tv/codely/context/notification/module/push/infrastructure/.gitkeep rename to src/mooc/main/tv/codely/mooc/notification/module/push/infrastructure/.gitkeep diff --git a/src/main/java/tv/codely/shared/application/DomainEventSubscriber.java b/src/mooc/main/tv/codely/mooc/shared/application/DomainEventSubscriber.java similarity index 61% rename from src/main/java/tv/codely/shared/application/DomainEventSubscriber.java rename to src/mooc/main/tv/codely/mooc/shared/application/DomainEventSubscriber.java index 099cdaa..a5c5886 100644 --- a/src/main/java/tv/codely/shared/application/DomainEventSubscriber.java +++ b/src/mooc/main/tv/codely/mooc/shared/application/DomainEventSubscriber.java @@ -1,6 +1,6 @@ -package tv.codely.shared.application; +package tv.codely.mooc.shared.application; -import tv.codely.shared.domain.DomainEvent; +import tv.codely.mooc.shared.domain.DomainEvent; public interface DomainEventSubscriber { Class subscribedTo(); diff --git a/src/main/java/tv/codely/shared/domain/AggregateRoot.java b/src/mooc/main/tv/codely/mooc/shared/domain/AggregateRoot.java similarity index 92% rename from src/main/java/tv/codely/shared/domain/AggregateRoot.java rename to src/mooc/main/tv/codely/mooc/shared/domain/AggregateRoot.java index 82ecbed..d937124 100644 --- a/src/main/java/tv/codely/shared/domain/AggregateRoot.java +++ b/src/mooc/main/tv/codely/mooc/shared/domain/AggregateRoot.java @@ -1,4 +1,4 @@ -package tv.codely.shared.domain; +package tv.codely.mooc.shared.domain; import java.util.LinkedList; import java.util.List; diff --git a/src/main/java/tv/codely/shared/domain/DomainEvent.java b/src/mooc/main/tv/codely/mooc/shared/domain/DomainEvent.java similarity index 65% rename from src/main/java/tv/codely/shared/domain/DomainEvent.java rename to src/mooc/main/tv/codely/mooc/shared/domain/DomainEvent.java index 563dd6e..e7c0d44 100644 --- a/src/main/java/tv/codely/shared/domain/DomainEvent.java +++ b/src/mooc/main/tv/codely/mooc/shared/domain/DomainEvent.java @@ -1,4 +1,4 @@ -package tv.codely.shared.domain; +package tv.codely.mooc.shared.domain; public interface DomainEvent { String fullQualifiedEventName(); diff --git a/src/main/java/tv/codely/shared/domain/EventBus.java b/src/mooc/main/tv/codely/mooc/shared/domain/EventBus.java similarity index 73% rename from src/main/java/tv/codely/shared/domain/EventBus.java rename to src/mooc/main/tv/codely/mooc/shared/domain/EventBus.java index 31211bc..97c0bf6 100644 --- a/src/main/java/tv/codely/shared/domain/EventBus.java +++ b/src/mooc/main/tv/codely/mooc/shared/domain/EventBus.java @@ -1,4 +1,4 @@ -package tv.codely.shared.domain; +package tv.codely.mooc.shared.domain; import java.util.List; diff --git a/src/main/java/tv/codely/shared/infrastructure/bus/ReactorEventBus.java b/src/mooc/main/tv/codely/mooc/shared/infrastructure/bus/ReactorEventBus.java similarity index 83% rename from src/main/java/tv/codely/shared/infrastructure/bus/ReactorEventBus.java rename to src/mooc/main/tv/codely/mooc/shared/infrastructure/bus/ReactorEventBus.java index 800bccf..b9a2edb 100644 --- a/src/main/java/tv/codely/shared/infrastructure/bus/ReactorEventBus.java +++ b/src/mooc/main/tv/codely/mooc/shared/infrastructure/bus/ReactorEventBus.java @@ -1,19 +1,18 @@ -package tv.codely.shared.infrastructure.bus; +package tv.codely.mooc.shared.infrastructure.bus; import reactor.bus.Event; import reactor.bus.EventBus; import reactor.bus.selector.Selector; import reactor.fn.Consumer; -import tv.codely.shared.application.DomainEventSubscriber; -import tv.codely.shared.domain.DomainEvent; +import tv.codely.mooc.shared.domain.DomainEvent; +import tv.codely.mooc.shared.application.DomainEventSubscriber; -import java.util.Arrays; import java.util.List; import java.util.Set; import static reactor.bus.selector.Selectors.$; -public class ReactorEventBus implements tv.codely.shared.domain.EventBus { +public class ReactorEventBus implements tv.codely.mooc.shared.domain.EventBus { private final EventBus bus; public ReactorEventBus(final Set subscribers) { diff --git a/src/main/java/tv/codely/context/video/module/video/application/publish/VideoPublisher.java b/src/mooc/main/tv/codely/mooc/video/module/video/application/publish/VideoPublisher.java similarity index 61% rename from src/main/java/tv/codely/context/video/module/video/application/publish/VideoPublisher.java rename to src/mooc/main/tv/codely/mooc/video/module/video/application/publish/VideoPublisher.java index 8bf8eac..ae71f97 100644 --- a/src/main/java/tv/codely/context/video/module/video/application/publish/VideoPublisher.java +++ b/src/mooc/main/tv/codely/mooc/video/module/video/application/publish/VideoPublisher.java @@ -1,9 +1,9 @@ -package tv.codely.context.video.module.video.application.publish; +package tv.codely.mooc.video.module.video.application.publish; -import tv.codely.context.video.module.video.domain.Video; -import tv.codely.context.video.module.video.domain.VideoDescription; -import tv.codely.context.video.module.video.domain.VideoTitle; -import tv.codely.shared.domain.EventBus; +import tv.codely.mooc.video.module.video.domain.Video; +import tv.codely.mooc.video.module.video.domain.VideoDescription; +import tv.codely.mooc.video.module.video.domain.VideoTitle; +import tv.codely.mooc.shared.domain.EventBus; public final class VideoPublisher { private final EventBus eventBus; diff --git a/src/main/java/tv/codely/context/video/module/video/domain/Video.java b/src/mooc/main/tv/codely/mooc/video/module/video/domain/Video.java similarity index 84% rename from src/main/java/tv/codely/context/video/module/video/domain/Video.java rename to src/mooc/main/tv/codely/mooc/video/module/video/domain/Video.java index cb7c4e9..54b4e79 100644 --- a/src/main/java/tv/codely/context/video/module/video/domain/Video.java +++ b/src/mooc/main/tv/codely/mooc/video/module/video/domain/Video.java @@ -1,6 +1,6 @@ -package tv.codely.context.video.module.video.domain; +package tv.codely.mooc.video.module.video.domain; -import tv.codely.shared.domain.AggregateRoot; +import tv.codely.mooc.shared.domain.AggregateRoot; public final class Video extends AggregateRoot { private final VideoTitle title; diff --git a/src/main/java/tv/codely/context/video/module/video/domain/VideoDescription.java b/src/mooc/main/tv/codely/mooc/video/module/video/domain/VideoDescription.java similarity index 91% rename from src/main/java/tv/codely/context/video/module/video/domain/VideoDescription.java rename to src/mooc/main/tv/codely/mooc/video/module/video/domain/VideoDescription.java index 696bda8..33a0590 100644 --- a/src/main/java/tv/codely/context/video/module/video/domain/VideoDescription.java +++ b/src/mooc/main/tv/codely/mooc/video/module/video/domain/VideoDescription.java @@ -1,4 +1,4 @@ -package tv.codely.context.video.module.video.domain; +package tv.codely.mooc.video.module.video.domain; public final class VideoDescription { private final String value; diff --git a/src/main/java/tv/codely/context/video/module/video/domain/VideoPublished.java b/src/mooc/main/tv/codely/mooc/video/module/video/domain/VideoPublished.java similarity index 91% rename from src/main/java/tv/codely/context/video/module/video/domain/VideoPublished.java rename to src/mooc/main/tv/codely/mooc/video/module/video/domain/VideoPublished.java index f527419..9e5c13e 100644 --- a/src/main/java/tv/codely/context/video/module/video/domain/VideoPublished.java +++ b/src/mooc/main/tv/codely/mooc/video/module/video/domain/VideoPublished.java @@ -1,6 +1,6 @@ -package tv.codely.context.video.module.video.domain; +package tv.codely.mooc.video.module.video.domain; -import tv.codely.shared.domain.DomainEvent; +import tv.codely.mooc.shared.domain.DomainEvent; public final class VideoPublished implements DomainEvent { private static final String FULL_QUALIFIED_EVENT_NAME = "codelytv.video.video.event.1.video.published"; diff --git a/src/main/java/tv/codely/context/video/module/video/domain/VideoTitle.java b/src/mooc/main/tv/codely/mooc/video/module/video/domain/VideoTitle.java similarity index 90% rename from src/main/java/tv/codely/context/video/module/video/domain/VideoTitle.java rename to src/mooc/main/tv/codely/mooc/video/module/video/domain/VideoTitle.java index 92b916e..e03c401 100644 --- a/src/main/java/tv/codely/context/video/module/video/domain/VideoTitle.java +++ b/src/mooc/main/tv/codely/mooc/video/module/video/domain/VideoTitle.java @@ -1,4 +1,4 @@ -package tv.codely.context.video.module.video.domain; +package tv.codely.mooc.video.module.video.domain; public final class VideoTitle { private final String value; diff --git a/src/main/java/tv/codely/context/video/module/video/infrastructure/VideoPublisherCliController.java b/src/mooc/main/tv/codely/mooc/video/module/video/infrastructure/VideoPublisherCliController.java similarity index 59% rename from src/main/java/tv/codely/context/video/module/video/infrastructure/VideoPublisherCliController.java rename to src/mooc/main/tv/codely/mooc/video/module/video/infrastructure/VideoPublisherCliController.java index 768fb44..ba53b33 100644 --- a/src/main/java/tv/codely/context/video/module/video/infrastructure/VideoPublisherCliController.java +++ b/src/mooc/main/tv/codely/mooc/video/module/video/infrastructure/VideoPublisherCliController.java @@ -1,10 +1,10 @@ -package tv.codely.context.video.module.video.infrastructure; +package tv.codely.mooc.video.module.video.infrastructure; -import tv.codely.context.notification.module.push.application.create.SendPushToSubscribersOnVideoPublished; -import tv.codely.context.video.module.video.application.publish.VideoPublisher; -import tv.codely.shared.application.DomainEventSubscriber; -import tv.codely.shared.domain.EventBus; -import tv.codely.shared.infrastructure.bus.ReactorEventBus; +import tv.codely.mooc.notification.module.push.application.create.SendPushToSubscribersOnVideoPublished; +import tv.codely.mooc.video.module.video.application.publish.VideoPublisher; +import tv.codely.mooc.shared.application.DomainEventSubscriber; +import tv.codely.mooc.shared.domain.EventBus; +import tv.codely.mooc.shared.infrastructure.bus.ReactorEventBus; import java.util.Set; diff --git a/src/test/java/tv/codely/context/video/module/video/application/publish/VideoPublisherShould.java b/src/mooc/test/tv/codely/mooc/video/application/publish/VideoPublisherShould.java similarity index 76% rename from src/test/java/tv/codely/context/video/module/video/application/publish/VideoPublisherShould.java rename to src/mooc/test/tv/codely/mooc/video/application/publish/VideoPublisherShould.java index ef09711..cea65bf 100644 --- a/src/test/java/tv/codely/context/video/module/video/application/publish/VideoPublisherShould.java +++ b/src/mooc/test/tv/codely/mooc/video/application/publish/VideoPublisherShould.java @@ -1,8 +1,9 @@ -package tv.codely.context.video.module.video.application.publish; +package tv.codely.mooc.video.application.publish; import org.junit.jupiter.api.Test; -import tv.codely.context.video.module.video.domain.VideoPublished; -import tv.codely.shared.domain.EventBus; +import tv.codely.mooc.video.module.video.application.publish.VideoPublisher; +import tv.codely.mooc.video.module.video.domain.VideoPublished; +import tv.codely.mooc.shared.domain.EventBus; import java.util.List; diff --git a/src/shared/build.gradle b/src/shared/build.gradle new file mode 100644 index 0000000..a7a64c5 --- /dev/null +++ b/src/shared/build.gradle @@ -0,0 +1,3 @@ +dependencies { +// compile project('src:shared') +}