#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-actuator'
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||||
implementation 'javax.persistence:javax.persistence-api:2.2'
|
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'
|
implementation 'org.jetbrains:annotations:23.0.0'
|
||||||
testImplementation 'junit:junit:4.13.1'
|
testImplementation 'junit:junit:4.13.1'
|
||||||
|
|
||||||
|
runtimeOnly 'com.h2database:h2'
|
||||||
}
|
}
|
||||||
|
|
||||||
test {
|
test {
|
||||||
|
|||||||
@@ -1,14 +1,34 @@
|
|||||||
package org.example.membership.adapter.in.web;
|
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.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@WebAdapter
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequiredArgsConstructor
|
||||||
public class RegisterMembershipController {
|
public class RegisterMembershipController {
|
||||||
|
|
||||||
@GetMapping("/test")
|
private final RegisterMembershipUseCase registerMembershipUseCase;
|
||||||
public void test() {
|
|
||||||
System.out.println("Hello world!");
|
@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