From 24c00bb43c29ec20e1ee43e75db1ba9cf2bf953e Mon Sep 17 00:00:00 2001 From: haerong22 Date: Mon, 27 Mar 2023 01:23:01 +0900 Subject: [PATCH] #31 loan: create judgement --- .../loan/controller/JudgementController.java | 23 ++++++++ .../com/example/loan/dto/JudgementDto.java | 45 ++++++++++++++ .../loan/repository/JudgementRepository.java | 9 +++ .../loan/service/JudgementService.java | 8 +++ .../loan/service/JudgementServiceImpl.java | 41 +++++++++++++ .../service/JudgementServiceImplTest.java | 59 +++++++++++++++++++ 6 files changed, 185 insertions(+) create mode 100644 loan/src/main/java/com/example/loan/controller/JudgementController.java create mode 100644 loan/src/main/java/com/example/loan/dto/JudgementDto.java create mode 100644 loan/src/main/java/com/example/loan/repository/JudgementRepository.java create mode 100644 loan/src/main/java/com/example/loan/service/JudgementService.java create mode 100644 loan/src/main/java/com/example/loan/service/JudgementServiceImpl.java create mode 100644 loan/src/test/java/com/example/loan/service/JudgementServiceImplTest.java diff --git a/loan/src/main/java/com/example/loan/controller/JudgementController.java b/loan/src/main/java/com/example/loan/controller/JudgementController.java new file mode 100644 index 00000000..33750f8e --- /dev/null +++ b/loan/src/main/java/com/example/loan/controller/JudgementController.java @@ -0,0 +1,23 @@ +package com.example.loan.controller; + +import com.example.loan.dto.JudgementDto; +import com.example.loan.dto.ResponseDto; +import com.example.loan.service.JudgementService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/judgements") +public class JudgementController extends AbstractController { + + private final JudgementService judgementService; + + @PostMapping + public ResponseDto create(@RequestBody JudgementDto.Request request) { + return ok(judgementService.create(request)); + } +} diff --git a/loan/src/main/java/com/example/loan/dto/JudgementDto.java b/loan/src/main/java/com/example/loan/dto/JudgementDto.java new file mode 100644 index 00000000..7a8d00f6 --- /dev/null +++ b/loan/src/main/java/com/example/loan/dto/JudgementDto.java @@ -0,0 +1,45 @@ +package com.example.loan.dto; + +import lombok.*; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +public class JudgementDto implements Serializable { + + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Getter + @Setter + public static class Request { + + private Long applicationId; + + private String name; + + private BigDecimal approvalAmount; + + } + + @NoArgsConstructor + @AllArgsConstructor + @Builder + @Getter + @Setter + public static class Response { + + private Long judgementId; + + private Long applicationId; + + private String name; + + private BigDecimal approvalAmount; + + private LocalDateTime createdAt; + + private LocalDateTime updatedAt; + } +} diff --git a/loan/src/main/java/com/example/loan/repository/JudgementRepository.java b/loan/src/main/java/com/example/loan/repository/JudgementRepository.java new file mode 100644 index 00000000..de5ef292 --- /dev/null +++ b/loan/src/main/java/com/example/loan/repository/JudgementRepository.java @@ -0,0 +1,9 @@ +package com.example.loan.repository; + +import com.example.loan.domain.Judgement; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface JudgementRepository extends JpaRepository { +} diff --git a/loan/src/main/java/com/example/loan/service/JudgementService.java b/loan/src/main/java/com/example/loan/service/JudgementService.java new file mode 100644 index 00000000..2ab10c06 --- /dev/null +++ b/loan/src/main/java/com/example/loan/service/JudgementService.java @@ -0,0 +1,8 @@ +package com.example.loan.service; + +import com.example.loan.dto.JudgementDto; + +public interface JudgementService { + + JudgementDto.Response create(JudgementDto.Request request); +} diff --git a/loan/src/main/java/com/example/loan/service/JudgementServiceImpl.java b/loan/src/main/java/com/example/loan/service/JudgementServiceImpl.java new file mode 100644 index 00000000..4bbfc523 --- /dev/null +++ b/loan/src/main/java/com/example/loan/service/JudgementServiceImpl.java @@ -0,0 +1,41 @@ +package com.example.loan.service; + +import com.example.loan.domain.Judgement; +import com.example.loan.dto.JudgementDto; +import com.example.loan.exception.BaseException; +import com.example.loan.exception.ResultType; +import com.example.loan.repository.ApplicationRepository; +import com.example.loan.repository.JudgementRepository; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class JudgementServiceImpl implements JudgementService { + + private final JudgementRepository judgementRepository; + private final ApplicationRepository applicationRepository; + private final ModelMapper modelMapper; + + @Override + public JudgementDto.Response create(JudgementDto.Request request) { + // 신청 정보 검증 + Long applicationId = request.getApplicationId(); + if (!isPresentApplication(applicationId)) { + throw new BaseException(ResultType.SYSTEM_ERROR); + } + + // request dto -> entity -> save + Judgement judgement = modelMapper.map(request, Judgement.class); + + Judgement saved = judgementRepository.save(judgement); + + // save -> response dto + return modelMapper.map(saved, JudgementDto.Response.class); + } + + private boolean isPresentApplication(Long applicationId) { + return applicationRepository.findById(applicationId).isPresent(); + } +} diff --git a/loan/src/test/java/com/example/loan/service/JudgementServiceImplTest.java b/loan/src/test/java/com/example/loan/service/JudgementServiceImplTest.java new file mode 100644 index 00000000..3733f8ec --- /dev/null +++ b/loan/src/test/java/com/example/loan/service/JudgementServiceImplTest.java @@ -0,0 +1,59 @@ +package com.example.loan.service; + +import com.example.loan.domain.Application; +import com.example.loan.domain.Judgement; +import com.example.loan.dto.JudgementDto; +import com.example.loan.repository.ApplicationRepository; +import com.example.loan.repository.JudgementRepository; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.*; +import org.mockito.junit.jupiter.MockitoExtension; +import org.modelmapper.ModelMapper; + +import java.math.BigDecimal; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class JudgementServiceImplTest { + + @InjectMocks + private JudgementServiceImpl judgementService; + + @Mock + private JudgementRepository judgementRepository; + + @Mock + private ApplicationRepository applicationRepository; + + @Spy + private ModelMapper modelMapper; + + @Test + void Should_ReturnResponseOfNewJudgementEntity_When_RequestNewJudgement() { + Judgement judgement = Judgement.builder() + .applicationId(1L) + .name("member kim") + .approvalAmount(BigDecimal.valueOf(5000000)) + .build(); + + JudgementDto.Request request = JudgementDto.Request.builder() + .applicationId(1L) + .name("member kim") + .approvalAmount(BigDecimal.valueOf(5000000)) + .build(); + + when(applicationRepository.findById(1L)).thenReturn(Optional.ofNullable(Application.builder().build())); + when(judgementRepository.save(ArgumentMatchers.any(Judgement.class))).thenReturn(judgement); + + JudgementDto.Response actual = judgementService.create(request); + + Assertions.assertThat(actual.getName()).isSameAs(judgement.getName()); + Assertions.assertThat(actual.getApplicationId()).isSameAs(judgement.getApplicationId()); + Assertions.assertThat(actual.getApprovalAmount()).isSameAs(judgement.getApprovalAmount()); + } +} \ No newline at end of file