1
resposta

Desafio: destinatário autenticado

Fiz esse teste e rodou tranquilamente!!

Main

import 'controllers/bank_controller.dart';
import 'exceptions/bank_controller_excpetions.dart';
import 'models/account.dart';

void main(List<String> args) {
  BankController bankController = BankController();

  bankController.addAccount(
      id: "Ricarth",
      account:
          Account(name: "Ricarth Lima", balance: 600, isAuthenticated: true));

  bankController.addAccount(
      id: "Duque",
      account:
          Account(name: "Guilherme Duque", balance: 39, isAuthenticated: true));

  try {
    bool result = bankController.makeTransfer(
        idSender: "Ricarth", idReceiver: "Duque", amount: 700);
    if (result) {
      print("Transação concluída!");
    }
  } on SenderIdInvalidException catch (e) {
    print(e);
    print("O ID '${e.idSender}' do remetente não é válido!");
  } on ReceiverIdInvalidException catch (e) {
    print(e);
    print("O ID '${e.idReceiver}' do destinatário não é válido!");
  } on SenderNotAuthenticatedException catch (e) {
    print(e);
    print("O usuário remetente de ID ${e.idSender} não está autenticado!");
  } on ReceiverNotAuthenticatedException catch (e) {
    print(e);
    print("O usuário destinatário de ID ${e.idReceiver} não está autenticado!");
  } on SenderBalanceLowerThanAmountException catch (e) {
    print(e);
    print(
        "O usuário de ID '${e.idSender}' tentou enviar ${e.amount} sendo que sua conta tem apenas ${e.senderBalance}");
  }
}

Bank Controller

import '../exceptions/bank_controller_excpetions.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}) {
    if (!verifyId(idSender)) {
      throw SenderIdInvalidException(idSender: idSender);
    }

    if (!verifyId(idReceiver)) {
      throw ReceiverIdInvalidException(idReceiver: idReceiver);
    }

    Account accountSender = _database[idSender]!;
    Account accountReceiver = _database[idReceiver]!;

    if (!accountSender.isAuthenticated) {
      throw SenderNotAuthenticatedException(idSender: idSender);
    }

    if (!accountReceiver.isAuthenticated) {
      throw ReceiverNotAuthenticatedException(idReceiver: idReceiver);
    }

    // Verifica se o remetente tem saldo suficiente para enviar o dinheiro
    if (accountSender.balance < amount) {
      throw SenderBalanceLowerThanAmountException(idSender: idSender, senderBalance: accountSender.balance, amount: amount);
    }

    accountSender.balance -= amount;
    accountReceiver.balance += amount;

    return true;
  }

  bool verifyId(String id) {
    return _database.containsKey(id);
  }
}

Bank Controlle Exceptions

import '../exceptions/bank_controller_excpetions.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}) {
    if (!verifyId(idSender)) {
      throw SenderIdInvalidException(idSender: idSender);
    }

    if (!verifyId(idReceiver)) {
      throw ReceiverIdInvalidException(idReceiver: idReceiver);
    }

    Account accountSender = _database[idSender]!;
    Account accountReceiver = _database[idReceiver]!;

    if (!accountSender.isAuthenticated) {
      throw SenderNotAuthenticatedException(idSender: idSender);
    }

    if (!accountReceiver.isAuthenticated) {
      throw ReceiverNotAuthenticatedException(idReceiver: idReceiver);
    }

    // Verifica se o remetente tem saldo suficiente para enviar o dinheiro
    if (accountSender.balance < amount) {
      throw SenderBalanceLowerThanAmountException(idSender: idSender, senderBalance: accountSender.balance, amount: amount);
    }

    accountSender.balance -= amount;
    accountReceiver.balance += amount;

    return true;
  }

  bool verifyId(String id) {
    return _database.containsKey(id);
  }
}
1 resposta

Olá, Guilherme! Tudo bem?

Primeiro te peço desculpas pela demora em responder.

Parabéns por concluir este desafio! Ficamos felizes por isso e por ter compartilhado conosco.

Bons estudos!