moacirjun / nano-digital-wallet

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Nano Digital Wallet

Um sistema simples para efeturar transferências entre usuários.

Documentação

O projeto foi dividido numa arquitetura hexagonal (também conhecido como ports and adapters).

  • Application: Serviços de uso de casos. Geralmente são chamodos por entry points do sistema como controller e commands.
  • Domain: Fica com as entidades do sistema. Ex.: Models, Values Object.
  • Infra: Controllers, Framework, Implementação de portas abstratas do Domain.

Models

  • Transference
  • Wallet
  • User

Fluxo

  1. AuthorizeTransference.php - Faz as validações internas e verifica o autorizador externo.
  2. ExecuteTransferenceProcess.php - Persiste a transferência e modifica as carteiras dos usuários.
  3. NotifyTransferencePayee.php - Envia a notificação para o beneficiado da transferência em caso de sucesso.

Configuração

Clone o repositório

$ git clone git@github.com:moacirjun/nano-digital-wallet.git

Monte a imagem do php-fpm com o seu userId:

$ cd nano-digital-wallet && docker-compose build --build-arg USER_ID=${UID} --build-arg GROUP_ID=${GID} php-fpm
$ docker-compose up -d

Crie seu .env.local:

$ cp .env .env.local

Instalar as dependências, carregar banco de dados e Fixtures.

$ docker exec -it digital_wallet_php composer sync

Testes unitários.

$ docker exec -it digital_wallet_php vendor/bin/codecept run Unit

Gere as chaves SSL:

$ docker exec -it digital_wallet_php bin/console lexik:jwt:generate-keypair

Gere um Token JWT para o usuário Mike (Para mais usuários veja o arquivo AppFixtures.php):

$ curl --location --request POST 'localhost/api/login_check' \
  --header 'Content-Type: application/json' \
  --data-raw '{
      "username":"mike@stranger.com",
      "password":"123"
  }'
{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2MTY0OTE4MjksImV4cCI6MTYxNjQ5..."
}

Faça sua primeira tranferência:

$ curl --location --request POST 'localhost/api/transferences' \
  --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2MTY0OTE...' \
  --header 'Content-Type: application/json' \
  --data-raw '{
      "payee": 2,
      "amount": 5
  }'
{"transference":"3908ef07-fe21-4fed-a016-091b72de275a"}

Proposta de melhoria

Configurar o Symfony/Messenger para manipular as mensagens de forma assíncrona utilizando o RabbitMQ como driver. Dessa forma, seria possível gerenciar tópicos e filas a nível de configuração, e sem falar na possibilidade de definir filas específicas para reprocessamento de falhas.

About


Languages

Language:PHP 98.7%Language:Shell 0.7%Language:Dockerfile 0.6%