Segue abaixo os códigos dos arquivos do projeto, não coloquei o account.dart por causa do limite de caracteres.
bank_controller_exceptions.dart
class SenderIdInvalidException implements Exception {
static const String report = "SenderIdInvalidException";
String idSender;
SenderIdInvalidException({required this.idSender});
@override
String toString() {
return "$report\nO ID $idSender do remetente não é um ID válido.";
}
}
class ReceiverIdInvalidException implements Exception {
static const String report = "ReceiverIdInvalidException";
String idReceiver;
ReceiverIdInvalidException({required this.idReceiver});
@override
String toString() {
return "$report\nO ID $idReceiver do destinatário não é um ID válido.";
}
}
class SenderNotAuthenticatedException implements Exception {
static const String report = "SenderNotAuthenticatedException";
String idSender;
SenderNotAuthenticatedException({required this.idSender});
@override
String toString() {
return "$report\nO usuário remetente de ID $idSender não está autenticado.";
}
}
class ReceiverNotAuthenticatedException implements Exception {
static const String report = "ReceiverNotAuthenticatedException";
String idReceiver;
ReceiverNotAuthenticatedException({required this.idReceiver});
@override
String toString() {
return "$report\nO usuário destinatário de ID $idReceiver não está autenticado.";
}
}
class SenderBalanceLowerThanAmountException implements Exception {
static const String report = "SenderBalanceLowerThanAmountException";
String idSender;
double senderBalance, amount;
SenderBalanceLowerThanAmountException({
required this.idSender,
required this.senderBalance,
required this.amount,
});
@override
String toString() {
return "$report\nO usuário de ID $idSender tentou enviar $amount porém o saldo da sua conta é $senderBalance.";
}
}
bank_controller.dart
import '../exceptions/bank_controller_exceptions.dart';
import '../models/account.dart';
class BankController {
final Map<String, Account> _database = {};
addAccount({required String id, required Account account}) {
_database[id] = account;
}
bool makeTransfer(
{required String idSender,
required String idReceiver,
required double amount}) {
// Verificar se ID de remetente é válido
if (!verifyId(idSender)) {
throw SenderIdInvalidException(idSender: idSender);
}
// Verificar se ID de destinatário é válido
if (!verifyId(idReceiver)) {
throw ReceiverIdInvalidException(idReceiver: idReceiver);
}
Account accountSender = _database[idSender]!;
Account accountReceiver = _database[idReceiver]!;
// Verificar se o remetente está autenticado
if (!accountSender.isAuthenticated) {
throw SenderNotAuthenticatedException(idSender: idSender);
}
// Verificar se o destinatário está autenticado
if (!accountReceiver.isAuthenticated) {
throw ReceiverNotAuthenticatedException(idReceiver: idReceiver);
}
// Verificar se o remetente possui saldo suficiente
if (accountSender.balance < amount) {
throw SenderBalanceLowerThanAmountException(
idSender: idSender,
senderBalance: accountSender.balance,
amount: amount);
}
// Se tudo estiver certo, efetivar transação
accountSender.balance -= amount;
accountReceiver.balance += amount;
return true;
}
bool verifyId(String id) {
return _database.containsKey(id);
}
}
dart_exceptions.dart
import 'controllers/bank_controller.dart';
import 'exceptions/bank_controller_exceptions.dart';
import 'models/account.dart';
void main() {
// Criando o banco
BankController bankController = BankController();
// Adicionando contas
bankController.addAccount(
id: "Ricarth",
account: Account(
name: "Ricarth Lima", balance: 777.96, isAuthenticated: true));
bankController.addAccount(
id: "Kako",
account:
Account(name: "Caio Couto", balance: 420.5, isAuthenticated: true));
// Fazendo transferência
try {
bool result = bankController.makeTransfer(
idSender: "Kako", idReceiver: "Ricarth", amount: 400);
// Observando resultado
if (result == true) {
print("Transação concluída com sucesso!");
}
} on SenderIdInvalidException catch (e) {
print(e);
} on ReceiverIdInvalidException catch (e) {
print(e);
} on SenderNotAuthenticatedException catch (e) {
print(e);
} on ReceiverNotAuthenticatedException catch (e) {
print(e);
} on SenderBalanceLowerThanAmountException catch (e) {
print(e);
} on Exception {
print("Algo deu errado.");
}
}