#38 hexagonal: register membership
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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())
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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> {
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package org.example.membership.application.port.in;
|
||||
|
||||
import org.example.membership.domain.Membership;
|
||||
|
||||
public interface RegisterMembershipUseCase {
|
||||
|
||||
Membership registerMembership(RegisterMembershipCommand command);
|
||||
}
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user