#38 hexagonal: register membership

This commit is contained in:
haerong22
2023-07-03 21:21:53 +09:00
parent 4f3652c68c
commit dd9579fc59
12 changed files with 236 additions and 4 deletions

View File

@@ -41,9 +41,11 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'javax.persistence:javax.persistence-api:2.2'
// implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.jetbrains:annotations:23.0.0'
testImplementation 'junit:junit:4.13.1'
runtimeOnly 'com.h2database:h2'
}
test {

View File

@@ -1,14 +1,34 @@
package org.example.membership.adapter.in.web;
import common.WebAdapter;
import lombok.RequiredArgsConstructor;
import org.example.membership.application.port.in.RegisterMembershipCommand;
import org.example.membership.application.port.in.RegisterMembershipUseCase;
import org.example.membership.domain.Membership;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@WebAdapter
@RestController
@RequiredArgsConstructor
public class RegisterMembershipController {
@GetMapping("/test")
public void test() {
System.out.println("Hello world!");
private final RegisterMembershipUseCase registerMembershipUseCase;
@PostMapping("/membership/register")
Membership registerMembership(@RequestBody RegisterMembershipRequest request) {
RegisterMembershipCommand command = RegisterMembershipCommand.builder()
.name(request.getName())
.address(request.getAddress())
.email(request.getEmail())
.isValid(true)
.isCorp(request.isCorp())
.build();
return registerMembershipUseCase.registerMembership(command);
}
}

View File

@@ -0,0 +1,16 @@
package org.example.membership.adapter.in.web;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RegisterMembershipRequest {
private String name;
private String email;
private String address;
private boolean isCorp;
}

View File

@@ -0,0 +1,32 @@
package org.example.membership.adapter.out.persistence;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "membership")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MembershipJpaEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private String membershipId;
private String name;
private String email;
private String address;
private boolean isValid;
private boolean isCorp;
public MembershipJpaEntity(String name, String email, String address, boolean isValid, boolean isCorp) {
this.name = name;
this.email = email;
this.address = address;
this.isValid = isValid;
this.isCorp = isCorp;
}
}

View File

@@ -0,0 +1,19 @@
package org.example.membership.adapter.out.persistence;
import org.example.membership.domain.Membership;
import org.springframework.stereotype.Component;
@Component
public class MembershipMapper {
public Membership mapToDomainEntity(MembershipJpaEntity membershipJpaEntity) {
return Membership.generateMember(
new Membership.MembershipId(membershipJpaEntity.getMembershipId()),
new Membership.MembershipName(membershipJpaEntity.getName()),
new Membership.MembershipEmail(membershipJpaEntity.getEmail()),
new Membership.MembershipAddress(membershipJpaEntity.getAddress()),
new Membership.MembershipIsValid(membershipJpaEntity.isValid()),
new Membership.MembershipIsCorp(membershipJpaEntity.isCorp())
);
}
}

View File

@@ -0,0 +1,26 @@
package org.example.membership.adapter.out.persistence;
import common.PersistenceAdapter;
import lombok.RequiredArgsConstructor;
import org.example.membership.application.port.out.RegisterMembershipPort;
import org.example.membership.domain.Membership;
@PersistenceAdapter
@RequiredArgsConstructor
public class MembershipPersistenceAdapter implements RegisterMembershipPort {
private final SpringDataMembershipRepository membershipRepository;
@Override
public MembershipJpaEntity createMembership(Membership.MembershipName membershipName, Membership.MembershipEmail membershipEmail, Membership.MembershipAddress membershipAddress, Membership.MembershipIsValid membershipIsValid, Membership.MembershipIsCorp membershipIsCorp) {
return membershipRepository.save(
new MembershipJpaEntity(
membershipName.getMembershipName(),
membershipEmail.getMembershipEmail(),
membershipAddress.getMembershipAddress(),
membershipIsValid.isMembershipIsValid(),
membershipIsCorp.isMembershipIsCorp()
)
);
}
}

View File

@@ -0,0 +1,6 @@
package org.example.membership.adapter.out.persistence;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SpringDataMembershipRepository extends JpaRepository<MembershipJpaEntity, String> {
}

View File

@@ -0,0 +1,39 @@
package org.example.membership.application.port.in;
import common.SelfValidating;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.NotEmpty;
@Builder
@Data
@EqualsAndHashCode(callSuper = false)
public class RegisterMembershipCommand extends SelfValidating<RegisterMembershipCommand> {
@NotEmpty
private final String name;
@NotEmpty
private final String email;
@NotEmpty
private final String address;
@AssertTrue
private final boolean isValid;
private final boolean isCorp;
public RegisterMembershipCommand(String name, String email, String address, boolean isValid, boolean isCorp) {
this.name = name;
this.email = email;
this.address = address;
this.isValid = isValid;
this.isCorp = isCorp;
this.validateSelf();
}
}

View File

@@ -0,0 +1,8 @@
package org.example.membership.application.port.in;
import org.example.membership.domain.Membership;
public interface RegisterMembershipUseCase {
Membership registerMembership(RegisterMembershipCommand command);
}

View File

@@ -0,0 +1,15 @@
package org.example.membership.application.port.out;
import org.example.membership.adapter.out.persistence.MembershipJpaEntity;
import org.example.membership.domain.Membership;
public interface RegisterMembershipPort {
MembershipJpaEntity createMembership(
Membership.MembershipName membershipName,
Membership.MembershipEmail membershipEmail,
Membership.MembershipAddress membershipAddress,
Membership.MembershipIsValid membershipIsValid,
Membership.MembershipIsCorp membershipIsCorp
);
}

View File

@@ -0,0 +1,34 @@
package org.example.membership.application.service;
import common.UseCase;
import lombok.RequiredArgsConstructor;
import org.example.membership.adapter.out.persistence.MembershipJpaEntity;
import org.example.membership.adapter.out.persistence.MembershipMapper;
import org.example.membership.application.port.in.RegisterMembershipCommand;
import org.example.membership.application.port.in.RegisterMembershipUseCase;
import org.example.membership.application.port.out.RegisterMembershipPort;
import org.example.membership.domain.Membership;
import org.springframework.transaction.annotation.Transactional;
@UseCase
@Transactional
@RequiredArgsConstructor
public class RegisterMembershipService implements RegisterMembershipUseCase {
private final RegisterMembershipPort registerMembershipPort;
private final MembershipMapper membershipMapper;
@Override
public Membership registerMembership(RegisterMembershipCommand command) {
MembershipJpaEntity jpaEntity = registerMembershipPort.createMembership(
new Membership.MembershipName(command.getName()),
new Membership.MembershipEmail(command.getEmail()),
new Membership.MembershipAddress(command.getAddress()),
new Membership.MembershipIsValid(command.isValid()),
new Membership.MembershipIsCorp(command.isCorp())
);
return membershipMapper.mapToDomainEntity(jpaEntity);
}
}

View File

@@ -0,0 +1,15 @@
# H2
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:test
username: user
password:
jpa:
hibernate:
ddl-auto: create-drop
h2:
console:
enabled: true
path: /h2-console