Skip to content
This repository has been archived by the owner on Nov 20, 2024. It is now read-only.

Commit

Permalink
Create BankManager
Browse files Browse the repository at this point in the history
  • Loading branch information
DeerFrog committed Oct 31, 2024
1 parent ab8003e commit c74df63
Showing 1 changed file with 109 additions and 48 deletions.
157 changes: 109 additions & 48 deletions src/Server/BankManager/BankManager.go
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
package BankManager

import (
"fmt"
)

// Account representa uma conta bancária com nome, senha e saldo.
type Account struct {
Name string
Password string // Tudo que eu fizer com psw são péssimas praticas mas não nos importamos com segurança aqui :)
Balance float64
Name string // Nome do titular da conta.
Password string // Senha da conta.
Balance float64 // Saldo atual da conta.
}

type AccountMap

// Bank representa um banco que gerencia múltiplas contas usando um map para armazenar contas e um ID para controle.
type Bank struct {
accounts map[int64]*Account // { AccountID : Account }
nextID int64
accounts map[int64]*Account // Mapeia cada ID de conta para os dados da conta.
nextID int64 // ID da próxima conta a ser criada.
}


func (b* Bank) Initialize() {
// Initialize configura o banco inicializando o map de contas e criando uma conta de teste.
// Ele deve ser chamado antes de outras operações do banco.
func (b *Bank) Initialize() {
b.accounts = make(map[int64]*Account)
b.nextID = 1

Expand All @@ -27,61 +32,117 @@ func (b* Bank) Initialize() {
b.nextID++
}

func (b* Bank) OpenAccount(accountName string, accountPassword string) bool{
if isCredentialsValid(accountName, accountPassword) {
b.accounts[.nextID] = &Account{
Name: accountName,
Password: accountPassword,
Balance: 0,
}
b.nextID++
// OpenAccount cria uma nova conta bancária com o nome e a senha fornecidos.
// Parâmetros:
// - accountName: o nome do titular da nova conta.
// - accountPassword: a senha para a nova conta.
// - result: um ponteiro para um bool que será true se a conta for criada com sucesso.
// Retorna:
// - error: um erro, caso a conta não seja criada por algum motivo.
func (b *Bank) OpenAccount(accountName string, accountPassword string, result *bool) error {
b.accounts[b.nextID] = &Account{
Name: accountName,
Password: accountPassword,
Balance: 0,
}
}

func (b* Bank) CloseAccount(accountID int64, accountPassword string) bool{
if isAuthenticated(accountID, accountPassword) {
accounts.delete(accountID)
_, accountExists := b.accounts[b.nextID]
if accountExists {
b.nextID++
*result = true
return nil
}
return fmt.Errorf("BankManager.OpenAccount : Failed to create a new account : AccountName=%s", accountName)
}

func (b* Bank) Withdraw(accountID int64, accountPassword string, quantity float64) bool{
if isAuthenticated(accountID, accountPassword) {
account, _ := b.accounts
if account.Balance >= quantity {
account.Balance = account.Balance - quantity
return true
// CloseAccount fecha a conta com o ID fornecido, após autenticação da senha.
// Parâmetros:
// - accountID: o ID da conta a ser fechada.
// - accountPassword: a senha da conta para autenticação.
// - result: um ponteiro para um bool que será true se a conta for fechada com sucesso.
// Retorna:
// - error: um erro caso a conta não seja fechada, como erro de autenticação.
func (b *Bank) CloseAccount(accountID int64, accountPassword string, result *bool) error {
if b.isAuthenticated(accountID, accountPassword) {
delete(b.accounts, accountID)
_, accountExists := b.accounts[accountID]
if !accountExists {
*result = true
return nil
}
return false
return fmt.Errorf("BankManager.CloseAccount : Failed to delete account : AccountID=%d", accountID)
}
return false

*result = false
return fmt.Errorf("BankManager.CloseAccount : Failed to authenticate account : AccountID=%d", accountID)
}

func (b* Bank) Deposit(accountID int64 accountPassword string, quantity float64) bool{
if isAuthenticated(accountID, accountPassword) {
account, _ := b.accounts
account.Balance = account.Balance + quantity
return true
// Withdraw realiza um saque de uma conta especificada, caso haja saldo suficiente.
// Parâmetros:
// - accountID: o ID da conta de onde o valor será retirado.
// - accountPassword: a senha da conta para autenticação.
// - quantity: o valor a ser sacado.
// - result: um ponteiro para um bool que será true se o saque for bem-sucedido.
// Retorna:
// - error: um erro caso o saque não seja realizado, como erro de autenticação ou saldo insuficiente.
func (b *Bank) Withdraw(accountID int64, accountPassword string, quantity float64, result *bool) error {
if b.isAuthenticated(accountID, accountPassword) {
account := b.accounts[accountID]
if account.Balance >= quantity {
account.Balance -= quantity
*result = true
return nil
}
*result = false
return fmt.Errorf("BankManager.Withdraw : Insufficient funds for account : AccountID=%d", accountID)
}
return false
*result = false
return fmt.Errorf("BankManager.Withdraw : Failed to authenticate account : AccountID=%d", accountID)
}

func (b* Bank) PeekBalance(accountID int64, accountPassword string) float64{
if isAuthenticated(accountID, accountPassword) {
account, _ := b.accounts[accountID]
return account.Balance
// Deposit adiciona um valor ao saldo de uma conta especificada.
// Parâmetros:
// - accountID: o ID da conta que receberá o valor.
// - accountPassword: a senha da conta para autenticação.
// - quantity: o valor a ser depositado.
// - result: um ponteiro para um bool que será true se o depósito for bem-sucedido.
// Retorna:
// - error: um erro caso o depósito não seja realizado, como erro de autenticação.
func (b *Bank) Deposit(accountID int64, accountPassword string, quantity float64, result *bool) error {
if b.isAuthenticated(accountID, accountPassword) {
account := b.accounts[accountID]
account.Balance += quantity
*result = true
return nil
}
return 0
*result = false
return fmt.Errorf("BankManager.Deposit : Failed to authenticate account : AccountID=%d", accountID)
}

func (b *Bank) isAuthenticated(accountID int64, accountPassword string) bool{
if accountID > 0 {
accountInfo, accountExists := b.accounts[accountID]
return accountExists && accountInfo.Password == accountPassword
// PeekBalance consulta o saldo de uma conta, se a senha estiver correta.
// Parâmetros:
// - accountID: o ID da conta que será consultada.
// - accountPassword: a senha da conta para autenticação.
// - result: um ponteiro para float64 que armazenará o saldo da conta se a consulta for bem-sucedida.
// Retorna:
// - error: um erro caso a consulta não seja realizada, como erro de autenticação.
func (b *Bank) PeekBalance(accountID int64, accountPassword string, result *float64) error {
if b.isAuthenticated(accountID, accountPassword) {
account := b.accounts[accountID]
*result = account.Balance
return nil
}
return false
*result = 0
return fmt.Errorf("BankManager.PeekBalance : Failed to authenticate account : AccountID=%d", accountID)
}

func (b *Bank) isCredentialsValid(accountID int64, accountPassword string) bool{
return true
// isAuthenticated verifica se a senha fornecida está correta para a conta especificada.
// Esta função é usada internamente e não deve ser chamada diretamente por outros pacotes.
// Parâmetros:
// - accountID: o ID da conta a ser autenticada.
// - accountPassword: a senha da conta a ser verificada.
// Retorna:
// - bool: true se a senha estiver correta, false caso contrário.
func (b *Bank) isAuthenticated(accountID int64, accountPassword string) bool {
accountInfo, accountExists := b.accounts[accountID]
return accountExists && (accountInfo.Password == accountPassword)
}

0 comments on commit c74df63

Please sign in to comment.