Skip to content

Commit

Permalink
Refactor to hexagonal architecture
Browse files Browse the repository at this point in the history
  • Loading branch information
mkutz committed Aug 21, 2024
1 parent 959e854 commit 332a87a
Show file tree
Hide file tree
Showing 20 changed files with 264 additions and 141 deletions.
4 changes: 3 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ java { sourceCompatibility = JavaVersion.VERSION_21 }
repositories { mavenCentral() }

dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-webflux")
implementation("org.springframework.boot:spring-boot-starter-validation")
runtimeOnly("org.postgresql:postgresql")
Expand All @@ -30,6 +30,8 @@ dependencies {
testImplementation(platform("org.testcontainers:testcontainers-bom:1.20.1"))
testImplementation("org.testcontainers:postgresql")
testImplementation("org.testcontainers:junit-jupiter")
val stubitVersion = 0.6
testImplementation("org.stubit:spring-data:$stubitVersion")

testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

@SpringBootApplication
@EnableJdbcRepositories
@EnableJpaRepositories
public class Application {

static {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db;

import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.UUID;

@Entity
@Table(name = "unicorns")
public class UnicornEntity {

@Id private UUID id;
private String name;
private String maneColor;
private Integer hornLength;
private Integer hornDiameter;
private Instant dateOfBirth;

public UnicornEntity() {}

public UnicornEntity(Unicorn unicorn) {
this.id = unicorn.id();
this.name = unicorn.name();
this.maneColor = unicorn.maneColor().name();
this.hornLength = unicorn.hornLength();
this.hornDiameter = unicorn.hornDiameter();
this.dateOfBirth = unicorn.dateOfBirth().atStartOfDay().toInstant(ZoneOffset.UTC);
}

public UUID getId() {
return id;
}

public void setId(UUID id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getManeColor() {
return maneColor;
}

public void setManeColor(String maneColor) {
this.maneColor = maneColor;
}

public Integer getHornLength() {
return hornLength;
}

public void setHornLength(Integer hornLength) {
this.hornLength = hornLength;
}

public Integer getHornDiameter() {
return hornDiameter;
}

public void setHornDiameter(Integer hornDiameter) {
this.hornDiameter = hornDiameter;
}

public Instant getDateOfBirth() {
return dateOfBirth;
}

public void setDateOfBirth(Instant dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}

public Unicorn toUnicorn() {
return new Unicorn(
id,
name,
Unicorn.ManeColor.valueOf(maneColor),
hornLength,
hornDiameter,
LocalDate.ofInstant(dateOfBirth, ZoneOffset.UTC));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db;

import java.util.List;
import java.util.UUID;
import org.springframework.data.repository.ListCrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UnicornRepository extends ListCrudRepository<UnicornEntity, UUID> {

List<UnicornEntity> findAll();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db;

import com.agiletestingdays.untangletestcode.unicornservice.application.port.out.UnicornStore;
import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.springframework.stereotype.Service;

@Service
public class UnicornStoreAdapter implements UnicornStore {

UnicornRepository repository;

public UnicornStoreAdapter(UnicornRepository repository) {
this.repository = repository;
}

@Override
public Optional<Unicorn> findById(UUID id) {
return repository.findById(id).map(UnicornEntity::toUnicorn);
}

@Override
public List<Unicorn> getAll() {
return repository.findAll().stream().map(UnicornEntity::toUnicorn).toList();
}

@Override
public Unicorn save(Unicorn unicorn) {
return repository.save(new UnicornEntity(unicorn)).toUnicorn();
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.agiletestingdays.untangletestcode.unicornservice.unicorn;
package com.agiletestingdays.untangletestcode.unicornservice.adapter.driving.http;

import static java.util.Objects.requireNonNull;
import static java.util.UUID.randomUUID;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;

import com.agiletestingdays.untangletestcode.unicornservice.unicorn.Unicorn.ManeColor;
import com.agiletestingdays.untangletestcode.unicornservice.application.service.UnicornService;
import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn;
import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn.ManeColor;
import jakarta.validation.Validator;
import java.util.List;
import java.util.UUID;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.agiletestingdays.untangletestcode.unicornservice.unicorn;
package com.agiletestingdays.untangletestcode.unicornservice.adapter.driving.http;

import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.validation.constraints.Past;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.agiletestingdays.untangletestcode.unicornservice.application.port.in;

import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

public interface ReadUnicorn {

List<Unicorn> getAll();

Optional<Unicorn> getById(UUID id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.agiletestingdays.untangletestcode.unicornservice.application.port.in;

import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn;

public interface WriteUnicorn {

void createNewUnicorn(Unicorn unicorn);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.agiletestingdays.untangletestcode.unicornservice.application.port.out;

import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

public interface UnicornStore {

Optional<Unicorn> findById(UUID id);

List<Unicorn> getAll();

Unicorn save(Unicorn unicorn);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.agiletestingdays.untangletestcode.unicornservice.application.service;

import com.agiletestingdays.untangletestcode.unicornservice.application.port.in.ReadUnicorn;
import com.agiletestingdays.untangletestcode.unicornservice.application.port.in.WriteUnicorn;
import com.agiletestingdays.untangletestcode.unicornservice.application.port.out.UnicornStore;
import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.springframework.stereotype.Service;

@Service
public class UnicornService implements ReadUnicorn, WriteUnicorn {

private final UnicornStore store;

public UnicornService(UnicornStore store) {
this.store = store;
}

public List<Unicorn> getAll() {
return store.getAll();
}

public Optional<Unicorn> getById(UUID id) {
return store.findById(id);
}

public void createNewUnicorn(Unicorn newUnicorn) {
store.save(newUnicorn);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.agiletestingdays.untangletestcode.unicornservice.unicorn;
package com.agiletestingdays.untangletestcode.unicornservice.domain;

import java.time.LocalDate;
import java.time.Period;
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.agiletestingdays.untangletestcode.unicornservice.adapter.driven.db;

import java.util.UUID;
import org.stubit.springdata.ListCrudRepositoryStub;

public class UnicornRepositoryStub extends ListCrudRepositoryStub<UnicornEntity, UUID>
implements UnicornRepository {}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.agiletestingdays.untangletestcode.unicornservice.unicorn;
package com.agiletestingdays.untangletestcode.unicornservice.adapter.driving.http;

import static java.util.UUID.randomUUID;
import static org.assertj.core.api.Assertions.assertThat;
Expand All @@ -8,7 +8,9 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.agiletestingdays.untangletestcode.unicornservice.unicorn.Unicorn.ManeColor;
import com.agiletestingdays.untangletestcode.unicornservice.application.service.UnicornService;
import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn;
import com.agiletestingdays.untangletestcode.unicornservice.domain.Unicorn.ManeColor;
import jakarta.validation.Validator;
import java.time.LocalDate;
import java.util.List;
Expand Down
Loading

0 comments on commit 332a87a

Please sign in to comment.