diff --git a/src/main/java/com/back/together02be/asset/controller/AssetController.java b/src/main/java/com/back/together02be/asset/controller/AssetController.java index 6c87596..a3d322a 100644 --- a/src/main/java/com/back/together02be/asset/controller/AssetController.java +++ b/src/main/java/com/back/together02be/asset/controller/AssetController.java @@ -1,14 +1,43 @@ package com.back.together02be.asset.controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; + +import com.back.together02be.asset.dto.response.StockInfoRes; +import com.back.together02be.asset.dto.response.TotalPurchaseRes; +import com.back.together02be.asset.repository.UserStockRepository; +import com.back.together02be.asset.service.AssetService; +import com.back.together02be.global.apiRes.ApiRes; +import com.back.together02be.users.service.UsersService; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.web.bind.annotation.*; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import java.util.List; +import java.util.Map; + @RestController @RequiredArgsConstructor @RequestMapping("/api/asset") @Tag(name = "AssetController", description = "자산 API") public class AssetController { + private final AssetService assetService; + private final UsersService usersService; + + + @GetMapping("/accounts/{userId}") + @Operation(summary = "총 매수금 조회") + public ApiRes totalPrice(@PathVariable long userId){ + //인증된 사용자 정보 가져오기 + //Users actor= rq.getActor(); + //userId = 1L; + //총매수액 가져오기 + long totalPurchase = assetService.getTotalAmountByUserId(userId); + List stockInfos = assetService.getStockInfo(userId); + + return new ApiRes<>( + "조회가 완료되었습니다.", + new TotalPurchaseRes(totalPurchase,stockInfos) + ); + } } diff --git a/src/main/java/com/back/together02be/asset/dto/response/StockInfoRes.java b/src/main/java/com/back/together02be/asset/dto/response/StockInfoRes.java new file mode 100644 index 0000000..61373ac --- /dev/null +++ b/src/main/java/com/back/together02be/asset/dto/response/StockInfoRes.java @@ -0,0 +1,6 @@ +package com.back.together02be.asset.dto.response; + +public record StockInfoRes( + String stockCode, + long quantity +) { } diff --git a/src/main/java/com/back/together02be/asset/dto/response/TotalPurchaseRes.java b/src/main/java/com/back/together02be/asset/dto/response/TotalPurchaseRes.java new file mode 100644 index 0000000..64904ff --- /dev/null +++ b/src/main/java/com/back/together02be/asset/dto/response/TotalPurchaseRes.java @@ -0,0 +1,10 @@ +package com.back.together02be.asset.dto.response; + +import com.back.together02be.asset.controller.AssetController; + +import java.util.List; + +public record TotalPurchaseRes( + long totalAmount, + List stocks +) { } \ No newline at end of file diff --git a/src/main/java/com/back/together02be/asset/enitity/UserAccount.java b/src/main/java/com/back/together02be/asset/entity/UserAccount.java similarity index 95% rename from src/main/java/com/back/together02be/asset/enitity/UserAccount.java rename to src/main/java/com/back/together02be/asset/entity/UserAccount.java index aa5bb15..8a73bd6 100644 --- a/src/main/java/com/back/together02be/asset/enitity/UserAccount.java +++ b/src/main/java/com/back/together02be/asset/entity/UserAccount.java @@ -1,4 +1,4 @@ -package com.back.together02be.asset.enitity; +package com.back.together02be.asset.entity; import com.back.together02be.global.entity.BaseEntity; import com.back.together02be.users.enitity.Users; diff --git a/src/main/java/com/back/together02be/asset/enitity/UserStock.java b/src/main/java/com/back/together02be/asset/entity/UserStock.java similarity index 96% rename from src/main/java/com/back/together02be/asset/enitity/UserStock.java rename to src/main/java/com/back/together02be/asset/entity/UserStock.java index 9bb51fb..b44f78f 100644 --- a/src/main/java/com/back/together02be/asset/enitity/UserStock.java +++ b/src/main/java/com/back/together02be/asset/entity/UserStock.java @@ -1,4 +1,4 @@ -package com.back.together02be.asset.enitity; +package com.back.together02be.asset.entity; import com.back.together02be.global.entity.BaseEntity; import com.back.together02be.stock.enitity.Stock; diff --git a/src/main/java/com/back/together02be/asset/repository/UserAccountRepository.java b/src/main/java/com/back/together02be/asset/repository/UserAccountRepository.java index 81f30a4..99265da 100644 --- a/src/main/java/com/back/together02be/asset/repository/UserAccountRepository.java +++ b/src/main/java/com/back/together02be/asset/repository/UserAccountRepository.java @@ -1,8 +1,10 @@ package com.back.together02be.asset.repository; +import com.back.together02be.asset.entity.UserAccount; import org.springframework.data.jpa.repository.JpaRepository; -import com.back.together02be.asset.enitity.UserAccount; +import java.util.Optional; public interface UserAccountRepository extends JpaRepository { + Optional findByUsersId(Long usersId); } diff --git a/src/main/java/com/back/together02be/asset/repository/UserStockRepository.java b/src/main/java/com/back/together02be/asset/repository/UserStockRepository.java index 6f2381a..488f520 100644 --- a/src/main/java/com/back/together02be/asset/repository/UserStockRepository.java +++ b/src/main/java/com/back/together02be/asset/repository/UserStockRepository.java @@ -1,8 +1,12 @@ package com.back.together02be.asset.repository; +import com.back.together02be.asset.entity.UserStock; import org.springframework.data.jpa.repository.JpaRepository; -import com.back.together02be.asset.enitity.UserAccount; +import com.back.together02be.asset.entity.UserAccount; -public interface UserStockRepository extends JpaRepository { +import java.util.List; + +public interface UserStockRepository extends JpaRepository { + public List findAllByUsersId(Long userId); } diff --git a/src/main/java/com/back/together02be/asset/service/AssetService.java b/src/main/java/com/back/together02be/asset/service/AssetService.java index 3abd3ef..b6d4b8d 100644 --- a/src/main/java/com/back/together02be/asset/service/AssetService.java +++ b/src/main/java/com/back/together02be/asset/service/AssetService.java @@ -1,10 +1,31 @@ package com.back.together02be.asset.service; +import com.back.together02be.asset.dto.response.StockInfoRes; +import com.back.together02be.asset.entity.UserStock; +import com.back.together02be.asset.repository.UserAccountRepository; +import com.back.together02be.asset.repository.UserStockRepository; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import lombok.RequiredArgsConstructor; +import java.util.List; @Service @RequiredArgsConstructor public class AssetService { + private final UserAccountRepository userAccountRepository; + private final UserStockRepository userStockRepository; + public long getTotalAmountByUserId(long userId){ + return userAccountRepository.findByUsersId(userId) + .orElseThrow(()->new RuntimeException("계좌 없음")) + .getTotalPurchase(); + } + public List getStockInfo(long userId){ + List userStocks = userStockRepository.findAllByUsersId(userId); + + List stockInfos = userStocks.stream() + .map(us->new StockInfoRes(us.getStock().getStockCode(),us.getQuantity())) + .toList(); + + return stockInfos; + } } diff --git a/src/test/java/com/back/together02be/asset/controller/AssetControllerTest.java b/src/test/java/com/back/together02be/asset/controller/AssetControllerTest.java new file mode 100644 index 0000000..63dca1b --- /dev/null +++ b/src/test/java/com/back/together02be/asset/controller/AssetControllerTest.java @@ -0,0 +1,76 @@ +package com.back.together02be.asset.controller; + +import com.back.together02be.asset.entity.UserAccount; +import com.back.together02be.asset.entity.UserStock; +import com.back.together02be.asset.repository.UserAccountRepository; +import com.back.together02be.asset.repository.UserStockRepository; +import com.back.together02be.stock.enitity.Stock; +import com.back.together02be.stock.repository.StockRepository; +import com.back.together02be.users.enitity.Users; +import com.back.together02be.users.repository.UsersRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.List; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; + +@SpringBootTest +@AutoConfigureMockMvc +public class AssetControllerTest { + @Autowired + private MockMvc mockMvc; + + @Autowired + private UserAccountRepository userAccountRepository; + @Autowired + private UsersRepository usersRepository; + @Autowired + private StockRepository StockRepository; + @Autowired + private UserStockRepository userStockRepository; + @Autowired + private StockRepository stockRepository; + + @BeforeEach + void setUp(){ + Users testUser = new Users("user1","1234","my_nick"); + usersRepository.save(testUser); + + UserAccount testUserAccount = new UserAccount(testUser,10000L,1000000L); + userAccountRepository.save(testUserAccount); + + Stock samsung = new Stock("005930", "삼성전자","kospi"); + Stock hynix = new Stock("000660", "SK하이닉스","kospi"); + stockRepository.saveAll(List.of(samsung, hynix)); + + UserStock us1 = new UserStock(testUser, samsung, 10L, 5000L); + UserStock us2 = new UserStock(testUser, hynix, 2L, 10000L); + userStockRepository.saveAll(List.of(us1,us2)); + } + + @Test + @DisplayName("총매수금 및 보유 주식 목록 조회 테스트") + void test1() throws Exception{ + mockMvc.perform(get("/api/asset/accounts/1")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.totalAmount").value(10000L)) + // 2. 리스트 크기 검증 + .andExpect(jsonPath("$.data.stocks.length()").value(2)) + // 3. 구체적인 데이터 검증 (삼성전자) + .andExpect(jsonPath("$.data.stocks[0].stockCode").value("005930")) + .andExpect(jsonPath("$.data.stocks[0].quantity").value(10)) + // 4. 구체적인 데이터 검증 (SK하이닉스) + .andExpect(jsonPath("$.data.stocks[1].stockCode").value("000660")) + .andExpect(jsonPath("$.data.stocks[1].quantity").value(2)); + } +}