From dd9579fc5933f95ce3e2b5b6a98e9a746cb751ad Mon Sep 17 00:00:00 2001 From: haerong22 Date: Mon, 3 Jul 2023 21:21:53 +0900 Subject: [PATCH] #38 hexagonal: register membership --- bobby-pay/membership-service/build.gradle | 4 +- .../in/web/RegisterMembershipController.java | 26 +++++++++++-- .../in/web/RegisterMembershipRequest.java | 16 ++++++++ .../out/persistence/MembershipJpaEntity.java | 32 +++++++++++++++ .../out/persistence/MembershipMapper.java | 19 +++++++++ .../MembershipPersistenceAdapter.java | 26 +++++++++++++ .../SpringDataMembershipRepository.java | 6 +++ .../port/in/RegisterMembershipCommand.java | 39 +++++++++++++++++++ .../port/in/RegisterMembershipUseCase.java | 8 ++++ .../port/out/RegisterMembershipPort.java | 15 +++++++ .../service/RegisterMembershipService.java | 34 ++++++++++++++++ .../src/main/resources/application.yml | 15 +++++++ 12 files changed, 236 insertions(+), 4 deletions(-) create mode 100644 bobby-pay/membership-service/src/main/java/org/example/membership/adapter/in/web/RegisterMembershipRequest.java create mode 100644 bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipJpaEntity.java create mode 100644 bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipMapper.java create mode 100644 bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipPersistenceAdapter.java create mode 100644 bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/SpringDataMembershipRepository.java create mode 100644 bobby-pay/membership-service/src/main/java/org/example/membership/application/port/in/RegisterMembershipCommand.java create mode 100644 bobby-pay/membership-service/src/main/java/org/example/membership/application/port/in/RegisterMembershipUseCase.java create mode 100644 bobby-pay/membership-service/src/main/java/org/example/membership/application/port/out/RegisterMembershipPort.java create mode 100644 bobby-pay/membership-service/src/main/java/org/example/membership/application/service/RegisterMembershipService.java create mode 100644 bobby-pay/membership-service/src/main/resources/application.yml diff --git a/bobby-pay/membership-service/build.gradle b/bobby-pay/membership-service/build.gradle index d8ea846a..51359d4f 100644 --- a/bobby-pay/membership-service/build.gradle +++ b/bobby-pay/membership-service/build.gradle @@ -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 { diff --git a/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/in/web/RegisterMembershipController.java b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/in/web/RegisterMembershipController.java index b70f3ab4..f1a1563d 100644 --- a/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/in/web/RegisterMembershipController.java +++ b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/in/web/RegisterMembershipController.java @@ -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); } } diff --git a/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/in/web/RegisterMembershipRequest.java b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/in/web/RegisterMembershipRequest.java new file mode 100644 index 00000000..5463ed2a --- /dev/null +++ b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/in/web/RegisterMembershipRequest.java @@ -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; +} diff --git a/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipJpaEntity.java b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipJpaEntity.java new file mode 100644 index 00000000..d6d70dea --- /dev/null +++ b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipJpaEntity.java @@ -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; + } +} diff --git a/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipMapper.java b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipMapper.java new file mode 100644 index 00000000..7f230268 --- /dev/null +++ b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipMapper.java @@ -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()) + ); + } +} diff --git a/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipPersistenceAdapter.java b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipPersistenceAdapter.java new file mode 100644 index 00000000..9db9da9b --- /dev/null +++ b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/MembershipPersistenceAdapter.java @@ -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() + ) + ); + } +} diff --git a/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/SpringDataMembershipRepository.java b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/SpringDataMembershipRepository.java new file mode 100644 index 00000000..d3f43bc5 --- /dev/null +++ b/bobby-pay/membership-service/src/main/java/org/example/membership/adapter/out/persistence/SpringDataMembershipRepository.java @@ -0,0 +1,6 @@ +package org.example.membership.adapter.out.persistence; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SpringDataMembershipRepository extends JpaRepository { +} diff --git a/bobby-pay/membership-service/src/main/java/org/example/membership/application/port/in/RegisterMembershipCommand.java b/bobby-pay/membership-service/src/main/java/org/example/membership/application/port/in/RegisterMembershipCommand.java new file mode 100644 index 00000000..74b3229b --- /dev/null +++ b/bobby-pay/membership-service/src/main/java/org/example/membership/application/port/in/RegisterMembershipCommand.java @@ -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 { + + @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(); + } +} diff --git a/bobby-pay/membership-service/src/main/java/org/example/membership/application/port/in/RegisterMembershipUseCase.java b/bobby-pay/membership-service/src/main/java/org/example/membership/application/port/in/RegisterMembershipUseCase.java new file mode 100644 index 00000000..2ee03d53 --- /dev/null +++ b/bobby-pay/membership-service/src/main/java/org/example/membership/application/port/in/RegisterMembershipUseCase.java @@ -0,0 +1,8 @@ +package org.example.membership.application.port.in; + +import org.example.membership.domain.Membership; + +public interface RegisterMembershipUseCase { + + Membership registerMembership(RegisterMembershipCommand command); +} diff --git a/bobby-pay/membership-service/src/main/java/org/example/membership/application/port/out/RegisterMembershipPort.java b/bobby-pay/membership-service/src/main/java/org/example/membership/application/port/out/RegisterMembershipPort.java new file mode 100644 index 00000000..855b34f5 --- /dev/null +++ b/bobby-pay/membership-service/src/main/java/org/example/membership/application/port/out/RegisterMembershipPort.java @@ -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 + ); +} diff --git a/bobby-pay/membership-service/src/main/java/org/example/membership/application/service/RegisterMembershipService.java b/bobby-pay/membership-service/src/main/java/org/example/membership/application/service/RegisterMembershipService.java new file mode 100644 index 00000000..864d58d5 --- /dev/null +++ b/bobby-pay/membership-service/src/main/java/org/example/membership/application/service/RegisterMembershipService.java @@ -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); + } +} diff --git a/bobby-pay/membership-service/src/main/resources/application.yml b/bobby-pay/membership-service/src/main/resources/application.yml new file mode 100644 index 00000000..9931deb5 --- /dev/null +++ b/bobby-pay/membership-service/src/main/resources/application.yml @@ -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 \ No newline at end of file