UserDatabaseAdapter implemented

This commit is contained in:
wkrzywiec
2020-05-28 20:20:45 +02:00
parent b2b1003b0b
commit 93f2eed4c8
12 changed files with 106 additions and 19 deletions

View File

@@ -0,0 +1,4 @@
package io.wkrzywiec.hexagonal.library.borrowing.ports.incoming;
public interface BorrowBook {
}

View File

@@ -0,0 +1,4 @@
package io.wkrzywiec.hexagonal.library.borrowing.ports.incoming;
public interface CancelReservation {
}

View File

@@ -0,0 +1,4 @@
package io.wkrzywiec.hexagonal.library.borrowing.ports.incoming;
public interface GiveBackBook {
}

View File

@@ -2,7 +2,7 @@ package io.wkrzywiec.hexagonal.library.user;
import io.wkrzywiec.hexagonal.library.user.model.AddUserCommand;
import io.wkrzywiec.hexagonal.library.user.model.EmailAddress;
import io.wkrzywiec.hexagonal.library.user.model.NewUser;
import io.wkrzywiec.hexagonal.library.user.model.User;
import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
import io.wkrzywiec.hexagonal.library.user.ports.incoming.AddNewUser;
import io.wkrzywiec.hexagonal.library.user.ports.outgoing.UserDatabase;
@@ -15,11 +15,11 @@ public class UserFacade implements AddNewUser {
@Override
public UserIdentifier handle(AddUserCommand addUserCommand) {
NewUser newUser = new NewUser(
User user = new User(
new EmailAddress(addUserCommand.getEmail()),
addUserCommand.getFirstName(),
addUserCommand.getLastName()
);
return database.save(newUser);
return database.save(user);
}
}

View File

@@ -1,13 +1,18 @@
package io.wkrzywiec.hexagonal.library.user.infrastructure;
import io.wkrzywiec.hexagonal.library.user.model.NewUser;
import io.wkrzywiec.hexagonal.library.user.model.User;
import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
import io.wkrzywiec.hexagonal.library.user.ports.outgoing.UserDatabase;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class UserDatabaseAdapter implements UserDatabase {
private final UserRepository userRepository;
@Override
public UserIdentifier save(NewUser newUser) {
return null;
public UserIdentifier save(User user) {
User savedUser = userRepository.save(user);
return new UserIdentifier(savedUser.getIdentifierAsLong());
}
}

View File

@@ -0,0 +1,7 @@
package io.wkrzywiec.hexagonal.library.user.infrastructure;
import io.wkrzywiec.hexagonal.library.user.model.User;
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<User, Long> {
}

View File

@@ -12,7 +12,7 @@ import java.util.regex.Pattern;
public class EmailAddress {
@Column(name="email")
private final String value;
private String value;
public EmailAddress(String value) {
Pattern pattern = Pattern.compile("^(.+)@(.+)$");
@@ -23,4 +23,6 @@ public class EmailAddress {
throw new IllegalArgumentException("Provided value is not an email address");
}
}
private EmailAddress(){}
}

View File

@@ -14,7 +14,7 @@ import javax.persistence.Table;
@Entity
@Table(name="user")
@EqualsAndHashCode
public class NewUser {
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -30,9 +30,15 @@ public class NewUser {
@Column(name="last_name")
private String lastName;
public NewUser(EmailAddress emailAddress, String firstName, String lastName) {
public User(EmailAddress emailAddress, String firstName, String lastName) {
this.emailAddress = emailAddress;
this.firstName = firstName;
this.lastName = lastName;
}
public Long getIdentifierAsLong(){
return id;
}
private User(){}
}

View File

@@ -1,8 +1,8 @@
package io.wkrzywiec.hexagonal.library.user.ports.outgoing;
import io.wkrzywiec.hexagonal.library.user.model.NewUser;
import io.wkrzywiec.hexagonal.library.user.model.User;
import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
public interface UserDatabase {
UserIdentifier save(NewUser newUser);
UserIdentifier save(User user);
}

View File

@@ -1,6 +1,6 @@
package io.wkrzywiec.hexagonal.library.user;
import io.wkrzywiec.hexagonal.library.user.model.NewUser;
import io.wkrzywiec.hexagonal.library.user.model.User;
import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
import io.wkrzywiec.hexagonal.library.user.ports.outgoing.UserDatabase;
import org.apache.commons.lang3.reflect.FieldUtils;
@@ -9,18 +9,18 @@ import java.util.concurrent.ConcurrentHashMap;
public class InMemoryUserDatabase implements UserDatabase {
ConcurrentHashMap<Long, NewUser> users = new ConcurrentHashMap<>();
ConcurrentHashMap<Long, User> users = new ConcurrentHashMap<>();
@Override
public UserIdentifier save(NewUser newUser) {
public UserIdentifier save(User user) {
Long id = users.size() + 1L;
try {
FieldUtils.writeField(newUser, "id", id, true);
FieldUtils.writeField(user, "id", id, true);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
users.put(id, newUser);
users.put(id, user);
return new UserIdentifier(id);
}
}

View File

@@ -2,7 +2,7 @@ package io.wkrzywiec.hexagonal.library.user;
import io.wkrzywiec.hexagonal.library.user.model.AddUserCommand;
import io.wkrzywiec.hexagonal.library.user.model.EmailAddress;
import io.wkrzywiec.hexagonal.library.user.model.NewUser;
import io.wkrzywiec.hexagonal.library.user.model.User;
import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
@@ -26,7 +26,7 @@ public class UserFacadeTest {
@DisplayName("Add new user")
public void shouldAddNewUser(){
//given
NewUser expectedNewUser = new NewUser(
User expectedUser = new User(
new EmailAddress("john.doe@test.com"),
"John",
"Doe"
@@ -43,6 +43,6 @@ public class UserFacadeTest {
//then
assertTrue(userIdentifier.getAsLong() > 0);
assertEquals(expectedNewUser, database.users.get(userIdentifier.getAsLong()));
assertEquals(expectedUser, database.users.get(userIdentifier.getAsLong()));
}
}

View File

@@ -0,0 +1,55 @@
package io.wkrzywiec.hexagonal.library.user.infrastructure;
import io.wkrzywiec.hexagonal.library.user.model.EmailAddress;
import io.wkrzywiec.hexagonal.library.user.model.User;
import io.wkrzywiec.hexagonal.library.user.model.UserIdentifier;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.jdbc.Sql;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_METHOD;
@SpringBootTest
public class UserDatabaseAdapterITCase {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private UserRepository userRepository;
private UserDatabaseAdapter userDatabase;
@BeforeEach
public void init(){
userDatabase = new UserDatabaseAdapter(userRepository);
}
@Test
@DisplayName("Save new user in database")
@Sql(scripts = "/clean-database.sql", executionPhase = AFTER_TEST_METHOD)
public void shouldSaveDatabase(){
//given
User user = new User(
new EmailAddress("john.doe@test.com"),
"John",
"Doe"
);
//when
UserIdentifier userIdentifier = userDatabase.save(user);
//then
Long savedUserId = jdbcTemplate.queryForObject(
"SELECT id FROM user WHERE email = ?",
Long.class,
"john.doe@test.com");
assertEquals(userIdentifier.getAsLong(), savedUserId);
}
}