/
valitovgaziz
/
EffectiveMobileTestTask
Обзор
Документация
Войти
/
valitovgaziz
/
EffectiveMobileTestTask
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/main/java/com/EffectiveMobile/effMobTestTask/endpoints/BankController.java
140 строк
6 KB
ValitovGaziz
repo, services for account
23 май 2024, 18:27
23 май 2024, 18:27
03bd773
Код
Авторство
О чём код?
package com.EffectiveMobile.effMobTestTask.endpoints; import com.EffectiveMobile.effMobTestTask.repositories.AccountRepository; import com.EffectiveMobile.effMobTestTask.repositories.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/v1") public class BankController { @Autowired private final UserRepository userRepository; @Autowired private final AccountRepository accountRepository; public BankController(UserRepository userRepository, AccountRepository accountRepository) { this.userRepository = userRepository; this.accountRepository = accountRepository; } @PostMapping("/users") public ResponseEntity<?> createUser(@Valid @RequestBody CreateUserRequest request) { // Проверка уникальности логина, телефона и email if (!userRepository.findByUsernameOrPhoneNumberOrEmail(request.getUsername(), request.getPhoneNumber(), request.getEmail()).isEmpty()) { throw new BadRequestException("Username, phone number or email already exists"); } // Создание пользователя и его банковского аккаунта User user = new User(); user.setUsername(request.getUsername()); user.setPassword(passwordEncoder.encode(request.getPassword())); user.setPhoneNumber(request.getPhoneNumber()); user.setEmail(request.getEmail()); user.setBirthDate(request.getBirthDate()); user.setFullName(request.getFullName()); Account account = new Account(); account.setUser(user); account.setBalance(request.getInitialDeposit()); userRepository.save(user); accountRepository.save(account); return ResponseEntity.ok(new ApiResponse(true)); } @GetMapping("/users") public Page<User> searchUsers(@RequestParam(required = false) Date birthDate, @RequestParam(required = false) String phoneNumber, @RequestParam(required = false) String fullName, @RequestParam(required = false) String email, Pageable pageable) { Specification<User> spec = Specification.where(null); if (birthDate != null) { spec = spec.and((root, query, cb) -> cb.greaterThan(root.get("birthDate"), birthDate)); } if (phoneNumber != null) { spec = spec.and((root, query, cb) -> cb.equal(root.get("phoneNumber"), phoneNumber)); } if (fullName != null) { spec = spec.and((root, query, cb) -> cb.like(cb.lower(root.get("fullName")), "%" + fullName.toLowerCase() + "%")); } if (email != null) { spec = spec.and((root, query, cb) -> cb.equal(root.get("email"), email)); } return userRepository.findAll(spec, pageable); } @PutMapping("/users/{userId}") public ResponseEntity<?> updateUser(@PathVariable Long userId, @Valid @RequestBody UpdateUserRequest request) { User user = userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User not found with id " + userId)); if (!request.getPhoneNumber().isEmpty() && !user.getPhoneNumber().equals(request.getPhoneNumber())) { if (userRepository.findByPhoneNumber(request.getPhoneNumber()).isPresent()) { throw new BadRequestException("Phone number is already in use"); } user.setPhoneNumber(request.getPhoneNumber()); } if (!request.getEmail().isEmpty() && !user.getEmail().equals(request.getEmail())) { if (userRepository.findByEmail(request.getEmail()).isPresent()) { throw new BadRequestException("Email is already in use"); } user.setEmail(request.getEmail()); } userRepository.save(user); return ResponseEntity.ok(new ApiResponse(true)); } @DeleteMapping("/users/{userId}/phone") public ResponseEntity<?> deletePhone(@PathVariable Long userId) { User user = userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User not found with id " + userId)); if (user.getPhoneNumber() == null || user.getPhoneNumber().isEmpty()) { throw new BadRequestException("Phone number not set for the user"); } user.setPhoneNumber(null); userRepository.save(user); return ResponseEntity.ok(new ApiResponse(true)); } @DeleteMapping("/users/{userId}/email") public ResponseEntity<?> deleteEmail(@PathVariable Long userId) { User user = userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User not found with id " + userId)); if (user.getEmail() == null || user.getEmail().isEmpty()) { throw new BadRequestException("Email not set for the user"); } user.setEmail(null); userRepository.save(user); return ResponseEntity.ok(new ApiResponse(true)); } @PostMapping("/transfers") public ResponseEntity<?> transferMoney(@AuthenticationPrincipal User currentUser, @RequestBody TransferMoneyRequest request) { Account fromAccount = accountRepository.findByUserId(currentUser.getId()).orElseThrow(() -> new ResourceNotFoundException("User account not found")); Account toAccount = accountRepository.findById(request.getToAccountId()).orElseThrow(() -> new ResourceNotFoundException("To account not found")); if (fromAccount.getBalance().compareTo(request.getAmount()) < 0) { throw new BadRequestException("Insufficient funds on the source account"); } fromAccount.setBalance(fromAccount.getBalance().subtract(request.getAmount())); toAccount.setBalance(toAccount.getBalance().add(request.getAmount())); accountRepository.save(fromAccount); accountRepository.save(toAccount); return ResponseEntity.ok(new ApiResponse(true)); }