Projeto feito como parte do seguinte desafio Sistema de Contas bancárias. Projeto foi feito usando Ruby on Rails e banco de dados Mysql
Pra rodar o projeto você vai precisar do seguinte:
Ruby 2.7.0
, a forma mais simples de instalar é usando o RVM- postgresql
- Nodejs, pode usar o NVM
- Yarn
Ou pode usar o Docker, bastando ter o Docker e docker-compose instalado
Pra rodar o projeto basta seguir os passos:
bundle install
- Ir em database.yml e alterar
username
epassword
para as credenciais do banco instalado. bundle exec rails db:setup
Depos disso você pode rodar bundle exec rspec
para rodar a suite de testes , bundle exec rails s
ou docker-compose up
pra subir o projeto.
Após o projeto estiver rodando você pode usar esta collection do postman para testar as rotas ou fazer manualmente.
obs: por enquanto sempre é preciso remover o tmp/pids/server.pid
quando for subir o projeto novamente :( ainda não consegui resolver isso
Achei interessante aplicar alguns conceitos de event-sourcing nesse projeto pois entendi que um sistema que tem transferencias de valores entre contas iria se benificiar de um histórico completo e de nuncar perder nenhuma informação, o "framework" usado (app/models/lib/base_event, event_dispatcher, command) foram retirados de uma talk sobre o d.rip do kickstarder, video da talk e repo de exemplo. Como ainda estou começando a estudar esse design pattern, ainda não consegui implementar todo seu ecossistema, mas essa é a direção pra onde pretendo evoluir a aplicação
Como são dados sensiveis, decidi usar a gem symmetric-encryption para encriptar dados sensiveis como nome, numero da conta e token, para ter um nivel melhor se segurança eu encriptei os dados serializados que são guardados nos eventos, como esse projeto é só um desafio eu deixei todas as chaves na pasta config/symmetric-encryption-keys
mas eu sei que o ideal é que cada chave seja inclusa no servidor por algum job de deploy e não fique no repositório.
Já trabalhei em alguns projetos que usam esse tipo de autenticação, e me parece ser bem sólido, contanto que o arquivo não esteja no repo, porém como é um simples desafio creio que não tenha problema
- Separar o evento de transação em dois eventos distintos, como um débito na conta de origem e um crédito na conta de destino, dessa forma eu não preciso confiar no agregado pra saber o estado dele, posso só calcular os dados dos eventos
- Ajustar o docker pois sempre tem que ser removido o tmp/pids/server.pid pra rodar novamente
E Também Pretendo usar esse sistema como base para estudos sobre event driven design, então provavelmente vai mudar bastante no futuro.