Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/docs/asciidoc/portfolio.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
=== 포트폴리오 생성
operation::portfolio/post[snippets="http-request,http-response,request-fields"]

=== 포트폴리오 삭제
operation::portfolio/delete[snippetes="http-request,http-response"]

=== 내 포트폴리오 조회
operation::my-portfolio/get[snippets="http-request,http-response"]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,12 @@ public List<PortfolioDto> getMine(@RequestHeader(HttpHeaders.AUTHORIZATION) Stri
return portfolioService.getMine(jwtBuilder.decryptJwt(token));
}

@DeleteMapping
public PortfolioDto delete(
@RequestHeader(HttpHeaders.AUTHORIZATION) String token,
@RequestParam Long id
) {
return portfolioService.delete(jwtBuilder.decryptJwt(token), id);
}

}
3 changes: 3 additions & 0 deletions src/main/java/com/bigant/gaeme/dto/PortfolioDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ public class PortfolioDto {

private List<PortfolioStockDto> stocks;

@Builder.Default
private boolean isDeleted = false;

@Data
@AllArgsConstructor
@NoArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public class Portfolio {

private String name;

private Boolean isDeleted;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/bigant/gaeme/service/PortfolioService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -129,4 +130,21 @@ public List<PortfolioDto> getMine(Long requestId) {

return portfolioStocksByPortfolio.entrySet().stream().map(convertDto).toList();
}

@Transactional
public PortfolioDto delete(Long requestId, Long portfolioId) {
User user = userRepository.findById(requestId).orElseThrow();
Portfolio portfolio = portfolioRepository.findById(portfolioId).orElseThrow();

if (!Objects.equals(portfolio.getUser().getId(), user.getId())) {
throw new IllegalStateException("리소스를 삭제할 권한이 없습니다");
}

portfolio.setIsDeleted(true);
return PortfolioDto.builder()
.name(portfolio.getName())
.stocks(List.of())
.isDeleted(true)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ RestDocumentationResultHandler getBacktestGetResultHandler() {
requestFields(fieldWithPath("portfolio").type(JsonFieldType.OBJECT).description("포트폴리오"),
fieldWithPath("portfolio.name").type(JsonFieldType.STRING).description("포트폴리오 이름"),
fieldWithPath("portfolio.stocks").type(JsonFieldType.ARRAY).description("보유 주식"),
fieldWithPath("portfolio.deleted").type(JsonFieldType.BOOLEAN).description("삭제 여부"),
fieldWithPath("portfolio.stocks.[].symbol").type(JsonFieldType.STRING).description("주식 심볼"),
fieldWithPath("portfolio.stocks.[].rate").type(JsonFieldType.NUMBER).description("주식 비중"),
fieldWithPath("startDate").type(JsonFieldType.STRING).description("시작 날짜"),
Expand Down Expand Up @@ -218,4 +219,35 @@ RestDocumentationResultHandler getMyPortfolioGetHandler() {
);
}

@Test
void delete() throws Exception {
//given
BDDMockito.given(portfolioService.delete(BDDMockito.any(), BDDMockito.any())).willReturn(
PortfolioDto.builder()
.name("test-portfolio")
.stocks(List.of())
.isDeleted(true)
.build()
);

//when
mockMvc.perform(RestDocumentationRequestBuilders.delete("/v1/portfolio?id=1")
.contentType(MediaType.APPLICATION_JSON)
.header(HttpHeaders.AUTHORIZATION, "Bearer token")
.characterEncoding(StandardCharsets.UTF_8))
.andDo(print())
.andExpect(status().isOk())
.andDo(getPortfolioDeleteHandler());

//then
BDDMockito.then(portfolioService).should().delete(BDDMockito.any(), BDDMockito.any());
}

RestDocumentationResultHandler getPortfolioDeleteHandler() {
return document("portfolio/delete",
preprocessRequest(prettyPrint()),
preprocessResponse(prettyPrint())
);
}

}
29 changes: 29 additions & 0 deletions src/test/java/com/bigant/gaeme/service/PortfolioServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -227,4 +227,33 @@ public PortfolioServiceTest(
), result);
}

@Test
void 포트폴리오_삭제_성공() {
//given
User user = TestFixture.getTestUser();
Portfolio portfolio = TestFixture.getTestPortfolio(user);
Stock stock = TestFixture.getTestStock();

userRepository.save(user);
portfolioRepository.save(portfolio);
stockRepository.save(stock);
portfolioStockRepository.save(PortfolioStock.builder()
.rate(100)
.portfolio(portfolio)
.stock(stock)
.build());

//when
PortfolioDto result = portfolioService.delete(user.getId(), portfolio.getId());

//then
Assertions.assertEquals(
PortfolioDto.builder()
.name("test-portfolio")
.stocks(List.of())
.isDeleted(true)
.build(), result
);
}

}