From 9d51ff147d391d2123d0d6c61754bd9453c55bc1 Mon Sep 17 00:00:00 2001 From: Valentyn Kolesnikov Date: Sat, 5 Jul 2025 14:56:43 +0300 Subject: [PATCH] Refined code style: formatted all source files --- .github/workflows/maven.yml | 25 ++++++ .../org/example/springbank/Application.java | 5 +- .../example/springbank/config/AppConfig.java | 8 +- .../springbank/config/AuthHandler.java | 23 ++--- .../springbank/config/SecurityConfig.java | 69 ++++++++------- .../controllers/AccountController.java | 49 ++++++----- .../controllers/ClientController.java | 32 +++---- .../controllers/DemoDataController.java | 2 +- .../controllers/LoanController.java | 43 ++++++---- .../controllers/TransactionController.java | 86 +++++++++++-------- .../controllers/UserController.java | 62 ++++++------- .../example/springbank/dto/CustomUserDTO.java | 5 +- .../dto/TransactionToNotifyDTO.java | 3 +- .../springbank/dto/results/ResultDTO.java | 4 +- .../springbank/dto/results/SuccessResult.java | 3 +- .../springbank/enums/CurrencyType.java | 4 +- .../springbank/enums/TransactionType.java | 8 +- .../springbank/enums/UserRegisterType.java | 3 +- .../example/springbank/enums/UserRole.java | 4 +- .../AccountProcessingException.java | 1 - .../exceptions/DataAccessException.java | 1 - .../exceptions/GlobalExceptionHandler.java | 2 +- .../GlobalViewExceptionHandler.java | 1 - .../InsufficientFundsException.java | 1 - .../exceptions/LoanNotFoundException.java | 2 +- .../exceptions/UserNotFoundException.java | 4 +- .../example/springbank/json/SingleRate.java | 5 +- .../springbank/mail/EmailScheduler.java | 3 +- .../springbank/mail/EmailServiceImpl.java | 11 ++- .../example/springbank/models/Account.java | 15 ++-- .../example/springbank/models/BaseEntity.java | 7 +- .../org/example/springbank/models/Client.java | 16 ++-- .../springbank/models/CurrencyRate.java | 12 ++- .../example/springbank/models/CustomUser.java | 56 +++++++++--- .../springbank/models/ExchangeRate.java | 2 +- .../org/example/springbank/models/Loan.java | 26 ++++-- .../springbank/models/Transaction.java | 38 +++++--- .../repositories/CurrencyRateRepository.java | 3 +- .../repositories/LoanRepository.java | 3 +- .../repositories/TransactionRepository.java | 19 ++-- .../repositories/UserRepository.java | 6 +- .../springbank/services/AccountService.java | 22 +++-- .../springbank/services/ClientService.java | 24 +++--- .../springbank/services/DemoDataService.java | 50 ++++++++--- .../springbank/services/LoanService.java | 25 +++--- .../springbank/services/RateService.java | 27 +++--- .../services/TransactionService.java | 54 +++++++----- .../services/UserDetailsServiceImpl.java | 8 +- .../springbank/services/UserService.java | 61 +++++++------ .../example/springbank/ApplicationTests.java | 4 +- .../springbank/ClientControllerTest.java | 34 ++++---- .../example/springbank/ClientServiceTest.java | 14 ++- .../springbank/UserControllerTest.java | 59 +++++++------ .../example/springbank/UserServiceTest.java | 41 +++++---- 54 files changed, 651 insertions(+), 444 deletions(-) create mode 100644 .github/workflows/maven.yml diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 0000000..5446440 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,25 @@ +name: Java CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'corretto' + cache: maven + - name: Build with Maven + run: mvn -T 1C -B clean com.spotify.fmt:fmt-maven-plugin:2.27:check -Dstyle=aosp test diff --git a/src/main/java/org/example/springbank/Application.java b/src/main/java/org/example/springbank/Application.java index 293b7dd..474349d 100644 --- a/src/main/java/org/example/springbank/Application.java +++ b/src/main/java/org/example/springbank/Application.java @@ -1,9 +1,9 @@ package org.example.springbank; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { @@ -13,5 +13,4 @@ public static void main(String[] args) { logger.info("Starting the application..."); SpringApplication.run(Application.class, args); } - } diff --git a/src/main/java/org/example/springbank/config/AppConfig.java b/src/main/java/org/example/springbank/config/AppConfig.java index ceba1bc..fca5936 100644 --- a/src/main/java/org/example/springbank/config/AppConfig.java +++ b/src/main/java/org/example/springbank/config/AppConfig.java @@ -26,7 +26,8 @@ public SimpleMailMessage messageTemplate() { SimpleMailMessage message = new SimpleMailMessage(); message.setSubject("Transaction notification"); - message.setText("Transaction completed successfully:\n\n [%s] Sender: %s, Receiver: %s, Amount: %s"); + message.setText( + "Transaction completed successfully:\n\n [%s] Sender: %s, Receiver: %s, Amount: %s"); message.setFrom(fromAddress); return message; @@ -34,10 +35,9 @@ public SimpleMailMessage messageTemplate() { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry - .addResourceHandler("/static/**") - .addResourceLocations("/WEB-INF/static/"); + registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/"); } + @Profile("local") @Bean public CommandLineRunner demo(final DemoDataService demoDataService) { diff --git a/src/main/java/org/example/springbank/config/AuthHandler.java b/src/main/java/org/example/springbank/config/AuthHandler.java index 65b1a96..aeb28ee 100644 --- a/src/main/java/org/example/springbank/config/AuthHandler.java +++ b/src/main/java/org/example/springbank/config/AuthHandler.java @@ -9,11 +9,12 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + @Component public class AuthHandler implements AuthenticationSuccessHandler { @@ -24,9 +25,11 @@ public AuthHandler(UserService userService) { } @Override - public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, - HttpServletResponse httpServletResponse, - Authentication authentication) throws IOException { + public void onAuthenticationSuccess( + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse, + Authentication authentication) + throws IOException { System.out.println("OAuth2 authentication successful!!!"); OAuth2User oAuth2User = (OAuth2User) authentication.getPrincipal(); Map attributes = oAuth2User.getAttributes(); @@ -45,11 +48,11 @@ public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, if (user == null) { System.out.println("User not found, creating new Google user"); - CustomUserDTO userDTO = CustomUserDTO.of( - email, - (String) attributes.get("name"), - (String) attributes.get("picture") - ); + CustomUserDTO userDTO = + CustomUserDTO.of( + email, + (String) attributes.get("name"), + (String) attributes.get("picture")); userService.addGoogleUser(userDTO); httpServletResponse.sendRedirect("/"); diff --git a/src/main/java/org/example/springbank/config/SecurityConfig.java b/src/main/java/org/example/springbank/config/SecurityConfig.java index b637f29..21d260b 100644 --- a/src/main/java/org/example/springbank/config/SecurityConfig.java +++ b/src/main/java/org/example/springbank/config/SecurityConfig.java @@ -19,6 +19,7 @@ public SecurityConfig(AuthHandler authHandler) { this.authenticationSuccessHandler = authHandler; System.out.println("Authentication Success Handler: " + authenticationSuccessHandler); } + @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); @@ -26,36 +27,44 @@ public PasswordEncoder passwordEncoder() { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http - .csrf().disable() - .authorizeRequests(auth -> auth - .antMatchers("/").hasAnyRole("USER", "ADMIN") - .antMatchers("/register","/login", "/js/**", "/css/**", "/images/**", "/favicon.ico", "/logout") - .permitAll() - .anyRequest() - .authenticated() - ) - .exceptionHandling(ex -> ex - .accessDeniedPage("/error/403") - ) - .formLogin(form -> form - .loginPage("/login") - .loginProcessingUrl("/j_spring_security_check") - .failureUrl("/login?error") - .usernameParameter("j_login") - .passwordParameter("j_password") - .permitAll() - ) - .oauth2Login(oauth -> oauth - .loginPage("/login") - .successHandler(authenticationSuccessHandler) - .failureHandler(new SimpleUrlAuthenticationFailureHandler("/login?error")) - ) - .logout(logout -> logout - .logoutUrl("/logout") - .logoutSuccessUrl("/login?logout") - .permitAll() - ); + http.csrf() + .disable() + .authorizeRequests( + auth -> + auth.antMatchers("/") + .hasAnyRole("USER", "ADMIN") + .antMatchers( + "/register", + "/login", + "/js/**", + "/css/**", + "/images/**", + "/favicon.ico", + "/logout") + .permitAll() + .anyRequest() + .authenticated()) + .exceptionHandling(ex -> ex.accessDeniedPage("/error/403")) + .formLogin( + form -> + form.loginPage("/login") + .loginProcessingUrl("/j_spring_security_check") + .failureUrl("/login?error") + .usernameParameter("j_login") + .passwordParameter("j_password") + .permitAll()) + .oauth2Login( + oauth -> + oauth.loginPage("/login") + .successHandler(authenticationSuccessHandler) + .failureHandler( + new SimpleUrlAuthenticationFailureHandler( + "/login?error"))) + .logout( + logout -> + logout.logoutUrl("/logout") + .logoutSuccessUrl("/login?logout") + .permitAll()); return http.build(); } } diff --git a/src/main/java/org/example/springbank/controllers/AccountController.java b/src/main/java/org/example/springbank/controllers/AccountController.java index 94e8930..b83a162 100644 --- a/src/main/java/org/example/springbank/controllers/AccountController.java +++ b/src/main/java/org/example/springbank/controllers/AccountController.java @@ -20,18 +20,19 @@ public class AccountController { private final AccountService accountService; private final DemoDataService demoDataService; - public AccountController(AccountService accountService, DemoDataService demoDataService){ + public AccountController(AccountService accountService, DemoDataService demoDataService) { this.accountService = accountService; this.demoDataService = demoDataService; } @GetMapping("/") - public String listAllAccounts(Model model, - @RequestParam(required = false, defaultValue = "0") Integer page){ + public String listAllAccounts( + Model model, @RequestParam(required = false, defaultValue = "0") Integer page) { if (page < 0) page = 0; - List accounts = accountService - .findAll(PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); + List accounts = + accountService.findAll( + PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); model.addAttribute("clients", accountService.findClients()); model.addAttribute("accounts", accounts); @@ -44,13 +45,17 @@ public String listAllAccounts(Model model, public String listAccountsByClient( @PathVariable(value = "id") long clientId, @RequestParam(required = false, defaultValue = "0") Integer page, - Model model) - { - Client client = (clientId != Constants.DEFAULT_CLIENT_ID) ? accountService.findClient(clientId) : null; + Model model) { + Client client = + (clientId != Constants.DEFAULT_CLIENT_ID) + ? accountService.findClient(clientId) + : null; if (page < 0) page = 0; - List accounts = accountService - .findByClient(client, PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); + List accounts = + accountService.findByClient( + client, + PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); model.addAttribute("clients", accountService.findClients()); model.addAttribute("accounts", accounts); @@ -61,20 +66,22 @@ public String listAccountsByClient( } @GetMapping("/account_add_page/{id}") - public String accountAddPage(Model model, - @PathVariable(value = "id") long clientId) { + public String accountAddPage(Model model, @PathVariable(value = "id") long clientId) { model.addAttribute("clients", accountService.findClients()); model.addAttribute("client", accountService.findClient(clientId)); model.addAttribute("currencies", CurrencyType.values()); return "account/account_add_page"; } - @PostMapping(value="/add") - public String accountAdd(@RequestParam(value = "clientId") long clientId, - @RequestParam double balance, - @RequestParam CurrencyType currency) - { - Client client = (clientId != Constants.DEFAULT_CLIENT_ID) ? accountService.findClient(clientId) : null; + @PostMapping(value = "/add") + public String accountAdd( + @RequestParam(value = "clientId") long clientId, + @RequestParam double balance, + @RequestParam CurrencyType currency) { + Client client = + (clientId != Constants.DEFAULT_CLIENT_ID) + ? accountService.findClient(clientId) + : null; Account account = new Account(client, balance, currency); accountService.addAccount(account); @@ -98,11 +105,13 @@ public String search(@RequestParam String pattern, Model model) { private long getPageCount() { long totalCount = accountService.count(); - return (totalCount / Constants.ITEMS_PER_PAGE) + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); + return (totalCount / Constants.ITEMS_PER_PAGE) + + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); } private long getPageCount(Client client) { long totalCount = accountService.countByClient(client); - return (totalCount / Constants.ITEMS_PER_PAGE) + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); + return (totalCount / Constants.ITEMS_PER_PAGE) + + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); } } diff --git a/src/main/java/org/example/springbank/controllers/ClientController.java b/src/main/java/org/example/springbank/controllers/ClientController.java index 76b6cb4..b57b96c 100644 --- a/src/main/java/org/example/springbank/controllers/ClientController.java +++ b/src/main/java/org/example/springbank/controllers/ClientController.java @@ -22,7 +22,7 @@ public class ClientController { private final ClientService clientService; private final DemoDataService demoDataService; - public ClientController(ClientService clientService, DemoDataService demoDataService){ + public ClientController(ClientService clientService, DemoDataService demoDataService) { this.clientService = clientService; this.demoDataService = demoDataService; } @@ -40,11 +40,13 @@ public Client getClientByName(@PathVariable String name) { } @GetMapping("/") - public String index(Model model, - @RequestParam(required = false, defaultValue = "0") Integer page){ - if(page < 0) page = 0; + public String index( + Model model, @RequestParam(required = false, defaultValue = "0") Integer page) { + if (page < 0) page = 0; - List clients = clientService.findAll(PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); + List clients = + clientService.findAll( + PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); model.addAttribute("clients", clients); model.addAttribute("allPages", getPageCount()); @@ -56,13 +58,13 @@ public String clientAddPage() { return "client/client_add_page"; } - @PostMapping(value="/add") - public String clientAdd(@RequestParam String name, - @RequestParam String surname, - @RequestParam String phone, - @RequestParam String email, - @RequestParam String address) - { + @PostMapping(value = "/add") + public String clientAdd( + @RequestParam String name, + @RequestParam String surname, + @RequestParam String phone, + @RequestParam String email, + @RequestParam String address) { Client client = new Client(name, surname, phone, email, address); clientService.addClient(client); @@ -78,8 +80,7 @@ public String resetDemoData() { @PostMapping(value = "/delete") public ResponseEntity delete( @RequestParam(value = "toDelete[]", required = false) long[] toDelete) { - if (toDelete != null && toDelete.length > 0) - clientService.deleteClient(toDelete); + if (toDelete != null && toDelete.length > 0) clientService.deleteClient(toDelete); return new ResponseEntity<>(HttpStatus.OK); } @@ -93,6 +94,7 @@ public String search(@RequestParam String pattern, Model model) { private long getPageCount() { long totalCount = clientService.count(); - return (totalCount / Constants.ITEMS_PER_PAGE) + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); + return (totalCount / Constants.ITEMS_PER_PAGE) + + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); } } diff --git a/src/main/java/org/example/springbank/controllers/DemoDataController.java b/src/main/java/org/example/springbank/controllers/DemoDataController.java index a5b31a2..360a09e 100644 --- a/src/main/java/org/example/springbank/controllers/DemoDataController.java +++ b/src/main/java/org/example/springbank/controllers/DemoDataController.java @@ -4,7 +4,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController -//@RequestMapping("/demo") +// @RequestMapping("/demo") public class DemoDataController { private final DemoDataService demoDataService; diff --git a/src/main/java/org/example/springbank/controllers/LoanController.java b/src/main/java/org/example/springbank/controllers/LoanController.java index db29dbb..1c1e267 100644 --- a/src/main/java/org/example/springbank/controllers/LoanController.java +++ b/src/main/java/org/example/springbank/controllers/LoanController.java @@ -26,12 +26,13 @@ public LoanController(LoanService loanService, DemoDataService demoDataService) } @GetMapping("/") - public String listAllLoans(Model model, - @RequestParam(required = false, defaultValue = "0") Integer page){ + public String listAllLoans( + Model model, @RequestParam(required = false, defaultValue = "0") Integer page) { if (page < 0) page = 0; - List loans = loanService - .findAll(PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); + List loans = + loanService.findAll( + PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); model.addAttribute("clients", loanService.findClients()); model.addAttribute("loans", loans); @@ -44,13 +45,15 @@ public String listAllLoans(Model model, public String listLoansByClient( @PathVariable(value = "id") long clientId, @RequestParam(required = false, defaultValue = "0") Integer page, - Model model) - { - Client client = (clientId != Constants.DEFAULT_CLIENT_ID) ? loanService.findClient(clientId) : null; + Model model) { + Client client = + (clientId != Constants.DEFAULT_CLIENT_ID) ? loanService.findClient(clientId) : null; if (page < 0) page = 0; - List loans = loanService - .findByClient(client, PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); + List loans = + loanService.findByClient( + client, + PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); model.addAttribute("clients", loanService.findClients()); model.addAttribute("loans", loans); @@ -61,20 +64,20 @@ public String listLoansByClient( } @GetMapping("/loan_add_page/{id}") - public String loanAddPage(Model model, - @PathVariable(value = "id") long clientId) { + public String loanAddPage(Model model, @PathVariable(value = "id") long clientId) { model.addAttribute("clients", loanService.findClients()); model.addAttribute("client", loanService.findClient(clientId)); model.addAttribute("currencies", CurrencyType.values()); return "loan/loan_add_page"; } - @PostMapping(value="/add") - public String loanAdd(@RequestParam(value = "clientId") long clientId, - @RequestParam double balance, - @RequestParam CurrencyType currency) - { - Client client = (clientId != Constants.DEFAULT_CLIENT_ID) ? loanService.findClient(clientId) : null; + @PostMapping(value = "/add") + public String loanAdd( + @RequestParam(value = "clientId") long clientId, + @RequestParam double balance, + @RequestParam CurrencyType currency) { + Client client = + (clientId != Constants.DEFAULT_CLIENT_ID) ? loanService.findClient(clientId) : null; Loan loan = new Loan(client, balance, currency); loanService.addLoan(loan); @@ -98,11 +101,13 @@ public String search(@RequestParam String pattern, Model model) { private long getPageCount() { long totalCount = loanService.count(); - return (totalCount / Constants.ITEMS_PER_PAGE) + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); + return (totalCount / Constants.ITEMS_PER_PAGE) + + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); } private long getPageCount(Client client) { long totalCount = loanService.countByClient(client); - return (totalCount / Constants.ITEMS_PER_PAGE) + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); + return (totalCount / Constants.ITEMS_PER_PAGE) + + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); } } diff --git a/src/main/java/org/example/springbank/controllers/TransactionController.java b/src/main/java/org/example/springbank/controllers/TransactionController.java index 15d01a6..1c825df 100644 --- a/src/main/java/org/example/springbank/controllers/TransactionController.java +++ b/src/main/java/org/example/springbank/controllers/TransactionController.java @@ -22,19 +22,20 @@ public class TransactionController { private final TransactionService transactionService; private final DemoDataService demoDataService; - public TransactionController(TransactionService transactionService, DemoDataService demoDataService) { + public TransactionController( + TransactionService transactionService, DemoDataService demoDataService) { this.transactionService = transactionService; this.demoDataService = demoDataService; } @GetMapping("/") - public String listAllTransactions(Model model, - @RequestParam(required = false, defaultValue = "0") Integer page) - { + public String listAllTransactions( + Model model, @RequestParam(required = false, defaultValue = "0") Integer page) { if (page < 0) page = 0; - List transactions = transactionService - .findAll(PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); + List transactions = + transactionService.findAll( + PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); model.addAttribute("transactions", transactions); model.addAttribute("allPages", getPageCount()); @@ -45,13 +46,17 @@ public String listAllTransactions(Model model, public String listTransactionsByAccount( @PathVariable(value = "id") long accountId, @RequestParam(required = false, defaultValue = "0") Integer page, - Model model) - { - Account account = (accountId != Constants.DEFAULT_ACCOUNT_ID) ? transactionService.findAccount(accountId) : null; + Model model) { + Account account = + (accountId != Constants.DEFAULT_ACCOUNT_ID) + ? transactionService.findAccount(accountId) + : null; if (page < 0) page = 0; - List transactions = transactionService - .findByAnyAccount(account, PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); + List transactions = + transactionService.findByAnyAccount( + account, + PageRequest.of(page, Constants.ITEMS_PER_PAGE, Sort.Direction.DESC, "id")); model.addAttribute("accounts", transactionService.findAccounts()); model.addAttribute("transactions", transactions); @@ -62,28 +67,29 @@ public String listTransactionsByAccount( } @GetMapping("/deposit_page/{id}") - public String transactionDepositPage(Model model, - @PathVariable(value = "id") long accountId) { + public String transactionDepositPage(Model model, @PathVariable(value = "id") long accountId) { model.addAttribute("accounts", transactionService.findAccounts()); model.addAttribute("account", transactionService.findAccount(accountId)); return "transaction/deposit_page"; } - @PostMapping(value="/deposit") - public String transactionDeposit(@RequestParam(value = "fromaccount") long accountId, - @RequestParam double amount) - { - Account account = (accountId != Constants.DEFAULT_ACCOUNT_ID) ? transactionService.findAccount(accountId) : null; + @PostMapping(value = "/deposit") + public String transactionDeposit( + @RequestParam(value = "fromaccount") long accountId, @RequestParam double amount) { + Account account = + (accountId != Constants.DEFAULT_ACCOUNT_ID) + ? transactionService.findAccount(accountId) + : null; - Transaction transaction = new Transaction(account, account, amount, amount, TransactionType.DEPOSIT); + Transaction transaction = + new Transaction(account, account, amount, amount, TransactionType.DEPOSIT); transactionService.deposit(transaction); return "redirect:/transaction/account/" + accountId; } @GetMapping("/transfer_page/{id}") - public String transactionTransferPage(Model model, - @PathVariable(value = "id") long accountId) { + public String transactionTransferPage(Model model, @PathVariable(value = "id") long accountId) { Account sender = transactionService.findAccount(accountId); List accounts = transactionService.findAccounts(); @@ -94,7 +100,9 @@ public String transactionTransferPage(Model model, for (Account acc : accounts) { String receiverCurrency = acc.getCurrency().toString(); if (!receiverCurrency.equals(sender.getCurrency())) { - double rate = transactionService.getTodayRate(sender.getCurrency().toString(), receiverCurrency); + double rate = + transactionService.getTodayRate( + sender.getCurrency().toString(), receiverCurrency); exchangeRates.put(receiverCurrency, rate); } } @@ -103,19 +111,27 @@ public String transactionTransferPage(Model model, return "transaction/transfer_page"; } - @PostMapping(value="/transfer") - public String transactionTransfer(@RequestParam(value = "fromaccount") long fromAccountId, - @RequestParam(value = "toaccount") long toAccountId, - @RequestParam double amount, - @RequestParam(value = "isConversion", required = false) boolean isConversion, - @RequestParam(value = "convertedAmount", required = false) Double convertedAmount) - { - Account fromAccount = (fromAccountId != Constants.DEFAULT_ACCOUNT_ID) ? transactionService.findAccount(fromAccountId) : null; - Account toAccount = (toAccountId != Constants.DEFAULT_ACCOUNT_ID) ? transactionService.findAccount(toAccountId) : null; + @PostMapping(value = "/transfer") + public String transactionTransfer( + @RequestParam(value = "fromaccount") long fromAccountId, + @RequestParam(value = "toaccount") long toAccountId, + @RequestParam double amount, + @RequestParam(value = "isConversion", required = false) boolean isConversion, + @RequestParam(value = "convertedAmount", required = false) Double convertedAmount) { + Account fromAccount = + (fromAccountId != Constants.DEFAULT_ACCOUNT_ID) + ? transactionService.findAccount(fromAccountId) + : null; + Account toAccount = + (toAccountId != Constants.DEFAULT_ACCOUNT_ID) + ? transactionService.findAccount(toAccountId) + : null; double finalAmount = (isConversion && convertedAmount != null) ? convertedAmount : amount; - Transaction transaction = new Transaction(fromAccount, toAccount, amount, finalAmount, TransactionType.TRANSFER); + Transaction transaction = + new Transaction( + fromAccount, toAccount, amount, finalAmount, TransactionType.TRANSFER); transactionService.transfer(transaction); return "redirect:/transaction/account/" + fromAccountId; @@ -137,11 +153,13 @@ public String search(@RequestParam String pattern, Model model) { private long getPageCount() { long totalCount = transactionService.count(); - return (totalCount / Constants.ITEMS_PER_PAGE) + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); + return (totalCount / Constants.ITEMS_PER_PAGE) + + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); } private long getPageCount(Account account) { long totalCount = transactionService.countByReceiverAccount(account); - return (totalCount / Constants.ITEMS_PER_PAGE) + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); + return (totalCount / Constants.ITEMS_PER_PAGE) + + ((totalCount % Constants.ITEMS_PER_PAGE > 0) ? 1 : 0); } } diff --git a/src/main/java/org/example/springbank/controllers/UserController.java b/src/main/java/org/example/springbank/controllers/UserController.java index 2f92e99..d3bc18b 100644 --- a/src/main/java/org/example/springbank/controllers/UserController.java +++ b/src/main/java/org/example/springbank/controllers/UserController.java @@ -7,6 +7,8 @@ import org.example.springbank.retrievers.RateRetriever; import org.example.springbank.services.RateService; import org.example.springbank.services.UserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -19,14 +21,13 @@ import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import javax.validation.Valid; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; +import javax.validation.Valid; + @Controller public class UserController { private final UserService userService; @@ -34,8 +35,8 @@ public class UserController { private final RateService rateService; private static final Logger logger = LoggerFactory.getLogger(RateRetriever.class); - - public UserController(UserService userService, PasswordEncoder passwordEncoder, RateService rateService) { + public UserController( + UserService userService, PasswordEncoder passwordEncoder, RateService rateService) { this.userService = userService; this.passwordEncoder = passwordEncoder; this.rateService = rateService; @@ -74,9 +75,10 @@ public String profile(Model model) { } @PostMapping(value = "/update") - public String update(@RequestParam(required = false) String name, - @RequestParam(required = false) String phone, - @RequestParam(required = false) String address) { + public String update( + @RequestParam(required = false) String name, + @RequestParam(required = false) String phone, + @RequestParam(required = false) String address) { CustomUser customUser = getCurrentCustomUser(); String email = customUser.getEmail(); customUser.getClient().setPhone(phone); @@ -92,19 +94,19 @@ public String register() { } @PostMapping(value = "/newuser") - public String add(@RequestParam String email, - @RequestParam String password, - @RequestParam String name, - @RequestParam String surname, - @RequestParam(required = false) String phone, - @RequestParam(required = false) String address, - @ModelAttribute @Valid CustomUser form, - BindingResult binding, - Model model) { + public String add( + @RequestParam String email, + @RequestParam String password, + @RequestParam String name, + @RequestParam String surname, + @RequestParam(required = false) String phone, + @RequestParam(required = false) String address, + @ModelAttribute @Valid CustomUser form, + BindingResult binding, + Model model) { String passHash = passwordEncoder.encode(password); - if (password.length() < 8) - return "error"; + if (password.length() < 8) return "error"; Client client = new Client(); client.setName(name); @@ -113,7 +115,7 @@ public String add(@RequestParam String email, client.setPhone(phone); client.setAddress(address); - if ( ! userService.addUser(email, passHash, UserRole.USER, client, name)) { + if (!userService.addUser(email, passHash, UserRole.USER, client, name)) { model.addAttribute("exists", true); model.addAttribute("email", email); return "register"; @@ -127,8 +129,8 @@ public String add(@RequestParam String email, } @PostMapping(value = "/delete") - public String delete(@RequestParam(name = "toDelete[]", required = false) List ids, - Model model) { + public String delete( + @RequestParam(name = "toDelete[]", required = false) List ids, Model model) { userService.deleteUsers(ids); model.addAttribute("users", userService.getAllUsers()); @@ -147,7 +149,6 @@ public String admin(Model model) { return "admin"; } - @GetMapping("/error/403") public String unauthorized(Model model) { @@ -169,11 +170,13 @@ private CustomUser resolveUserAndAddAttributes(Model model, boolean includeDetai Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Object principal = authentication.getPrincipal(); - Collection roles = (principal instanceof DefaultOidcUser) - ? ((DefaultOidcUser) principal).getAuthorities().stream() - .filter(a -> a.getAuthority().startsWith("ROLE_")) - .collect(Collectors.toList()) - : ((User) principal).getAuthorities(); + Collection roles = + (principal instanceof DefaultOidcUser) + ? ((DefaultOidcUser) principal) + .getAuthorities().stream() + .filter(a -> a.getAuthority().startsWith("ROLE_")) + .collect(Collectors.toList()) + : ((User) principal).getAuthorities(); model.addAttribute("roles", roles); model.addAttribute("admin", isAdmin(principal)); @@ -223,7 +226,6 @@ private boolean isAdmin(Object principal) { throw new IllegalStateException("Unknown principal type: " + principal.getClass()); } - return authorities.stream() - .anyMatch(auth -> "ROLE_ADMIN".equals(auth.getAuthority())); + return authorities.stream().anyMatch(auth -> "ROLE_ADMIN".equals(auth.getAuthority())); } } diff --git a/src/main/java/org/example/springbank/dto/CustomUserDTO.java b/src/main/java/org/example/springbank/dto/CustomUserDTO.java index 5ce34ac..62187cc 100644 --- a/src/main/java/org/example/springbank/dto/CustomUserDTO.java +++ b/src/main/java/org/example/springbank/dto/CustomUserDTO.java @@ -14,13 +14,16 @@ private CustomUserDTO(String email, String name, String pictureUrl) { public static CustomUserDTO of(String email, String name, String pictureUrl) { return new CustomUserDTO(email, name, pictureUrl); } + public String getEmail() { return email; } + public String getName() { return name; } + public String getPictureUrl() { return pictureUrl; } -} \ No newline at end of file +} diff --git a/src/main/java/org/example/springbank/dto/TransactionToNotifyDTO.java b/src/main/java/org/example/springbank/dto/TransactionToNotifyDTO.java index 6777ddc..cdee317 100644 --- a/src/main/java/org/example/springbank/dto/TransactionToNotifyDTO.java +++ b/src/main/java/org/example/springbank/dto/TransactionToNotifyDTO.java @@ -9,7 +9,8 @@ public class TransactionToNotifyDTO { private final String receiverName; private final double amount; - public TransactionToNotifyDTO(String email, Date date, String senderName, String receiverName, double amount) { + public TransactionToNotifyDTO( + String email, Date date, String senderName, String receiverName, double amount) { this.email = email; this.date = date; this.senderName = senderName; diff --git a/src/main/java/org/example/springbank/dto/results/ResultDTO.java b/src/main/java/org/example/springbank/dto/results/ResultDTO.java index 8fcbbfd..c2a4411 100644 --- a/src/main/java/org/example/springbank/dto/results/ResultDTO.java +++ b/src/main/java/org/example/springbank/dto/results/ResultDTO.java @@ -3,8 +3,7 @@ public abstract class ResultDTO { protected String description = "OK"; - public ResultDTO() { - } + public ResultDTO() {} public ResultDTO(String description) { this.description = description; @@ -18,4 +17,3 @@ public void setDescription(String description) { this.description = description; } } - diff --git a/src/main/java/org/example/springbank/dto/results/SuccessResult.java b/src/main/java/org/example/springbank/dto/results/SuccessResult.java index fff4c2a..03c6ad6 100644 --- a/src/main/java/org/example/springbank/dto/results/SuccessResult.java +++ b/src/main/java/org/example/springbank/dto/results/SuccessResult.java @@ -1,4 +1,3 @@ package org.example.springbank.dto.results; -public class SuccessResult extends ResultDTO { -} +public class SuccessResult extends ResultDTO {} diff --git a/src/main/java/org/example/springbank/enums/CurrencyType.java b/src/main/java/org/example/springbank/enums/CurrencyType.java index 5bfecd9..b0b0a46 100644 --- a/src/main/java/org/example/springbank/enums/CurrencyType.java +++ b/src/main/java/org/example/springbank/enums/CurrencyType.java @@ -1,7 +1,9 @@ package org.example.springbank.enums; public enum CurrencyType { - USD, EUR, UAH; + USD, + EUR, + UAH; public static CurrencyType fromString(String input) { try { diff --git a/src/main/java/org/example/springbank/enums/TransactionType.java b/src/main/java/org/example/springbank/enums/TransactionType.java index 38c5911..c58c8b7 100644 --- a/src/main/java/org/example/springbank/enums/TransactionType.java +++ b/src/main/java/org/example/springbank/enums/TransactionType.java @@ -1,7 +1,9 @@ package org.example.springbank.enums; public enum TransactionType { - DEPOSIT, CONVERT, TRANSFER; + DEPOSIT, + CONVERT, + TRANSFER; public static TransactionType fromString(String input) { try { @@ -12,7 +14,7 @@ public static TransactionType fromString(String input) { } @Override - public String toString(){ + public String toString() { return name().toLowerCase(); } -} \ No newline at end of file +} diff --git a/src/main/java/org/example/springbank/enums/UserRegisterType.java b/src/main/java/org/example/springbank/enums/UserRegisterType.java index 3097e16..ef7ce1f 100644 --- a/src/main/java/org/example/springbank/enums/UserRegisterType.java +++ b/src/main/java/org/example/springbank/enums/UserRegisterType.java @@ -1,7 +1,8 @@ package org.example.springbank.enums; public enum UserRegisterType { - FORM, GOOGLE; + FORM, + GOOGLE; @Override public String toString() { diff --git a/src/main/java/org/example/springbank/enums/UserRole.java b/src/main/java/org/example/springbank/enums/UserRole.java index 7f20609..219cfae 100644 --- a/src/main/java/org/example/springbank/enums/UserRole.java +++ b/src/main/java/org/example/springbank/enums/UserRole.java @@ -1,11 +1,11 @@ package org.example.springbank.enums; public enum UserRole { - ADMIN, USER; + ADMIN, + USER; @Override public String toString() { return "ROLE_" + name(); } } - diff --git a/src/main/java/org/example/springbank/exceptions/AccountProcessingException.java b/src/main/java/org/example/springbank/exceptions/AccountProcessingException.java index 20f3643..d41514e 100644 --- a/src/main/java/org/example/springbank/exceptions/AccountProcessingException.java +++ b/src/main/java/org/example/springbank/exceptions/AccountProcessingException.java @@ -5,4 +5,3 @@ public AccountProcessingException(String message, Throwable cause) { super(message, cause); } } - diff --git a/src/main/java/org/example/springbank/exceptions/DataAccessException.java b/src/main/java/org/example/springbank/exceptions/DataAccessException.java index e4b8ec5..aee0155 100644 --- a/src/main/java/org/example/springbank/exceptions/DataAccessException.java +++ b/src/main/java/org/example/springbank/exceptions/DataAccessException.java @@ -5,4 +5,3 @@ public DataAccessException(String message, Throwable cause) { super(message, cause); } } - diff --git a/src/main/java/org/example/springbank/exceptions/GlobalExceptionHandler.java b/src/main/java/org/example/springbank/exceptions/GlobalExceptionHandler.java index f0a26e7..11bbf9f 100644 --- a/src/main/java/org/example/springbank/exceptions/GlobalExceptionHandler.java +++ b/src/main/java/org/example/springbank/exceptions/GlobalExceptionHandler.java @@ -38,4 +38,4 @@ public ResponseEntity> handleUserNotFound(UserNotFoundExcept error.put("error", ex.getMessage()); return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); } -} \ No newline at end of file +} diff --git a/src/main/java/org/example/springbank/exceptions/GlobalViewExceptionHandler.java b/src/main/java/org/example/springbank/exceptions/GlobalViewExceptionHandler.java index 4a8df38..659b14a 100644 --- a/src/main/java/org/example/springbank/exceptions/GlobalViewExceptionHandler.java +++ b/src/main/java/org/example/springbank/exceptions/GlobalViewExceptionHandler.java @@ -47,4 +47,3 @@ public String handleGenericException(Exception ex, Model model) { return "error/custom_error"; } } - diff --git a/src/main/java/org/example/springbank/exceptions/InsufficientFundsException.java b/src/main/java/org/example/springbank/exceptions/InsufficientFundsException.java index 684a153..6b12fe7 100644 --- a/src/main/java/org/example/springbank/exceptions/InsufficientFundsException.java +++ b/src/main/java/org/example/springbank/exceptions/InsufficientFundsException.java @@ -5,4 +5,3 @@ public InsufficientFundsException(String message) { super(message); } } - diff --git a/src/main/java/org/example/springbank/exceptions/LoanNotFoundException.java b/src/main/java/org/example/springbank/exceptions/LoanNotFoundException.java index 6795262..1b1d975 100644 --- a/src/main/java/org/example/springbank/exceptions/LoanNotFoundException.java +++ b/src/main/java/org/example/springbank/exceptions/LoanNotFoundException.java @@ -8,4 +8,4 @@ public LoanNotFoundException(Long id) { public LoanNotFoundException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/org/example/springbank/exceptions/UserNotFoundException.java b/src/main/java/org/example/springbank/exceptions/UserNotFoundException.java index efcd2cd..f4840fd 100644 --- a/src/main/java/org/example/springbank/exceptions/UserNotFoundException.java +++ b/src/main/java/org/example/springbank/exceptions/UserNotFoundException.java @@ -1,6 +1,6 @@ package org.example.springbank.exceptions; -public class UserNotFoundException extends RuntimeException{ +public class UserNotFoundException extends RuntimeException { public UserNotFoundException(String email) { super("User with email '" + email + "' not found!"); } @@ -12,4 +12,4 @@ public UserNotFoundException(Long id) { public UserNotFoundException(String message, Throwable cause) { super(message, cause); } -} \ No newline at end of file +} diff --git a/src/main/java/org/example/springbank/json/SingleRate.java b/src/main/java/org/example/springbank/json/SingleRate.java index a72a5c9..5470c84 100644 --- a/src/main/java/org/example/springbank/json/SingleRate.java +++ b/src/main/java/org/example/springbank/json/SingleRate.java @@ -2,7 +2,4 @@ import com.fasterxml.jackson.annotation.JsonProperty; -public record SingleRate ( - @JsonProperty("UAH") double uah, - @JsonProperty("USD") double usd -) {} +public record SingleRate(@JsonProperty("UAH") double uah, @JsonProperty("USD") double usd) {} diff --git a/src/main/java/org/example/springbank/mail/EmailScheduler.java b/src/main/java/org/example/springbank/mail/EmailScheduler.java index 2062df7..1efb322 100644 --- a/src/main/java/org/example/springbank/mail/EmailScheduler.java +++ b/src/main/java/org/example/springbank/mail/EmailScheduler.java @@ -21,7 +21,8 @@ public EmailScheduler(EmailService emailService, TransactionService transactionS @Scheduled(fixedDelay = 60000) public void sendNotifications() { - List transactions = transactionService.getTransactionToNotify(new Date()); + List transactions = + transactionService.getTransactionToNotify(new Date()); transactions.forEach((transaction) -> emailService.sendMessage(transaction)); } } diff --git a/src/main/java/org/example/springbank/mail/EmailServiceImpl.java b/src/main/java/org/example/springbank/mail/EmailServiceImpl.java index 14d46d5..3c5b3af 100644 --- a/src/main/java/org/example/springbank/mail/EmailServiceImpl.java +++ b/src/main/java/org/example/springbank/mail/EmailServiceImpl.java @@ -7,7 +7,7 @@ import org.springframework.stereotype.Component; @Component -public class EmailServiceImpl implements EmailService{ +public class EmailServiceImpl implements EmailService { private final JavaMailSender emailSender; private final ApplicationContext applicationContext; @@ -20,8 +20,13 @@ public EmailServiceImpl(JavaMailSender emailSender, ApplicationContext applicati public void sendMessage(TransactionToNotifyDTO transaction) { SimpleMailMessage message = applicationContext.getBean(SimpleMailMessage.class); - String text = String.format(message.getText(), transaction.getDate(), transaction.getSenderName(), - transaction.getReceiverName(), transaction.getAmount()); //, transaction.getType()); + String text = + String.format( + message.getText(), + transaction.getDate(), + transaction.getSenderName(), + transaction.getReceiverName(), + transaction.getAmount()); // , transaction.getType()); message.setText(text); message.setTo(transaction.getEmail()); diff --git a/src/main/java/org/example/springbank/models/Account.java b/src/main/java/org/example/springbank/models/Account.java index 6edbb99..a483dd9 100644 --- a/src/main/java/org/example/springbank/models/Account.java +++ b/src/main/java/org/example/springbank/models/Account.java @@ -3,18 +3,20 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; + import org.example.springbank.enums.CurrencyType; -import javax.persistence.*; import java.util.ArrayList; import java.util.List; +import javax.persistence.*; + @Entity @Getter @Setter @NoArgsConstructor @Table(name = "Accounts") -public class Account extends BaseEntity{ +public class Account extends BaseEntity { @ManyToOne @JoinColumn(name = "client_id", nullable = false) @@ -33,7 +35,7 @@ public class Account extends BaseEntity{ @OneToMany(mappedBy = "receiver", cascade = CascadeType.ALL, orphanRemoval = true) private List rTransactions = new ArrayList<>(); - public Account(Client client, double balance, CurrencyType currency){ + public Account(Client client, double balance, CurrencyType currency) { this.client = client; this.balance = balance; this.currency = currency; @@ -42,14 +44,13 @@ public Account(Client client, double balance, CurrencyType currency){ public void deposit(double amount) { this.balance += amount; } + public void withdraw(double amount) { this.balance -= amount; } @Override - public String toString(){ - return "Account by " + - "client '"+client.getName()+" "+client.getSurname()+"'" - ; + public String toString() { + return "Account by " + "client '" + client.getName() + " " + client.getSurname() + "'"; } } diff --git a/src/main/java/org/example/springbank/models/BaseEntity.java b/src/main/java/org/example/springbank/models/BaseEntity.java index a210d97..6b29843 100644 --- a/src/main/java/org/example/springbank/models/BaseEntity.java +++ b/src/main/java/org/example/springbank/models/BaseEntity.java @@ -1,13 +1,15 @@ package org.example.springbank.models; -import javax.persistence.*; import lombok.Getter; import lombok.Setter; + import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; import java.time.LocalDateTime; +import javax.persistence.*; + @MappedSuperclass @Getter @Setter @@ -21,6 +23,5 @@ public abstract class BaseEntity { @Column(updatable = false) private LocalDateTime createdAt; - @UpdateTimestamp - private LocalDateTime updatedAt; + @UpdateTimestamp private LocalDateTime updatedAt; } diff --git a/src/main/java/org/example/springbank/models/Client.java b/src/main/java/org/example/springbank/models/Client.java index 9696728..c3c7546 100644 --- a/src/main/java/org/example/springbank/models/Client.java +++ b/src/main/java/org/example/springbank/models/Client.java @@ -1,32 +1,36 @@ package org.example.springbank.models; import com.fasterxml.jackson.annotation.JsonIgnore; + import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import javax.persistence.*; -import javax.validation.constraints.*; import java.util.ArrayList; import java.util.List; +import javax.persistence.*; +import javax.validation.constraints.*; + @Entity @Getter @Setter @NoArgsConstructor @Table(name = "clients") -public class Client extends BaseEntity{ +public class Client extends BaseEntity { @Column(name = "client_name") private String name; + private String surname; - @Pattern(regexp="\\+?\\d{12,13}", message="Phone: 12–13 numbers, can be +") + @Pattern(regexp = "\\+?\\d{12,13}", message = "Phone: 12–13 numbers, can be +") private String phone; @NotBlank @Email(message = "Incorrect email") private String email; + private String address; @OneToMany(mappedBy = "client", cascade = CascadeType.ALL, orphanRemoval = true) @@ -39,7 +43,7 @@ public class Client extends BaseEntity{ @OneToOne(mappedBy = "client", fetch = FetchType.LAZY) private CustomUser user; - public Client(String name, String surname, String phone, String email, String address){ + public Client(String name, String surname, String phone, String email, String address) { this.name = name; this.surname = surname; this.phone = phone; @@ -55,7 +59,7 @@ public void setUser(CustomUser user) { } @Override - public String toString(){ + public String toString() { return name + " " + surname; } } diff --git a/src/main/java/org/example/springbank/models/CurrencyRate.java b/src/main/java/org/example/springbank/models/CurrencyRate.java index c29bd3b..0d4f6e5 100644 --- a/src/main/java/org/example/springbank/models/CurrencyRate.java +++ b/src/main/java/org/example/springbank/models/CurrencyRate.java @@ -3,6 +3,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; + import org.example.springbank.enums.CurrencyType; import javax.persistence.*; @@ -12,7 +13,7 @@ @Setter @NoArgsConstructor @Table(name = "CurrencyRates") -public class CurrencyRate extends BaseEntity{ +public class CurrencyRate extends BaseEntity { @Enumerated(EnumType.STRING) @Column(nullable = false) @@ -21,16 +22,13 @@ public class CurrencyRate extends BaseEntity{ @Column(nullable = false) private double rate; - public CurrencyRate(CurrencyType currency, double rate){ + public CurrencyRate(CurrencyType currency, double rate) { this.rate = rate; this.currency = currency; } @Override - public String toString(){ - return "CurrencyRate{" + - "currency='"+currency+"', " + - "rate="+rate+ - "}"; + public String toString() { + return "CurrencyRate{" + "currency='" + currency + "', " + "rate=" + rate + "}"; } } diff --git a/src/main/java/org/example/springbank/models/CustomUser.java b/src/main/java/org/example/springbank/models/CustomUser.java index 0d19b25..f88bcfa 100644 --- a/src/main/java/org/example/springbank/models/CustomUser.java +++ b/src/main/java/org/example/springbank/models/CustomUser.java @@ -1,8 +1,10 @@ package org.example.springbank.models; import com.fasterxml.jackson.annotation.JsonIgnore; + import lombok.Data; import lombok.NoArgsConstructor; + import org.example.springbank.dto.CustomUserDTO; import org.example.springbank.enums.UserRegisterType; import org.example.springbank.enums.UserRole; @@ -14,17 +16,19 @@ @Data @NoArgsConstructor @Table(name = "customusers") -public class CustomUser extends BaseEntity{ +public class CustomUser extends BaseEntity { @NotBlank @Email(message = "Incorrect email") @Column(nullable = false, unique = true) - private String email; //login + private String email; // login + private String name; private String password; @Enumerated(EnumType.STRING) private UserRole role; + @Enumerated(EnumType.STRING) private UserRegisterType type; @@ -35,8 +39,13 @@ public class CustomUser extends BaseEntity{ private String pictureUrl; - public CustomUser(String email, String name, String password, UserRole role, - UserRegisterType type, Client client) { + public CustomUser( + String email, + String name, + String password, + UserRole role, + UserRegisterType type, + Client client) { this.email = email; this.name = name; this.password = password; @@ -45,8 +54,13 @@ public CustomUser(String email, String name, String password, UserRole role, setClient(client); } - public CustomUser(String email, String name, UserRole role, - UserRegisterType type, Client client, String pictureUrl) { + public CustomUser( + String email, + String name, + UserRole role, + UserRegisterType type, + Client client, + String pictureUrl) { this.email = email; this.name = name; this.role = role; @@ -55,22 +69,38 @@ public CustomUser(String email, String name, UserRole role, this.pictureUrl = pictureUrl; } - public static CustomUser of(String email, String name, UserRole role, - UserRegisterType type, Client client, String pictureUrl) { + public static CustomUser of( + String email, + String name, + UserRole role, + UserRegisterType type, + Client client, + String pictureUrl) { return new CustomUser(email, name, role, type, client, pictureUrl); } + public CustomUserDTO toDTO() { return CustomUserDTO.of(email, name, pictureUrl); } public static CustomUser fromDTO(CustomUserDTO customUserDTO) { - return CustomUser.of(customUserDTO.getEmail(), customUserDTO.getName(), - null, null, null, customUserDTO.getPictureUrl()); + return CustomUser.of( + customUserDTO.getEmail(), + customUserDTO.getName(), + null, + null, + null, + customUserDTO.getPictureUrl()); } - public static CustomUser create(String email, String name, String password, UserRole role, - UserRegisterType type, Client client) { - return new CustomUser(email, name, password, role,type, client); + public static CustomUser create( + String email, + String name, + String password, + UserRole role, + UserRegisterType type, + Client client) { + return new CustomUser(email, name, password, role, type, client); } public void setClient(Client client) { diff --git a/src/main/java/org/example/springbank/models/ExchangeRate.java b/src/main/java/org/example/springbank/models/ExchangeRate.java index f597394..7cce0ae 100644 --- a/src/main/java/org/example/springbank/models/ExchangeRate.java +++ b/src/main/java/org/example/springbank/models/ExchangeRate.java @@ -12,7 +12,7 @@ @Setter @NoArgsConstructor @Table(name = "ExchangeRates") -public class ExchangeRate extends BaseEntity{ +public class ExchangeRate extends BaseEntity { private double eurToUah; private double eurToUsd; diff --git a/src/main/java/org/example/springbank/models/Loan.java b/src/main/java/org/example/springbank/models/Loan.java index 94e65d9..3c4dff9 100644 --- a/src/main/java/org/example/springbank/models/Loan.java +++ b/src/main/java/org/example/springbank/models/Loan.java @@ -3,6 +3,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; + import org.example.springbank.enums.CurrencyType; import javax.persistence.*; @@ -12,7 +13,7 @@ @Setter @NoArgsConstructor @Table(name = "Loans") -public class Loan extends BaseEntity{ +public class Loan extends BaseEntity { @ManyToOne @JoinColumn(name = "client_id", nullable = false) @@ -25,7 +26,7 @@ public class Loan extends BaseEntity{ @Column(nullable = false) private CurrencyType currency; - public Loan(Client client, double balance, CurrencyType currency){ + public Loan(Client client, double balance, CurrencyType currency) { this.client = client; this.balance = balance; this.currency = currency; @@ -40,12 +41,19 @@ public void withdraw(double amount) { } @Override - public String toString(){ - return "Loan{" + - "client='"+client.getName()+" "+client.getSurname()+"'"+ - ", " +"balance="+balance+ - ", " +"currency="+currency+ - "}"; + public String toString() { + return "Loan{" + + "client='" + + client.getName() + + " " + + client.getSurname() + + "'" + + ", " + + "balance=" + + balance + + ", " + + "currency=" + + currency + + "}"; } - } diff --git a/src/main/java/org/example/springbank/models/Transaction.java b/src/main/java/org/example/springbank/models/Transaction.java index dd3db77..4587b3a 100644 --- a/src/main/java/org/example/springbank/models/Transaction.java +++ b/src/main/java/org/example/springbank/models/Transaction.java @@ -1,27 +1,31 @@ package org.example.springbank.models; import com.fasterxml.jackson.annotation.JsonFormat; + import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; + import org.example.springbank.enums.TransactionType; -import javax.persistence.*; import java.util.Date; +import javax.persistence.*; + @Entity @Getter @Setter @NoArgsConstructor @Table(name = "Transactions") -public class Transaction extends BaseEntity{ +public class Transaction extends BaseEntity { - @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm", timezone = "UTC") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm", timezone = "UTC") private Date date; @ManyToOne @JoinColumn(name = "sender_id", nullable = false) private Account sender; + @ManyToOne @JoinColumn(name = "receiver_id", nullable = false) private Account receiver; @@ -36,7 +40,12 @@ public class Transaction extends BaseEntity{ @Column(nullable = false) private TransactionType type; - public Transaction(Account senderAccount, Account receiverAccount, double senderAmount, double receiverAmount, TransactionType type){ + public Transaction( + Account senderAccount, + Account receiverAccount, + double senderAmount, + double receiverAmount, + TransactionType type) { this.date = new Date(); this.sender = senderAccount; this.receiver = receiverAccount; @@ -50,12 +59,19 @@ public void updateSenderAmount(double senderAmount) { } @Override - public String toString(){ - return "Transaction{" + - "senderAccount="+sender+", " + - "receiverAccount="+receiver+", " + - "senderAmount="+senderAmount+", " + - "type="+type+ - "}"; + public String toString() { + return "Transaction{" + + "senderAccount=" + + sender + + ", " + + "receiverAccount=" + + receiver + + ", " + + "senderAmount=" + + senderAmount + + ", " + + "type=" + + type + + "}"; } } diff --git a/src/main/java/org/example/springbank/repositories/CurrencyRateRepository.java b/src/main/java/org/example/springbank/repositories/CurrencyRateRepository.java index f92e1ed..ef9089a 100644 --- a/src/main/java/org/example/springbank/repositories/CurrencyRateRepository.java +++ b/src/main/java/org/example/springbank/repositories/CurrencyRateRepository.java @@ -5,5 +5,4 @@ import org.springframework.stereotype.Repository; @Repository -public interface CurrencyRateRepository extends JpaRepository { -} +public interface CurrencyRateRepository extends JpaRepository {} diff --git a/src/main/java/org/example/springbank/repositories/LoanRepository.java b/src/main/java/org/example/springbank/repositories/LoanRepository.java index 7d8bd6d..a8560e3 100644 --- a/src/main/java/org/example/springbank/repositories/LoanRepository.java +++ b/src/main/java/org/example/springbank/repositories/LoanRepository.java @@ -13,7 +13,8 @@ @Repository public interface LoanRepository extends JpaRepository { - @Query("SELECT loan FROM Loan loan WHERE LOWER(loan.currency) LIKE LOWER(CONCAT('%', :pattern, '%'))") + @Query( + "SELECT loan FROM Loan loan WHERE LOWER(loan.currency) LIKE LOWER(CONCAT('%', :pattern, '%'))") List findByPattern(@Param("pattern") String pattern, Pageable pageable); @Query("SELECT loan FROM Loan loan WHERE loan.client = :client") diff --git a/src/main/java/org/example/springbank/repositories/TransactionRepository.java b/src/main/java/org/example/springbank/repositories/TransactionRepository.java index 10a45b9..681445e 100644 --- a/src/main/java/org/example/springbank/repositories/TransactionRepository.java +++ b/src/main/java/org/example/springbank/repositories/TransactionRepository.java @@ -14,25 +14,30 @@ @Repository public interface TransactionRepository extends JpaRepository { - @Query("SELECT c FROM Transaction c WHERE LOWER(c.senderAmount) LIKE LOWER(CONCAT('%', :pattern, '%'))") + @Query( + "SELECT c FROM Transaction c WHERE LOWER(c.senderAmount) LIKE LOWER(CONCAT('%', :pattern, '%'))") List findByPattern(@Param("pattern") String pattern, Pageable pageable); @Query("SELECT c FROM Transaction c WHERE c.sender = :account OR c.receiver = :account") List findByAnyAccount(@Param("account") Account account, Pageable pageable); @Query("SELECT c FROM Transaction c WHERE c.sender = :senderAccount") - List findBySenderAccount(@Param("senderAccount") Account senderAccount, Pageable pageable); + List findBySenderAccount( + @Param("senderAccount") Account senderAccount, Pageable pageable); @Query("SELECT c FROM Transaction c WHERE c.receiver = :receiverAccount") - List findByReceiverAccount(@Param("receiverAccount") Account receiverAccount, Pageable pageable); + List findByReceiverAccount( + @Param("receiverAccount") Account receiverAccount, Pageable pageable); @Query("SELECT COUNT(c) FROM Transaction c WHERE c.sender = :senderAccount") long countBySenderAccount(@Param("senderAccount") Account senderAccount); + @Query("SELECT COUNT(c) FROM Transaction c WHERE c.receiver = :receiverAccount") long countByReceiverAccount(@Param("receiverAccount") Account receiverAccount); - @Query("SELECT NEW org.example.springbank.dto.TransactionToNotifyDTO(u.email, t.date, t.sender.client.name, t.receiver.client.name, t.senderAmount)" + - "FROM CustomUser u, Transaction t WHERE t.date >= :from AND t.date < :to") - List findTransactionToNotify(@Param("from") Date from, - @Param("to") Date to); + @Query( + "SELECT NEW org.example.springbank.dto.TransactionToNotifyDTO(u.email, t.date, t.sender.client.name, t.receiver.client.name, t.senderAmount)" + + "FROM CustomUser u, Transaction t WHERE t.date >= :from AND t.date < :to") + List findTransactionToNotify( + @Param("from") Date from, @Param("to") Date to); } diff --git a/src/main/java/org/example/springbank/repositories/UserRepository.java b/src/main/java/org/example/springbank/repositories/UserRepository.java index c80e9cb..0836499 100644 --- a/src/main/java/org/example/springbank/repositories/UserRepository.java +++ b/src/main/java/org/example/springbank/repositories/UserRepository.java @@ -14,9 +14,11 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM CustomUser u WHERE u.email = :email") Optional findByEmail(@Param("email") String email); - @Query("SELECT CASE WHEN COUNT(u) > 0 THEN true ELSE false END FROM CustomUser u WHERE u.role = :role") + @Query( + "SELECT CASE WHEN COUNT(u) > 0 THEN true ELSE false END FROM CustomUser u WHERE u.role = :role") boolean existsByRole(@Param("role") UserRole role); - @Query("SELECT CASE WHEN COUNT(u) > 0 THEN true ELSE false END FROM CustomUser u WHERE u.email = :email") + @Query( + "SELECT CASE WHEN COUNT(u) > 0 THEN true ELSE false END FROM CustomUser u WHERE u.email = :email") boolean existsByEmail(@Param("email") String email); } diff --git a/src/main/java/org/example/springbank/services/AccountService.java b/src/main/java/org/example/springbank/services/AccountService.java index 6ae95c6..3437aa3 100644 --- a/src/main/java/org/example/springbank/services/AccountService.java +++ b/src/main/java/org/example/springbank/services/AccountService.java @@ -20,13 +20,13 @@ public class AccountService { private final AccountRepository accountRepository; private final ClientRepository clientRepository; - public AccountService(AccountRepository accountRepository, ClientRepository clientRepository){ + public AccountService(AccountRepository accountRepository, ClientRepository clientRepository) { this.accountRepository = accountRepository; this.clientRepository = clientRepository; } @Transactional - public void addAccount(Account account){ + public void addAccount(Account account) { try { accountRepository.save(account); } catch (Exception e) { @@ -34,7 +34,7 @@ public void addAccount(Account account){ } } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findClients() { try { return clientRepository.findAll(); @@ -43,7 +43,7 @@ public List findClients() { } } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findAll(Pageable pageable) { try { return accountRepository.findAll(pageable).getContent(); @@ -52,13 +52,12 @@ public List findAll(Pageable pageable) { } } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public Account findById(long id) { - return accountRepository.findById(id) - .orElseThrow(() -> new AccountNotFoundException(id)); + return accountRepository.findById(id).orElseThrow(() -> new AccountNotFoundException(id)); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findByClient(Client client, Pageable pageable) { try { return accountRepository.findByClient(client, pageable); @@ -67,7 +66,7 @@ public List findByClient(Client client, Pageable pageable) { } } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findByPattern(String pattern, Pageable pageable) { try { return accountRepository.findByPattern(pattern, pageable); @@ -94,10 +93,9 @@ public long count() { } } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public Client findClient(long id) { - return clientRepository.findById(id) - .orElseThrow(() -> new ClientNotFoundException(id)); + return clientRepository.findById(id).orElseThrow(() -> new ClientNotFoundException(id)); } public void deleteAllAccounts() { diff --git a/src/main/java/org/example/springbank/services/ClientService.java b/src/main/java/org/example/springbank/services/ClientService.java index c0f6a61..def25c6 100644 --- a/src/main/java/org/example/springbank/services/ClientService.java +++ b/src/main/java/org/example/springbank/services/ClientService.java @@ -18,32 +18,34 @@ public ClientService(ClientRepository clientRepository) { } @Transactional - public void addClient(Client client){ + public void addClient(Client client) { if (client == null || client.getName() == null) { throw new IllegalArgumentException("Client or client name cannot be null."); } clientRepository.save(client); - System.out.println("CLIENT IN ClientService"+clientRepository.findByPattern(client.getName(),null)); + System.out.println( + "CLIENT IN ClientService" + clientRepository.findByPattern(client.getName(), null)); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List getAllClients() { return clientRepository.findAll(); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findAll(Pageable pageable) { return clientRepository.findAll(pageable).getContent(); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public Client getByName(String name) { - return clientRepository.findByName(name) + return clientRepository + .findByName(name) .orElseThrow(() -> new ClientNotFoundException(name)); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findByPattern(String pattern, Pageable pageable) { return clientRepository.findByPattern(pattern, pageable); } @@ -55,9 +57,11 @@ public long count() { @Transactional public void deleteClient(long[] idList) { - for (long id : idList){ - Client client = clientRepository.findById(id) - .orElseThrow(() -> new ClientNotFoundException(id)); + for (long id : idList) { + Client client = + clientRepository + .findById(id) + .orElseThrow(() -> new ClientNotFoundException(id)); clientRepository.delete(client); } } diff --git a/src/main/java/org/example/springbank/services/DemoDataService.java b/src/main/java/org/example/springbank/services/DemoDataService.java index 8e4dc00..f6e0732 100644 --- a/src/main/java/org/example/springbank/services/DemoDataService.java +++ b/src/main/java/org/example/springbank/services/DemoDataService.java @@ -19,7 +19,14 @@ public class DemoDataService { private final TransactionService transactionService; private final RateService rateService; - public DemoDataService(UserService userService, PasswordEncoder encoder, ClientService clientService, LoanService loanService, AccountService accountService, TransactionService transactionService, RateService rateService) { + public DemoDataService( + UserService userService, + PasswordEncoder encoder, + ClientService clientService, + LoanService loanService, + AccountService accountService, + TransactionService transactionService, + RateService rateService) { this.userService = userService; this.encoder = encoder; this.clientService = clientService; @@ -33,7 +40,7 @@ public DemoDataService(UserService userService, PasswordEncoder encoder, ClientS public void generateDemoData() { transactionService.deleteAllTransactions(); accountService.deleteAllAccounts(); -// clientService.deleteAllClients(); + // clientService.deleteAllClients(); Client client; Loan loan; @@ -44,22 +51,32 @@ public void generateDemoData() { rateService.addDemoRate(exchangeRate); for (int i = 1; i < 3; i++) { - client = new Client("Name" + i, "Surname" + i, "12345678901" + i, "user" + i + "@test.com", "address"+i); + client = + new Client( + "Name" + i, + "Surname" + i, + "12345678901" + i, + "user" + i + "@test.com", + "address" + i); clientService.addClient(client); - userService.addUser("user" + i + "@test.com", + userService.addUser( + "user" + i + "@test.com", encoder.encode("password"), - UserRole.USER, client,"Name" + i); + UserRole.USER, + client, + "Name" + i); - for (CurrencyType currencyType : CurrencyType.values()){ + for (CurrencyType currencyType : CurrencyType.values()) { loan = new Loan(client, 10000, currencyType); loanService.addLoan(loan); } - for (CurrencyType currencyType : CurrencyType.values()){ + for (CurrencyType currencyType : CurrencyType.values()) { account = new Account(client, 0, currencyType); accountService.addAccount(account); - transaction = new Transaction(account, account, 1000, 1000, TransactionType.DEPOSIT); + transaction = + new Transaction(account, account, 1000, 1000, TransactionType.DEPOSIT); transactionService.deposit(transaction); } } @@ -67,12 +84,21 @@ public void generateDemoData() { public void createAdminIfNotExists() { if (!userService.adminExists()) { - Client clientadmin = new Client(ADMIN_LOGIN, ADMIN_LOGIN, "123456789012", ADMIN_LOGIN + "@test.com", "address"); - System.out.println("Create admin in DemoData: "+clientadmin); + Client clientadmin = + new Client( + ADMIN_LOGIN, + ADMIN_LOGIN, + "123456789012", + ADMIN_LOGIN + "@test.com", + "address"); + System.out.println("Create admin in DemoData: " + clientadmin); clientService.addClient(clientadmin); - userService.addUser(ADMIN_LOGIN + "@test.com", + userService.addUser( + ADMIN_LOGIN + "@test.com", encoder.encode("password"), - UserRole.ADMIN, clientadmin, ADMIN_LOGIN); + UserRole.ADMIN, + clientadmin, + ADMIN_LOGIN); } } } diff --git a/src/main/java/org/example/springbank/services/LoanService.java b/src/main/java/org/example/springbank/services/LoanService.java index 41e036d..1d1f4e5 100644 --- a/src/main/java/org/example/springbank/services/LoanService.java +++ b/src/main/java/org/example/springbank/services/LoanService.java @@ -18,38 +18,39 @@ public class LoanService { private final LoanRepository loanRepository; private final ClientRepository clientRepository; - public LoanService(LoanRepository loanRepository, ClientRepository clientRepository) { this.loanRepository = loanRepository; this.clientRepository = clientRepository; } - @Transactional - public void addLoan(Loan loan){loanRepository.save(loan);} + public void addLoan(Loan loan) { + loanRepository.save(loan); + } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findClients() { return clientRepository.findAll(); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findAll(Pageable pageable) { return loanRepository.findAll(pageable).getContent(); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public Loan findById(long id) { - return loanRepository.findById(id) + return loanRepository + .findById(id) .orElseThrow(() -> new LoanNotFoundException("Loan not found with id: " + id)); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findByClient(Client client, Pageable pageable) { return loanRepository.findByClient(client, pageable); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findByPattern(String pattern, Pageable pageable) { return loanRepository.findByPattern(pattern, pageable); } @@ -64,14 +65,12 @@ public long count() { return loanRepository.count(); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public Client findClient(long id) { - return clientRepository.findById(id) - .orElseThrow(() -> new ClientNotFoundException(id)); + return clientRepository.findById(id).orElseThrow(() -> new ClientNotFoundException(id)); } public void deleteAllLoans() { loanRepository.deleteAll(); } - } diff --git a/src/main/java/org/example/springbank/services/RateService.java b/src/main/java/org/example/springbank/services/RateService.java index f24b6bf..9afac6c 100644 --- a/src/main/java/org/example/springbank/services/RateService.java +++ b/src/main/java/org/example/springbank/services/RateService.java @@ -20,19 +20,21 @@ public RateService(RateRetriever rateRetriever, ExchangeRateRepository exchangeR public ExchangeRate getTodayRate() { LocalDate today = LocalDate.now(); - return exchangeRateRepository.findTopByOrderByCreatedAtDesc() + return exchangeRateRepository + .findTopByOrderByCreatedAtDesc() .filter(rate -> rate.getCreatedAt().toLocalDate().equals(today)) - .orElseGet(() -> { - try { - Rate externalRate = rateRetriever.getRate(); - ExchangeRate newRate = new ExchangeRate(); - newRate.setEurToUah(externalRate.getRates().uah()); - newRate.setEurToUsd(externalRate.getRates().usd()); - return exchangeRateRepository.save(newRate); - } catch (Exception e) { - throw new RuntimeException("Failed to fetch external rate", e); - } - }); + .orElseGet( + () -> { + try { + Rate externalRate = rateRetriever.getRate(); + ExchangeRate newRate = new ExchangeRate(); + newRate.setEurToUah(externalRate.getRates().uah()); + newRate.setEurToUsd(externalRate.getRates().usd()); + return exchangeRateRepository.save(newRate); + } catch (Exception e) { + throw new RuntimeException("Failed to fetch external rate", e); + } + }); } public ExchangeRate forceRefreshRate() { @@ -57,4 +59,3 @@ public ExchangeRate addDemoRate(ExchangeRate exchangeRate) { } } } - diff --git a/src/main/java/org/example/springbank/services/TransactionService.java b/src/main/java/org/example/springbank/services/TransactionService.java index 9ad60e6..f33d578 100644 --- a/src/main/java/org/example/springbank/services/TransactionService.java +++ b/src/main/java/org/example/springbank/services/TransactionService.java @@ -25,14 +25,17 @@ public class TransactionService { private final AccountRepository accountRepository; private final ExchangeRateRepository exchangeRateRepository; - public TransactionService(TransactionRepository transactionRepository, AccountRepository accountRepository, ExchangeRateRepository exchangeRateRepository){ + public TransactionService( + TransactionRepository transactionRepository, + AccountRepository accountRepository, + ExchangeRateRepository exchangeRateRepository) { this.transactionRepository = transactionRepository; this.accountRepository = accountRepository; this.exchangeRateRepository = exchangeRateRepository; } @Transactional - public void addTransaction(Transaction transaction){ + public void addTransaction(Transaction transaction) { try { transactionRepository.save(transaction); } catch (Exception e) { @@ -41,7 +44,7 @@ public void addTransaction(Transaction transaction){ } @Transactional - public void deposit(Transaction transaction){ + public void deposit(Transaction transaction) { try { transactionRepository.save(transaction); @@ -53,12 +56,13 @@ public void deposit(Transaction transaction){ } @Transactional - public void transfer(Transaction transaction){ + public void transfer(Transaction transaction) { try { transactionRepository.save(transaction); - if (transaction.getSender().getBalance() < transaction.getSenderAmount()) { - throw new InsufficientFundsException("Sender does not have enough funds for this transfer"); - } + if (transaction.getSender().getBalance() < transaction.getSenderAmount()) { + throw new InsufficientFundsException( + "Sender does not have enough funds for this transfer"); + } transaction.getSender().withdraw(transaction.getSenderAmount()); accountRepository.save(transaction.getReceiver()); @@ -77,8 +81,13 @@ public double getTodayRate(String fromCurrency, String toCurrency) { return 1.0; } - ExchangeRate rate = exchangeRateRepository.findTopByOrderByCreatedAtDesc() - .orElseThrow(() -> new DataAccessException("No exchange rate data available", null)); + ExchangeRate rate = + exchangeRateRepository + .findTopByOrderByCreatedAtDesc() + .orElseThrow( + () -> + new DataAccessException( + "No exchange rate data available", null)); try { double eurToUah = rate.getEurToUah(); double eurToUsd = rate.getEurToUsd(); @@ -97,13 +106,19 @@ public double getTodayRate(String fromCurrency, String toCurrency) { if ("UAH".equals(toCurrency)) return (1.0 / eurToUsd) * eurToUah; break; } - throw new DataAccessException("Unsupported currency pair: " + fromCurrency + " → " + toCurrency, null); + throw new DataAccessException( + "Unsupported currency pair: " + fromCurrency + " → " + toCurrency, null); } catch (Exception e) { - throw new DataAccessException("Error while calculating exchange rate for " + fromCurrency + " → " + toCurrency, e); + throw new DataAccessException( + "Error while calculating exchange rate for " + + fromCurrency + + " → " + + toCurrency, + e); } } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findAccounts() { try { return accountRepository.findAll(); @@ -112,13 +127,12 @@ public List findAccounts() { } } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public Account findAccount(long id) { - return accountRepository.findById(id) - .orElseThrow(() -> new AccountNotFoundException(id)); + return accountRepository.findById(id).orElseThrow(() -> new AccountNotFoundException(id)); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findAll(Pageable pageable) { try { return transactionRepository.findAll(pageable).getContent(); @@ -127,22 +141,22 @@ public List findAll(Pageable pageable) { } } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findByPattern(String pattern, Pageable pageable) { return transactionRepository.findByPattern(pattern, pageable); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findByAnyAccount(Account account, Pageable pageable) { return transactionRepository.findByAnyAccount(account, pageable); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findBySenderAccount(Account account, Pageable pageable) { return transactionRepository.findBySenderAccount(account, pageable); } - @Transactional(readOnly=true) + @Transactional(readOnly = true) public List findByReceiverAccount(Account account, Pageable pageable) { return transactionRepository.findByReceiverAccount(account, pageable); } diff --git a/src/main/java/org/example/springbank/services/UserDetailsServiceImpl.java b/src/main/java/org/example/springbank/services/UserDetailsServiceImpl.java index d969622..53dd38c 100644 --- a/src/main/java/org/example/springbank/services/UserDetailsServiceImpl.java +++ b/src/main/java/org/example/springbank/services/UserDetailsServiceImpl.java @@ -15,8 +15,7 @@ @Service public class UserDetailsServiceImpl implements UserDetailsService { - @Autowired - private final UserService userService; + @Autowired private final UserService userService; public UserDetailsServiceImpl(UserService userService) { this.userService = userService; @@ -26,9 +25,8 @@ public UserDetailsServiceImpl(UserService userService) { public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { CustomUser customUser = userService.getByEmail(email); - List roles = Arrays.asList( - new SimpleGrantedAuthority(customUser.getRole().toString()) - ); + List roles = + Arrays.asList(new SimpleGrantedAuthority(customUser.getRole().toString())); return new User(customUser.getEmail(), customUser.getPassword(), roles); } diff --git a/src/main/java/org/example/springbank/services/UserService.java b/src/main/java/org/example/springbank/services/UserService.java index 69fff51..afe74db 100644 --- a/src/main/java/org/example/springbank/services/UserService.java +++ b/src/main/java/org/example/springbank/services/UserService.java @@ -1,9 +1,9 @@ package org.example.springbank.services; -import org.example.springbank.exceptions.UserNotFoundException; import org.example.springbank.dto.CustomUserDTO; import org.example.springbank.enums.UserRegisterType; import org.example.springbank.enums.UserRole; +import org.example.springbank.exceptions.UserNotFoundException; import org.example.springbank.models.Client; import org.example.springbank.models.CustomUser; import org.example.springbank.repositories.ClientRepository; @@ -14,7 +14,7 @@ import java.util.List; @Service -public class UserService{ +public class UserService { private final UserRepository userRepository; private final ClientRepository clientRepository; @@ -41,26 +41,29 @@ public CustomUser findByEmail(String email) { @Transactional(readOnly = true) public CustomUser getByEmail(String email) { System.out.println("Run getByEmail: " + email); - return userRepository.findByEmail(email) + return userRepository + .findByEmail(email) .orElseThrow(() -> new UserNotFoundException(email)); } @Transactional public void deleteUsers(List ids) { - ids.forEach(id -> { - CustomUser user = userRepository.findById(id) - .orElseThrow(() -> new UserNotFoundException(id)); - - if (!DemoDataService.ADMIN_LOGIN.equals(user.getEmail())) { - userRepository.deleteById(user.getId()); - } - }); + ids.forEach( + id -> { + CustomUser user = + userRepository + .findById(id) + .orElseThrow(() -> new UserNotFoundException(id)); + + if (!DemoDataService.ADMIN_LOGIN.equals(user.getEmail())) { + userRepository.deleteById(user.getId()); + } + }); } @Transactional - public boolean addUser(String email, String passHash, - UserRole role, Client client, - String name) { + public boolean addUser( + String email, String passHash, UserRole role, Client client, String name) { if (email == null || client == null) { throw new IllegalArgumentException("Email or Client must not be null"); } @@ -71,16 +74,19 @@ public boolean addUser(String email, String passHash, clientRepository.save(client); - System.out.println("CLIENT IN USER CREATION (addUser)!!! "+client); - CustomUser user = CustomUser.create(email, name, passHash, role, UserRegisterType.FORM, client); + System.out.println("CLIENT IN USER CREATION (addUser)!!! " + client); + CustomUser user = + CustomUser.create(email, name, passHash, role, UserRegisterType.FORM, client); userRepository.save(user); return true; } @Transactional public void updateUser(String email, String name) { - CustomUser user = userRepository.findByEmail(email) - .orElseThrow(() -> new UserNotFoundException(email)); + CustomUser user = + userRepository + .findByEmail(email) + .orElseThrow(() -> new UserNotFoundException(email)); user.setEmail(email); user.setName(name); @@ -89,8 +95,7 @@ public void updateUser(String email, String name) { @Transactional public void addGoogleUser(CustomUserDTO userDTO) { - if (userRepository.existsByEmail(userDTO.getEmail())) - return; + if (userRepository.existsByEmail(userDTO.getEmail())) return; Client client = new Client(); client.setName(userDTO.getName()); @@ -98,16 +103,22 @@ public void addGoogleUser(CustomUserDTO userDTO) { clientRepository.save(client); - System.out.println("CLIENT from GOOGLE CREATION!!! "+client); + System.out.println("CLIENT from GOOGLE CREATION!!! " + client); - CustomUser user = CustomUser.of(userDTO.getEmail(), userDTO.getName(), - UserRole.USER, UserRegisterType.GOOGLE, client, userDTO.getPictureUrl()); + CustomUser user = + CustomUser.of( + userDTO.getEmail(), + userDTO.getName(), + UserRole.USER, + UserRegisterType.GOOGLE, + client, + userDTO.getPictureUrl()); user.setClient(client); - System.out.println("USER from GOOGLE CREATION!!! "+user); + System.out.println("USER from GOOGLE CREATION!!! " + user); client.setUser(user); userRepository.save(user); System.out.println("User saved to DB: " + user); } -} \ No newline at end of file +} diff --git a/src/test/java/org/example/springbank/ApplicationTests.java b/src/test/java/org/example/springbank/ApplicationTests.java index 1184c12..91d35de 100644 --- a/src/test/java/org/example/springbank/ApplicationTests.java +++ b/src/test/java/org/example/springbank/ApplicationTests.java @@ -7,7 +7,5 @@ class ApplicationTests { @Test - void contextLoads() { - } - + void contextLoads() {} } diff --git a/src/test/java/org/example/springbank/ClientControllerTest.java b/src/test/java/org/example/springbank/ClientControllerTest.java index 8058a83..2704f67 100644 --- a/src/test/java/org/example/springbank/ClientControllerTest.java +++ b/src/test/java/org/example/springbank/ClientControllerTest.java @@ -1,8 +1,13 @@ package org.example.springbank; +import static org.mockito.Mockito.when; +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 org.example.springbank.controllers.ClientController; -import org.example.springbank.exceptions.GlobalExceptionHandler; import org.example.springbank.exceptions.ClientNotFoundException; +import org.example.springbank.exceptions.GlobalExceptionHandler; import org.example.springbank.models.Client; import org.example.springbank.services.ClientService; import org.junit.jupiter.api.BeforeEach; @@ -16,16 +21,10 @@ import java.util.Arrays; -import static org.mockito.Mockito.when; -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; - @ExtendWith(MockitoExtension.class) public class ClientControllerTest { - @Mock - private ClientService clientMockService; + @Mock private ClientService clientMockService; private MockMvc mockMvc; private ClientController clientController; @@ -38,17 +37,17 @@ void setUp() { client2 = new Client("Iryna", "Berg", "1234568", "iryna@test.com", "addressFamily"); clientController = new ClientController(clientMockService, null); - mockMvc = MockMvcBuilders.standaloneSetup(clientController) - .setControllerAdvice(new GlobalExceptionHandler()) - .build(); + mockMvc = + MockMvcBuilders.standaloneSetup(clientController) + .setControllerAdvice(new GlobalExceptionHandler()) + .build(); } @Test public void shouldReturnListOfClients_whenGetClientsController() throws Exception { when(clientMockService.getAllClients()).thenReturn(Arrays.asList(client1, client2)); - mockMvc.perform(get("/client/api") - .contentType(MediaType.APPLICATION_JSON)) + mockMvc.perform(get("/client/api").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$[0].name").value("Dima")) .andExpect(jsonPath("$[1].name").value("Iryna")); @@ -58,18 +57,17 @@ public void shouldReturnListOfClients_whenGetClientsController() throws Exceptio public void shouldReturnClient_whenGetClientByNameExistsController() throws Exception { when(clientMockService.getByName("Dima")).thenReturn((client1)); - mockMvc.perform(get("/client/api/name/Dima") - .contentType(MediaType.APPLICATION_JSON)) + mockMvc.perform(get("/client/api/name/Dima").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("Dima")); } @Test public void shouldReturnError_whenGetClientByNameNotExistsController() throws Exception { - when(clientMockService.getByName("Unknown")).thenThrow(new ClientNotFoundException("Unknown")); + when(clientMockService.getByName("Unknown")) + .thenThrow(new ClientNotFoundException("Unknown")); - mockMvc.perform(get("/client/api/name/Unknown") - .contentType(MediaType.APPLICATION_JSON)) + mockMvc.perform(get("/client/api/name/Unknown").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNotFound()) .andExpect(jsonPath("$.error").value("Client not found: Unknown")); } diff --git a/src/test/java/org/example/springbank/ClientServiceTest.java b/src/test/java/org/example/springbank/ClientServiceTest.java index 36e7d1a..c2a8971 100644 --- a/src/test/java/org/example/springbank/ClientServiceTest.java +++ b/src/test/java/org/example/springbank/ClientServiceTest.java @@ -1,5 +1,9 @@ package org.example.springbank; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.when; + import org.example.springbank.models.Client; import org.example.springbank.repositories.ClientRepository; import org.example.springbank.services.ClientService; @@ -14,18 +18,12 @@ import java.util.List; import java.util.Optional; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.Mockito.when; - @ExtendWith(MockitoExtension.class) public class ClientServiceTest { - @Mock - private ClientRepository clientMockRepository; + @Mock private ClientRepository clientMockRepository; - @InjectMocks - private ClientService clientMockService; + @InjectMocks private ClientService clientMockService; private Client client1, client2; diff --git a/src/test/java/org/example/springbank/UserControllerTest.java b/src/test/java/org/example/springbank/UserControllerTest.java index 5c4533f..e9633ed 100644 --- a/src/test/java/org/example/springbank/UserControllerTest.java +++ b/src/test/java/org/example/springbank/UserControllerTest.java @@ -1,10 +1,15 @@ package org.example.springbank; +import static org.mockito.Mockito.when; +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 org.example.springbank.controllers.ClientController; -import org.example.springbank.exceptions.GlobalExceptionHandler; import org.example.springbank.controllers.UserController; import org.example.springbank.enums.UserRegisterType; import org.example.springbank.enums.UserRole; +import org.example.springbank.exceptions.GlobalExceptionHandler; import org.example.springbank.models.Client; import org.example.springbank.models.CustomUser; import org.example.springbank.services.ClientService; @@ -20,20 +25,13 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.util.Arrays; -import static org.mockito.Mockito.when; -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; @ExtendWith(MockitoExtension.class) public class UserControllerTest { - @Mock - private PasswordEncoder encoder; - @Mock - private ClientService clientMockService; - @Mock - private UserService userMockService; + @Mock private PasswordEncoder encoder; + @Mock private ClientService clientMockService; + @Mock private UserService userMockService; private MockMvc mockMvc; private ClientController clientController; @@ -46,22 +44,36 @@ void setUp() { client1 = new Client("Dima", "Berg", "1234567", "dima@test.com", "addressFamily"); client2 = new Client("Iryna", "Berg", "1234568", "iryna@test.com", "addressFamily"); - customUser1 = new CustomUser("dima@test.com", "Dima", encoder.encode("password"), UserRole.USER, UserRegisterType.FORM, client1); - customUser2 = new CustomUser("iryna@test.com", "Iryna", encoder.encode("password"), UserRole.USER, UserRegisterType.FORM, client2); + customUser1 = + new CustomUser( + "dima@test.com", + "Dima", + encoder.encode("password"), + UserRole.USER, + UserRegisterType.FORM, + client1); + customUser2 = + new CustomUser( + "iryna@test.com", + "Iryna", + encoder.encode("password"), + UserRole.USER, + UserRegisterType.FORM, + client2); userController = new UserController(userMockService, encoder, null); clientController = new ClientController(clientMockService, null); - mockMvc = MockMvcBuilders.standaloneSetup(userController, clientController) - .setControllerAdvice(new GlobalExceptionHandler()) - .build(); + mockMvc = + MockMvcBuilders.standaloneSetup(userController, clientController) + .setControllerAdvice(new GlobalExceptionHandler()) + .build(); } @Test public void shouldReturnListOfClients_whenGetClientsController() throws Exception { when(clientMockService.getAllClients()).thenReturn(Arrays.asList(client1, client2)); - mockMvc.perform(get("/client/api") - .contentType(MediaType.APPLICATION_JSON)) + mockMvc.perform(get("/client/api").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$[0].name").value("Dima")) .andExpect(jsonPath("$[1].name").value("Iryna")); @@ -71,8 +83,7 @@ public void shouldReturnListOfClients_whenGetClientsController() throws Exceptio public void shouldReturnClient_whenGetClientByNameExistsController() throws Exception { when(clientMockService.getByName("Dima")).thenReturn((client1)); - mockMvc.perform(get("/client/api/name/Dima") - .contentType(MediaType.APPLICATION_JSON)) + mockMvc.perform(get("/client/api/name/Dima").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("Dima")); } @@ -81,8 +92,7 @@ public void shouldReturnClient_whenGetClientByNameExistsController() throws Exce public void shouldReturnListOfUsers_whenGetUsersController() throws Exception { when(userMockService.getAllUsers()).thenReturn(Arrays.asList(customUser1, customUser2)); - mockMvc.perform(get("/user/api") - .contentType(MediaType.APPLICATION_JSON)) + mockMvc.perform(get("/user/api").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$[0].name").value("Dima")) .andExpect(jsonPath("$[1].name").value("Iryna")); @@ -92,8 +102,9 @@ public void shouldReturnListOfUsers_whenGetUsersController() throws Exception { public void shouldReturnUser_whenGetUserByEmailExistsController() throws Exception { when(userMockService.getByEmail("dima@test.com")).thenReturn((customUser1)); - mockMvc.perform(get("/user/api/email/dima@test.com") - .contentType(MediaType.APPLICATION_JSON)) + mockMvc.perform( + get("/user/api/email/dima@test.com") + .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.email").value("dima@test.com")); } diff --git a/src/test/java/org/example/springbank/UserServiceTest.java b/src/test/java/org/example/springbank/UserServiceTest.java index a9d9cce..87bf859 100644 --- a/src/test/java/org/example/springbank/UserServiceTest.java +++ b/src/test/java/org/example/springbank/UserServiceTest.java @@ -1,5 +1,9 @@ package org.example.springbank; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.when; + import org.example.springbank.enums.UserRegisterType; import org.example.springbank.enums.UserRole; import org.example.springbank.models.Client; @@ -20,22 +24,13 @@ import java.util.List; import java.util.Optional; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.Mockito.when; - @ExtendWith(MockitoExtension.class) public class UserServiceTest { - @Mock - private PasswordEncoder encoder; - @Mock - private ClientRepository clientMockRepository; - @Mock - private UserRepository userMockRepository; - @InjectMocks - private ClientService clientMockService; - @InjectMocks - private UserService userMockService; + @Mock private PasswordEncoder encoder; + @Mock private ClientRepository clientMockRepository; + @Mock private UserRepository userMockRepository; + @InjectMocks private ClientService clientMockService; + @InjectMocks private UserService userMockService; private Client client1, client2; private CustomUser customUser1, customUser2; @@ -44,8 +39,22 @@ void setUp() { client1 = new Client("Dima", "Berg", "1234567", "dima@test.com", "addressFamily"); client2 = new Client("Iryna", "Berg", "1234568", "iryna@test.com", "addressFamily"); - customUser1 = new CustomUser("dima@test.com", "Dima", encoder.encode("password"), UserRole.USER, UserRegisterType.FORM, client1); - customUser2 = new CustomUser("iryna@test.com", "Iryna", encoder.encode("password"), UserRole.USER, UserRegisterType.FORM, client2); + customUser1 = + new CustomUser( + "dima@test.com", + "Dima", + encoder.encode("password"), + UserRole.USER, + UserRegisterType.FORM, + client1); + customUser2 = + new CustomUser( + "iryna@test.com", + "Iryna", + encoder.encode("password"), + UserRole.USER, + UserRegisterType.FORM, + client2); } @Test