package shop.mtcoding.bank.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import shop.mtcoding.bank.domain.account.Account;
import shop.mtcoding.bank.domain.account.AccountRepository;
import shop.mtcoding.bank.domain.user.User;
import shop.mtcoding.bank.domain.user.UserRepository;
import shop.mtcoding.bank.dto.account.AccountRequestDto.AccountSaveRequestDto;
import shop.mtcoding.bank.dto.account.AccountResponseDto.AccountSaveResponseDto;
import shop.mtcoding.bank.handler.ex.CustomApiException;
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class AccountService {
private final UserRepository userRepository;
private final AccountRepository accountRepository;
public AccountListResponseDto 계좌목록보기_유저별(Long userId) {
User userPS = userRepository.findById(userId).orElseThrow(
() -> new CustomApiException("유저를 찾을 수 없습니다. "));
// 유저의 모든 계좌목록
List<Account> accountListPS = accountRepository.findByUser_id(userId);
return new AccountListResponseDto(userPS, accountListPS);
}
@Getter
@Setter
public static class AccountListResponseDto {
private String fullname;
private List<AccountDto> accounts = new ArrayList<>();
public AccountListResponseDto(User user, List<Account> accounts) {
this.fullname = user.getFullname();
this.accounts = accounts.stream().map(AccountDto::new).collect(Collectors.toList());
}
@Getter
@Setter
public class AccountDto {
private Long id;
private Long number;
private Long balance;
public AccountDto(Account account) {
this.id = account.getId();
this.number = account.getNumber();
this.balance = account.getBalance();
}
}
}
.
.
.
stream -> map -> collect
Account에 User가 잊지만 LAZY 로딩하지 않는 이유 : 굳이 할 필요가 없어서 왜냐하면 user_id로 account를 조회하기 때문에
package shop.mtcoding.bank.web;
import javax.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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;
import lombok.RequiredArgsConstructor;
import shop.mtcoding.bank.config.auth.LoginUser;
import shop.mtcoding.bank.dto.ResponseDto;
import shop.mtcoding.bank.dto.account.AccountRequestDto.AccountSaveRequestDto;
import shop.mtcoding.bank.dto.account.AccountResponseDto.AccountSaveResponseDto;
import shop.mtcoding.bank.handler.ex.CustomForbiddenException;
import shop.mtcoding.bank.service.AccountService;
import shop.mtcoding.bank.service.AccountService.AccountListResponseDto;
@RequiredArgsConstructor
@RequestMapping("/api")
@RestController
public class AccountController {
private final AccountService accountService;
@PostMapping("/s/account")
public ResponseEntity<?> saveAccount(@RequestBody @Valid AccountSaveRequestDto accountSaveRequestDto,
BindingResult bindingResult,
@AuthenticationPrincipal LoginUser loginUser) {
AccountSaveResponseDto accountSaveResponseDto = accountService.계좌등록(accountSaveRequestDto,
loginUser.getUser().getId());
return new ResponseEntity<>(new ResponseDto<>(1, "계좌등록 성공", accountSaveResponseDto), HttpStatus.CREATED);
}
@GetMapping("/s/account/login-user")
public ResponseEntity<?> findUserAccount(@AuthenticationPrincipal LoginUser loginUser) {
AccountListResponseDto accountListResponseDto = accountService.계좌목록보기_유저별(loginUser.getUser().getId());
return new ResponseEntity<>(new ResponseDto<>(1, "계좌목록보기_유저별 성공", accountListResponseDto), HttpStatus.OK);
}
}
/s/account/{id} 이렇게 작성할 경우 권한 처리를 해야하기 때문에 번거롭다. 따라서 사용을 지양한다.