Criar um app console SEM persistencia (nao precisa de banco de dados)
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
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}}
- 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
)
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á umjson
válido
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"]}
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
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
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
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