From 0eab737d2247e164c776a446b36b3bf76aef8118 Mon Sep 17 00:00:00 2001 From: Alexander Kim Date: Thu, 27 Feb 2025 00:16:30 +0300 Subject: [PATCH 1/7] feat: add workflow .yml file --- .github/workflows/java.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/java.yml diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml new file mode 100644 index 0000000..c5298c3 --- /dev/null +++ b/.github/workflows/java.yml @@ -0,0 +1,16 @@ +name: Java CI +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 21 + uses: actions/setup-java@v2 + with: + java-version: '21' + distribution: 'temurin' + - name: Build with Maven + run: mvn --batch-mode --update-snapshots package \ No newline at end of file From 076432de7918765820c31638b9d7fd38c2add09c Mon Sep 17 00:00:00 2001 From: Alexander Kim Date: Thu, 27 Feb 2025 00:18:39 +0300 Subject: [PATCH 2/7] feat: implement lab1 --- Application/pom.xml | 119 ++++++++ .../Repositories/IBankAccountRepository.java | 14 + .../Repositories/IOperationRepository.java | 12 + .../Repositories/IUserRepository.java | 14 + .../Contracts/Interfaces/IUserService.java | 33 +++ .../ResultTypes/BankAccountResult.java | 30 ++ .../ResultTypes/OperationResult.java | 18 ++ .../Contracts/ResultTypes/UserResult.java | 29 ++ .../Application/Managers/UserManager.java | 80 +++++ .../Models/Entites/BankAccount.java | 24 ++ .../Application/Models/Entites/Operation.java | 19 ++ .../java/Application/Models/Entites/User.java | 46 +++ .../Application/Models/Enums/HairColor.java | 14 + .../Models/Enums/OperationType.java | 8 + .../java/Application/Models/Enums/Sex.java | 7 + .../Application/Models/Utils/IdGenerator.java | 15 + .../Application/Services/UserService.java | 140 +++++++++ .../Repositories/IBankAccountRepository.class | Bin 0 -> 615 bytes .../Repositories/IOperationRepository.class | Bin 0 -> 456 bytes .../Repositories/IUserRepository.class | Bin 0 -> 546 bytes .../Contracts/Interfaces/IUserService.class | Bin 0 -> 1226 bytes ...countResult$BankAccountCreationError.class | Bin 0 -> 691 bytes ...countResult$BankAccountDeletionError.class | Bin 0 -> 691 bytes ...AccountResult$BankAccountUpdateError.class | Bin 0 -> 685 bytes .../BankAccountResult$Success.class | Bin 0 -> 455 bytes .../ResultTypes/BankAccountResult.class | Bin 0 -> 865 bytes .../OperationResult$OperationError.class | Bin 0 -> 653 bytes .../ResultTypes/OperationResult$Success.class | Bin 0 -> 447 bytes .../ResultTypes/OperationResult.class | Bin 0 -> 597 bytes .../ResultTypes/UserResult$Success.class | Bin 0 -> 427 bytes .../UserResult$UserCreationError.class | Bin 0 -> 642 bytes .../UserResult$UserDeletionError.class | Bin 0 -> 642 bytes .../UserResult$UserUpdateError.class | Bin 0 -> 636 bytes .../Contracts/ResultTypes/UserResult.class | Bin 0 -> 774 bytes .../Application/Managers/UserManager.class | Bin 0 -> 6448 bytes .../Models/Entites/BankAccount.class | Bin 0 -> 1479 bytes .../Models/Entites/Operation.class | Bin 0 -> 970 bytes .../Application/Models/Entites/User.class | Bin 0 -> 3467 bytes .../Application/Models/Enums/HairColor.class | Bin 0 -> 1548 bytes .../Models/Enums/OperationType.class | Bin 0 -> 1272 bytes .../Application/Models/Enums/Sex.class | Bin 0 -> 1139 bytes .../Models/Utils/IdGenerator.class | Bin 0 -> 574 bytes .../Application/Services/UserService.class | Bin 0 -> 7692 bytes DataAccess/pom.xml | 125 ++++++++ .../DataAccess/BankAccountRepository.java | 61 ++++ .../java/DataAccess/OperationRepository.java | 27 ++ .../main/java/DataAccess/UserRepository.java | 64 ++++ .../DataAccess/BankAccountRepository.class | Bin 0 -> 3732 bytes .../DataAccess/OperationRepository.class | Bin 0 -> 1483 bytes .../classes/DataAccess/UserRepository.class | Bin 0 -> 3517 bytes Presentation/pom.xml | 145 +++++++++ .../main/java/Presentation/Console/Main.java | 11 + .../main/java/Presentation/Console/Menu.java | 274 ++++++++++++++++++ .../java/Presentation/Interfaces/IMenu.java | 5 + Presentation/src/test/java/BankTests.java | 78 +++++ .../classes/Presentation/Console/Main.class | Bin 0 -> 557 bytes .../classes/Presentation/Console/Menu.class | Bin 0 -> 11645 bytes .../Presentation/Interfaces/IMenu.class | Bin 0 -> 135 bytes .../target/test-classes/BankTests.class | Bin 0 -> 4310 bytes 59 files changed, 1412 insertions(+) create mode 100644 Application/pom.xml create mode 100644 Application/src/main/java/Application/Abstractions/Repositories/IBankAccountRepository.java create mode 100644 Application/src/main/java/Application/Abstractions/Repositories/IOperationRepository.java create mode 100644 Application/src/main/java/Application/Abstractions/Repositories/IUserRepository.java create mode 100644 Application/src/main/java/Application/Contracts/Interfaces/IUserService.java create mode 100644 Application/src/main/java/Application/Contracts/ResultTypes/BankAccountResult.java create mode 100644 Application/src/main/java/Application/Contracts/ResultTypes/OperationResult.java create mode 100644 Application/src/main/java/Application/Contracts/ResultTypes/UserResult.java create mode 100644 Application/src/main/java/Application/Managers/UserManager.java create mode 100644 Application/src/main/java/Application/Models/Entites/BankAccount.java create mode 100644 Application/src/main/java/Application/Models/Entites/Operation.java create mode 100644 Application/src/main/java/Application/Models/Entites/User.java create mode 100644 Application/src/main/java/Application/Models/Enums/HairColor.java create mode 100644 Application/src/main/java/Application/Models/Enums/OperationType.java create mode 100644 Application/src/main/java/Application/Models/Enums/Sex.java create mode 100644 Application/src/main/java/Application/Models/Utils/IdGenerator.java create mode 100644 Application/src/main/java/Application/Services/UserService.java create mode 100644 Application/target/classes/Application/Abstractions/Repositories/IBankAccountRepository.class create mode 100644 Application/target/classes/Application/Abstractions/Repositories/IOperationRepository.class create mode 100644 Application/target/classes/Application/Abstractions/Repositories/IUserRepository.class create mode 100644 Application/target/classes/Application/Contracts/Interfaces/IUserService.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountCreationError.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountDeletionError.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountUpdateError.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$Success.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/OperationResult$OperationError.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/OperationResult$Success.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/OperationResult.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/UserResult$Success.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserCreationError.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserDeletionError.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserUpdateError.class create mode 100644 Application/target/classes/Application/Contracts/ResultTypes/UserResult.class create mode 100644 Application/target/classes/Application/Managers/UserManager.class create mode 100644 Application/target/classes/Application/Models/Entites/BankAccount.class create mode 100644 Application/target/classes/Application/Models/Entites/Operation.class create mode 100644 Application/target/classes/Application/Models/Entites/User.class create mode 100644 Application/target/classes/Application/Models/Enums/HairColor.class create mode 100644 Application/target/classes/Application/Models/Enums/OperationType.class create mode 100644 Application/target/classes/Application/Models/Enums/Sex.class create mode 100644 Application/target/classes/Application/Models/Utils/IdGenerator.class create mode 100644 Application/target/classes/Application/Services/UserService.class create mode 100644 DataAccess/pom.xml create mode 100644 DataAccess/src/main/java/DataAccess/BankAccountRepository.java create mode 100644 DataAccess/src/main/java/DataAccess/OperationRepository.java create mode 100644 DataAccess/src/main/java/DataAccess/UserRepository.java create mode 100644 DataAccess/target/classes/DataAccess/BankAccountRepository.class create mode 100644 DataAccess/target/classes/DataAccess/OperationRepository.class create mode 100644 DataAccess/target/classes/DataAccess/UserRepository.class create mode 100644 Presentation/pom.xml create mode 100644 Presentation/src/main/java/Presentation/Console/Main.java create mode 100644 Presentation/src/main/java/Presentation/Console/Menu.java create mode 100644 Presentation/src/main/java/Presentation/Interfaces/IMenu.java create mode 100644 Presentation/src/test/java/BankTests.java create mode 100644 Presentation/target/classes/Presentation/Console/Main.class create mode 100644 Presentation/target/classes/Presentation/Console/Menu.class create mode 100644 Presentation/target/classes/Presentation/Interfaces/IMenu.class create mode 100644 Presentation/target/test-classes/BankTests.class diff --git a/Application/pom.xml b/Application/pom.xml new file mode 100644 index 0000000..c8522ac --- /dev/null +++ b/Application/pom.xml @@ -0,0 +1,119 @@ + + + 4.0.0 + + is.technologies + Application + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + + + + org.projectlombok + lombok + 1.18.30 + provided + + + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + + ${project.build.directory}/libs + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + true + libs/ + + is.technologies.Main + + + + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.12.1 + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.4.2 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.0.0 + + 17 + ${java.home}/bin/javadoc + + + + maven-javadocs + + jar + + + + + + + + \ No newline at end of file diff --git a/Application/src/main/java/Application/Abstractions/Repositories/IBankAccountRepository.java b/Application/src/main/java/Application/Abstractions/Repositories/IBankAccountRepository.java new file mode 100644 index 0000000..9a7f694 --- /dev/null +++ b/Application/src/main/java/Application/Abstractions/Repositories/IBankAccountRepository.java @@ -0,0 +1,14 @@ +package Application.Abstractions.Repositories; + +import Application.Contracts.ResultTypes.BankAccountResult; +import Application.Models.Entites.BankAccount; + +public interface IBankAccountRepository { + BankAccountResult AddBankAccount(BankAccount account); + + BankAccount FindBankAccountById(Integer id); + + BankAccountResult UpdateBankAccountBalance(Integer id, Double balance); + + BankAccountResult DeleteBankAccount(Integer id); +} diff --git a/Application/src/main/java/Application/Abstractions/Repositories/IOperationRepository.java b/Application/src/main/java/Application/Abstractions/Repositories/IOperationRepository.java new file mode 100644 index 0000000..98ff0f8 --- /dev/null +++ b/Application/src/main/java/Application/Abstractions/Repositories/IOperationRepository.java @@ -0,0 +1,12 @@ +package Application.Abstractions.Repositories; + +import Application.Contracts.ResultTypes.OperationResult; +import Application.Models.Entites.Operation; + +import java.util.ArrayList; + +public interface IOperationRepository { + OperationResult AddOperation(Operation operation); + + ArrayList GetOperationHistory(Integer bankAccountId); +} diff --git a/Application/src/main/java/Application/Abstractions/Repositories/IUserRepository.java b/Application/src/main/java/Application/Abstractions/Repositories/IUserRepository.java new file mode 100644 index 0000000..bf30361 --- /dev/null +++ b/Application/src/main/java/Application/Abstractions/Repositories/IUserRepository.java @@ -0,0 +1,14 @@ +package Application.Abstractions.Repositories; + +import Application.Contracts.ResultTypes.UserResult; +import Application.Models.Entites.User; + +public interface IUserRepository { + UserResult AddUser(User user); + + User FindUserById(Integer id); + + UserResult UpdateUser(Integer id, User userUpdate); + + UserResult DeleteUser(Integer id); +} diff --git a/Application/src/main/java/Application/Contracts/Interfaces/IUserService.java b/Application/src/main/java/Application/Contracts/Interfaces/IUserService.java new file mode 100644 index 0000000..62d9150 --- /dev/null +++ b/Application/src/main/java/Application/Contracts/Interfaces/IUserService.java @@ -0,0 +1,33 @@ +package Application.Contracts.Interfaces; + +import Application.Contracts.ResultTypes.BankAccountResult; +import Application.Contracts.ResultTypes.OperationResult; +import Application.Contracts.ResultTypes.UserResult; +import Application.Models.Entites.BankAccount; +import Application.Models.Entites.User; + +public interface IUserService { + UserResult CreateUser(User user); + + UserResult DeleteUser(User user); + + void GetUserInfo(User user); + + void AddFriend(User user, User other); + + void RemoveFriend(User user, User other); + + BankAccountResult addBankAccount(User user, BankAccount bankAccount); + + BankAccountResult RemoveBankAccount(User user, BankAccount bankAccount); + + OperationResult CheckBalance(User user, BankAccount bankAccount); + + OperationResult Deposit(BankAccount bankAccount, Double amount); + + OperationResult Withdraw(BankAccount bankAccount, Double amount); + + OperationResult Transfer(BankAccount bankAccount1, BankAccount bankAccount2, Double amount); + + OperationResult GetOperationHistory(BankAccount bankAccount); +} diff --git a/Application/src/main/java/Application/Contracts/ResultTypes/BankAccountResult.java b/Application/src/main/java/Application/Contracts/ResultTypes/BankAccountResult.java new file mode 100644 index 0000000..af36412 --- /dev/null +++ b/Application/src/main/java/Application/Contracts/ResultTypes/BankAccountResult.java @@ -0,0 +1,30 @@ +package Application.Contracts.ResultTypes; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +public abstract sealed class BankAccountResult + permits BankAccountResult.Success, BankAccountResult.BankAccountCreationError, + BankAccountResult.BankAccountUpdateError, BankAccountResult.BankAccountDeletionError { + + public static final class Success extends BankAccountResult { + } + + @Getter + @AllArgsConstructor + public static final class BankAccountCreationError extends BankAccountResult { + private final String message; + } + + @Getter + @AllArgsConstructor + public static final class BankAccountUpdateError extends BankAccountResult { + private final String message; + } + + @Getter + @AllArgsConstructor + public static final class BankAccountDeletionError extends BankAccountResult { + private final String message; + } +} diff --git a/Application/src/main/java/Application/Contracts/ResultTypes/OperationResult.java b/Application/src/main/java/Application/Contracts/ResultTypes/OperationResult.java new file mode 100644 index 0000000..871b473 --- /dev/null +++ b/Application/src/main/java/Application/Contracts/ResultTypes/OperationResult.java @@ -0,0 +1,18 @@ +package Application.Contracts.ResultTypes; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public abstract sealed class OperationResult permits OperationResult.Success, OperationResult.OperationError { + + @NoArgsConstructor + public static final class Success extends OperationResult { + } + + @Getter + @AllArgsConstructor + public static final class OperationError extends OperationResult { + private final String message; + } +} diff --git a/Application/src/main/java/Application/Contracts/ResultTypes/UserResult.java b/Application/src/main/java/Application/Contracts/ResultTypes/UserResult.java new file mode 100644 index 0000000..16819db --- /dev/null +++ b/Application/src/main/java/Application/Contracts/ResultTypes/UserResult.java @@ -0,0 +1,29 @@ +package Application.Contracts.ResultTypes; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +public abstract sealed class UserResult + permits UserResult.Success, UserResult.UserCreationError, UserResult.UserUpdateError, UserResult.UserDeletionError { + + public static final class Success extends UserResult { + } + + @Getter + @AllArgsConstructor + public static final class UserCreationError extends UserResult { + private final String message; + } + + @Getter + @AllArgsConstructor + public static final class UserUpdateError extends UserResult { + private final String message; + } + + @Getter + @AllArgsConstructor + public static final class UserDeletionError extends UserResult { + private final String message; + } +} diff --git a/Application/src/main/java/Application/Managers/UserManager.java b/Application/src/main/java/Application/Managers/UserManager.java new file mode 100644 index 0000000..a6e3a2e --- /dev/null +++ b/Application/src/main/java/Application/Managers/UserManager.java @@ -0,0 +1,80 @@ +package Application.Managers; + +import Application.Contracts.ResultTypes.OperationResult; +import Application.Models.Entites.BankAccount; +import Application.Models.Entites.Operation; +import Application.Models.Entites.User; + +import java.util.ArrayList; + +public record UserManager() { + + public void GetUserInfo(User user) { + if (user == null) { + System.out.println("User data is not available."); + return; + } + + System.out.println("User Information:"); + System.out.println("──────────────────────────────────"); + System.out.printf("ID: %d%n", user.getId()); + System.out.printf("Login: %s%n", user.getLogin()); + System.out.printf("Name: %s%n", user.getName()); + System.out.printf("Age: %d%n", user.getAge()); + System.out.printf("Sex: %s%n", user.getSex()); + System.out.printf("Hair Color: %s%n", user.getHairType()); + + System.out.println("\nBank Accounts:"); + if (user.getBankAccounts().isEmpty()) { + System.out.println("No bank accounts available."); + } else { + user.getBankAccounts().forEach(account -> System.out.printf("Account ID: %d%n", account)); + } + + System.out.println("\nFriends:"); + if (user.getFriends().isEmpty()) { + System.out.println("No friends available."); + } else { + user.getFriends().forEach(friend -> + System.out.printf("Friend ID: %d | Name: %s%n", friend.getId(), friend.getName())); + } + + System.out.println("──────────────────────────────────\n"); + } + + public void AddFriend(User user, User other) { + user.getFriends().add(other); + other.getFriends().add(user); + } + + public void RemoveFriend(User user, User other) { + user.getFriends().remove(other); + other.getFriends().remove(user); + } + + public void AddBankAccount(User user, BankAccount bankAccount) { + user.getBankAccounts().add(bankAccount.getId()); + } + + public void RemoveBankAccount(User user, BankAccount bankAccount) { + user.getBankAccounts().remove(bankAccount.getId()); + } + + public void CheckBalance(User user, BankAccount bankAccount) { + System.out.println("User: " + user.getId()); + System.out.println("BankAccount: " + bankAccount.getId()); + System.out.println("Balance: " + bankAccount.getBalance()); + } + + public OperationResult PrintHistory(BankAccount account, ArrayList operations) { + if (operations == null) { + return new OperationResult.OperationError("Operations can not be null."); + } else { + System.out.println("Account Id: " + account.getId()); + for (Operation operation : operations) { + System.out.println("Operation: " + operation.getType() + "Amount: " + operation.getAmount()); + } + return new OperationResult.Success(); + } + } +} diff --git a/Application/src/main/java/Application/Models/Entites/BankAccount.java b/Application/src/main/java/Application/Models/Entites/BankAccount.java new file mode 100644 index 0000000..da63639 --- /dev/null +++ b/Application/src/main/java/Application/Models/Entites/BankAccount.java @@ -0,0 +1,24 @@ +package Application.Models.Entites; + +import lombok.Getter; +import lombok.Setter; +import Application.Models.Utils.IdGenerator; + +@Getter +public class BankAccount { + final private Integer id; + + @Setter + private Double balance; + + private final String userLogin; + + private final Integer UserId; + + public BankAccount(IdGenerator idGenerator, User user) { + this.id = idGenerator.generateBankAccountId(); + this.balance = 0.0; + this.userLogin = user.getLogin(); + this.UserId = user.getId(); + } +} diff --git a/Application/src/main/java/Application/Models/Entites/Operation.java b/Application/src/main/java/Application/Models/Entites/Operation.java new file mode 100644 index 0000000..bb9835c --- /dev/null +++ b/Application/src/main/java/Application/Models/Entites/Operation.java @@ -0,0 +1,19 @@ +package Application.Models.Entites; + +import lombok.Getter; +import Application.Models.Enums.OperationType; + +@Getter +public class Operation { + private final Integer BankAccountId; + + private final OperationType Type; + + private final Double Amount; + + public Operation(Integer bankAccountId, OperationType type, Double amount) { + this.BankAccountId = bankAccountId; + this.Type = type; + this.Amount = amount; + } +} diff --git a/Application/src/main/java/Application/Models/Entites/User.java b/Application/src/main/java/Application/Models/Entites/User.java new file mode 100644 index 0000000..18b8f71 --- /dev/null +++ b/Application/src/main/java/Application/Models/Entites/User.java @@ -0,0 +1,46 @@ +package Application.Models.Entites; + +import lombok.*; +import Application.Models.Enums.HairColor; +import Application.Models.Enums.Sex; +import Application.Models.Utils.IdGenerator; + +import java.util.ArrayList; + +@Getter +@Setter +public class User { + private Integer id; + + private String login; + + private String name; + + private Integer age; + + private Sex sex; + + private HairColor hairType; + + private ArrayList bankAccounts = new ArrayList<>(); + + private ArrayList friends = new ArrayList<>(); + + public User( + IdGenerator idGenerator, + String login, + String name, + Integer age, + Sex sex, + HairColor hairType + ) { + this.id = idGenerator.generateUserId(); + this.login = login; + this.name = name; + this.age = age; + this.sex = sex; + this.hairType = hairType; + this.bankAccounts = bankAccounts != null ? bankAccounts : new ArrayList<>(); + this.friends = friends != null ? friends : new ArrayList<>(); + } +} diff --git a/Application/src/main/java/Application/Models/Enums/HairColor.java b/Application/src/main/java/Application/Models/Enums/HairColor.java new file mode 100644 index 0000000..532ce53 --- /dev/null +++ b/Application/src/main/java/Application/Models/Enums/HairColor.java @@ -0,0 +1,14 @@ +package Application.Models.Enums; + +public enum HairColor { + Blond, + Ash, + Brown, + Auburn, + Black, + Dyed, + Colored, + Grey, + White, + Bold +} diff --git a/Application/src/main/java/Application/Models/Enums/OperationType.java b/Application/src/main/java/Application/Models/Enums/OperationType.java new file mode 100644 index 0000000..7fabe47 --- /dev/null +++ b/Application/src/main/java/Application/Models/Enums/OperationType.java @@ -0,0 +1,8 @@ +package Application.Models.Enums; + +public enum OperationType { + Deposit, + Withdraw, + Transfer, + CheckBalance +} diff --git a/Application/src/main/java/Application/Models/Enums/Sex.java b/Application/src/main/java/Application/Models/Enums/Sex.java new file mode 100644 index 0000000..6ec0f67 --- /dev/null +++ b/Application/src/main/java/Application/Models/Enums/Sex.java @@ -0,0 +1,7 @@ +package Application.Models.Enums; + +public enum Sex { + Undefined, + Male, + Female +} diff --git a/Application/src/main/java/Application/Models/Utils/IdGenerator.java b/Application/src/main/java/Application/Models/Utils/IdGenerator.java new file mode 100644 index 0000000..4c96f36 --- /dev/null +++ b/Application/src/main/java/Application/Models/Utils/IdGenerator.java @@ -0,0 +1,15 @@ +package Application.Models.Utils; + + +public class IdGenerator { + private int userId = 0; + private int bankAccountId = 0; + + public synchronized int generateUserId() { + return ++userId; + } + + public synchronized int generateBankAccountId() { + return ++bankAccountId; + } +} diff --git a/Application/src/main/java/Application/Services/UserService.java b/Application/src/main/java/Application/Services/UserService.java new file mode 100644 index 0000000..61f621b --- /dev/null +++ b/Application/src/main/java/Application/Services/UserService.java @@ -0,0 +1,140 @@ +package Application.Services; + +import lombok.AllArgsConstructor; +import Application.Abstractions.Repositories.IBankAccountRepository; +import Application.Abstractions.Repositories.IOperationRepository; +import Application.Abstractions.Repositories.IUserRepository; +import Application.Contracts.Interfaces.IUserService; +import Application.Contracts.ResultTypes.BankAccountResult; +import Application.Contracts.ResultTypes.OperationResult; +import Application.Contracts.ResultTypes.UserResult; +import Application.Managers.UserManager; +import Application.Models.Entites.BankAccount; +import Application.Models.Entites.Operation; +import Application.Models.Entites.User; +import Application.Models.Enums.OperationType; + +import java.util.Objects; + +@AllArgsConstructor +public class UserService implements IUserService { + + private IUserRepository _userRepository; + private IBankAccountRepository _bankAccountRepository; + private IOperationRepository _operationRepository; + + private UserManager _userManager; + + @Override + public UserResult CreateUser(User user) { + return _userRepository.AddUser(user); + } + + @Override + public UserResult DeleteUser(User user) { + return _userRepository.DeleteUser(user.getId()); + } + + @Override + public void GetUserInfo(User user) { + _userManager.GetUserInfo(user); + } + + @Override + public void AddFriend(User user, User other) { + _userManager.AddFriend(user, other); + } + + @Override + public void RemoveFriend(User user, User other) { + _userManager.RemoveFriend(user, other); + } + + @Override + public BankAccountResult addBankAccount(User user, BankAccount bankAccount) { + _userManager.AddBankAccount(user, bankAccount); + return _bankAccountRepository.AddBankAccount(bankAccount); + } + + @Override + public BankAccountResult RemoveBankAccount(User user, BankAccount bankAccount) { + _userManager.RemoveBankAccount(user, bankAccount); + return _bankAccountRepository.DeleteBankAccount(bankAccount.getId()); + } + + @Override + public OperationResult CheckBalance(User user, BankAccount bankAccount) { + _userManager.CheckBalance(user, bankAccount); + return _operationRepository.AddOperation(new Operation(bankAccount.getId(), OperationType.CheckBalance, 0.0)); + } + + @Override + public OperationResult Deposit(BankAccount bankAccount, Double amount) { + var account = _bankAccountRepository.FindBankAccountById(bankAccount.getId()); + _bankAccountRepository.UpdateBankAccountBalance(account.getId(), account.getBalance() + amount); + return _operationRepository.AddOperation(new Operation(bankAccount.getId(), OperationType.Deposit, amount)); + } + + @Override + public OperationResult Withdraw(BankAccount bankAccount, Double amount) { + var account = _bankAccountRepository.FindBankAccountById(bankAccount.getId()); + if (account.getBalance() - amount >= 0) { + _bankAccountRepository.UpdateBankAccountBalance(account.getId(), account.getBalance() - amount); + return _operationRepository.AddOperation(new Operation(bankAccount.getId(), OperationType.Withdraw, amount)); + } + return new OperationResult.OperationError("Not enough balance"); + } + + @Override + public OperationResult Transfer(BankAccount bankAccount1, BankAccount bankAccount2, Double amount) { + if (amount == null || amount <= 0) { + return new OperationResult.OperationError("Invalid transfer amount."); + } + + var account1 = _bankAccountRepository.FindBankAccountById(bankAccount1.getId()); + var account2 = _bankAccountRepository.FindBankAccountById(bankAccount2.getId()); + + if (account1 == null || account2 == null) { + return new OperationResult.OperationError("One or both bank accounts not found."); + } + + var user1 = _userRepository.FindUserById(account1.getUserId()); + var user2 = _userRepository.FindUserById(account2.getUserId()); + + if (user1 == null || user2 == null) { + return new OperationResult.OperationError("One or both users not found."); + } + + double commissionRate; + + if (account1.getUserId().equals(account2.getUserId())) { + commissionRate = 0.00; + } else if (user1.getFriends().stream().anyMatch(friend -> friend.getId().equals(user2.getId()))) { + commissionRate = 0.03; + } else { + commissionRate = 0.10; + } + + double commission = amount * commissionRate; + double totalAmount = amount + commission; + + if (account1.getBalance() < totalAmount) { + return new OperationResult.OperationError("Insufficient funds, including commission."); + } + + _bankAccountRepository.UpdateBankAccountBalance(account1.getId(), account1.getBalance() - totalAmount); + _bankAccountRepository.UpdateBankAccountBalance(account2.getId(), account2.getBalance() + amount); + + _operationRepository.AddOperation(new Operation(bankAccount1.getId(), OperationType.Transfer, totalAmount)); + _operationRepository.AddOperation(new Operation(bankAccount2.getId(), OperationType.Deposit, amount)); + + return new OperationResult.Success(); + } + + @Override + public OperationResult GetOperationHistory(BankAccount bankAccount) { + var account = _bankAccountRepository.FindBankAccountById(bankAccount.getId()); + var operations = _operationRepository.GetOperationHistory(account.getId()); + return _userManager.PrintHistory(account, operations); + } +} diff --git a/Application/target/classes/Application/Abstractions/Repositories/IBankAccountRepository.class b/Application/target/classes/Application/Abstractions/Repositories/IBankAccountRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..4a6c128a72d3de1e2d45f83f8d0aa328b4058673 GIT binary patch literal 615 zcmbV~-%7(U6vn?Z=c-eu;*H=7%p3ava~G|1P?-q+xf3K!!^jLtX;Y!E=7kU7Ly2hx zZATIDCg+fRIlu4ZESt;wXw{U~Jm zIpEwB+I}CD9{PlX6?v?t1je!A8dGMij0f7RIZtm?)jcok2fF?Hr$s1`fl8t Y7`TMsVXKbY7}jwIyG}vab88QyPb>4sg8%>k literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Abstractions/Repositories/IOperationRepository.class b/Application/target/classes/Application/Abstractions/Repositories/IOperationRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..b981c5ee70bc4f548db07deb34e2f86efe0b5fea GIT binary patch literal 456 zcma)3!Ab)$6r5D;+FC*I7yYZjE-`)D0OH>9bG5b z7dY9dS0$}-gOHRWu7=*{AG!V*T!6C{9uV7QL2!%?KiV%+;z>R-Zt}NS%U8G!%1qa|zs7}hO zkWDxKe_Nw(MxOVN*EaxHI8M-ExX7H-st`e0!?T$Wr6}s%^G9;lt6)n-p663f<@ZaK zpv!Qw5HEsjVdngPwxA*~B$<@8lHp-6`AxpFlCp%_`yc-O{$sl#*S zK85T1kfA?TromrVxn#H;OnwsNCeZvJw9S?wojNH3t%J%o%0{v_$ky4@8`AXUIcoFV z9{FUKWkF-5iQ)85L+AC^^cWa+V%tDB7PgCCTw+VuYvw-EW*(p)6%2>*?BHkxprNfT literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Contracts/Interfaces/IUserService.class b/Application/target/classes/Application/Contracts/Interfaces/IUserService.class new file mode 100644 index 0000000000000000000000000000000000000000..7e7748562c616e69f3f72ce994be5927558ce425 GIT binary patch literal 1226 zcmcgs%TB^T6usjM1biUA-MY|)_5+9u1Ro?ABfeHHhUrBH>P#~oFl>x};lH@>1NfxjqHA*NwEh%=B4Fc;zs%m(pXi1UyS;sq!KxESIREC=xltQrLZYvwry>+d$P BjXeMW literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountCreationError.class b/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountCreationError.class new file mode 100644 index 0000000000000000000000000000000000000000..72a65af1b4fb2e8ddfdc7d3533aaf61129e24be2 GIT binary patch literal 691 zcmb_ZO-}+b5Pe021y?{t1kWA-6F0`AN`geA335=wy{-*bmo90GiT_Fyjfn?;fIrGO zTQp+0887qInK!TV-alU70PJHuhZN?rNc)&ahN0UYjUpLxD`OROVr4ZCtqIPA8AtZw zek4qAz}0O#4CAq~lk&z?rK5$LJ=8kZ4B4SDh7Sb8a`%Sc@gU-A5S&{r)nGRd54kMz zJ{I6J?EGOhLuOAZXyU=?X@%vy??#TF2iblmYe&*c|6vkIFbpY%G7Bm$KFcL$l&#avB$Bo4E~8y zLU$r=j3A=bsgYl5V4I}&NOck;5u2hE#fvDAEm9VcXXNLbPhb!3xkNVOiX|*j>`xj9 zV1+V9!j;J;!z}_!k0gFRA~!Vf~hAyg(^UkKFisE~YEb^R5rIq#vGpb>gP Hx`x^(n2D*I literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountDeletionError.class b/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountDeletionError.class new file mode 100644 index 0000000000000000000000000000000000000000..41805ea79f7cb758fcf6fbd3d3b740e43c58384f GIT binary patch literal 691 zcmb_ZT`vPc6g|`LuBATOD)H!{DzOodXi`N;st-utr)yHfnr&ugCH@r&k$CU}{3vmE zTT$toc)4G5@4090`S^T$2e6OTB2q}_k#Uhlj-k^U4g=|PD?{bALuEDht?|xS5TWZK~sF)DSW65Z&oFZ3nv2MNc} z=RuEa8Rz3-#$HRq(EZoT>@rm9)7+9DT!fMK#j%VTRVPk6I`&q4MutLH7<&>L%ix|W zC3HLB#t0%>n;7|}2DVA+0;x`7#9~vFqIec_WJ{EJ+tcsG0GAaxwdr1<>fLj?WuNy0?d0>rqE=(HP z%ZEf5Z=b8Xy&#BFWsCO8Q0FSS=2jeN9czZ_Kp4YA!7%IJ@_X(@T!r3+)l!99b<{9k zMcu^&T!zhmEM}-|OC{|t!&rN@$50Q2J^k6)Y_E=PWhiyyYf{wkr4nc9pfB_#??<`D zIN(u_YnkEiX35@2!{Gb>koU)3wixEyqsnsq7jdcsaVRrAt)a6PhhEQ)$WS{I#vaAS zGPuV|3EhpjF@j_ce;IND8)R~g{3atZo2hcBp2QTz1|g3!qg?JhgFWWY(-bRtvxOO| z-C}?U<_Iw|tw}Nayh~&b<$C88)y~=r*b^ZKzYNWsp;b(MGthi4g{;GTKHtJZo@-dl L*oZw7y@aJNoZF`> literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$Success.class b/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$Success.class new file mode 100644 index 0000000000000000000000000000000000000000..a436add7e8dd1276526915209a205d091a690304 GIT binary patch literal 455 zcmbtQ%}N6?7@X`+x2~(z3W9eJ>cK@kwiW7vC@ekL(t8>MMq{#UvVxE0N$}tU_)y}v zYj55(fthb6Ka+f)U+*6PCfG|6AWRTth|yy>pH`Jtf_r66URdL6F1*WcrE9cbyj0TV zm)tx~g|LnBKQ=>etc>y(4B^r7GC`kV^oM&6=Zz53IfkgPcamXHDkEpj(@NG0zS86j zODniu@>;ceZASiH(VMO5f zNFB*QnkGZMy5DEWj)b}X-B_&dFYjbXw8A^mlW)sFbf)8hP(42It-^4~{XSPR!t-Xr z+)K@H)?QiMKQ9^#rRuUCtGXLb)lgi>NJVjB;mp#*$To&_M`&{yYQx}O1%Xg4pKC2h zT5j>ddX73BF-`X*%cC<=6{C6`If{8g9%V*3S$hS0w$BBMDcdYygKBp+Km=Qa7@em` zG5XvjvKZxT?Hx|-;0^4BPz-+zIm=LMM%H9WvVuR$lio3^95P<5^u-N^q}?&I_Zx<-)uCPP(S@%a>ZZ z{I-_1%m0WBy{Xd5UowQpC#wW~hVwt)a&*W+8q4)-`OL7<_!J0bpF~n&yd|{Ep1V8=OlS2 zo2O%pgofEJMw`Y-xJ4}QI1rz{fxVItASG1(Gb9U$I;(mO-y#qKyr-A~C99|72lo=XR@g)3EL=XNTm@4TQ%BMQg?wp~x zyEo=oVmQ1^l2A+GbR7BJIC4fvXZ?F+)6k8c6J`BDqD&tD78$&5JW&kwo{m&ModwE_ zL=ckF?8Q=qV_|g0=c4BxwPiT!E!^pZp)!n9Bh|Ie%D4Yba*!>^Q0*)0ZdEpik_tYSC&7ac;6sUD z>w;%ZU?wy9l1aYLulElC7uZe_AWRTth%sO|oHR|X1oz75qBPoDF1#ylrE6;oklt!I0tPFBk02S|Ox!3{h$BB|}~*EvN0%QrbCR*5r&UBY3^w zR&{!1M*cz3q0{O=VP_2K%(Pa>E7c|BzaKh!z{xsh*(EcBiGQVu#>9gk;71vI z2Mh;JT)Mkvd#fu|Kfhn!0M4+VLjp+$DHmyE7}^)pX&}ek$SCwWQD_t&8|~c*Jqyg> zWh%6HuZ5c9gLv#HVYe@piWGx05n6L!Fl=|9_%rtc9{OJ2C>i>#JhI3+$h+8p%W$;L zF^0^k45eu^BZcwLb=Xmcjr4 literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserDeletionError.class b/Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserDeletionError.class new file mode 100644 index 0000000000000000000000000000000000000000..fae4bbdc8dbb10fb68735e3bcbb2b5ac9aa6d101 GIT binary patch literal 642 zcmb7B%T5A85Uk#g7G7P*{7#PKeMtgTcPkqyS znF#IOYoTU%&yE+u7k2wnsZcRw$3km95)2#dC;rSmp9dqaYm^K|4F@^ovv6Fjz-2gG z<`_ffLQ4O=+4{i;*c+h)77W#hp)%W=Gthn{g(5;Z+OJ?M>N#v%He$D;tEm0~3m=x( literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserUpdateError.class b/Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserUpdateError.class new file mode 100644 index 0000000000000000000000000000000000000000..12147c7f338f0f209fca33e6fb9fdfb73d0fec79 GIT binary patch literal 636 zcmb7B%T5A85Uk-1uA=f#JbOSiZajk|hG;ZF4)VAU%LK-*yqz&Q@Gh#{Uv!a))#hQ`Ho>PwFs83t}E42D)z#qBm^I+_DjgrB*opgYbNhR&SUp-j$B<}+Ba)JD%RqEylc7*OKJ=})(BuAqD;eR% zW5V1^&CqPGqwBu~b%s)PRf|>J4QI*|S29wNU%Gf28O4z42yL!IZ5W)JAP}nMbFBp_ zvb%q5#u;Unq4>z7?unL%TS(gEf{FuN}+gAvioK1*`C3E#769q=n5)7e*=_K literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Contracts/ResultTypes/UserResult.class b/Application/target/classes/Application/Contracts/ResultTypes/UserResult.class new file mode 100644 index 0000000000000000000000000000000000000000..1dd131152475085f6b852fec74a6a3d280290be6 GIT binary patch literal 774 zcmbVKT`vPc6g^X0OO>LiZy_EKu`k|yBvK@j`iSCvy1ikVwcE_hO8hKO5)XcWA0_Ur z6~t4`BrN+_VuhgU`s{Q{#M`5=Qx#<#(Ft3#m`=-*Ybvikyk zYwI^Y1_U+_y4^^H(yAm5>Pc+146O++$)u6JdhC)3t_|r=E#TFYHVIT3DyFmazD4>< zwjz#v7xI?j^BZ$V@a0#=ILIol}vFcwh3D07MR7^;{=4Kul}v8r-(mi0=O_c6!WDz`At NJjuMkTw`9u%m*Ql)uR9a literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Managers/UserManager.class b/Application/target/classes/Application/Managers/UserManager.class new file mode 100644 index 0000000000000000000000000000000000000000..ba920bc9803a610fe4a371a92487819946a81acb GIT binary patch literal 6448 zcmcgx33wc38Girfn9XK#bki0Jg)WfvNK2N=*(62MG@&U;icM)v>owV(Btv#*mYLbw zC@P3};|U5V;(^xNwrUEg)Eg90QSrcAJn#l@1q9!JW_B{$Y(pMV`m}R=|M!3Q_x|5( z?|N+d2!IWuDUJoGP*AC&3e^IQmuh>oR8}*`Qrq;jWoHDcI}Out&ljjzwR%SlVyICN zS5XVKgnekzarGRztb!}BxZe|GSgDI`!*qvSTi0?OG1Lp3c!{Ii$&BV|NyAB+mYbwX zBdd*M^|m+~u~0!mMH3bYG?ft|pyZ{?r=`yvwd|bc z8kX4}!|?*6_g{O(Q}8#269i&?o7$5tnHE#QvXW439l2CbyK$V1sYs6hKT+CJ)w2~uIzZU3^v{Hioy-mdswlh{-*Yj-4!#ZEkv`q(->T6$bY*e@B+qS>2d$L(U8;=Q(^n;Aa{&r?ROn!rRA?Emt;#gUF3C5p!jOE`ww|;0=y6QQ z#?7))%GRCVvysdvh_R*$3wf46PMgpfZ#Mc)!yT8AcQsayz{+T^7P~sy=|N{DPyzPJ z1RNDE3Vw(;YQ(@ai?_5HH(3S3YDWT)9{*)d$sDh+8)GOd{&r3wd_?oXqjfIu2=_`}cKx-uPQhDL zycO4%91wn{DRz&RE$CZWdL>yaMeXR}CvCb>#oJ_A)JO=;Nmxpt8aK)GzeC`>X!?VS ziq!pF1@TUS_0ho0uONmB#2&|q<7QOE@E(B^d^kw@r(^Q+{P@qy*)TiDQVnEGHLH=^6y<*>wp z@3+!gc86vg@;x9{y5k0oI`xTz!*lOK-IcS29Fth}NBJ>(2H|i;a|+%xa!RR!GRy*X zL#~#d7|`;8Z8cq)jGujho+sA!gc_tdRhBz0rz3Tn2hK(D^;8vsV1fQ8r!OMQi$bkD zcY{h5m{WFiD+g2G&IpmVcaQ7oi4en8Z)V=i$-uIC+}rb(9yz9GhKthaXkJa*LG-YS zz)tX)D-j{4ag!3vAv}}9?X1P%W1w`PA^Vcj`Xwd?b+VzHBc1cJ;(TfRkTGUzZoy`g z-1wxTH*cl?U6lDr)h8g>e2Liz!4oR0l4b`|m zj)VBQitpjRM%+ijuO#6C72m;hBc@~cEh|Qvf5-6{9#;rFu!JD;&kBieJ;8!=YHu+p*Z=>+5Jc_R->A{NMO+dUaZxF% z6j7}TMa1}}GvkuY5y;5tDZe&@(j`cY6suX_!2i-Snc7XdleUdKiz%9@?yTlGQ9>Da zOOhGnI-1U)!eni;|Na09XJj5pcy~F3Os;TJjmaAWZakdu?^zRDC00b#mL{z zwHj2_J%U?mm(`MR1fTX3LRAZB7|=wYcdwm7dM7Wt`I6o_liPZarHwLDwDt^7SJK}W z>S_vfQ4~HytqZ8&v&U33R#Y=KOU;>7a~9Q{J#RIi!{-BUwg%qR$qdqwOH2KbKcWKX zG4AUl!s|jG>Ovpt@CAI)^Wl!Ugh#FSg?Cc;hItFWGZelzu)K|>MdMGJW&u!)YzgVd zG%kz0+SAzMz0Raa{&WCbz=G=HPg@&tI=UlPw1qCVg)X**E`AALrgqueKVnj=cpqMS zC+ZGkayaqALwM1C-zFOI5>G1)x?=G3+wd}h8?c%WuM$l8HSLw;TUt4V*WZda%li$} zc)Pb@-{bcl#?8Zr@UHz7Ug`D0$^1kEdii!CJE4!&y@fw1UW7sPv&jZL<6F6U4*TFP ze8qEbICNtecQZc{afb0#e2wORozFh*NXk8=$f{RSQU55K6kPo<+VBlh7T}v$$dA;u zLCLJ+UCL2fr|~}UlkwPqrUdF2@~iY)Www71T$s=H{TL0lchVkNld;w{)A;DI_WOMu z3%!rwUVIy(F)l~6KvHjjz{{9~#Jj6J@NAXfIb6w`kBu|s;-mFSFUo$@mf^eXT2LnE zz|cCMFCk^#;)7+Yhm=Q4S{{*QR@7Scm17r{eyRX(7XOg$S57eUqlThoWR|aA}&;-T~pIQ6g^u?L&Hi-ON*icRfIGk#c!pE@}*O!$^*iC8rHg46Q)gh@K@=KMaBnz zfIrIdZjwr%8K*P*m3z)Td+y!-{`2z}faloJk-(6KB*!pP4A~>=#HzF`r&-x;90}WF zNUcdndg}~BM)^R;2+|sKj!|%ixsBuFmb5KTx=!V-dnj6+%DyLQtR21Vzs(r_X9)GsFmvj5!Ey% zP|#51n8a0v`509@jwe0QsYDboBqWK*#}Mk6!gUQdl&G5*T-kQJjh3J*8QW1M!Lcu7 zhGP~bQr)n~N1I}Ekqlv=j@y{iaED_a3k);=QM}(#9*i`FS9hDzVVE$YnfJW5beewV zGKYyphIE%8VQ@5e7^-sLhapx#pE^?DD#NIZ z_ThY-ra|Q-OF76;ii__j^6$W)lY^W6N?$BZSZfAOF)BQ)NjlsrH}y^gUN8nbMY*K! zx!txcUP;w?*~kr-)muP`+CM?hIf?K+K8XTmP{abQ z9@CfEfEQ2jly;N>&#+2a)vAg$VqvQPLLF*W--gZa$bY3pkVJ_E(mo*%0zyJY|6J>I zqAn2yPhSS}SnvzdIS4i`gU4dQFJon|Tn1-j!5i2NGq2JmRn1c7A~}8TY;fsOA6*P0 R{<)YUUrU5%*z!%<{tHiZJLCWW literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Models/Entites/Operation.class b/Application/target/classes/Application/Models/Entites/Operation.class new file mode 100644 index 0000000000000000000000000000000000000000..4e427190ef3bff9c476c26669503e73ac3f903d6 GIT binary patch literal 970 zcma)4*>2NN5IvJPaTA=)P0PNQDlv;cpnw!MsZyXwt@7@;SK$`Nj+|>G{t6@_Bp&zx zJ_<3{c8VMMp%1>xc+NR9XYQZBzkUOFf&C^bsG2Y=)KDjM&%7_58+hT&J(`{gUlHoh zWhm84LUk~lG_Zw+iKc}sun2pj#UhZtr(_hm@1s)@EZw)El1ePyqlJjmAB5H`FZ?|6 z{U{05;VEHz{9ooURAMIL1I^sF&_S1AoP1pf!eCrVpUey7Iy1%E7Pisnaz}G5L$C`X zZ=z%xhy%jMK_R-9zN}0EniCEuTH)g_3)}{1xi*t1~ zeca}+%F#Qxn=8A#>#Umd1LikAWK#7sxRp|8G_{^Us6gVG z`NB+>OsAOMIe2CjT!HAC?bz;pfu7{TzJ^|bVd+$J?NT~ZshF>FcGZnRLr)*#&^7ey zxP$?Lsm$qV$u5|#U3Su2a1^?ON6JUe&4y=m)0rJX0u?YmQqL7|kh|SDAHC z#}HF$M-|(04y!SYU{u4Hj&WQTm{qK_NAXqD*~5pHV^vJIOv_y=dbY)@XAfmc*%+>1 zQo~gp@8FuiU{ist<61=yQ+r{SYSzw?z*sW7-~}l)@;zjT*L6(ehCs+B;^7WXvpQ~K zP9Rb$7i~viDBzcOE4EXVTuB`Z>=t&+6N~d-)Um|mJ!Vlp-_nuByYyVOUJ6{xDe~WN zYA4ln-g+q+Z|isu?+f%En|5XQ)u~0Ibw)iRr}c8FTv-+9%iBfAbZZrY7^)3g3*>Mn z$bACdQ#&g|Z5G8ULw`!DVmr5^tAUk$^)7sK7M+T`DOcyOO<5N9X>-=8qy+|YwqtGA zP7bWfu6a%iI}13$Jyik?)fFOQ({L z5%s1wp#)YsVU=kGDu6p6QuV|gO9m?XtbV!rddb08cQokZi_0z=x%l#u<;hEily_R$ zVa+CBe4Lz{`p#c~Xv)jD0m8KkeA$n%O<#5%Yi$;qOn$?plo+-0OcbM48``gS0RO-A zk}6-WRSMRo&E4F`hs7;E6==T4>9_=X=}NPntPqcLd8c_T?=+_6oyN1g)6|uBIuRl8 zfwb=sj*hd&^IZ&*9l<@ieh7#fdgwR>T;nx_@h7w=uhCaWtZ62U#osaf1`~Bm8B2A{ z7^ynujfrp_hA|PTBV|lP>sU67-w^wokaYVQu>cjlNq8R;!4HXFY26;I(DgQSy3Qhu z35s=+j>(%cTLbfS_#`Qp1+2nA28(z~$5Rz4dIlbOv15(?zTh7h_wg}h#ulr^3c7s0 z(K>9gVqs~qW)W$zYEgVbwvF&xd;v{ET*HWljQqW#VO_%p1igMso*h1iBuabSl^2Eh zkb;+6KnV&Na)fl6`i0^MNll{iWxvc*_Z<8@1+w^z-q8NFfM?pl14{7cO7MI;cu)z> zDZ@6}!NW@M7Pb{(r`o}zO7ISC&H0>{+ri^X@MC;QvbGBrYX?s#z+NBaY3*GlNur%( zvLneJk?i9uKaCZNhzm4oEK+N6GXyt2E?LGrk4Aw<;cj%=3*pFQZ!?ZcXO-7T?j8cdA97RJT0b*v#`ieo*l&cgw?Lfq8y}NqfNY;bPW$Bz;{)>cnm9`Tu-qYDudE7W9jaFdjK_;t@Wy*^g(2K+tYDFKM5~8T F{14LVwGaRR literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Models/Enums/HairColor.class b/Application/target/classes/Application/Models/Enums/HairColor.class new file mode 100644 index 0000000000000000000000000000000000000000..f2dbd10f8ef6947862dfc97038591a91171a6e08 GIT binary patch literal 1548 zcma)5VQ<@16g`fe*l}N1ld-aPWn-nKNjDlgwlPRonr7`bNZWy-C;}n5scBtYdvcP& zzVV4~{1?b1HZg(r8HvAyIPWGv&_Fbjb9}DvJ@>uy?)&xkpMC*w6TXd{f!X@~`*G9` zx>1@`x6=JE?o>CD-f^dTCy25}8mCzi1}ud<3I_7)ahmKKm}~xjT}>A{3PoLL);ouq zk142uP?mm`=*TIB2^}fadwac1LN6$khTVepmpbW1g)=&0-Fg`A>%dD2XLZ1qB@SZK z3g;y0b{0O=NiQp$7oATIqi(1puP9uUl=Uo6EelpLIKaMr;&2j?AJ)Zgn0>u6|OWNjS-3+2j*jNuagEU_A#Cj%4BC<(WF$9rM+ zQLq;?a^qjtRym3521?De9mKmq7HO%Wo|Od0lr25)l>u)n>>j53_kxT$-7w=;tnOh% zDEiSs5_EeROU-g+m&3Z!j)(SLAJNh#ubgCgt2G0zpZ2nLxEbk|qH1inCKk)Uxlx#HhE<~xA<97JYXG==9Jy#DSTk0)+4vYW5 zrsw_)qhEpED@)(*VFg8VCaE4IqA9=cvfFC S<69m@ZfNK|e89RKKKuiYelx28 literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Models/Enums/OperationType.class b/Application/target/classes/Application/Models/Enums/OperationType.class new file mode 100644 index 0000000000000000000000000000000000000000..af096b5e3a1fcacae7d21b54ec2d6d5715e8532e GIT binary patch literal 1272 zcma)5?@!ZE6g_WU*R2+r>p*k?=j7c5vR zxD|50xhp~$ylA0c2CcQaaNa)Q9`_y9!6geB3{VG?)z!+Yb(os3}M*7fQ8Gr z!k{}|;0uPqT)wi;4|$P_>=ie+_k|OcOk{D@z^H{WT%&&eBuHtf{vr2TVsn>aA=iao z^LVpa>I&FV==yu5?h2AX@sC@$feD60+4bFMnPIq_s)KxRMDCGML8j79K~rRNWHmZ6W(uRnxc-S=|HoutUQVHyQZX8b-sxUYkj1nq zmyJrwkroiACopDw1FLCmXm%~$hGEzAHVIlww9#kFuFp@I!~-mLD4Y&O=_@g0ZfeJv zJc6d2TXE$W%9+xYV=8Alp`5-G$T?r^+b@$4?&a`lmi6)P$UoniAgKQlP1JZOS{04>y=!u#EzW@0A4Zw3eGm&B#-8eZ3{2Gt_X6RO$brH1O zt+3r_xt@5J1%qzGK$;=D8`i~vABsA|c)1s=BxxBNSxM6?JP21+SLj5)d zkYg~Xs~hFrEstU1ZEs}@4sMyq*%-ua2BQ`Z^-X#zhJi9Y$jf$P zUqo;Cen63>za&uX-Bbpr+^q4S$|GNjBuaY78zkub*$ReSMZ`zV`YRq0CKeH;ug6C| znXKm@hCFUZMAZt#Dow&_El9ev(4{4NxY|3hwGxBnHQP~5Z2Pjf49(=ce8=@gYT+=A zvA#Yc#}gn+^QJ6~8Ia4%*&>8N@d9QDUnFmeto*DF`aa?2C7ciBG0f6Gtx zWS>Fb*z6QAgMx{og;`h(Yt7*>kUmdj6gnqSR|F%cok)sq_gI7?=1CM2A{~j??J_V| z0ZJCiN^N^QylMJ=l!l4AH4cfuP;SXkoTj&)h%dMoP^H?6d>(XoELA=!8cAP{7}i_= z@vy^C>WvMF_QVYJ<1*Af%Ll*B6wjkH_QjD@1}Z<=*-|4yo%+ydgc>axMRua5XxG8i zEGbqfYtlWVz1(;PYv@lfRj?m2!5qaB2>^pu4h51`DYM2B%wvJFI%-&);I=b7y=YuM n!Zfb02zXC#G$@w(6h!%ESYM2#=?pt#*nb)J6b8d`_S4D-5yfbt literal 0 HcmV?d00001 diff --git a/Application/target/classes/Application/Services/UserService.class b/Application/target/classes/Application/Services/UserService.class new file mode 100644 index 0000000000000000000000000000000000000000..ceca49cb719e586e96bb9a99f95c5610478fb070 GIT binary patch literal 7692 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 + + 4.0.0 + + is.technologies + DataAccess + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + + + + org.projectlombok + lombok + 1.18.30 + provided + + + + is.technologies + Application + 1.0-SNAPSHOT + + + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + + ${project.build.directory}/libs + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + true + libs/ + + is.technologies.Main + + + + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.12.1 + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.4.2 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.0.0 + + 17 + ${java.home}/bin/javadoc + + + + maven-javadocs + + jar + + + + + + + + \ No newline at end of file diff --git a/DataAccess/src/main/java/DataAccess/BankAccountRepository.java b/DataAccess/src/main/java/DataAccess/BankAccountRepository.java new file mode 100644 index 0000000..75bdfc3 --- /dev/null +++ b/DataAccess/src/main/java/DataAccess/BankAccountRepository.java @@ -0,0 +1,61 @@ +package DataAccess; + +import lombok.NoArgsConstructor; +import Application.Abstractions.Repositories.IBankAccountRepository; +import Application.Contracts.ResultTypes.BankAccountResult; +import Application.Models.Entites.BankAccount; + +import java.util.ArrayList; +import java.util.Objects; + +@NoArgsConstructor +public class BankAccountRepository implements IBankAccountRepository { + ArrayList _bankAccounts = new ArrayList<>(); + + @Override + public BankAccountResult AddBankAccount(BankAccount account) { + if (account == null) { + return new BankAccountResult.BankAccountCreationError("Bank account cannot be null"); + } + _bankAccounts.add(account); + return new BankAccountResult.Success(); + } + + @Override + public BankAccount FindBankAccountById(Integer id) { + if (id < 0) { + return null; + } + for (BankAccount account : _bankAccounts) { + if (Objects.equals(account.getId(), id)) { + return account; + } + } + return null; + } + + @Override + public BankAccountResult UpdateBankAccountBalance(Integer id, Double balance) { + if (id < 0 || balance < 0) { + return new BankAccountResult.BankAccountUpdateError("Invalid update parameters"); + } + + for (BankAccount account : _bankAccounts) { + if (Objects.equals(account.getId(), id)) { + account.setBalance(balance); + return new BankAccountResult.Success(); + } + } + + return new BankAccountResult.BankAccountUpdateError("Bank account balance update failed"); + } + + @Override + public BankAccountResult DeleteBankAccount(Integer id) { + if (id < 0) { + return new BankAccountResult.BankAccountDeletionError("Invalid delete parameters"); + } + _bankAccounts.removeIf(bankAccount -> Objects.equals(bankAccount.getId(), id)); + return new BankAccountResult.Success(); + } +} diff --git a/DataAccess/src/main/java/DataAccess/OperationRepository.java b/DataAccess/src/main/java/DataAccess/OperationRepository.java new file mode 100644 index 0000000..6f59de2 --- /dev/null +++ b/DataAccess/src/main/java/DataAccess/OperationRepository.java @@ -0,0 +1,27 @@ +package DataAccess; + +import lombok.NoArgsConstructor; +import Application.Abstractions.Repositories.IOperationRepository; +import Application.Contracts.ResultTypes.OperationResult; +import Application.Models.Entites.Operation; + +import java.util.ArrayList; + +@NoArgsConstructor +public class OperationRepository implements IOperationRepository { + private final ArrayList operations = new ArrayList<>(); + + @Override + public OperationResult AddOperation(Operation operation) { + if (operation == null) { + return new OperationResult.OperationError("Operation can not be null"); + } + operations.add(operation); + return new OperationResult.Success(); + } + + @Override + public ArrayList GetOperationHistory(Integer bankAccountId) { + return operations; + } +} diff --git a/DataAccess/src/main/java/DataAccess/UserRepository.java b/DataAccess/src/main/java/DataAccess/UserRepository.java new file mode 100644 index 0000000..7de4b28 --- /dev/null +++ b/DataAccess/src/main/java/DataAccess/UserRepository.java @@ -0,0 +1,64 @@ +package DataAccess; + +import lombok.NoArgsConstructor; +import Application.Abstractions.Repositories.IUserRepository; +import Application.Contracts.ResultTypes.UserResult; +import Application.Models.Entites.User; + +import java.util.ArrayList; +import java.util.Objects; + +@NoArgsConstructor +public class UserRepository implements IUserRepository { + + private final ArrayList _users = new ArrayList<>(); + + @Override + public UserResult AddUser(User user) { + if (user == null) { + return new UserResult.UserCreationError("User can not be null"); + } + _users.add(user); + return new UserResult.Success(); + } + + @Override + public User FindUserById(Integer id) { + if (id < 0) { + return null; + } + for (User user : _users) { + if (Objects.equals(user.getId(), id)) { + return user; + } + } + return null; + } + + @Override + public UserResult UpdateUser(Integer id, User userUpdate) { + if (userUpdate == null || id < 0) { + return new UserResult.UserUpdateError("Invalid update parameters"); + } + + for (int i = 0; i < _users.size(); ++i) { + User existingUser = _users.get(i); + if (Objects.equals(existingUser.getId(), id)) { + _users.set(i, userUpdate); + return new UserResult.Success(); + } + } + + return new UserResult.UserUpdateError("User update failed "); + } + + + @Override + public UserResult DeleteUser(Integer id) { + if (id < 0) { + return new UserResult.UserDeletionError("Invalid delete parameters"); + } + _users.removeIf(user -> Objects.equals(user.getId(), id)); + return new UserResult.Success(); + } +} diff --git a/DataAccess/target/classes/DataAccess/BankAccountRepository.class b/DataAccess/target/classes/DataAccess/BankAccountRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..238bd06d09b20063fd217b5db21824f14f70fcb4 GIT binary patch literal 3732 zcmbtX-BS}+6#rcaEQAF^6cwx*DGK4kXtipMpnPbJ2DGABsMg*j7g$+#7y@wurn>RI@9S}XF7fAOyB!=bUL-??rxHeqGjwu_TIgF?>WD7&hMOi^6Ni0 ze*(~tFBDWUqzChPUCVMuGmXTsX*d?oI(FiWunW3#b}=vP#1J>;2D4eSU^w1#M_^^x z67JcfmStLX2r+DuUt`=m5X*AIFr8RN#EgQjhrv**LO~skhcrWT1{hkp(wF%HPw3p3 zNsK#|X3Qkx6ZHtAL4m5G5lsxS5$N3QV54+G zD=F%VPlT}v4=LEJVhgr1G?$%`G8{1@EQUJGa3;835blYTv|*cyc04RUIl|)P0fzNm z@qo!Ge?8fN?bxB9Q$-iz4AHX1#VriVEVswRbB-&2N}lLZ(ThHYkl`+`E6R4GeQPN~k7A#K{VERNv7$fR z2zhELw6)?&f$KEs406Xu6<|{-XkjFANI}1f0UTzClzlv67BV{dwISzD%3dB(FvxHs zXx#(k$GLotJHpS7VTRU}vA}gL7c00QVtH=yc|oDF!#ILk>7`>T9>;Npuq~V+POixk zyox08FjJD$;RHi_MZ#sg6Gi#cT+>BPLHhrv`iRhlEEB#lV*z6*=ww5MF(*+Qr8@J3 ziZd7|8WA0cU3-G@Dh52r+UbIkb!*XSOXOr-5^lzxQ!#<_#CA)}n+qZ}&9KcEu1p_>ovE2elR>~Ua*A|VKoC?&u(g!L!_2b%%!JUFd zF*+Q`zEZ(CR8e8?ogc}8Btz3+E*DV5aH(sx$Kw?nSIJaT85*XPWmuEe3^7)i&j{-* zcM~F-HnUux;Fc!e{l$v*d^uBX8#fD9Rve?^#LyP7 zshnFoWsRoP9WqTvW@UaV_w_-kRjjyDv% zsp2iXO@uCA2%52A&WS|Ybq49=)6@~U4MqbM>hjxfL67){Jc!4+k<*3Ukv7e_LOvM? zrr+HJRw@q4ek-_r^&dTz_dgrFYkkSXT-V3xrlxFFQ-&d|VV&Eyuob*VwK|wit1Kv# zKY?IYG>23W{04|RmB6OJ4Ow}*;=WPv3B&fgqO_936@139<^Ef#h47+-ZN#HVYD+KB z53<*!@oAb>;Sy?T{tP%hGqf^`YFY)h_WXjzTVRvX>Sfg2=>87%Jxf?~{uWv$m$Bgn zZK+07G8*-XzUiCu>c)cECSWxXc`0@L(H0x?6v88n(#gGmIJG3RUjnl?)@`$$LI zHPkRy;Syq_y+5LZ;VL%Mq?_Sq>>TS`!mgelu=grz`fgmm{UTqsK;h> zP`8;N)w{_9d#RO_z+$AngM1+2R7;&Di2I;p-iO$TQ2pOf6l~x67lC6iVESPHAgDET z@S+6!71Z7(9BlgXnsnEZ$>`8BMvCai`h4^~H1W_M47G+z_?ufpbogk|r`K=)?utlB z5v0I#a69T~-br_P7g^RrczZE~J{+em>NIv?oZ3xkS2w}hM?0il(w7%Yc3t%Cl52Tf zA#-F9notw*P3-ebv|#%t=1I3?L8liFvh3t!baWY~JR;mA#aP1Gd$D0Z1>gX2;vl&` z8DK+a2~uak)x?Ho(o268eC-3IUGg;2y^JTjZy`dAd+K}Ce@kmsF6qK9x(2ed(G{FqtbW=lEs^Zq)lIDVrX)lXAB0gl&tq%7i;7-}JPR&ctMM$oRpB`-(kRuu rO5mQy3wRmt&`LKkf#F@ePvBc<{D8(IG=50qNg6+*@nd|7&(ZoXtndv) literal 0 HcmV?d00001 diff --git a/DataAccess/target/classes/DataAccess/OperationRepository.class b/DataAccess/target/classes/DataAccess/OperationRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..6fef27d1feae46d67fca8f0acf0f06b26811343f GIT binary patch literal 1483 zcmb7EYflqF6g|@iOV<`kOM!|)Rm8R^72jAOHi+7!NJ0q){WRTf%ECI^?9Q6-uP{+b zB=M_>KgxJ_Tb9z0r<*Q8V0 z)*aWBJ4bEZDQ&fN+duCZ=Ysu)ZCmy*A`IEUmeaV%2}|Z0dQP~ese)lB4h6$BuNcCR zYYdru?SOycC6kL*sV;3pw919u7*t$Q5RW5)5r&zUT=I&h=}w=7w&fVovX2;4>r9wK zkR3!<8fK|t+x)0zII^rFi7^GKIMNtrNc*h)J`7>rZ2qNbt8t)fvRrttV1i-!@-eEr zzHk*8OnJA@5>39at6~~c3a&9E&jZjQ^Q6+zEW`6&x=O?GQ$p$SveLc1L20Q5F%QfX zlvv$p2`*h*XIQ-`CM&gG_)V*+n@(v%NJI9fy1Z6qh*z4;fP~>gez0E)eQpEQ6p=;N zNeaVg%@F!q_hUo1cX-1jOR8pR+}!21;qAM|h}<_Q>$%$hi-d4vL6tDf_bL15-5C;f z$+g2x-tN++U+Xf6#2czCzW|H9Wn2|fZ|Qcqa8b}nN20;SA(gY`3R$IkOZT+E*}n|i z14CXSk80g=ZB2h=c;TE1?r~l=i(WBOzN?*oI< zZ3f(+2A`()V1~Yw*W@(k=q(D-Nto6*af`+|vh347MDy&zPb5yk_EO;!M30MK5L@_$ z(RZiF?44lpm|ViRO=AiX8k01R5o{Wh7{@$WCOR;KQ5dIFkFtQ90mx~%Nthx$|=wd`PERrB%++@MaDh3i_hTQ{<4m0b_ED>{0 z%+1_y4_2irReA9x52h-CM5|JHidCunh~#frshB=zhTS1VN9b9Kv14qB#bYdP0Rp5#u^a8Jz_xRX5XaNB#1i`zk)OY0%q zw(M01Gc<|iSWYuzrsc*adCV*tMg$BsDio}uYoBiFZa+hFd*+-rrzH)|oK9w4TQ{du ziP2g_P^UmuQICfh)*sefZ6KH9&Qk1x<>;Q_sES53F*M3x%WW7!T0Z|TD90wx@tm7Vj4Nni=zgG_WQ!7N1kG3{_^zi2?TOI{ zHejQIO)55{m0?YpciMFMG`AU6>83lX8AUF4qy_jbDz;*qc;#|iBhCyh?TG-_w7;IJ z!*=XY(59jt35IBy>XHeAGNU;o{Gu!UkBc2URdiw(L)etdO-sIILHsNzNHVkrb1-b> zx#1*-OqXDJMTuZH_NaISdl{;yxto?L^^r<%K2560KJ+Nqui^k6T}p(ki5HKGS;H?B zHG^*2g8J~`1QZh}Q;MN42=Tt8d%BR?9(n3Y)AZH(-uzNzqQKZSv5q53u=?XmVURs5xNVc+{ zd`wfCZt#3e!SMfS*2CQ3qP2a_#{!(Gq(pTY=L~A1G#gH;$l?@nreYKJy}_a^RW+!| zsiK*a^W(V9^J128*@&Ym&fsa%vdw3$Ii8+k*y6jA<*%?UF&@D<)+u;~p`qL{URp&~ z>D6-#`+}7pm~`aOB9>xq`LjYNou)+|ODi-zYP0&Zskud)I_^NAsY(N+FB9}!LH4PB z5}q=U&kNTKC)!uskXUB1l1#~ac#yh{VRc3~`ABhglG~@WNrP6R87rq5qnfRYXMZv5 z&gj%Q8#4bnG=)nsG%5Sbpj2YVP@i?R-1%Xx;QLpP=%yrlXkN5||bxmp#Y381`54y)x%Deu zD$u&~7V2+;jYUI?sJ`CuJ!*F@VD*`sXdYX{+UsNzLY{u32>ZW{0tN;yGM2{ zplj!k=)Q{TUDvPO`Gb|gY^HM?=)k66BWmfu7N@XD#IT1>W8K&$fyF3%oN^%Gghb2| z#2(DT^dZ(GT>BRk1>0M16F3G71t096w5^&pPIUf?hzFQ5)jJmLTSWi$Q2!>8tOY#w z4Z6kMrUe`#*uCNP;S%s>`J!_HM@k939Aek*+>(Bt6n-dxm*5@51avs8LxR%VNlbPT zr`<@=?-05$Olw(UCz9Sxz>>uK0&xpdDf(c;kt`=lEGK-HL;xnHdOUts+|hm*AT literal 0 HcmV?d00001 diff --git a/Presentation/pom.xml b/Presentation/pom.xml new file mode 100644 index 0000000..a43faf4 --- /dev/null +++ b/Presentation/pom.xml @@ -0,0 +1,145 @@ + + + 4.0.0 + + is.technologies + Presentation + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + + + org.junit.jupiter + junit-jupiter-api + 5.9.2 + test + + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + test + + + + + org.projectlombok + lombok + 1.18.30 + provided + + + + is.technologies + Application + 1.0-SNAPSHOT + + + + is.technologies + DataAccess + 1.0-SNAPSHOT + + + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + + ${project.build.directory}/libs + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + true + libs/ + + is.technologies.Main + + + + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.12.1 + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.4.2 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.0.0 + + 17 + ${java.home}/bin/javadoc + + + + maven-javadocs + + jar + + + + + + + + \ No newline at end of file diff --git a/Presentation/src/main/java/Presentation/Console/Main.java b/Presentation/src/main/java/Presentation/Console/Main.java new file mode 100644 index 0000000..5047091 --- /dev/null +++ b/Presentation/src/main/java/Presentation/Console/Main.java @@ -0,0 +1,11 @@ +package Presentation.Console; + + +import Presentation.Interfaces.IMenu; + +public class Main { + public static void main(String[] args) { + IMenu menu = new Menu(); + menu.Run(); + } +} diff --git a/Presentation/src/main/java/Presentation/Console/Menu.java b/Presentation/src/main/java/Presentation/Console/Menu.java new file mode 100644 index 0000000..2403777 --- /dev/null +++ b/Presentation/src/main/java/Presentation/Console/Menu.java @@ -0,0 +1,274 @@ +package Presentation.Console; + +import Application.Contracts.ResultTypes.BankAccountResult; +import Application.Contracts.ResultTypes.OperationResult; +import Application.Contracts.ResultTypes.UserResult; +import Application.Managers.UserManager; +import Application.Models.Entites.BankAccount; +import Application.Models.Entites.User; +import Application.Models.Enums.HairColor; +import Application.Models.Enums.Sex; +import Application.Models.Utils.IdGenerator; +import Application.Services.UserService; +import Presentation.Interfaces.IMenu; +import DataAccess.BankAccountRepository; +import DataAccess.OperationRepository; +import DataAccess.UserRepository; + +import java.util.Scanner; + +public class Menu implements IMenu { + + private final IdGenerator userIdGenerator = new IdGenerator(); + private final IdGenerator bankAccountIdGenerator = new IdGenerator(); + private final UserRepository userRepository = new UserRepository(); + private final OperationRepository operationRepository = new OperationRepository(); + private final BankAccountRepository bankAccountRepository = new BankAccountRepository(); + private final UserService userService = new UserService(userRepository, bankAccountRepository, operationRepository, new UserManager()); + + private final Scanner scanner = new Scanner(System.in); + + @Override + public void Run() { + while (true) { + System.out.println("\n--- Меню ---"); + System.out.println("1. Создать пользователя"); + System.out.println("2. Показать информацию о пользователе"); + System.out.println("3. Изменить список друзей пользователя"); + System.out.println("4. Создать счет пользователя"); + System.out.println("5. Просмотреть баланс счета"); + System.out.println("6. Снять деньги со счета"); + System.out.println("7. Пополнить счет"); + System.out.println("8. Перевести деньги"); + System.out.println("0. Выйти"); + System.out.print("Выберите команду: "); + + int choice = scanner.nextInt(); + scanner.nextLine(); + + switch (choice) { + case 1 -> createUser(); + case 2 -> getUserInfo(); + case 3 -> manageFriends(); + case 4 -> createBankAccount(); + case 5 -> checkBalance(); + case 6 -> withdraw(); + case 7 -> deposit(); + case 8 -> transfer(); + case 0 -> { + System.out.println("Выход..."); + return; + } + default -> System.out.println("Неверная команда!"); + } + } + } + + private void createUser() { + System.out.print("Введите логин: "); + String login = scanner.nextLine(); + System.out.print("Введите имя: "); + String name = scanner.nextLine(); + System.out.print("Введите возраст: "); + int age = scanner.nextInt(); + scanner.nextLine(); + + // Ввод пола через выбор цифрой + System.out.println("Выберите пол:"); + System.out.println("1. Мужской"); + System.out.println("2. Женский"); + System.out.println("3. Неопределённый"); + System.out.print("Введите цифру (1-3): "); + int sexChoice = scanner.nextInt(); + scanner.nextLine(); + + Sex sex = switch (sexChoice) { + case 1 -> Sex.Male; + case 2 -> Sex.Female; + default -> Sex.Undefined; + }; + + // Ввод цвета волос через выбор цифрой + System.out.println("Выберите цвет волос:"); + System.out.println("1. Блонд"); + System.out.println("2. Пепельный"); + System.out.println("3. Каштановый"); + System.out.println("4. Рыжий"); + System.out.println("5. Черный"); + System.out.println("6. Окрашенный"); + System.out.println("7. Цветной"); + System.out.println("8. Седой"); + System.out.println("9. Белый"); + System.out.println("10. Лысый"); + System.out.print("Введите цифру (1-10): "); + int hairChoice = scanner.nextInt(); + scanner.nextLine(); + + HairColor hairColor = switch (hairChoice) { + case 1 -> HairColor.Blond; + case 2 -> HairColor.Ash; + case 3 -> HairColor.Brown; + case 4 -> HairColor.Auburn; + case 5 -> HairColor.Black; + case 6 -> HairColor.Dyed; + case 7 -> HairColor.Colored; + case 8 -> HairColor.Grey; + case 9 -> HairColor.White; + default -> HairColor.Bold; + }; + + User user = new User(userIdGenerator, login, name, age, sex, hairColor); + UserResult result = userService.CreateUser(user); + + System.out.println(result instanceof UserResult.Success ? "Пользователь создан!" : "Ошибка создания пользователя."); + } + + + private void getUserInfo() { + System.out.print("Введите ID пользователя: "); + int userId = scanner.nextInt(); + User user = userRepository.FindUserById(userId); + if (user != null) { + userService.GetUserInfo(user); + } else { + System.out.println("Пользователь не найден."); + } + } + + private void manageFriends() { + System.out.print("Введите ID пользователя: "); + int userId = scanner.nextInt(); + System.out.print("Введите ID друга: "); + int friendId = scanner.nextInt(); + + User user = userRepository.FindUserById(userId); + User friend = userRepository.FindUserById(friendId); + + if (user != null && friend != null) { + System.out.print("Добавить друга (1) или удалить (2): "); + int action = scanner.nextInt(); + + if (action == 1) { + userService.AddFriend(user, friend); + System.out.println("Друг добавлен."); + } else if (action == 2) { + userService.RemoveFriend(user, friend); + System.out.println("Друг удален."); + } else { + System.out.println("Неверная команда."); + } + } else { + System.out.println("Пользователь или друг не найден."); + } + } + + private void createBankAccount() { + System.out.print("Введите ID пользователя: "); + int userId = scanner.nextInt(); + + User user = userRepository.FindUserById(userId); + if (user == null) { + System.out.println("Пользователь не найден."); + return; // 💥 Выход, если пользователь не найден + } + + System.out.println("Найден пользователь: " + user.getName() + " (ID: " + user.getId() + ")"); + + BankAccount account = new BankAccount(bankAccountIdGenerator, user); + BankAccountResult result = userService.addBankAccount(user, account); + + if (result instanceof BankAccountResult.Success) { + System.out.println("Счет создан!"); + } else { + System.out.println("Ошибка создания счета."); + } + } + + + private void checkBalance() { + System.out.print("Введите ID счета: "); + int accountId = scanner.nextInt(); + BankAccount account = bankAccountRepository.FindBankAccountById(accountId); + + if (account != null) { + User user = userRepository.FindUserById(account.getUserId()); // ✅ Получаем пользователя из счета + if (user != null) { + userService.CheckBalance(user, account); // ✅ Передаём пользователя + } else { + System.out.println("Пользователь не найден."); + } + } else { + System.out.println("Счет не найден."); + } + } + + + private void withdraw() { + System.out.print("Введите ID счета: "); + int accountId = scanner.nextInt(); + System.out.print("Введите сумму снятия: "); + double amount = scanner.nextDouble(); + + BankAccount account = bankAccountRepository.FindBankAccountById(accountId); + if (account != null) { + OperationResult result = userService.Withdraw(account, amount); + + if (result instanceof OperationResult.Success) { + System.out.println("Деньги сняты."); + } else if (result instanceof OperationResult.OperationError error) { + System.out.println("Ошибка: " + error.getMessage()); + } + } else { + System.out.println("Счет не найден."); + } + } + + private void deposit() { + System.out.print("Введите ID счета: "); + int accountId = scanner.nextInt(); + System.out.print("Введите сумму пополнения: "); + double amount = scanner.nextDouble(); + + BankAccount account = bankAccountRepository.FindBankAccountById(accountId); + if (account != null) { + OperationResult result = userService.Deposit(account, amount); + if (result instanceof OperationResult.Success) { + System.out.println("Счет пополнен."); + } else if (result instanceof OperationResult.OperationError error) { + System.out.println("Ошибка: " + error.getMessage()); + } + } else { + System.out.println("Счет не найден."); + } + } + + + private void transfer() { + try { + System.out.print("Введите ID счета отправителя: "); + int fromId = Integer.parseInt(scanner.nextLine().trim()); + + System.out.print("Введите ID счета получателя: "); + int toId = Integer.parseInt(scanner.nextLine().trim()); + + System.out.print("Введите сумму перевода: "); + double amount = Double.parseDouble(scanner.nextLine().trim().replace(',', '.')); + + BankAccount fromAccount = bankAccountRepository.FindBankAccountById(fromId); + BankAccount toAccount = bankAccountRepository.FindBankAccountById(toId); + + if (fromAccount != null && toAccount != null) { + OperationResult result = userService.Transfer(fromAccount, toAccount, amount); + if (result instanceof OperationResult.Success) { + System.out.println("Перевод выполнен."); + } else if (result instanceof OperationResult.OperationError error) { + System.out.println("Ошибка: " + error.getMessage()); + } + } else { + System.out.println("Один или оба счета не найдены."); + } + } catch (NumberFormatException e) { + System.out.println("Ошибка ввода! Пожалуйста, введите корректные числовые значения."); + } + } +} diff --git a/Presentation/src/main/java/Presentation/Interfaces/IMenu.java b/Presentation/src/main/java/Presentation/Interfaces/IMenu.java new file mode 100644 index 0000000..869abd7 --- /dev/null +++ b/Presentation/src/main/java/Presentation/Interfaces/IMenu.java @@ -0,0 +1,5 @@ +package Presentation.Interfaces; + +public interface IMenu { + void Run(); +} diff --git a/Presentation/src/test/java/BankTests.java b/Presentation/src/test/java/BankTests.java new file mode 100644 index 0000000..8d7bb9b --- /dev/null +++ b/Presentation/src/test/java/BankTests.java @@ -0,0 +1,78 @@ +import Application.Abstractions.Repositories.IBankAccountRepository; +import Application.Abstractions.Repositories.IOperationRepository; +import Application.Abstractions.Repositories.IUserRepository; +import Application.Contracts.Interfaces.IUserService; +import Application.Contracts.ResultTypes.OperationResult; +import Application.Managers.UserManager; +import Application.Models.Entites.BankAccount; +import Application.Models.Entites.User; +import Application.Models.Enums.HairColor; +import Application.Models.Enums.Sex; +import Application.Models.Utils.IdGenerator; +import Application.Services.UserService; +import DataAccess.BankAccountRepository; +import DataAccess.OperationRepository; +import DataAccess.UserRepository; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class BankTests { + + @Test + public void Scenario1() { + IdGenerator userIdGenerator = new IdGenerator(); + IdGenerator bankAccountIdGenerator = new IdGenerator(); + IUserRepository userRepository = new UserRepository(); + IOperationRepository operationRepository = new OperationRepository(); + IBankAccountRepository bankAccountRepository = new BankAccountRepository(); + var user1 = new User(userIdGenerator, "test_login", "lim0sha", 22, Sex.Male, HairColor.Brown); + var bankAccount1 = new BankAccount(bankAccountIdGenerator, user1); + IUserService userService = new UserService(userRepository, bankAccountRepository, operationRepository, new UserManager()); + + userService.CreateUser(user1); + userService.addBankAccount(user1, bankAccount1); + userService.Deposit(bankAccount1, 239.00); + userService.Withdraw(bankAccount1, 52.00); + + assertEquals(187.00, bankAccountRepository.FindBankAccountById(bankAccount1.getId()).getBalance()); + } + + @Test + public void Scenario2() { + IdGenerator userIdGenerator = new IdGenerator(); + IdGenerator bankAccountIdGenerator = new IdGenerator(); + IUserRepository userRepository = new UserRepository(); + IOperationRepository operationRepository = new OperationRepository(); + IBankAccountRepository bankAccountRepository = new BankAccountRepository(); + var user1 = new User(userIdGenerator, "test_login", "lim0sha", 22, Sex.Male, HairColor.Brown); + var bankAccount1 = new BankAccount(bankAccountIdGenerator, user1); + IUserService userService = new UserService(userRepository, bankAccountRepository, operationRepository, new UserManager()); + + userService.CreateUser(user1); + userService.addBankAccount(user1, bankAccount1); + userService.Deposit(bankAccount1, 52.00); + var withdrawResult = userService.Withdraw(bankAccount1, 239.00); + + assertEquals(OperationResult.OperationError.class, withdrawResult.getClass()); + } + + @Test + public void Scenario3() { + IdGenerator userIdGenerator = new IdGenerator(); + IdGenerator bankAccountIdGenerator = new IdGenerator(); + IUserRepository userRepository = new UserRepository(); + IOperationRepository operationRepository = new OperationRepository(); + IBankAccountRepository bankAccountRepository = new BankAccountRepository(); + var user1 = new User(userIdGenerator, "test_login", "lim0sha", 22, Sex.Male, HairColor.Brown); + var bankAccount1 = new BankAccount(bankAccountIdGenerator, user1); + IUserService userService = new UserService(userRepository, bankAccountRepository, operationRepository, new UserManager()); + + userService.CreateUser(user1); + userService.addBankAccount(user1, bankAccount1); + userService.Deposit(bankAccount1, 52.00); + userService.Deposit(bankAccount1, 52.00); + + assertEquals(104.00, bankAccountRepository.FindBankAccountById(bankAccount1.getId()).getBalance()); + } +} diff --git a/Presentation/target/classes/Presentation/Console/Main.class b/Presentation/target/classes/Presentation/Console/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..cf9b3794ac86bcbcfaced8aa40f3daad4fe9cab9 GIT binary patch literal 557 zcmZ{h(N4lJ6o&sYaBNIKP!ti3cc6)T0Mr{26XH-KhQxSPuwu#Rl5O~2UJ*6%0emRq z=`a$EuE}Z6`FpIdk7c0TcA%ob7j9RmsSOiG4mmg`RvqLuvc7b>qhb+0@S%v@j_x4r z^;DTC{)^>OF{InUyN$25+Amu+~-JHz6x9srya^zz7f@wGuXHpMqb;V8Exf_Jox$=B lUtlvVFnJgxXK7jVbL<3HnYUmI)kHI~jT!+Nb|_Dw{sp|pcU}Mh literal 0 HcmV?d00001 diff --git a/Presentation/target/classes/Presentation/Console/Menu.class b/Presentation/target/classes/Presentation/Console/Menu.class new file mode 100644 index 0000000000000000000000000000000000000000..01ee8857512fb650c07412e32cdb9dd8458f8217 GIT binary patch literal 11645 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 kNk literal 0 HcmV?d00001 diff --git a/Presentation/target/classes/Presentation/Interfaces/IMenu.class b/Presentation/target/classes/Presentation/Interfaces/IMenu.class new file mode 100644 index 0000000000000000000000000000000000000000..daa04b5b4c8396b59aff7f94a0b0be211f32eebc GIT binary patch literal 135 zcmX^0Z`VEs1_oOOPId++Mh4k{qSWHlypqI{%=|ok&%Bb1)M9;4-_*QPb_Nzk z27#=^vPAuy#JqHU|D>$cl`GoL^d$oa&aDlM3X3wdsL$urV?K Yl>n_`U|vdddd+9A2v+GIVw<6Ti2(cTwq(v#6;RiX^vr; zu`X*!PiJCh9fQ}-p%c2P+nQt95hzmeGJ$Bj=4dUcl%AnjMz_!C6IRBc$YcZ&DN`x1 z!6(x_AvI99UvRk;Tq&^0C)lc)m#NpvnvP$zN{ZG9Y%F4Chv^uOp0lGIYXl-3ITzE` zh+&pvt$>m?#&>5%wFn-^ItA-hJb?`YD+^pYO-CQmZHivi(pkNGSYS^DuNusEH{J6C1qbFxb!n!? zM9N9!2NCQ?Nd!$eB<+j~{28>fWiaE|T1r+&Cgvr*!KFHbr4_`t$TS}xPv7K{XBVl} z;M`(PlG!pG#t{WaRUAXJK!cxNn`OE_(kGUhJ*-KRu6ucutlBnP*Bo8CEbwd)QNAJh zD?L#cNVUQOXY@=q?etDgnXImD_cx~8YuCLl6{pe7Cf1(o#sb!&e)-Js z7k6IcQuz8(MM6)6n@_o3K+^6}(JRdC&$AzQl^ZXUVhewIc1oQeUQV>YTRj4j8jd(p*++GhB2aGRE2>t_72M)iH&8s7xOy7UCfSY6Gp5h!y<6|fq<&H zgN`d%EuE3uQoGOE2ccrWN((gm=@c)BIRV?|jXP{x?(ZR(DlAMeYV@To&Bci=;EDT^ zTgotO=>@;<@B_>pG5qHz`)W^EW;69V{F` z0val%&O$d8I2cg5NHWf8;^b+~KMgUrm#WW;S-~3mzuISb;e)`@rK*)M=bgN$xJ)`u zsG9?d=2V3Ak+Q1K2u@jY_hB&QDm}S9Rv;EwtB}eIY#v-WdWI)PV_feuG6plH#WXF) zJ#aEn)+dXXnM^)T^)iP?h{|jEUX|<10!<58;@@R_0dc#aPh}IELXVZTQ~Gg3Ht$MF z*-iRJdA206PLqdgx2E)rf-eR3JaQFNt!IK;$JmUkEM@sq3PuoNUaxZ$<6ZDxRzC&t zD<49b!p?Yj7L5bDqTwm*jw`ch8fb`?MLBIh zryZQaQ}Oa>c{DtOL4;H z4ZYxJ9F??xE&Yh1ivJ9(#X6!|k9uylZPO`Uqke_! zCGi11q)i{uHW`UqF8A93?h(HG@xSJt<6PjLivzjGE2=L?EAC@_8dv7h-bv4Pkx&EK zG?Ge;Ja&`B9x~WV@Ar}Re$qWa8V7L~hwua9F706+hUm3N`&*Cp9gp@ckM>QE_RAja zlt;VYqurXPeV1pHkMRj38sz?IfcyU<-{*2KjBDULJl~Hp0>>DEW=5ce5ol!u+W6bf t2y`$4Cm4Z~B;LsgoMOHwneScya=wS~8Dky7=lFv62&>>S?y#1k{{Y71zg_?U literal 0 HcmV?d00001 From 9886a59183ed015a3df0c9495ccad96ba756e508 Mon Sep 17 00:00:00 2001 From: Alexander Kim Date: Thu, 27 Feb 2025 00:32:04 +0300 Subject: [PATCH 3/7] fix: add global pom.xml --- pom.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6774ad8 --- /dev/null +++ b/pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + com.example + lim0sha + 1.0-SNAPSHOT + pom + + + Application + DataAccess + Presentation + + \ No newline at end of file From 8ffe52dff87b4a2bc225681524cef2916c912bfe Mon Sep 17 00:00:00 2001 From: Alexander Kim Date: Thu, 27 Feb 2025 00:38:43 +0300 Subject: [PATCH 4/7] fix: remove target directories from repository and update .gitignore --- .gitignore | 3 +++ .../Repositories/IBankAccountRepository.class | Bin 615 -> 0 bytes .../Repositories/IOperationRepository.class | Bin 456 -> 0 bytes .../Repositories/IUserRepository.class | Bin 546 -> 0 bytes .../Contracts/Interfaces/IUserService.class | Bin 1226 -> 0 bytes ...AccountResult$BankAccountCreationError.class | Bin 691 -> 0 bytes ...AccountResult$BankAccountDeletionError.class | Bin 691 -> 0 bytes ...nkAccountResult$BankAccountUpdateError.class | Bin 685 -> 0 bytes .../ResultTypes/BankAccountResult$Success.class | Bin 455 -> 0 bytes .../ResultTypes/BankAccountResult.class | Bin 865 -> 0 bytes .../OperationResult$OperationError.class | Bin 653 -> 0 bytes .../ResultTypes/OperationResult$Success.class | Bin 447 -> 0 bytes .../Contracts/ResultTypes/OperationResult.class | Bin 597 -> 0 bytes .../ResultTypes/UserResult$Success.class | Bin 427 -> 0 bytes .../UserResult$UserCreationError.class | Bin 642 -> 0 bytes .../UserResult$UserDeletionError.class | Bin 642 -> 0 bytes .../UserResult$UserUpdateError.class | Bin 636 -> 0 bytes .../Contracts/ResultTypes/UserResult.class | Bin 774 -> 0 bytes .../Application/Managers/UserManager.class | Bin 6448 -> 0 bytes .../Models/Entites/BankAccount.class | Bin 1479 -> 0 bytes .../Application/Models/Entites/Operation.class | Bin 970 -> 0 bytes .../Application/Models/Entites/User.class | Bin 3467 -> 0 bytes .../Application/Models/Enums/HairColor.class | Bin 1548 -> 0 bytes .../Models/Enums/OperationType.class | Bin 1272 -> 0 bytes .../classes/Application/Models/Enums/Sex.class | Bin 1139 -> 0 bytes .../Application/Models/Utils/IdGenerator.class | Bin 574 -> 0 bytes .../Application/Services/UserService.class | Bin 7692 -> 0 bytes .../DataAccess/BankAccountRepository.class | Bin 3732 -> 0 bytes .../DataAccess/OperationRepository.class | Bin 1483 -> 0 bytes .../classes/DataAccess/UserRepository.class | Bin 3517 -> 0 bytes .../classes/Presentation/Console/Main.class | Bin 557 -> 0 bytes .../classes/Presentation/Console/Menu.class | Bin 11645 -> 0 bytes .../classes/Presentation/Interfaces/IMenu.class | Bin 135 -> 0 bytes .../target/test-classes/BankTests.class | Bin 4310 -> 0 bytes 34 files changed, 3 insertions(+) delete mode 100644 Application/target/classes/Application/Abstractions/Repositories/IBankAccountRepository.class delete mode 100644 Application/target/classes/Application/Abstractions/Repositories/IOperationRepository.class delete mode 100644 Application/target/classes/Application/Abstractions/Repositories/IUserRepository.class delete mode 100644 Application/target/classes/Application/Contracts/Interfaces/IUserService.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountCreationError.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountDeletionError.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountUpdateError.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$Success.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/OperationResult$OperationError.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/OperationResult$Success.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/OperationResult.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/UserResult$Success.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserCreationError.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserDeletionError.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserUpdateError.class delete mode 100644 Application/target/classes/Application/Contracts/ResultTypes/UserResult.class delete mode 100644 Application/target/classes/Application/Managers/UserManager.class delete mode 100644 Application/target/classes/Application/Models/Entites/BankAccount.class delete mode 100644 Application/target/classes/Application/Models/Entites/Operation.class delete mode 100644 Application/target/classes/Application/Models/Entites/User.class delete mode 100644 Application/target/classes/Application/Models/Enums/HairColor.class delete mode 100644 Application/target/classes/Application/Models/Enums/OperationType.class delete mode 100644 Application/target/classes/Application/Models/Enums/Sex.class delete mode 100644 Application/target/classes/Application/Models/Utils/IdGenerator.class delete mode 100644 Application/target/classes/Application/Services/UserService.class delete mode 100644 DataAccess/target/classes/DataAccess/BankAccountRepository.class delete mode 100644 DataAccess/target/classes/DataAccess/OperationRepository.class delete mode 100644 DataAccess/target/classes/DataAccess/UserRepository.class delete mode 100644 Presentation/target/classes/Presentation/Console/Main.class delete mode 100644 Presentation/target/classes/Presentation/Console/Menu.class delete mode 100644 Presentation/target/classes/Presentation/Interfaces/IMenu.class delete mode 100644 Presentation/target/test-classes/BankTests.class diff --git a/.gitignore b/.gitignore index ea1f7b6..277d995 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ out/ !**/src/main/**/out/ !**/src/test/**/out/ .idea +Application/target +DataAccess/target +Presentation/target ### Eclipse ### .apt_generated diff --git a/Application/target/classes/Application/Abstractions/Repositories/IBankAccountRepository.class b/Application/target/classes/Application/Abstractions/Repositories/IBankAccountRepository.class deleted file mode 100644 index 4a6c128a72d3de1e2d45f83f8d0aa328b4058673..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615 zcmbV~-%7(U6vn?Z=c-eu;*H=7%p3ava~G|1P?-q+xf3K!!^jLtX;Y!E=7kU7Ly2hx zZATIDCg+fRIlu4ZESt;wXw{U~Jm zIpEwB+I}CD9{PlX6?v?t1je!A8dGMij0f7RIZtm?)jcok2fF?Hr$s1`fl8t Y7`TMsVXKbY7}jwIyG}vab88QyPb>4sg8%>k diff --git a/Application/target/classes/Application/Abstractions/Repositories/IOperationRepository.class b/Application/target/classes/Application/Abstractions/Repositories/IOperationRepository.class deleted file mode 100644 index b981c5ee70bc4f548db07deb34e2f86efe0b5fea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcma)3!Ab)$6r5D;+FC*I7yYZjE-`)D0OH>9bG5b z7dY9dS0$}-gOHRWu7=*{AG!V*T!6C{9uV7QL2!%?KiV%+;z>R-Zt}NS%U8G!%1qa|zs7}hO zkWDxKe_Nw(MxOVN*EaxHI8M-ExX7H-st`e0!?T$Wr6}s%^G9;lt6)n-p663f<@ZaK zpv!Qw5HEsjVdngPwxA*~B$<@8lHp-6`AxpFlCp%_`yc-O{$sl#*S zK85T1kfA?TromrVxn#H;OnwsNCeZvJw9S?wojNH3t%J%o%0{v_$ky4@8`AXUIcoFV z9{FUKWkF-5iQ)85L+AC^^cWa+V%tDB7PgCCTw+VuYvw-EW*(p)6%2>*?BHkxprNfT diff --git a/Application/target/classes/Application/Contracts/Interfaces/IUserService.class b/Application/target/classes/Application/Contracts/Interfaces/IUserService.class deleted file mode 100644 index 7e7748562c616e69f3f72ce994be5927558ce425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1226 zcmcgs%TB^T6usjM1biUA-MY|)_5+9u1Ro?ABfeHHhUrBH>P#~oFl>x};lH@>1NfxjqHA*NwEh%=B4Fc;zs%m(pXi1UyS;sq!KxESIREC=xltQrLZYvwry>+d$P BjXeMW diff --git a/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountCreationError.class b/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountCreationError.class deleted file mode 100644 index 72a65af1b4fb2e8ddfdc7d3533aaf61129e24be2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 691 zcmb_ZO-}+b5Pe021y?{t1kWA-6F0`AN`geA335=wy{-*bmo90GiT_Fyjfn?;fIrGO zTQp+0887qInK!TV-alU70PJHuhZN?rNc)&ahN0UYjUpLxD`OROVr4ZCtqIPA8AtZw zek4qAz}0O#4CAq~lk&z?rK5$LJ=8kZ4B4SDh7Sb8a`%Sc@gU-A5S&{r)nGRd54kMz zJ{I6J?EGOhLuOAZXyU=?X@%vy??#TF2iblmYe&*c|6vkIFbpY%G7Bm$KFcL$l&#avB$Bo4E~8y zLU$r=j3A=bsgYl5V4I}&NOck;5u2hE#fvDAEm9VcXXNLbPhb!3xkNVOiX|*j>`xj9 zV1+V9!j;J;!z}_!k0gFRA~!Vf~hAyg(^UkKFisE~YEb^R5rIq#vGpb>gP Hx`x^(n2D*I diff --git a/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountDeletionError.class b/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$BankAccountDeletionError.class deleted file mode 100644 index 41805ea79f7cb758fcf6fbd3d3b740e43c58384f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 691 zcmb_ZT`vPc6g|`LuBATOD)H!{DzOodXi`N;st-utr)yHfnr&ugCH@r&k$CU}{3vmE zTT$toc)4G5@4090`S^T$2e6OTB2q}_k#Uhlj-k^U4g=|PD?{bALuEDht?|xS5TWZK~sF)DSW65Z&oFZ3nv2MNc} z=RuEa8Rz3-#$HRq(EZoT>@rm9)7+9DT!fMK#j%VTRVPk6I`&q4MutLH7<&>L%ix|W zC3HLB#t0%>n;7|}2DVA+0;x`7#9~vFqIec_WJ{EJ+tcsG0GAaxwdr1<>fLj?WuNy0?d0>rqE=(HP z%ZEf5Z=b8Xy&#BFWsCO8Q0FSS=2jeN9czZ_Kp4YA!7%IJ@_X(@T!r3+)l!99b<{9k zMcu^&T!zhmEM}-|OC{|t!&rN@$50Q2J^k6)Y_E=PWhiyyYf{wkr4nc9pfB_#??<`D zIN(u_YnkEiX35@2!{Gb>koU)3wixEyqsnsq7jdcsaVRrAt)a6PhhEQ)$WS{I#vaAS zGPuV|3EhpjF@j_ce;IND8)R~g{3atZo2hcBp2QTz1|g3!qg?JhgFWWY(-bRtvxOO| z-C}?U<_Iw|tw}Nayh~&b<$C88)y~=r*b^ZKzYNWsp;b(MGthi4g{;GTKHtJZo@-dl L*oZw7y@aJNoZF`> diff --git a/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$Success.class b/Application/target/classes/Application/Contracts/ResultTypes/BankAccountResult$Success.class deleted file mode 100644 index a436add7e8dd1276526915209a205d091a690304..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455 zcmbtQ%}N6?7@X`+x2~(z3W9eJ>cK@kwiW7vC@ekL(t8>MMq{#UvVxE0N$}tU_)y}v zYj55(fthb6Ka+f)U+*6PCfG|6AWRTth|yy>pH`Jtf_r66URdL6F1*WcrE9cbyj0TV zm)tx~g|LnBKQ=>etc>y(4B^r7GC`kV^oM&6=Zz53IfkgPcamXHDkEpj(@NG0zS86j zODniu@>;ceZASiH(VMO5f zNFB*QnkGZMy5DEWj)b}X-B_&dFYjbXw8A^mlW)sFbf)8hP(42It-^4~{XSPR!t-Xr z+)K@H)?QiMKQ9^#rRuUCtGXLb)lgi>NJVjB;mp#*$To&_M`&{yYQx}O1%Xg4pKC2h zT5j>ddX73BF-`X*%cC<=6{C6`If{8g9%V*3S$hS0w$BBMDcdYygKBp+Km=Qa7@em` zG5XvjvKZxT?Hx|-;0^4BPz-+zIm=LMM%H9WvVuR$lio3^95P<5^u-N^q}?&I_Zx<-)uCPP(S@%a>ZZ z{I-_1%m0WBy{Xd5UowQpC#wW~hVwt)a&*W+8q4)-`OL7<_!J0bpF~n&yd|{Ep1V8=OlS2 zo2O%pgofEJMw`Y-xJ4}QI1rz{fxVItASG1(Gb9U$I;(mO-y#qKyr-A~C99|72lo=XR@g)3EL=XNTm@4TQ%BMQg?wp~x zyEo=oVmQ1^l2A+GbR7BJIC4fvXZ?F+)6k8c6J`BDqD&tD78$&5JW&kwo{m&ModwE_ zL=ckF?8Q=qV_|g0=c4BxwPiT!E!^pZp)!n9Bh|Ie%D4Yba*!>^Q0*)0ZdEpik_tYSC&7ac;6sUD z>w;%ZU?wy9l1aYLulElC7uZe_AWRTth%sO|oHR|X1oz75qBPoDF1#ylrE6;oklt!I0tPFBk02S|Ox!3{h$BB|}~*EvN0%QrbCR*5r&UBY3^w zR&{!1M*cz3q0{O=VP_2K%(Pa>E7c|BzaKh!z{xsh*(EcBiGQVu#>9gk;71vI z2Mh;JT)Mkvd#fu|Kfhn!0M4+VLjp+$DHmyE7}^)pX&}ek$SCwWQD_t&8|~c*Jqyg> zWh%6HuZ5c9gLv#HVYe@piWGx05n6L!Fl=|9_%rtc9{OJ2C>i>#JhI3+$h+8p%W$;L zF^0^k45eu^BZcwLb=Xmcjr4 diff --git a/Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserDeletionError.class b/Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserDeletionError.class deleted file mode 100644 index fae4bbdc8dbb10fb68735e3bcbb2b5ac9aa6d101..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 642 zcmb7B%T5A85Uk#g7G7P*{7#PKeMtgTcPkqyS znF#IOYoTU%&yE+u7k2wnsZcRw$3km95)2#dC;rSmp9dqaYm^K|4F@^ovv6Fjz-2gG z<`_ffLQ4O=+4{i;*c+h)77W#hp)%W=Gthn{g(5;Z+OJ?M>N#v%He$D;tEm0~3m=x( diff --git a/Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserUpdateError.class b/Application/target/classes/Application/Contracts/ResultTypes/UserResult$UserUpdateError.class deleted file mode 100644 index 12147c7f338f0f209fca33e6fb9fdfb73d0fec79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 636 zcmb7B%T5A85Uk-1uA=f#JbOSiZajk|hG;ZF4)VAU%LK-*yqz&Q@Gh#{Uv!a))#hQ`Ho>PwFs83t}E42D)z#qBm^I+_DjgrB*opgYbNhR&SUp-j$B<}+Ba)JD%RqEylc7*OKJ=})(BuAqD;eR% zW5V1^&CqPGqwBu~b%s)PRf|>J4QI*|S29wNU%Gf28O4z42yL!IZ5W)JAP}nMbFBp_ zvb%q5#u;Unq4>z7?unL%TS(gEf{FuN}+gAvioK1*`C3E#769q=n5)7e*=_K diff --git a/Application/target/classes/Application/Contracts/ResultTypes/UserResult.class b/Application/target/classes/Application/Contracts/ResultTypes/UserResult.class deleted file mode 100644 index 1dd131152475085f6b852fec74a6a3d280290be6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 774 zcmbVKT`vPc6g^X0OO>LiZy_EKu`k|yBvK@j`iSCvy1ikVwcE_hO8hKO5)XcWA0_Ur z6~t4`BrN+_VuhgU`s{Q{#M`5=Qx#<#(Ft3#m`=-*Ybvikyk zYwI^Y1_U+_y4^^H(yAm5>Pc+146O++$)u6JdhC)3t_|r=E#TFYHVIT3DyFmazD4>< zwjz#v7xI?j^BZ$V@a0#=ILIol}vFcwh3D07MR7^;{=4Kul}v8r-(mi0=O_c6!WDz`At NJjuMkTw`9u%m*Ql)uR9a diff --git a/Application/target/classes/Application/Managers/UserManager.class b/Application/target/classes/Application/Managers/UserManager.class deleted file mode 100644 index ba920bc9803a610fe4a371a92487819946a81acb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6448 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 R{<)YUUrU5%*z!%<{tHiZJLCWW diff --git a/Application/target/classes/Application/Models/Entites/Operation.class b/Application/target/classes/Application/Models/Entites/Operation.class deleted file mode 100644 index 4e427190ef3bff9c476c26669503e73ac3f903d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 970 zcma)4*>2NN5IvJPaTA=)P0PNQDlv;cpnw!MsZyXwt@7@;SK$`Nj+|>G{t6@_Bp&zx zJ_<3{c8VMMp%1>xc+NR9XYQZBzkUOFf&C^bsG2Y=)KDjM&%7_58+hT&J(`{gUlHoh zWhm84LUk~lG_Zw+iKc}sun2pj#UhZtr(_hm@1s)@EZw)El1ePyqlJjmAB5H`FZ?|6 z{U{05;VEHz{9ooURAMIL1I^sF&_S1AoP1pf!eCrVpUey7Iy1%E7Pisnaz}G5L$C`X zZ=z%xhy%jMK_R-9zN}0EniCEuTH)g_3)}{1xi*t1~ zeca}+%F#Qxn=8A#>#Umd1LikAWK#7sxRp|8G_{^Us6gVG z`NB+>OsAOMIe2CjT!HAC?bz;pfu7{TzJ^|bVd+$J?NT~ZshF>FcGZnRLr)*#&^7ey zxP$?Lsm$qV$u5|#U3Su2a1^?ON6JUe&4y=m)0rJX0u?YmQqL7|kh|SDAHC z#}HF$M-|(04y!SYU{u4Hj&WQTm{qK_NAXqD*~5pHV^vJIOv_y=dbY)@XAfmc*%+>1 zQo~gp@8FuiU{ist<61=yQ+r{SYSzw?z*sW7-~}l)@;zjT*L6(ehCs+B;^7WXvpQ~K zP9Rb$7i~viDBzcOE4EXVTuB`Z>=t&+6N~d-)Um|mJ!Vlp-_nuByYyVOUJ6{xDe~WN zYA4ln-g+q+Z|isu?+f%En|5XQ)u~0Ibw)iRr}c8FTv-+9%iBfAbZZrY7^)3g3*>Mn z$bACdQ#&g|Z5G8ULw`!DVmr5^tAUk$^)7sK7M+T`DOcyOO<5N9X>-=8qy+|YwqtGA zP7bWfu6a%iI}13$Jyik?)fFOQ({L z5%s1wp#)YsVU=kGDu6p6QuV|gO9m?XtbV!rddb08cQokZi_0z=x%l#u<;hEily_R$ zVa+CBe4Lz{`p#c~Xv)jD0m8KkeA$n%O<#5%Yi$;qOn$?plo+-0OcbM48``gS0RO-A zk}6-WRSMRo&E4F`hs7;E6==T4>9_=X=}NPntPqcLd8c_T?=+_6oyN1g)6|uBIuRl8 zfwb=sj*hd&^IZ&*9l<@ieh7#fdgwR>T;nx_@h7w=uhCaWtZ62U#osaf1`~Bm8B2A{ z7^ynujfrp_hA|PTBV|lP>sU67-w^wokaYVQu>cjlNq8R;!4HXFY26;I(DgQSy3Qhu z35s=+j>(%cTLbfS_#`Qp1+2nA28(z~$5Rz4dIlbOv15(?zTh7h_wg}h#ulr^3c7s0 z(K>9gVqs~qW)W$zYEgVbwvF&xd;v{ET*HWljQqW#VO_%p1igMso*h1iBuabSl^2Eh zkb;+6KnV&Na)fl6`i0^MNll{iWxvc*_Z<8@1+w^z-q8NFfM?pl14{7cO7MI;cu)z> zDZ@6}!NW@M7Pb{(r`o}zO7ISC&H0>{+ri^X@MC;QvbGBrYX?s#z+NBaY3*GlNur%( zvLneJk?i9uKaCZNhzm4oEK+N6GXyt2E?LGrk4Aw<;cj%=3*pFQZ!?ZcXO-7T?j8cdA97RJT0b*v#`ieo*l&cgw?Lfq8y}NqfNY;bPW$Bz;{)>cnm9`Tu-qYDudE7W9jaFdjK_;t@Wy*^g(2K+tYDFKM5~8T F{14LVwGaRR diff --git a/Application/target/classes/Application/Models/Enums/HairColor.class b/Application/target/classes/Application/Models/Enums/HairColor.class deleted file mode 100644 index f2dbd10f8ef6947862dfc97038591a91171a6e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1548 zcma)5VQ<@16g`fe*l}N1ld-aPWn-nKNjDlgwlPRonr7`bNZWy-C;}n5scBtYdvcP& zzVV4~{1?b1HZg(r8HvAyIPWGv&_Fbjb9}DvJ@>uy?)&xkpMC*w6TXd{f!X@~`*G9` zx>1@`x6=JE?o>CD-f^dTCy25}8mCzi1}ud<3I_7)ahmKKm}~xjT}>A{3PoLL);ouq zk142uP?mm`=*TIB2^}fadwac1LN6$khTVepmpbW1g)=&0-Fg`A>%dD2XLZ1qB@SZK z3g;y0b{0O=NiQp$7oATIqi(1puP9uUl=Uo6EelpLIKaMr;&2j?AJ)Zgn0>u6|OWNjS-3+2j*jNuagEU_A#Cj%4BC<(WF$9rM+ zQLq;?a^qjtRym3521?De9mKmq7HO%Wo|Od0lr25)l>u)n>>j53_kxT$-7w=;tnOh% zDEiSs5_EeROU-g+m&3Z!j)(SLAJNh#ubgCgt2G0zpZ2nLxEbk|qH1inCKk)Uxlx#HhE<~xA<97JYXG==9Jy#DSTk0)+4vYW5 zrsw_)qhEpED@)(*VFg8VCaE4IqA9=cvfFC S<69m@ZfNK|e89RKKKuiYelx28 diff --git a/Application/target/classes/Application/Models/Enums/OperationType.class b/Application/target/classes/Application/Models/Enums/OperationType.class deleted file mode 100644 index af096b5e3a1fcacae7d21b54ec2d6d5715e8532e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1272 zcma)5?@!ZE6g_WU*R2+r>p*k?=j7c5vR zxD|50xhp~$ylA0c2CcQaaNa)Q9`_y9!6geB3{VG?)z!+Yb(os3}M*7fQ8Gr z!k{}|;0uPqT)wi;4|$P_>=ie+_k|OcOk{D@z^H{WT%&&eBuHtf{vr2TVsn>aA=iao z^LVpa>I&FV==yu5?h2AX@sC@$feD60+4bFMnPIq_s)KxRMDCGML8j79K~rRNWHmZ6W(uRnxc-S=|HoutUQVHyQZX8b-sxUYkj1nq zmyJrwkroiACopDw1FLCmXm%~$hGEzAHVIlww9#kFuFp@I!~-mLD4Y&O=_@g0ZfeJv zJc6d2TXE$W%9+xYV=8Alp`5-G$T?r^+b@$4?&a`lmi6)P$UoniAgKQlP1JZOS{04>y=!u#EzW@0A4Zw3eGm&B#-8eZ3{2Gt_X6RO$brH1O zt+3r_xt@5J1%qzGK$;=D8`i~vABsA|c)1s=BxxBNSxM6?JP21+SLj5)d zkYg~Xs~hFrEstU1ZEs}@4sMyq*%-ua2BQ`Z^-X#zhJi9Y$jf$P zUqo;Cen63>za&uX-Bbpr+^q4S$|GNjBuaY78zkub*$ReSMZ`zV`YRq0CKeH;ug6C| znXKm@hCFUZMAZt#Dow&_El9ev(4{4NxY|3hwGxBnHQP~5Z2Pjf49(=ce8=@gYT+=A zvA#Yc#}gn+^QJ6~8Ia4%*&>8N@d9QDUnFmeto*DF`aa?2C7ciBG0f6Gtx zWS>Fb*z6QAgMx{og;`h(Yt7*>kUmdj6gnqSR|F%cok)sq_gI7?=1CM2A{~j??J_V| z0ZJCiN^N^QylMJ=l!l4AH4cfuP;SXkoTj&)h%dMoP^H?6d>(XoELA=!8cAP{7}i_= z@vy^C>WvMF_QVYJ<1*Af%Ll*B6wjkH_QjD@1}Z<=*-|4yo%+ydgc>axMRua5XxG8i zEGbqfYtlWVz1(;PYv@lfRj?m2!5qaB2>^pu4h51`DYM2B%wvJFI%-&);I=b7y=YuM n!Zfb02zXC#G$@w(6h!%ESYM2#=?pt#*nb)J6b8d`_S4D-5yfbt diff --git a/Application/target/classes/Application/Services/UserService.class b/Application/target/classes/Application/Services/UserService.class deleted file mode 100644 index ceca49cb719e586e96bb9a99f95c5610478fb070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7692 zcmcIp349z?8UMdzlSwwyrIfU3N+}Dpp-Gd5tF&o)kfVh_(kpFh$`L2KlVr(eChX1z zgMxsdfS?E{H|oy=MG&YoX{ZN^fFjC~gZ5bU+CSsbEFpb7;JvEky>FLHjX+7l*1diy- zaJWk!HPZ>pOpOby?ewo|=}%iJEhagn8$GfF*>p%g-pqJ&1M482l`0lukwCazPwJNLXx_Fm z5A`e5Rl0JqifSwoP;Do5X@*9z0>=k-?M^#>bqCz(QXHdTnTlf(od$$_3j`|8)Geuf zhcRFZET4nzd!&%#Rh)q30_Aku)>J|_Xss>(eQ|IH`8;cLuTgQL(1)(h15 zw=pfWd<*2}H>k{9o5;?IAm3Yovky0rd|Z5*pP`~fYOb~o>9OHfjnN#_rIXuKv}21v zWuG~!r|f*0a}k{~R~K)exw=`wnT)3b_V5;!qXTCvI7e#PIhzeLBk4wOh0JgQv-o@l zC9}ddY*(;D#ZK%Jn4e2&?PjJwNmk03mdxne2V}}?_vbu^fE>1Bw~9UJ5h&e|FcKC$ zw}(;YUG!5z`#9+#7F6rOZ?r z#sn5@Gp(p@n3=($Xup#H!bszF64Pvc7W((wZKV>%AnQOGUQa7^7z~a?Jjx!!NDt_# zs5T;N&gwE;$^hSP=utBj?KdsS*cgs#PDx5f4N4p!Wqh@C;2Tw3E}M^XI?%4SaoIRs zsp3tzikV5mMov3;Io+>Lw(Tg07rC~%3~v@#>end4>7XXp;93ROsdy`{XYS2q0#^#d zTfZoyCDYSvvc3O8J!Uo6?vuUL+f=+AH#%T+YBR~JvS7?uiDY9-Dy5BgCejwsdlPO} zaEpp};#~|7TV#-iLfLKV+K9l>0WQvLBOSt*%?sG<-lpPq+#wKRFGz5-6bx(IC~h{h zB@Sc^yQOX1k<#O`LDpG^@50>*?osh>yobBUsTUAVRBFa}muAHnR>!&SnT==dzS7P2 z9NhW*)yoc+Zl1bb{=1_L9~7wVFw&WUfkccA6Tv}jr0b&zBbLm>iMVLY92rTZ)9krd z%Xs*ZiVxfIu-iqRf{zF^z4CbI&ct{CNQZGB9*}_lsGSS!bo-Eshq0e-VH@a$%~|xD zeI}^OkHege{BB-~M^qfZ1kt>M0c3exQU#sl%MZ;?h6#e>uu^gu2l0S{sX(!FFs$H^ zKtp~b${%9@F48Lz}wAgxZT3^u5FL}9{_v=MDuCwzH9Yul>}vG=

jDTooO7KDA01->pfg`usM|^Ft7RSIRI6!PEcV)Hmu?N2@$`IL ze?%#M73Kl)*D8LD=jP-2xm}Iyxp2`@15+tt#(KuQ>6=CIz_X>Xds zG?p5t&{mB2N6+}nuDi(5?JUiRC-wC5PSYIDjJoyG=FJ{SHm$xS5?CltjEDEq5m|Vx z|HSBuZPSv;Zr<1tzG{bI=&81(mQL$w1%DMd*`Jc~*A*YAZO+hKbLpHIzuPr4JuneE#=OTv;kKxlCaREMq$N8Q~#$(p%GK<*E zCNOUbN6qASf{$Os;}`Mx@jlR1uEph7PJUIZCUEq_6kG(UnuI*Ck_VGoAG>moUAf1O zmwzt1P89P$*V^prCve1khyr|>yj`?a2oUROp{R>m4z z#st<)p?Rj5jTE!VC#K31Q{{=N^2D^@^X^s#q1Z-UkrlI<53Pr=wU@3~w;yLk4x(!k z-BZ{*Q)nB7w)=#x@Pw}Lgs$*}nt0k3dJ91uqCeZ^mIxtk>HH#WlcNTX_^VAorviG6 z(x;Fp#@?)2l6*f#>SyW{u{YAeSUMZ4aE`54og>H7tKHT{22eY`fM;m)2u{ZrY5ijA zmhv=w!qu=ZsG(1@!N{$5qA8EcgR`hSnp61@(!C2Zlekz$b+H{fi)`j9zplJsknWxeZT3dyn8KY!Jf~Mw;=S^9StZ`r zR3=qkTsGVkwjaW=CROs1Kv}Hbc9*Ny2eLbn@7CoA0#2!y^4G}^xmvQD4QBT)R(SbIej=|+(J+2Vly!VkA@hVEVkr4U{ zzDl=0=snTRS-9}&Ys5D(&!?~3c}6}-^cSN>tid-p7s47*gKzSw1ihjN&oY~qQnwc< z{c!?k67P3qJcc{*ZAuGMx0~=CKBh^(4Y7PJ|Dto9FG6avTc){XLS@mX z8)R@7kur?$;ro>N1Im$(#l9&Qa6dox>W}t>go@mzOLZ_TI;Gq z2T+wOB2Fbf%GTgCXO*YH5{{ksOYD*_3*!>`*8<9uPqOTX=7(i_=t@3=k|mYO3^%Wi zzYLK3Id)2`!)w%*3@cw+p_|{rL7y@wurn>RI@9S}XF7fAOyB!=bUL-??rxHeqGjwu_TIgF?>WD7&hMOi^6Ni0 ze*(~tFBDWUqzChPUCVMuGmXTsX*d?oI(FiWunW3#b}=vP#1J>;2D4eSU^w1#M_^^x z67JcfmStLX2r+DuUt`=m5X*AIFr8RN#EgQjhrv**LO~skhcrWT1{hkp(wF%HPw3p3 zNsK#|X3Qkx6ZHtAL4m5G5lsxS5$N3QV54+G zD=F%VPlT}v4=LEJVhgr1G?$%`G8{1@EQUJGa3;835blYTv|*cyc04RUIl|)P0fzNm z@qo!Ge?8fN?bxB9Q$-iz4AHX1#VriVEVswRbB-&2N}lLZ(ThHYkl`+`E6R4GeQPN~k7A#K{VERNv7$fR z2zhELw6)?&f$KEs406Xu6<|{-XkjFANI}1f0UTzClzlv67BV{dwISzD%3dB(FvxHs zXx#(k$GLotJHpS7VTRU}vA}gL7c00QVtH=yc|oDF!#ILk>7`>T9>;Npuq~V+POixk zyox08FjJD$;RHi_MZ#sg6Gi#cT+>BPLHhrv`iRhlEEB#lV*z6*=ww5MF(*+Qr8@J3 ziZd7|8WA0cU3-G@Dh52r+UbIkb!*XSOXOr-5^lzxQ!#<_#CA)}n+qZ}&9KcEu1p_>ovE2elR>~Ua*A|VKoC?&u(g!L!_2b%%!JUFd zF*+Q`zEZ(CR8e8?ogc}8Btz3+E*DV5aH(sx$Kw?nSIJaT85*XPWmuEe3^7)i&j{-* zcM~F-HnUux;Fc!e{l$v*d^uBX8#fD9Rve?^#LyP7 zshnFoWsRoP9WqTvW@UaV_w_-kRjjyDv% zsp2iXO@uCA2%52A&WS|Ybq49=)6@~U4MqbM>hjxfL67){Jc!4+k<*3Ukv7e_LOvM? zrr+HJRw@q4ek-_r^&dTz_dgrFYkkSXT-V3xrlxFFQ-&d|VV&Eyuob*VwK|wit1Kv# zKY?IYG>23W{04|RmB6OJ4Ow}*;=WPv3B&fgqO_936@139<^Ef#h47+-ZN#HVYD+KB z53<*!@oAb>;Sy?T{tP%hGqf^`YFY)h_WXjzTVRvX>Sfg2=>87%Jxf?~{uWv$m$Bgn zZK+07G8*-XzUiCu>c)cECSWxXc`0@L(H0x?6v88n(#gGmIJG3RUjnl?)@`$$LI zHPkRy;Syq_y+5LZ;VL%Mq?_Sq>>TS`!mgelu=grz`fgmm{UTqsK;h> zP`8;N)w{_9d#RO_z+$AngM1+2R7;&Di2I;p-iO$TQ2pOf6l~x67lC6iVESPHAgDET z@S+6!71Z7(9BlgXnsnEZ$>`8BMvCai`h4^~H1W_M47G+z_?ufpbogk|r`K=)?utlB z5v0I#a69T~-br_P7g^RrczZE~J{+em>NIv?oZ3xkS2w}hM?0il(w7%Yc3t%Cl52Tf zA#-F9notw*P3-ebv|#%t=1I3?L8liFvh3t!baWY~JR;mA#aP1Gd$D0Z1>gX2;vl&` z8DK+a2~uak)x?Ho(o268eC-3IUGg;2y^JTjZy`dAd+K}Ce@kmsF6qK9x(2ed(G{FqtbW=lEs^Zq)lIDVrX)lXAB0gl&tq%7i;7-}JPR&ctMM$oRpB`-(kRuu rO5mQy3wRmt&`LKkf#F@ePvBc<{D8(IG=50qNg6+*@nd|7&(ZoXtndv) diff --git a/DataAccess/target/classes/DataAccess/OperationRepository.class b/DataAccess/target/classes/DataAccess/OperationRepository.class deleted file mode 100644 index 6fef27d1feae46d67fca8f0acf0f06b26811343f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 zcmb7EYflqF6g|@iOV<`kOM!|)Rm8R^72jAOHi+7!NJ0q){WRTf%ECI^?9Q6-uP{+b zB=M_>KgxJ_Tb9z0r<*Q8V0 z)*aWBJ4bEZDQ&fN+duCZ=Ysu)ZCmy*A`IEUmeaV%2}|Z0dQP~ese)lB4h6$BuNcCR zYYdru?SOycC6kL*sV;3pw919u7*t$Q5RW5)5r&zUT=I&h=}w=7w&fVovX2;4>r9wK zkR3!<8fK|t+x)0zII^rFi7^GKIMNtrNc*h)J`7>rZ2qNbt8t)fvRrttV1i-!@-eEr zzHk*8OnJA@5>39at6~~c3a&9E&jZjQ^Q6+zEW`6&x=O?GQ$p$SveLc1L20Q5F%QfX zlvv$p2`*h*XIQ-`CM&gG_)V*+n@(v%NJI9fy1Z6qh*z4;fP~>gez0E)eQpEQ6p=;N zNeaVg%@F!q_hUo1cX-1jOR8pR+}!21;qAM|h}<_Q>$%$hi-d4vL6tDf_bL15-5C;f z$+g2x-tN++U+Xf6#2czCzW|H9Wn2|fZ|Qcqa8b}nN20;SA(gY`3R$IkOZT+E*}n|i z14CXSk80g=ZB2h=c;TE1?r~l=i(WBOzN?*oI< zZ3f(+2A`()V1~Yw*W@(k=q(D-Nto6*af`+|vh347MDy&zPb5yk_EO;!M30MK5L@_$ z(RZiF?44lpm|ViRO=AiX8k01R5o{Wh7{@$WCOR;KQ5dIFkFtQ90mx~%Nthx$|=wd`PERrB%++@MaDh3i_hTQ{<4m0b_ED>{0 z%+1_y4_2irReA9x52h-CM5|JHidCunh~#frshB=zhTS1VN9b9Kv14qB#bYdP0Rp5#u^a8Jz_xRX5XaNB#1i`zk)OY0%q zw(M01Gc<|iSWYuzrsc*adCV*tMg$BsDio}uYoBiFZa+hFd*+-rrzH)|oK9w4TQ{du ziP2g_P^UmuQICfh)*sefZ6KH9&Qk1x<>;Q_sES53F*M3x%WW7!T0Z|TD90wx@tm7Vj4Nni=zgG_WQ!7N1kG3{_^zi2?TOI{ zHejQIO)55{m0?YpciMFMG`AU6>83lX8AUF4qy_jbDz;*qc;#|iBhCyh?TG-_w7;IJ z!*=XY(59jt35IBy>XHeAGNU;o{Gu!UkBc2URdiw(L)etdO-sIILHsNzNHVkrb1-b> zx#1*-OqXDJMTuZH_NaISdl{;yxto?L^^r<%K2560KJ+Nqui^k6T}p(ki5HKGS;H?B zHG^*2g8J~`1QZh}Q;MN42=Tt8d%BR?9(n3Y)AZH(-uzNzqQKZSv5q53u=?XmVURs5xNVc+{ zd`wfCZt#3e!SMfS*2CQ3qP2a_#{!(Gq(pTY=L~A1G#gH;$l?@nreYKJy}_a^RW+!| zsiK*a^W(V9^J128*@&Ym&fsa%vdw3$Ii8+k*y6jA<*%?UF&@D<)+u;~p`qL{URp&~ z>D6-#`+}7pm~`aOB9>xq`LjYNou)+|ODi-zYP0&Zskud)I_^NAsY(N+FB9}!LH4PB z5}q=U&kNTKC)!uskXUB1l1#~ac#yh{VRc3~`ABhglG~@WNrP6R87rq5qnfRYXMZv5 z&gj%Q8#4bnG=)nsG%5Sbpj2YVP@i?R-1%Xx;QLpP=%yrlXkN5||bxmp#Y381`54y)x%Deu zD$u&~7V2+;jYUI?sJ`CuJ!*F@VD*`sXdYX{+UsNzLY{u32>ZW{0tN;yGM2{ zplj!k=)Q{TUDvPO`Gb|gY^HM?=)k66BWmfu7N@XD#IT1>W8K&$fyF3%oN^%Gghb2| z#2(DT^dZ(GT>BRk1>0M16F3G71t096w5^&pPIUf?hzFQ5)jJmLTSWi$Q2!>8tOY#w z4Z6kMrUe`#*uCNP;S%s>`J!_HM@k939Aek*+>(Bt6n-dxm*5@51avs8LxR%VNlbPT zr`<@=?-05$Olw(UCz9Sxz>>uK0&xpdDf(c;kt`=lEGK-HL;xnHdOUts+|hm*AT diff --git a/Presentation/target/classes/Presentation/Console/Main.class b/Presentation/target/classes/Presentation/Console/Main.class deleted file mode 100644 index cf9b3794ac86bcbcfaced8aa40f3daad4fe9cab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 557 zcmZ{h(N4lJ6o&sYaBNIKP!ti3cc6)T0Mr{26XH-KhQxSPuwu#Rl5O~2UJ*6%0emRq z=`a$EuE}Z6`FpIdk7c0TcA%ob7j9RmsSOiG4mmg`RvqLuvc7b>qhb+0@S%v@j_x4r z^;DTC{)^>OF{InUyN$25+Amu+~-JHz6x9srya^zz7f@wGuXHpMqb;V8Exf_Jox$=B lUtlvVFnJgxXK7jVbL<3HnYUmI)kHI~jT!+Nb|_Dw{sp|pcU}Mh diff --git a/Presentation/target/classes/Presentation/Console/Menu.class b/Presentation/target/classes/Presentation/Console/Menu.class deleted file mode 100644 index 01ee8857512fb650c07412e32cdb9dd8458f8217..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11645 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 kNk diff --git a/Presentation/target/classes/Presentation/Interfaces/IMenu.class b/Presentation/target/classes/Presentation/Interfaces/IMenu.class deleted file mode 100644 index daa04b5b4c8396b59aff7f94a0b0be211f32eebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmX^0Z`VEs1_oOOPId++Mh4k{qSWHlypqI{%=|ok&%Bb1)M9;4-_*QPb_Nzk z27#=^vPAuy#JqHU|D>$cl`GoL^d$oa&aDlM3X3wdsL$urV?K Yl>n_`U|vdddd+9A2v+GIVw<6Ti2(cTwq(v#6;RiX^vr; zu`X*!PiJCh9fQ}-p%c2P+nQt95hzmeGJ$Bj=4dUcl%AnjMz_!C6IRBc$YcZ&DN`x1 z!6(x_AvI99UvRk;Tq&^0C)lc)m#NpvnvP$zN{ZG9Y%F4Chv^uOp0lGIYXl-3ITzE` zh+&pvt$>m?#&>5%wFn-^ItA-hJb?`YD+^pYO-CQmZHivi(pkNGSYS^DuNusEH{J6C1qbFxb!n!? zM9N9!2NCQ?Nd!$eB<+j~{28>fWiaE|T1r+&Cgvr*!KFHbr4_`t$TS}xPv7K{XBVl} z;M`(PlG!pG#t{WaRUAXJK!cxNn`OE_(kGUhJ*-KRu6ucutlBnP*Bo8CEbwd)QNAJh zD?L#cNVUQOXY@=q?etDgnXImD_cx~8YuCLl6{pe7Cf1(o#sb!&e)-Js z7k6IcQuz8(MM6)6n@_o3K+^6}(JRdC&$AzQl^ZXUVhewIc1oQeUQV>YTRj4j8jd(p*++GhB2aGRE2>t_72M)iH&8s7xOy7UCfSY6Gp5h!y<6|fq<&H zgN`d%EuE3uQoGOE2ccrWN((gm=@c)BIRV?|jXP{x?(ZR(DlAMeYV@To&Bci=;EDT^ zTgotO=>@;<@B_>pG5qHz`)W^EW;69V{F` z0val%&O$d8I2cg5NHWf8;^b+~KMgUrm#WW;S-~3mzuISb;e)`@rK*)M=bgN$xJ)`u zsG9?d=2V3Ak+Q1K2u@jY_hB&QDm}S9Rv;EwtB}eIY#v-WdWI)PV_feuG6plH#WXF) zJ#aEn)+dXXnM^)T^)iP?h{|jEUX|<10!<58;@@R_0dc#aPh}IELXVZTQ~Gg3Ht$MF z*-iRJdA206PLqdgx2E)rf-eR3JaQFNt!IK;$JmUkEM@sq3PuoNUaxZ$<6ZDxRzC&t zD<49b!p?Yj7L5bDqTwm*jw`ch8fb`?MLBIh zryZQaQ}Oa>c{DtOL4;H z4ZYxJ9F??xE&Yh1ivJ9(#X6!|k9uylZPO`Uqke_! zCGi11q)i{uHW`UqF8A93?h(HG@xSJt<6PjLivzjGE2=L?EAC@_8dv7h-bv4Pkx&EK zG?Ge;Ja&`B9x~WV@Ar}Re$qWa8V7L~hwua9F706+hUm3N`&*Cp9gp@ckM>QE_RAja zlt;VYqurXPeV1pHkMRj38sz?IfcyU<-{*2KjBDULJl~Hp0>>DEW=5ce5ol!u+W6bf t2y`$4Cm4Z~B;LsgoMOHwneScya=wS~8Dky7=lFv62&>>S?y#1k{{Y71zg_?U From 22c6600af206b0cf28c238dde923a4eba058ee3a Mon Sep 17 00:00:00 2001 From: Alexander Kim Date: Thu, 27 Feb 2025 19:17:58 +0300 Subject: [PATCH 5/7] feat: implement mock tests with Mockito; fix: minor dependencies in UserService --- .../Application/Services/UserService.java | 6 +- Presentation/pom.xml | 7 + .../main/java/Presentation/Console/Menu.java | 29 ++-- Presentation/src/test/java/BankTests.java | 134 +++++++++++------- 4 files changed, 105 insertions(+), 71 deletions(-) diff --git a/Application/src/main/java/Application/Services/UserService.java b/Application/src/main/java/Application/Services/UserService.java index 61f621b..6d1dbcd 100644 --- a/Application/src/main/java/Application/Services/UserService.java +++ b/Application/src/main/java/Application/Services/UserService.java @@ -13,14 +13,16 @@ import Application.Models.Entites.Operation; import Application.Models.Entites.User; import Application.Models.Enums.OperationType; - -import java.util.Objects; +import lombok.Getter; @AllArgsConstructor public class UserService implements IUserService { + @Getter private IUserRepository _userRepository; + @Getter private IBankAccountRepository _bankAccountRepository; + @Getter private IOperationRepository _operationRepository; private UserManager _userManager; diff --git a/Presentation/pom.xml b/Presentation/pom.xml index a43faf4..e799d3e 100644 --- a/Presentation/pom.xml +++ b/Presentation/pom.xml @@ -50,6 +50,13 @@ 1.0-SNAPSHOT + + org.mockito + mockito-core + 3.0.0 + test + + diff --git a/Presentation/src/main/java/Presentation/Console/Menu.java b/Presentation/src/main/java/Presentation/Console/Menu.java index 2403777..60ad860 100644 --- a/Presentation/src/main/java/Presentation/Console/Menu.java +++ b/Presentation/src/main/java/Presentation/Console/Menu.java @@ -21,10 +21,11 @@ public class Menu implements IMenu { private final IdGenerator userIdGenerator = new IdGenerator(); private final IdGenerator bankAccountIdGenerator = new IdGenerator(); - private final UserRepository userRepository = new UserRepository(); - private final OperationRepository operationRepository = new OperationRepository(); - private final BankAccountRepository bankAccountRepository = new BankAccountRepository(); - private final UserService userService = new UserService(userRepository, bankAccountRepository, operationRepository, new UserManager()); + private final UserService userService = new UserService( + new UserRepository(), + new BankAccountRepository(), + new OperationRepository(), + new UserManager()); private final Scanner scanner = new Scanner(System.in); @@ -127,7 +128,7 @@ private void createUser() { private void getUserInfo() { System.out.print("Введите ID пользователя: "); int userId = scanner.nextInt(); - User user = userRepository.FindUserById(userId); + User user = userService.get_userRepository().FindUserById(userId); if (user != null) { userService.GetUserInfo(user); } else { @@ -141,8 +142,8 @@ private void manageFriends() { System.out.print("Введите ID друга: "); int friendId = scanner.nextInt(); - User user = userRepository.FindUserById(userId); - User friend = userRepository.FindUserById(friendId); + User user = userService.get_userRepository().FindUserById(userId); + User friend = userService.get_userRepository().FindUserById(friendId); if (user != null && friend != null) { System.out.print("Добавить друга (1) или удалить (2): "); @@ -166,7 +167,7 @@ private void createBankAccount() { System.out.print("Введите ID пользователя: "); int userId = scanner.nextInt(); - User user = userRepository.FindUserById(userId); + User user = userService.get_userRepository().FindUserById(userId); if (user == null) { System.out.println("Пользователь не найден."); return; // 💥 Выход, если пользователь не найден @@ -188,10 +189,10 @@ private void createBankAccount() { private void checkBalance() { System.out.print("Введите ID счета: "); int accountId = scanner.nextInt(); - BankAccount account = bankAccountRepository.FindBankAccountById(accountId); + BankAccount account = userService.get_bankAccountRepository().FindBankAccountById(accountId); if (account != null) { - User user = userRepository.FindUserById(account.getUserId()); // ✅ Получаем пользователя из счета + User user = userService.get_userRepository().FindUserById(account.getUserId()); // ✅ Получаем пользователя из счета if (user != null) { userService.CheckBalance(user, account); // ✅ Передаём пользователя } else { @@ -209,7 +210,7 @@ private void withdraw() { System.out.print("Введите сумму снятия: "); double amount = scanner.nextDouble(); - BankAccount account = bankAccountRepository.FindBankAccountById(accountId); + BankAccount account = userService.get_bankAccountRepository().FindBankAccountById(accountId); if (account != null) { OperationResult result = userService.Withdraw(account, amount); @@ -229,7 +230,7 @@ private void deposit() { System.out.print("Введите сумму пополнения: "); double amount = scanner.nextDouble(); - BankAccount account = bankAccountRepository.FindBankAccountById(accountId); + BankAccount account = userService.get_bankAccountRepository().FindBankAccountById(accountId); if (account != null) { OperationResult result = userService.Deposit(account, amount); if (result instanceof OperationResult.Success) { @@ -254,8 +255,8 @@ private void transfer() { System.out.print("Введите сумму перевода: "); double amount = Double.parseDouble(scanner.nextLine().trim().replace(',', '.')); - BankAccount fromAccount = bankAccountRepository.FindBankAccountById(fromId); - BankAccount toAccount = bankAccountRepository.FindBankAccountById(toId); + BankAccount fromAccount = userService.get_bankAccountRepository().FindBankAccountById(fromId); + BankAccount toAccount = userService.get_bankAccountRepository().FindBankAccountById(toId); if (fromAccount != null && toAccount != null) { OperationResult result = userService.Transfer(fromAccount, toAccount, amount); diff --git a/Presentation/src/test/java/BankTests.java b/Presentation/src/test/java/BankTests.java index 8d7bb9b..586778f 100644 --- a/Presentation/src/test/java/BankTests.java +++ b/Presentation/src/test/java/BankTests.java @@ -1,78 +1,102 @@ import Application.Abstractions.Repositories.IBankAccountRepository; import Application.Abstractions.Repositories.IOperationRepository; -import Application.Abstractions.Repositories.IUserRepository; -import Application.Contracts.Interfaces.IUserService; import Application.Contracts.ResultTypes.OperationResult; -import Application.Managers.UserManager; import Application.Models.Entites.BankAccount; import Application.Models.Entites.User; import Application.Models.Enums.HairColor; import Application.Models.Enums.Sex; import Application.Models.Utils.IdGenerator; import Application.Services.UserService; -import DataAccess.BankAccountRepository; -import DataAccess.OperationRepository; -import DataAccess.UserRepository; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.mockito.Mockito.*; public class BankTests { + @Mock + private IBankAccountRepository bankAccountRepository; + + @Mock + private IOperationRepository operationRepository; + + @InjectMocks + private UserService userService; + + private BankAccount bankAccount; + + @BeforeEach + void setUp() { + MockitoAnnotations.initMocks(this); + User user = new User(new IdGenerator(), "lim0sha", "Sasha", 22, Sex.Male, HairColor.Brown); + bankAccount = new BankAccount(new IdGenerator(), user); + bankAccount.setBalance(100.0); + } + @Test - public void Scenario1() { - IdGenerator userIdGenerator = new IdGenerator(); - IdGenerator bankAccountIdGenerator = new IdGenerator(); - IUserRepository userRepository = new UserRepository(); - IOperationRepository operationRepository = new OperationRepository(); - IBankAccountRepository bankAccountRepository = new BankAccountRepository(); - var user1 = new User(userIdGenerator, "test_login", "lim0sha", 22, Sex.Male, HairColor.Brown); - var bankAccount1 = new BankAccount(bankAccountIdGenerator, user1); - IUserService userService = new UserService(userRepository, bankAccountRepository, operationRepository, new UserManager()); - - userService.CreateUser(user1); - userService.addBankAccount(user1, bankAccount1); - userService.Deposit(bankAccount1, 239.00); - userService.Withdraw(bankAccount1, 52.00); - - assertEquals(187.00, bankAccountRepository.FindBankAccountById(bankAccount1.getId()).getBalance()); + void testWithdrawWithSufficientBalance() { + Double withdrawAmount = 50.0; + Double initialBalance = bankAccount.getBalance(); + + when(bankAccountRepository.FindBankAccountById(bankAccount.getId())).thenReturn(bankAccount); + when(bankAccountRepository.UpdateBankAccountBalance(bankAccount.getId(), initialBalance - withdrawAmount)) + .thenAnswer(invocation -> { + bankAccount.setBalance(initialBalance - withdrawAmount); + return null; + }); + when(operationRepository.AddOperation(any())).thenReturn(new OperationResult.Success()); + + OperationResult operationResult = userService.Withdraw(bankAccount, withdrawAmount); + + assertInstanceOf(OperationResult.Success.class, operationResult); + assertEquals(initialBalance - withdrawAmount, bankAccount.getBalance(), 0.001); + verify(bankAccountRepository, times(1)).UpdateBankAccountBalance(bankAccount.getId(), initialBalance - withdrawAmount); + verify(operationRepository, times(1)).AddOperation(any()); + + assertEquals(50.0, bankAccount.getBalance(), 0.001); } @Test - public void Scenario2() { - IdGenerator userIdGenerator = new IdGenerator(); - IdGenerator bankAccountIdGenerator = new IdGenerator(); - IUserRepository userRepository = new UserRepository(); - IOperationRepository operationRepository = new OperationRepository(); - IBankAccountRepository bankAccountRepository = new BankAccountRepository(); - var user1 = new User(userIdGenerator, "test_login", "lim0sha", 22, Sex.Male, HairColor.Brown); - var bankAccount1 = new BankAccount(bankAccountIdGenerator, user1); - IUserService userService = new UserService(userRepository, bankAccountRepository, operationRepository, new UserManager()); - - userService.CreateUser(user1); - userService.addBankAccount(user1, bankAccount1); - userService.Deposit(bankAccount1, 52.00); - var withdrawResult = userService.Withdraw(bankAccount1, 239.00); - - assertEquals(OperationResult.OperationError.class, withdrawResult.getClass()); + void testWithdrawWithInsufficientBalance() { + Double withdrawAmount = 150.0; + + when(bankAccountRepository.FindBankAccountById(bankAccount.getId())).thenReturn(bankAccount); + + OperationResult operationResult = userService.Withdraw(bankAccount, withdrawAmount); + + assertInstanceOf(OperationResult.OperationError.class, operationResult); + assertEquals("Not enough balance", ((OperationResult.OperationError) operationResult).getMessage()); + verify(bankAccountRepository, times(0)).UpdateBankAccountBalance(any(), anyDouble()); + verify(operationRepository, times(0)).AddOperation(any()); + + assertEquals(100.0, bankAccount.getBalance(), 0.001); } @Test - public void Scenario3() { - IdGenerator userIdGenerator = new IdGenerator(); - IdGenerator bankAccountIdGenerator = new IdGenerator(); - IUserRepository userRepository = new UserRepository(); - IOperationRepository operationRepository = new OperationRepository(); - IBankAccountRepository bankAccountRepository = new BankAccountRepository(); - var user1 = new User(userIdGenerator, "test_login", "lim0sha", 22, Sex.Male, HairColor.Brown); - var bankAccount1 = new BankAccount(bankAccountIdGenerator, user1); - IUserService userService = new UserService(userRepository, bankAccountRepository, operationRepository, new UserManager()); - - userService.CreateUser(user1); - userService.addBankAccount(user1, bankAccount1); - userService.Deposit(bankAccount1, 52.00); - userService.Deposit(bankAccount1, 52.00); - - assertEquals(104.00, bankAccountRepository.FindBankAccountById(bankAccount1.getId()).getBalance()); + void testDeposit() { + Double depositAmount = 100.0; + Double initialBalance = bankAccount.getBalance(); + + when(bankAccountRepository.FindBankAccountById(bankAccount.getId())).thenReturn(bankAccount); + when(bankAccountRepository.UpdateBankAccountBalance(bankAccount.getId(), initialBalance + depositAmount)) + .thenAnswer(invocation -> { + bankAccount.setBalance(initialBalance + depositAmount); + return null; + }); + when(operationRepository.AddOperation(any())).thenReturn(new OperationResult.Success()); + + OperationResult operationResult = userService.Deposit(bankAccount, depositAmount); + + assertInstanceOf(OperationResult.Success.class, operationResult); + assertEquals(initialBalance + depositAmount, bankAccount.getBalance(), 0.001); + verify(bankAccountRepository, times(1)).UpdateBankAccountBalance(bankAccount.getId(), initialBalance + depositAmount); + verify(operationRepository, times(1)).AddOperation(any()); + + assertEquals(200.0, bankAccount.getBalance(), 0.001); } -} +} \ No newline at end of file From ab89ab01f25b0499881fe04a17f2eef02ae8d584 Mon Sep 17 00:00:00 2001 From: Alexander Kim Date: Thu, 27 Feb 2025 19:56:00 +0300 Subject: [PATCH 6/7] feat: write Javadoc for classes and methods --- .../Repositories/IBankAccountRepository.java | 30 +++++++ .../Repositories/IOperationRepository.java | 17 ++++ .../Repositories/IUserRepository.java | 30 +++++++ .../Contracts/Interfaces/IUserService.java | 84 +++++++++++++++++ .../ResultTypes/BankAccountResult.java | 5 ++ .../ResultTypes/OperationResult.java | 4 + .../Contracts/ResultTypes/UserResult.java | 4 + .../Application/Managers/UserManager.java | 47 ++++++++++ .../Models/Entites/BankAccount.java | 11 +++ .../Application/Models/Entites/Operation.java | 11 +++ .../java/Application/Models/Entites/User.java | 15 ++++ .../Application/Models/Enums/HairColor.java | 3 + .../Models/Enums/OperationType.java | 3 + .../java/Application/Models/Enums/Sex.java | 3 + .../Application/Models/Utils/IdGenerator.java | 18 +++- .../Application/Services/UserService.java | 90 ++++++++++++++++++- .../DataAccess/BankAccountRepository.java | 40 ++++++++- .../java/DataAccess/OperationRepository.java | 23 +++++ .../main/java/DataAccess/UserRepository.java | 32 ++++++- .../main/java/Presentation/Console/Menu.java | 69 ++++++++++++-- .../java/Presentation/Interfaces/IMenu.java | 9 ++ 21 files changed, 534 insertions(+), 14 deletions(-) diff --git a/Application/src/main/java/Application/Abstractions/Repositories/IBankAccountRepository.java b/Application/src/main/java/Application/Abstractions/Repositories/IBankAccountRepository.java index 9a7f694..fe7c508 100644 --- a/Application/src/main/java/Application/Abstractions/Repositories/IBankAccountRepository.java +++ b/Application/src/main/java/Application/Abstractions/Repositories/IBankAccountRepository.java @@ -3,12 +3,42 @@ import Application.Contracts.ResultTypes.BankAccountResult; import Application.Models.Entites.BankAccount; +/** + * Репозиторий для управления банковскими счетами. + * Реализует паттерн CRUD для добавления, поиска, обновления и удаления банковских счетов. + */ public interface IBankAccountRepository { + + /** + * Добавляет новый банковский счет в хранилище данных. + * + * @param account объект банковского счета, который необходимо добавить. + * @return результат операции добавления банковского счета, может содержать сообщение об ошибке или подтверждение успеха. + */ BankAccountResult AddBankAccount(BankAccount account); + /** + * Ищет банковский счет в хранилище данных по его идентификатору. + * + * @param id идентификатор банковского счета, который нужно найти. + * @return объект банковского счета, если он существует; {@code null}, если счет не найден. + */ BankAccount FindBankAccountById(Integer id); + /** + * Обновляет баланс существующего банковского счета. + * + * @param id идентификатор банковского счета, баланс которого необходимо обновить. + * @param balance новый баланс банковского счета. + * @return результат операции обновления баланса, может содержать сообщение об ошибке или подтверждение успеха. + */ BankAccountResult UpdateBankAccountBalance(Integer id, Double balance); + /** + * Удаляет банковский счет из хранилища данных по его идентификатору. + * + * @param id идентификатор банковского счета, который нужно удалить. + * @return результат операции удаления банковского счета, может содержать сообщение об ошибке или подтверждение успеха. + */ BankAccountResult DeleteBankAccount(Integer id); } diff --git a/Application/src/main/java/Application/Abstractions/Repositories/IOperationRepository.java b/Application/src/main/java/Application/Abstractions/Repositories/IOperationRepository.java index 98ff0f8..2829ae3 100644 --- a/Application/src/main/java/Application/Abstractions/Repositories/IOperationRepository.java +++ b/Application/src/main/java/Application/Abstractions/Repositories/IOperationRepository.java @@ -5,8 +5,25 @@ import java.util.ArrayList; +/** + * Репозиторий для управления операциями с банковскими счетами. + * Реализует паттерн CRUD для добавления операций и получения истории операций. + */ public interface IOperationRepository { + + /** + * Добавляет новую операцию в хранилище данных. + * + * @param operation операция, которую необходимо добавить в хранилище. + * @return результат операции добавления, может содержать сообщение об ошибке или подтверждение успеха. + */ OperationResult AddOperation(Operation operation); + /** + * Извлекает историю операций для конкретного банковского счета. + * + * @param bankAccountId идентификатор банковского счета, для которого нужно получить историю операций. + * @return список операций, выполненных с указанным банковским счетом. + */ ArrayList GetOperationHistory(Integer bankAccountId); } diff --git a/Application/src/main/java/Application/Abstractions/Repositories/IUserRepository.java b/Application/src/main/java/Application/Abstractions/Repositories/IUserRepository.java index bf30361..14a89cc 100644 --- a/Application/src/main/java/Application/Abstractions/Repositories/IUserRepository.java +++ b/Application/src/main/java/Application/Abstractions/Repositories/IUserRepository.java @@ -3,12 +3,42 @@ import Application.Contracts.ResultTypes.UserResult; import Application.Models.Entites.User; +/** + * Репозиторий для управления операциями с пользователями. + * Использует паттерн CRUD (Create, Read, Update, Delete) для добавления, поиска, обновления и удаления пользователей. + */ public interface IUserRepository { + + /** + * Добавляет нового пользователя в хранилище данных. + * + * @param user объект пользователя, который необходимо добавить. + * @return результат операции добавления пользователя, может содержать сообщение об ошибке или подтверждение успеха. + */ UserResult AddUser(User user); + /** + * Ищет пользователя в хранилище данных по его идентификатору. + * + * @param id идентификатор пользователя, которого нужно найти. + * @return найденный объект пользователя, если он существует; {@code null}, если пользователь не найден. + */ User FindUserById(Integer id); + /** + * Обновляет информацию о существующем пользователе в хранилище данных. + * + * @param id идентификатор пользователя, чьи данные нужно обновить. + * @param userUpdate объект с обновленными данными пользователя. + * @return результат операции обновления пользователя, может содержать сообщение об ошибке или подтверждение успеха. + */ UserResult UpdateUser(Integer id, User userUpdate); + /** + * Удаляет пользователя из хранилища данных по его идентификатору. + * + * @param id идентификатор пользователя, которого нужно удалить. + * @return результат операции удаления пользователя, может содержать сообщение об ошибке или подтверждение успеха. + */ UserResult DeleteUser(Integer id); } diff --git a/Application/src/main/java/Application/Contracts/Interfaces/IUserService.java b/Application/src/main/java/Application/Contracts/Interfaces/IUserService.java index 62d9150..dac25eb 100644 --- a/Application/src/main/java/Application/Contracts/Interfaces/IUserService.java +++ b/Application/src/main/java/Application/Contracts/Interfaces/IUserService.java @@ -6,28 +6,112 @@ import Application.Models.Entites.BankAccount; import Application.Models.Entites.User; +/** + * Интерфейс, предоставляющий операции для управления пользователями и их банковскими счетами. + * Включает методы для создания, удаления пользователей, управления их друзьями и банковскими счетами, + * а также выполнения различных операций с банковскими счетами. + */ public interface IUserService { + + /** + * Создание нового пользователя. + * + * @param user объект пользователя, который должен быть создан. + * @return результат операции создания пользователя. + */ UserResult CreateUser(User user); + /** + * Удаление пользователя. + * + * @param user объект пользователя, который должен быть удален. + * @return результат операции удаления пользователя. + */ UserResult DeleteUser(User user); + /** + * Получение информации о пользователе. + * + * @param user объект пользователя, информацию о котором необходимо получить. + */ void GetUserInfo(User user); + /** + * Добавление пользователя в друзья. + * + * @param user объект текущего пользователя. + * @param other объект пользователя, которого нужно добавить в друзья. + */ void AddFriend(User user, User other); + /** + * Удаление пользователя из списка друзей. + * + * @param user объект текущего пользователя. + * @param other объект пользователя, которого нужно удалить из друзей. + */ void RemoveFriend(User user, User other); + /** + * Добавление нового банковского счета пользователю. + * + * @param user объект пользователя, которому нужно добавить банковский счет. + * @param bankAccount объект банковского счета, который нужно добавить. + * @return результат операции добавления банковского счета. + */ BankAccountResult addBankAccount(User user, BankAccount bankAccount); + /** + * Удаление банковского счета пользователя. + * + * @param user объект пользователя, чей банковский счет должен быть удален. + * @param bankAccount объект банковского счета, который нужно удалить. + * @return результат операции удаления банковского счета. + */ BankAccountResult RemoveBankAccount(User user, BankAccount bankAccount); + /** + * Проверка баланса банковского счета пользователя. + * + * @param user объект пользователя, чей баланс нужно проверить. + * @param bankAccount объект банковского счета, баланс которого нужно проверить. + * @return результат операции проверки баланса. + */ OperationResult CheckBalance(User user, BankAccount bankAccount); + /** + * Пополнение банковского счета. + * + * @param bankAccount объект банковского счета, на который нужно пополнить средства. + * @param amount сумма, которую нужно внести на счет. + * @return результат операции пополнения. + */ OperationResult Deposit(BankAccount bankAccount, Double amount); + /** + * Снятие средств с банковского счета. + * + * @param bankAccount объект банковского счета, с которого нужно снять средства. + * @param amount сумма, которую нужно снять со счета. + * @return результат операции снятия средств. + */ OperationResult Withdraw(BankAccount bankAccount, Double amount); + /** + * Перевод средств между двумя банковскими счетами. + * + * @param bankAccount1 объект исходного банковского счета. + * @param bankAccount2 объект целевого банковского счета. + * @param amount сумма, которую нужно перевести. + * @return результат операции перевода. + */ OperationResult Transfer(BankAccount bankAccount1, BankAccount bankAccount2, Double amount); + /** + * Получение истории операций для конкретного банковского счета. + * + * @param bankAccount объект банковского счета, для которого нужно получить историю операций. + * @return результат операции получения истории. + */ OperationResult GetOperationHistory(BankAccount bankAccount); } diff --git a/Application/src/main/java/Application/Contracts/ResultTypes/BankAccountResult.java b/Application/src/main/java/Application/Contracts/ResultTypes/BankAccountResult.java index af36412..16f9318 100644 --- a/Application/src/main/java/Application/Contracts/ResultTypes/BankAccountResult.java +++ b/Application/src/main/java/Application/Contracts/ResultTypes/BankAccountResult.java @@ -3,10 +3,15 @@ import lombok.AllArgsConstructor; import lombok.Getter; +/** + * Абстрактный класс, представляющий result-type операций с банковским счетом. + * Включает различные типы результатов, такие как успешное выполнение операции или ошибка при создании, обновлении или удалении банковского счета. + */ public abstract sealed class BankAccountResult permits BankAccountResult.Success, BankAccountResult.BankAccountCreationError, BankAccountResult.BankAccountUpdateError, BankAccountResult.BankAccountDeletionError { + public static final class Success extends BankAccountResult { } diff --git a/Application/src/main/java/Application/Contracts/ResultTypes/OperationResult.java b/Application/src/main/java/Application/Contracts/ResultTypes/OperationResult.java index 871b473..0adb251 100644 --- a/Application/src/main/java/Application/Contracts/ResultTypes/OperationResult.java +++ b/Application/src/main/java/Application/Contracts/ResultTypes/OperationResult.java @@ -4,6 +4,10 @@ import lombok.Getter; import lombok.NoArgsConstructor; +/** + * Абстрактный класс, представляющий result-type операции с деньгами. + * Включает два типа результатов: успешное выполнение операции и ошибка при выполнении. + */ public abstract sealed class OperationResult permits OperationResult.Success, OperationResult.OperationError { @NoArgsConstructor diff --git a/Application/src/main/java/Application/Contracts/ResultTypes/UserResult.java b/Application/src/main/java/Application/Contracts/ResultTypes/UserResult.java index 16819db..87b9595 100644 --- a/Application/src/main/java/Application/Contracts/ResultTypes/UserResult.java +++ b/Application/src/main/java/Application/Contracts/ResultTypes/UserResult.java @@ -3,6 +3,10 @@ import lombok.AllArgsConstructor; import lombok.Getter; +/** + * Абстрактный класс, представляющий result-type операций с пользователями. + * Включает различные типы результатов, такие как успешное выполнение операции или ошибка при создании, обновлении или удалении пользователя. + */ public abstract sealed class UserResult permits UserResult.Success, UserResult.UserCreationError, UserResult.UserUpdateError, UserResult.UserDeletionError { diff --git a/Application/src/main/java/Application/Managers/UserManager.java b/Application/src/main/java/Application/Managers/UserManager.java index a6e3a2e..b20b400 100644 --- a/Application/src/main/java/Application/Managers/UserManager.java +++ b/Application/src/main/java/Application/Managers/UserManager.java @@ -7,8 +7,18 @@ import java.util.ArrayList; +/** + * Класс-менеджер для управления данными пользователей, их банковскими счетами и друзьями. + * Предоставляет методы для получения информации о пользователе, добавления/удаления друзей, + * управления банковскими счетами и вывода истории операций. + */ public record UserManager() { + /** + * Выводит информацию о пользователе, включая его данные и банковские счета. + * + * @param user объект пользователя, информацию о котором нужно вывести. + */ public void GetUserInfo(User user) { if (user == null) { System.out.println("User data is not available."); @@ -42,30 +52,67 @@ public void GetUserInfo(User user) { System.out.println("──────────────────────────────────\n"); } + /** + * Добавляет друга пользователю и другому пользователю. + * + * @param user текущий пользователь, добавляющий друга. + * @param other пользователь, который будет добавлен в друзья. + */ public void AddFriend(User user, User other) { user.getFriends().add(other); other.getFriends().add(user); } + /** + * Удаляет друга у пользователя и другого пользователя. + * + * @param user текущий пользователь, у которого будет удален друг. + * @param other пользователь, который будет удален из друзей. + */ public void RemoveFriend(User user, User other) { user.getFriends().remove(other); other.getFriends().remove(user); } + /** + * Добавляет банковский счет пользователю. + * + * @param user пользователь, которому добавляется банковский счет. + * @param bankAccount банковский счет для добавления. + */ public void AddBankAccount(User user, BankAccount bankAccount) { user.getBankAccounts().add(bankAccount.getId()); } + /** + * Удаляет банковский счет у пользователя. + * + * @param user пользователь, у которого будет удален банковский счет. + * @param bankAccount банковский счет для удаления. + */ public void RemoveBankAccount(User user, BankAccount bankAccount) { user.getBankAccounts().remove(bankAccount.getId()); } + /** + * Проверяет баланс банковского счета пользователя. + * + * @param user пользователь, чей баланс проверяется. + * @param bankAccount банковский счет для проверки баланса. + */ public void CheckBalance(User user, BankAccount bankAccount) { System.out.println("User: " + user.getId()); System.out.println("BankAccount: " + bankAccount.getId()); System.out.println("Balance: " + bankAccount.getBalance()); } + /** + * Выводит историю операций по банковскому счету. + * + * @param account банковский счет, для которого нужно вывести историю. + * @param operations список операций, связанных с этим счетом. + * @return результат операции (успех или ошибка). + */ public OperationResult PrintHistory(BankAccount account, ArrayList operations) { if (operations == null) { return new OperationResult.OperationError("Operations can not be null."); diff --git a/Application/src/main/java/Application/Models/Entites/BankAccount.java b/Application/src/main/java/Application/Models/Entites/BankAccount.java index da63639..029f47e 100644 --- a/Application/src/main/java/Application/Models/Entites/BankAccount.java +++ b/Application/src/main/java/Application/Models/Entites/BankAccount.java @@ -4,6 +4,10 @@ import lombok.Setter; import Application.Models.Utils.IdGenerator; +/** + * Класс, представляющий банковский счет пользователя. + * Хранит информацию о счете, балансе и привязанном пользователе. + */ @Getter public class BankAccount { final private Integer id; @@ -15,6 +19,13 @@ public class BankAccount { private final Integer UserId; + /** + * Конструктор для создания нового банковского счета. + * Генерирует уникальный идентификатор счета и связывает его с пользователем. + * + * @param idGenerator генератор ID для создания уникального идентификатора счета. + * @param user пользователь, к которому будет привязан новый счет. + */ public BankAccount(IdGenerator idGenerator, User user) { this.id = idGenerator.generateBankAccountId(); this.balance = 0.0; diff --git a/Application/src/main/java/Application/Models/Entites/Operation.java b/Application/src/main/java/Application/Models/Entites/Operation.java index bb9835c..2b2ee00 100644 --- a/Application/src/main/java/Application/Models/Entites/Operation.java +++ b/Application/src/main/java/Application/Models/Entites/Operation.java @@ -3,6 +3,10 @@ import lombok.Getter; import Application.Models.Enums.OperationType; +/** + * Класс, представляющий операцию с банковским счетом. + * Хранит информацию о типе операции, сумме и счете, на котором она была проведена. + */ @Getter public class Operation { private final Integer BankAccountId; @@ -11,6 +15,13 @@ public class Operation { private final Double Amount; + /** + * Конструктор для создания новой операции. + * + * @param bankAccountId идентификатор банковского счета, на котором выполнена операция. + * @param type тип операции (например, депозит или снятие). + * @param amount сумма, участвующая в операции. + */ public Operation(Integer bankAccountId, OperationType type, Double amount) { this.BankAccountId = bankAccountId; this.Type = type; diff --git a/Application/src/main/java/Application/Models/Entites/User.java b/Application/src/main/java/Application/Models/Entites/User.java index 18b8f71..dc44a2d 100644 --- a/Application/src/main/java/Application/Models/Entites/User.java +++ b/Application/src/main/java/Application/Models/Entites/User.java @@ -7,6 +7,10 @@ import java.util.ArrayList; +/** + * Класс, представляющий пользователя системы. + * Хранит информацию о пользователе, включая личные данные, список банковских счетов и друзей. + */ @Getter @Setter public class User { @@ -26,6 +30,17 @@ public class User { private ArrayList friends = new ArrayList<>(); + /** + * Конструктор для создания нового пользователя. + * Генерирует уникальный идентификатор для пользователя и инициализирует его данные. + * + * @param idGenerator генератор ID для создания уникального идентификатора пользователя. + * @param login логин пользователя. + * @param name имя пользователя. + * @param age возраст пользователя. + * @param sex пол пользователя. + * @param hairType цвет волос пользователя. + */ public User( IdGenerator idGenerator, String login, diff --git a/Application/src/main/java/Application/Models/Enums/HairColor.java b/Application/src/main/java/Application/Models/Enums/HairColor.java index 532ce53..b1768fb 100644 --- a/Application/src/main/java/Application/Models/Enums/HairColor.java +++ b/Application/src/main/java/Application/Models/Enums/HairColor.java @@ -1,5 +1,8 @@ package Application.Models.Enums; +/** + * Перечисление возможных цветов волос пользователя. + */ public enum HairColor { Blond, Ash, diff --git a/Application/src/main/java/Application/Models/Enums/OperationType.java b/Application/src/main/java/Application/Models/Enums/OperationType.java index 7fabe47..a11cee8 100644 --- a/Application/src/main/java/Application/Models/Enums/OperationType.java +++ b/Application/src/main/java/Application/Models/Enums/OperationType.java @@ -1,5 +1,8 @@ package Application.Models.Enums; +/** + * Перечисление возможных типов операций с банковским счётом. + */ public enum OperationType { Deposit, Withdraw, diff --git a/Application/src/main/java/Application/Models/Enums/Sex.java b/Application/src/main/java/Application/Models/Enums/Sex.java index 6ec0f67..3ab3aac 100644 --- a/Application/src/main/java/Application/Models/Enums/Sex.java +++ b/Application/src/main/java/Application/Models/Enums/Sex.java @@ -1,5 +1,8 @@ package Application.Models.Enums; +/** + * Перечисление возможных вариантов пола пользователя. + */ public enum Sex { Undefined, Male, diff --git a/Application/src/main/java/Application/Models/Utils/IdGenerator.java b/Application/src/main/java/Application/Models/Utils/IdGenerator.java index 4c96f36..e461b94 100644 --- a/Application/src/main/java/Application/Models/Utils/IdGenerator.java +++ b/Application/src/main/java/Application/Models/Utils/IdGenerator.java @@ -1,14 +1,30 @@ package Application.Models.Utils; - +/** + * Класс для генерации уникальных Id пользователей и банковских счетов + */ public class IdGenerator { private int userId = 0; private int bankAccountId = 0; + /** + * Генерирует уникальный идентификатор пользователя. + * Каждый вызов метода увеличивает текущий userId на 1 и возвращает новое значение. + * Метод синхронизирован для обеспечения корректности работы в многозадачной среде. + * + * @return новый уникальный идентификатор пользователя. + */ public synchronized int generateUserId() { return ++userId; } + /** + * Генерирует уникальный идентификатор банковского счета. + * Каждый вызов метода увеличивает текущий bankAccountId на 1 и возвращает новое значение. + * Метод синхронизирован для обеспечения корректности работы в многозадачной среде. + * + * @return новый уникальный идентификатор банковского счета. + */ public synchronized int generateBankAccountId() { return ++bankAccountId; } diff --git a/Application/src/main/java/Application/Services/UserService.java b/Application/src/main/java/Application/Services/UserService.java index 6d1dbcd..282a16d 100644 --- a/Application/src/main/java/Application/Services/UserService.java +++ b/Application/src/main/java/Application/Services/UserService.java @@ -15,61 +15,125 @@ import Application.Models.Enums.OperationType; import lombok.Getter; +/** + * Сервис для управления пользователями, их банковскими счетами и операциями. + * Взаимодействует с репозиториями пользователей, банковских счетов и операций. + * Обрабатывает запросы, такие как создание/удаление пользователей, переводы, операции с балансом и так далее. + */ @AllArgsConstructor public class UserService implements IUserService { - + @Getter private IUserRepository _userRepository; + @Getter private IBankAccountRepository _bankAccountRepository; + @Getter private IOperationRepository _operationRepository; - + private UserManager _userManager; + /** + * Создает нового пользователя. + * + * @param user объект пользователя, который нужно добавить. + * @return result-type добавления пользователя. + */ @Override public UserResult CreateUser(User user) { return _userRepository.AddUser(user); } + /** + * Удаляет существующего пользователя. + * + * @param user объект пользователя, которого нужно удалить. + * @return result-type удаления пользователя. + */ @Override public UserResult DeleteUser(User user) { return _userRepository.DeleteUser(user.getId()); } + /** + * Получает информацию о пользователе и выводит ее. + * + * @param user объект пользователя, информацию о котором нужно вывести. + */ @Override public void GetUserInfo(User user) { _userManager.GetUserInfo(user); } + /** + * Добавляет другого пользователя в список друзей. + * + * @param user текущий пользователь, добавляющий друга. + * @param other пользователь, который будет добавлен в друзья. + */ @Override public void AddFriend(User user, User other) { _userManager.AddFriend(user, other); } + /** + * Удаляет пользователя из списка друзей. + * + * @param user текущий пользователь, удаляющий друга. + * @param other пользователь, которого нужно удалить из друзей. + */ @Override public void RemoveFriend(User user, User other) { _userManager.RemoveFriend(user, other); } + /** + * Добавляет новый банковский счет пользователю. + * + * @param user пользователь, которому добавляется банковский счет. + * @param bankAccount объект банковского счета, который нужно добавить. + * @return result-type добавления счета. + */ @Override public BankAccountResult addBankAccount(User user, BankAccount bankAccount) { _userManager.AddBankAccount(user, bankAccount); return _bankAccountRepository.AddBankAccount(bankAccount); } + /** + * Удаляет банковский счет у пользователя. + * + * @param user пользователь, у которого нужно удалить банковский счет. + * @param bankAccount объект банковского счета, который нужно удалить. + * @return result-type удаления счета. + */ @Override public BankAccountResult RemoveBankAccount(User user, BankAccount bankAccount) { _userManager.RemoveBankAccount(user, bankAccount); return _bankAccountRepository.DeleteBankAccount(bankAccount.getId()); } + /** + * Проверяет баланс на банковском счете пользователя. + * + * @param user пользователь, чьи средства нужно проверить. + * @param bankAccount объект банковского счета, на котором нужно проверить баланс. + * @return result-type операции (успех или ошибка). + */ @Override public OperationResult CheckBalance(User user, BankAccount bankAccount) { _userManager.CheckBalance(user, bankAccount); return _operationRepository.AddOperation(new Operation(bankAccount.getId(), OperationType.CheckBalance, 0.0)); } + /** + * Пополняет банковский счет на указанную сумму. + * + * @param bankAccount объект банковского счета, на который нужно пополнить средства. + * @param amount сумма пополнения. + * @return result-type операции (успех или ошибка). + */ @Override public OperationResult Deposit(BankAccount bankAccount, Double amount) { var account = _bankAccountRepository.FindBankAccountById(bankAccount.getId()); @@ -77,6 +141,13 @@ public OperationResult Deposit(BankAccount bankAccount, Double amount) { return _operationRepository.AddOperation(new Operation(bankAccount.getId(), OperationType.Deposit, amount)); } + /** + * Снимает средства с банковского счета. + * + * @param bankAccount объект банковского счета, с которого нужно снять деньги. + * @param amount сумма снятия. + * @return result-type операции (успех или ошибка). + */ @Override public OperationResult Withdraw(BankAccount bankAccount, Double amount) { var account = _bankAccountRepository.FindBankAccountById(bankAccount.getId()); @@ -87,6 +158,15 @@ public OperationResult Withdraw(BankAccount bankAccount, Double amount) { return new OperationResult.OperationError("Not enough balance"); } + /** + * Переводит средства между двумя банковскими счетами. + * В зависимости от типа отношений между пользователями применяется комиссия. + * + * @param bankAccount1 первый банковский счет (откуда переводятся деньги). + * @param bankAccount2 второй банковский счет (куда переводятся деньги). + * @param amount сумма перевода. + * @return result-type операции (успех или ошибка). + */ @Override public OperationResult Transfer(BankAccount bankAccount1, BankAccount bankAccount2, Double amount) { if (amount == null || amount <= 0) { @@ -133,6 +213,12 @@ public OperationResult Transfer(BankAccount bankAccount1, BankAccount bankAccoun return new OperationResult.Success(); } + /** + * Получает историю операций по банковскому счету. + * + * @param bankAccount объект банковского счета, для которого нужно получить историю операций. + * @return result-type с выводом историей операций в консоль. + */ @Override public OperationResult GetOperationHistory(BankAccount bankAccount) { var account = _bankAccountRepository.FindBankAccountById(bankAccount.getId()); diff --git a/DataAccess/src/main/java/DataAccess/BankAccountRepository.java b/DataAccess/src/main/java/DataAccess/BankAccountRepository.java index 75bdfc3..c04979e 100644 --- a/DataAccess/src/main/java/DataAccess/BankAccountRepository.java +++ b/DataAccess/src/main/java/DataAccess/BankAccountRepository.java @@ -8,10 +8,27 @@ import java.util.ArrayList; import java.util.Objects; +/** + * Репозиторий для управления банковскими счетами. + * Реализует интерфейс {@link IBankAccountRepository} и выполняет CRUD-операции с объектами {@link BankAccount}. + * + *

Хранение банковских счетов осуществляется в памяти с использованием {@link ArrayList}.

+ */ @NoArgsConstructor public class BankAccountRepository implements IBankAccountRepository { - ArrayList _bankAccounts = new ArrayList<>(); + /** + * Внутреннее хранилище банковских счетов в памяти. + */ + private final ArrayList _bankAccounts = new ArrayList<>(); + + /** + * Добавляет новый банковский счет в хранилище. + * + * @param account объект банковского счета, который будет добавлен. + * @return {@link BankAccountResult.Success} при успешном добавлении + * или {@link BankAccountResult.BankAccountCreationError} в случае ошибки. + */ @Override public BankAccountResult AddBankAccount(BankAccount account) { if (account == null) { @@ -21,6 +38,12 @@ public BankAccountResult AddBankAccount(BankAccount account) { return new BankAccountResult.Success(); } + /** + * Ищет банковский счет по идентификатору. + * + * @param id идентификатор банковского счета. + * @return объект {@link BankAccount}, если найден, иначе {@code null}. + */ @Override public BankAccount FindBankAccountById(Integer id) { if (id < 0) { @@ -34,6 +57,14 @@ public BankAccount FindBankAccountById(Integer id) { return null; } + /** + * Обновляет баланс банковского счета. + * + * @param id идентификатор банковского счета. + * @param balance новый баланс счета. + * @return {@link BankAccountResult.Success} при успешном обновлении + * или {@link BankAccountResult.BankAccountUpdateError} в случае ошибки. + */ @Override public BankAccountResult UpdateBankAccountBalance(Integer id, Double balance) { if (id < 0 || balance < 0) { @@ -50,6 +81,13 @@ public BankAccountResult UpdateBankAccountBalance(Integer id, Double balance) { return new BankAccountResult.BankAccountUpdateError("Bank account balance update failed"); } + /** + * Удаляет банковский счет по идентификатору. + * + * @param id идентификатор банковского счета, который нужно удалить. + * @return {@link BankAccountResult.Success} при успешном удалении + * или {@link BankAccountResult.BankAccountDeletionError} в случае ошибки. + */ @Override public BankAccountResult DeleteBankAccount(Integer id) { if (id < 0) { diff --git a/DataAccess/src/main/java/DataAccess/OperationRepository.java b/DataAccess/src/main/java/DataAccess/OperationRepository.java index 6f59de2..589f474 100644 --- a/DataAccess/src/main/java/DataAccess/OperationRepository.java +++ b/DataAccess/src/main/java/DataAccess/OperationRepository.java @@ -7,10 +7,27 @@ import java.util.ArrayList; +/** + * Репозиторий для управления операциями банковских счетов. + * Реализует интерфейс {@link IOperationRepository} и выполняет операции добавления и получения истории операций. + * + *

Хранение операций осуществляется в памяти с использованием {@link ArrayList}.

+ */ @NoArgsConstructor public class OperationRepository implements IOperationRepository { + + /** + * Внутреннее хранилище операций в памяти. + */ private final ArrayList operations = new ArrayList<>(); + /** + * Добавляет новую операцию в хранилище. + * + * @param operation объект операции, который будет добавлен. + * @return результат операции добавления: {@link OperationResult.Success} при успешном добавлении + * или {@link OperationResult.OperationError} в случае ошибки. + */ @Override public OperationResult AddOperation(Operation operation) { if (operation == null) { @@ -20,6 +37,12 @@ public OperationResult AddOperation(Operation operation) { return new OperationResult.Success(); } + /** + * Возвращает историю операций для указанного идентификатора банковского счета. + * + * @param bankAccountId идентификатор банковского счета, для которого требуется история операций. + * @return список операций {@link ArrayList} связанных с банковским счетом. + */ @Override public ArrayList GetOperationHistory(Integer bankAccountId) { return operations; diff --git a/DataAccess/src/main/java/DataAccess/UserRepository.java b/DataAccess/src/main/java/DataAccess/UserRepository.java index 7de4b28..8cd18c2 100644 --- a/DataAccess/src/main/java/DataAccess/UserRepository.java +++ b/DataAccess/src/main/java/DataAccess/UserRepository.java @@ -8,11 +8,23 @@ import java.util.ArrayList; import java.util.Objects; +/** + * Реализация репозитория для управления пользователями. + * Хранит пользователей в памяти (в списке) и реализует операции CRUD для сущности {@link User}. + * + *

Этот класс использует {@link ArrayList} для хранения данных и позволяет добавлять, обновлять, искать и удалять пользователей.

+ */ @NoArgsConstructor public class UserRepository implements IUserRepository { private final ArrayList _users = new ArrayList<>(); + /** + * Добавляет нового пользователя в хранилище. + * + * @param user объект пользователя, который будет добавлен. + * @return результат операции добавления, может быть ошибка создания пользователя, если пользователь равен {@code null}. + */ @Override public UserResult AddUser(User user) { if (user == null) { @@ -22,6 +34,12 @@ public UserResult AddUser(User user) { return new UserResult.Success(); } + /** + * Находит пользователя по его идентификатору. + * + * @param id идентификатор пользователя, которого нужно найти. + * @return найденный пользователь или {@code null}, если пользователь с таким идентификатором не существует. + */ @Override public User FindUserById(Integer id) { if (id < 0) { @@ -35,6 +53,13 @@ public User FindUserById(Integer id) { return null; } + /** + * Обновляет данные пользователя по его идентификатору. + * + * @param id идентификатор пользователя, которого нужно обновить. + * @param userUpdate объект с новыми данными пользователя. + * @return результат операции обновления, может быть ошибка, если параметры обновления неверны. + */ @Override public UserResult UpdateUser(Integer id, User userUpdate) { if (userUpdate == null || id < 0) { @@ -52,7 +77,12 @@ public UserResult UpdateUser(Integer id, User userUpdate) { return new UserResult.UserUpdateError("User update failed "); } - + /** + * Удаляет пользователя по его идентификатору. + * + * @param id идентификатор пользователя, которого нужно удалить. + * @return результат операции удаления, может быть ошибка, если параметры удаления неверны. + */ @Override public UserResult DeleteUser(Integer id) { if (id < 0) { diff --git a/Presentation/src/main/java/Presentation/Console/Menu.java b/Presentation/src/main/java/Presentation/Console/Menu.java index 60ad860..ed7ce7f 100644 --- a/Presentation/src/main/java/Presentation/Console/Menu.java +++ b/Presentation/src/main/java/Presentation/Console/Menu.java @@ -17,6 +17,33 @@ import java.util.Scanner; +/** + * Класс {@code Menu} представляет консольное меню для управления пользователями и банковскими счетами. + * Предоставляет интерфейс для создания пользователей, управления друзьями, работы с банковскими счетами + * и выполнения финансовых операций. + *

+ * Реализует интерфейс {@link IMenu}. + *

+ * Основные возможности: + *

    + *
  • Создание пользователя
  • + *
  • Просмотр информации о пользователе
  • + *
  • Управление списком друзей пользователя
  • + *
  • Создание банковского счета
  • + *
  • Проверка баланса счета
  • + *
  • Снятие и пополнение средств
  • + *
  • Перевод средств между счетами
  • + *
+ * + * Зависимости: + *
    + *
  • {@link UserService} - основной сервис для работы с пользователями и счетами
  • + *
  • {@link Scanner} - для считывания ввода пользователя
  • + *
+ * + * @author lim0sha + * @version 1.0 + */ public class Menu implements IMenu { private final IdGenerator userIdGenerator = new IdGenerator(); @@ -29,6 +56,10 @@ public class Menu implements IMenu { private final Scanner scanner = new Scanner(System.in); + /** + * Запускает основное меню и обрабатывает выбор пользователя. + * Предоставляет доступ к основным функциям системы через консольный интерфейс. + */ @Override public void Run() { while (true) { @@ -65,6 +96,9 @@ public void Run() { } } + /** + * Создает нового пользователя с вводом данных через консоль. + */ private void createUser() { System.out.print("Введите логин: "); String login = scanner.nextLine(); @@ -74,7 +108,7 @@ private void createUser() { int age = scanner.nextInt(); scanner.nextLine(); - // Ввод пола через выбор цифрой + System.out.println("Выберите пол:"); System.out.println("1. Мужской"); System.out.println("2. Женский"); @@ -89,7 +123,7 @@ private void createUser() { default -> Sex.Undefined; }; - // Ввод цвета волос через выбор цифрой + System.out.println("Выберите цвет волос:"); System.out.println("1. Блонд"); System.out.println("2. Пепельный"); @@ -124,7 +158,9 @@ private void createUser() { System.out.println(result instanceof UserResult.Success ? "Пользователь создан!" : "Ошибка создания пользователя."); } - + /** + * Выводит информацию о пользователе по введенному ID. + */ private void getUserInfo() { System.out.print("Введите ID пользователя: "); int userId = scanner.nextInt(); @@ -136,6 +172,9 @@ private void getUserInfo() { } } + /** + * Позволяет добавить или удалить друга из списка друзей пользователя. + */ private void manageFriends() { System.out.print("Введите ID пользователя: "); int userId = scanner.nextInt(); @@ -163,6 +202,9 @@ private void manageFriends() { } } + /** + * Создает банковский счет для существующего пользователя. + */ private void createBankAccount() { System.out.print("Введите ID пользователя: "); int userId = scanner.nextInt(); @@ -170,7 +212,7 @@ private void createBankAccount() { User user = userService.get_userRepository().FindUserById(userId); if (user == null) { System.out.println("Пользователь не найден."); - return; // 💥 Выход, если пользователь не найден + return; } System.out.println("Найден пользователь: " + user.getName() + " (ID: " + user.getId() + ")"); @@ -185,16 +227,18 @@ private void createBankAccount() { } } - + /** + * Проверяет баланс на указанном банковском счете. + */ private void checkBalance() { System.out.print("Введите ID счета: "); int accountId = scanner.nextInt(); BankAccount account = userService.get_bankAccountRepository().FindBankAccountById(accountId); if (account != null) { - User user = userService.get_userRepository().FindUserById(account.getUserId()); // ✅ Получаем пользователя из счета + User user = userService.get_userRepository().FindUserById(account.getUserId()); if (user != null) { - userService.CheckBalance(user, account); // ✅ Передаём пользователя + userService.CheckBalance(user, account); } else { System.out.println("Пользователь не найден."); } @@ -203,7 +247,9 @@ private void checkBalance() { } } - + /** + * Снимает средства с указанного банковского счета. + */ private void withdraw() { System.out.print("Введите ID счета: "); int accountId = scanner.nextInt(); @@ -224,6 +270,9 @@ private void withdraw() { } } + /** + * Пополняет баланс указанного банковского счета. + */ private void deposit() { System.out.print("Введите ID счета: "); int accountId = scanner.nextInt(); @@ -243,7 +292,9 @@ private void deposit() { } } - + /** + * Переводит средства с одного банковского счета на другой. + */ private void transfer() { try { System.out.print("Введите ID счета отправителя: "); diff --git a/Presentation/src/main/java/Presentation/Interfaces/IMenu.java b/Presentation/src/main/java/Presentation/Interfaces/IMenu.java index 869abd7..592e4d8 100644 --- a/Presentation/src/main/java/Presentation/Interfaces/IMenu.java +++ b/Presentation/src/main/java/Presentation/Interfaces/IMenu.java @@ -1,5 +1,14 @@ package Presentation.Interfaces; +/** + * Интерфейс для меню пользовательского интерфейса в консоли. + * Обеспечивает базовый контракт для запуска меню. + */ public interface IMenu { + + /** + * Запускает отображение и обработку логики меню. + * Отображает доступные опции и обрабатывает пользовательский ввод. + */ void Run(); } From 4b1cb052af73f6e5e5b0a2c03f169cdec8e012c4 Mon Sep 17 00:00:00 2001 From: Alexander Kim Date: Fri, 28 Feb 2025 15:51:17 +0300 Subject: [PATCH 7/7] chore: modify pom.xml --- pom.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pom.xml b/pom.xml index 6774ad8..0223449 100644 --- a/pom.xml +++ b/pom.xml @@ -12,4 +12,22 @@ DataAccess Presentation + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.4.1 + + + package + + javadoc + + + + + + \ No newline at end of file