Skip to content

Instantly share code, notes, and snippets.

@lucasteles
Last active February 2, 2024 17:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lucasteles/28211285196264312b88796fc3ce2b62 to your computer and use it in GitHub Desktop.
Save lucasteles/28211285196264312b88796fc3ce2b62 to your computer and use it in GitHub Desktop.
Desafio App Transações

App de Transações

Criar um app console SEM persistencia (nao precisa de banco de dados)

O que é?

Um programa que receberá linhas de um json como entrada stdin e deverá fornecer uma saída com a conta resultante para cada uma das operações em json

Como funciona?

Dado um arquivo chamado transactions.json que contém várias linhas que descreve cada uma das operações:

Exemplo entrada 1

$ cat transactions.json
{"account": { "owner": "Max", "active": true, "balance": 100}}
{"account": { "owner": "Julia", "active": true, "balance": 0}}
{"withdraw": {"owner": "Max", "amount": 50, "time": "2024-03-21T11:00:00.000Z"}}
{"deposit": {"owner": "Max", "amount": 10, "time": "2024-03-21T12:00:00.000Z"}}
{"transfer": { "onwer": "Max", "target": "Julia", "amount": 60, "time": "2024-03-21T13:00:00.000Z"}}
{"balance": { "onwer": "Julia", "time": "2024-03-21T14:00:00.000Z" }}

A aplicação deve receber o conteúdo do arquivo através de stdin e retornar um sumario das contas json via stdout:

Exemplo saida 1

$ my-app < transactions.json
{"account": { "owner": "Max", "active": true, "balance": 100}}
{"account": { "owner": "Julia", "active": true, "balance": 0}}
{"account": { "owner": "Max", "active": true, "balance": 50}}
{"account": { "owner": "Max", "active": true, "balance": 60}}
{"account": { "owner": "Max", "active": true, "balance": 0}}
{"account": { "owner": "Julia", "active": true, "balance": 60}}

Tipos de operação

  • Criação de conta (linhas 1,2 do Exemplo entrada 1)
  • Saque (linhas 3 do Exemplo entrada 1)
  • Deposito (linha 4 do Exemplo entrada 1)
  • Transferencia (linha 5 do Exemplo entrada 1)
  • Consulta de saldo (linha 6 do Exemplo entrada 1)

Validações

⚠️ Premissas⚠️

Para simplificar o desafio focando em coisas que importam mais, algumas validações não precisam ser implementas com resultados de saida. Então pode assumir que:

  • Todos os valores de tempo virão sempre em ordem crescente
  • Não havera valores negativos
  • Toda data estara valida no formato ISO 8601
  • Toda entrada json será um json válido

Conta duplicada

Não deve ser possivel criar duas contas com o mesmo owner (case insensitive)

  • Entrada:
{"account": { "owner": "Max", "active": true, "balance": 100}}
{"account": { "owner": "max", "active": true, "balance": 100}}
  • Saída:
{"account": { "owner": "Max", "active": true, "balance": 100}}
{"account": { "owner": "Max", "active": true, "balance": 100}, "errors": ["duplicated-account"]}

Conta Inativa

Não deve ser possivel operaraões que alterm saldos em uma conta inativa

  • Entrada:
{"account": { "owner": "Max", "active": false, "balance": 100}}
{"withdraw": {"owner": "Max", "amount": 10, "time": "2024-03-21T11:00:00.000Z"}}
  • Saída:
{"account": { "owner": "Max", "active": true, "balance": 100}}
{"account": { "owner": "Max", "active": true, "balance": 100}, "errors": ["inactive-account"]}

Aplicavel para: Saque, Deposito e Transferencia

Saldo Insuficiente

Não deve ser possivel fazer um operação que reduza o valor de uma conta a menos que zero:

  • Entrada:
{"account": { "owner": "Max", "active": true, "balance": 10}}
{"withdraw": {"owner": "Max", "amount": 20, "time": "2024-03-21T11:00:00.000Z"}}
  • Saída:
{"account": { "owner": "Max", "active": true, "balance": 10}}
{"account": { "owner": "Max", "active": true, "balance": 10}, "errors": ["insufficient-balance"]}

Aplicavel para: Saque, Deposito e Transferencia

Operação duplicada

Não deve ser possivel fazer duas operações de redução de saldo iguais em menos de 5 minutos.

  • Entrada:
{"account": { "owner": "Max", "active": true, "balance": 50}}
{"withdraw": {"owner": "Max", "amount": 10, "time": "2024-03-21T11:00:00.000Z"}}
{"withdraw": {"owner": "Max", "amount": 10, "time": "2024-03-21T11:04:00.000Z"}}
  • Saída:
{"account": { "owner": "Max", "active": true, "balance": 50}}
{"account": { "owner": "Max", "active": true, "balance": 40}}
{"account": { "owner": "Max", "active": true, "balance": 40}, "errors": ["duplicated"]}

Aplicavel para: Saque, Deposito e Transferencia

Recebedor não encontrado

Não deve ser possivel fazer uma transferencia pra uma conta que nao exista:

  • Entrada:
{"account": { "owner": "Max", "active": true, "balance": 100}}
{"transfer": { "onwer": "Max", "target": "Julia", "amount": 50, "time": "2024-03-21T13:00:00.000Z"}}
  • Saída:
{"account": { "owner": "Max", "active": true, "balance": 100}}
{"account": { "owner": "Max", "active": true, "balance": 100}, "errors": ["target-not-found"]}

Aplicavel para: Transferencia

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment