项目作者: phsacramento

项目描述 :
Elixir Bank é uma aplicação com propósitos de estudos que simula o processo de criação de uma conta digital.
高级语言: Elixir
项目地址: git://github.com/phsacramento/elixir-bank.git
创建时间: 2020-04-16T22:02:04Z
项目社区:https://github.com/phsacramento/elixir-bank

开源协议:

下载


Elixir Bank

Elixir Bank é uma aplicação com propósitos de estudos.

Aplicação de Exemplo:

https://app-elixir-banking.herokuapp.com/

Como rodar numa máquina local

Você deve rodar utilizando elixir 1.10.2 e Phoenix 1.4.16

| Recomendo utilizar asdf (plugin de gerenciamento de versão), para instalar o Erlang e o Elixir.

Setup do Cloak Ecto

Biblioteca utilizada para lidar com encriptação de dados.

  1. $ iex
  2. 32 |> :crypto.strong_rand_bytes() |> Base.encode64()
  3. "aJ7HcM24BcyiwsAvRsa3EG3jcvaFWooyQJ+91OO7bRU="

O base64 gerado precisa estar disponível numa variável de ambiente antes de rodar a aplicação

  1. export CLOAK_KEY="A7x+qcFD9yeRfl3GohiOFZM5bNCdHNu27B0Ozv8X4dE="

Setup do banco de dados

A aplicação roda com os dados padrão do postgresql

Usuário: postgres
Senha: postgres

Porém se você seus dados de usuário são diferences simplemente deixo os mesmos disponíveis em variáveis de ambiente.

  1. export POSTGRES_USER=""
  2. export POSTGRES_PASSWORD=""
  3. export POSTGRES_DB=""
  4. export POSTGRES_HOST=""

Subindo a aplicação

  1. $ mix deps.get
  2. $ mix ecto.create
  3. $ mix ecto.migrate
  4. $ mix phx.server

Para rodar os testes execute:

  1. $ mix test
  2. $ mix credo

Como funciona

A aplicação foi escrita utilizando 1.10.2 e expoẽ uma API REST através do Phoenix Framework.

Modelagem

Existem dois modelos principais na modelagem, Account e Inviation.

Account

Responsável por lidar com os dados relacionados a cada Conta.

  • Criptografa dados sensíveis.
  • Altera o status da conta de PENDING para COMPLETE sempre que todos os dados de conta forem todos preenchidos.
  • Não permite a criação de multiplas Accounts com o mesmo cpf.
  • Gera um código de convite uma única vez quando status da Account muda para COMPLETE.

Invitation

Responsável por lidar com os convites para criação de novas contas.
Como um usuário com uma Account com status complete posso fornecer meu código de convite para que
outros usuários possam criar Accounts através do mesmo.

  • Utiliza um Código de Convite ReferralCode para localizar uma Account relacionada.
  • Utiliza um para indificar as contas criadas através de convite referral_account_id.

API Rest

Expoẽ uma API rest privada, que necessita de um Token válido para realizar requests.

Como gerar um token válido

  1. $ iex -S mix
  2. $ {:ok, token, _} = BankWeb.Tokens.AuthenticationToken.generate_and_sign()
  3. $ token # retorna um token válido para ser usado na request

Endpoints

POST /api/accounts [create] (permite a criação de contas e uma ou multiplas requests)

  • Permite a criação de contas com uma ou mais requests, atributo obrigatório é o cpf.

Atributos

  • cpf String - obrigatório
  • birth_date String
  • name String
  • email String
  • gender Enum - MALE ou FEMALE
  • state String
  • city String
  • country String
  • referral_code String (precisa ser um código existente válido)

| Exemplo de request para criação de conta

Header

authorization Bearer token válido

  1. {
  2. "cpf": "861.370.560-07",
  3. "name": "Paulo Henrique dos Santos Sacramento",
  4. "birth_date": "06/01/2990",
  5. "email": "contato@henriquesacramento.net",
  6. "gender": "MALE",
  7. "state": "BA",
  8. "city": "Teixeira de Freitas",
  9. "country": "BR"
  10. }

Curl:

  1. curl --location --request POST 'http://localhost:4000/api/accounts' \
  2. --header 'authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJKb2tlbiIsImV4cCI6MTU4NzQ5OTAyMSwiaWF0IjoxNTg3NDkxODIxLCJpc3MiOiJKb2tlbiIsImp0aSI6IjJvM3VlcGtrY3NyY3NxZnRqczAwMDA5MSIsIm5iZiI6MTU4NzQ5MTgyMX0.ka_yeOhthqqcISMkQHadUWM_jzzsEMRWfgXirYN44dM' \
  3. --form 'cpf=861.370.560-07' \
  4. --form 'name=Paulo Henrique dos Santos Sacramento' \
  5. --form 'birth_date=06/01/2990' \
  6. --form 'email=contato@henriquesacramento.net' \
  7. --form 'gender=MALE' \
  8. --form 'state=BA' \
  9. --form 'city=Teixeira de Freitas' \
  10. --form 'country=BR'

Retorno esperado

  1. {
  2. "cpf": "861.370.560-07",
  3. "id": "d7cb33af-27c0-41dc-b6f6-67a54766dbc6",
  4. "invitation_code": "OiFWmBsQ",
  5. "name": "Paulo Henrique dos Santos Sacramento",
  6. "status": "COMPLETE"
  7. }

| Exemplo de request utilizando referral_code

  1. {
  2. "cpf": "861.370.560-07",
  3. "name": "Paulo Henrique dos Santos Sacramento",
  4. "birth_date": "06/01/2990",
  5. "email": "contato@henriquesacramento.net",
  6. "gender": "MALE",
  7. "state": "BA",
  8. "city": "Teixeira de Freitas",
  9. "country": "BR",
  10. "referral_code": "ArvBFSHJ"
  11. }

Curl:

  1. curl --location --request POST 'http://localhost:4000/api/accounts' \
  2. --header 'authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJKb2tlbiIsImV4cCI6MTU4NzQ5OTAyMSwiaWF0IjoxNTg3NDkxODIxLCJpc3MiOiJKb2tlbiIsImp0aSI6IjJvM3VlcGtrY3NyY3NxZnRqczAwMDA5MSIsIm5iZiI6MTU4NzQ5MTgyMX0.ka_yeOhthqqcISMkQHadUWM_jzzsEMRWfgXirYN44dM' \
  3. --form 'cpf=279.794.900-53' \
  4. --form 'name=Paulo Henrique dos Santos Sacramento' \
  5. --form 'birth_date=06/01/2990' \
  6. --form 'email=contato@henriquesacramento.net' \
  7. --form 'gender=MALE' \
  8. --form 'state=BA' \
  9. --form 'city=Teixeira de Freitas' \
  10. --form 'country=BR' \
  11. --form 'referral_code=ArvBFSHJ'

POST /api/referrals [index] (lista as indicações feitas por determinado cpf)

Atributos

  • cpf String - obrigatório

| Exemplo de request para listagem de indicações

Header

authorization Bearer token válido

  1. {
  2. "cpf": "087.493.230-08"
  3. }
  4. Retorno Esperado
  5. ```json
  6. [
  7. {
  8. "account_id": "f54452ca-108d-4306-a82d-e607a11f4ac1",
  9. "email": "contato@henriquesacramento.net",
  10. "inserted_at": "2020-04-21T19:12:45"
  11. }
  12. ]

Curl:

  1. curl --location --request POST 'http://localhost:4000/api/referrals' \
  2. --header 'authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJKb2tlbiIsImV4cCI6MTU4NzQ5OTAyMSwiaWF0IjoxNTg3NDkxODIxLCJpc3MiOiJKb2tlbiIsImp0aSI6IjJvM3VlcGtrY3NyY3NxZnRqczAwMDA5MSIsIm5iZiI6MTU4NzQ5MTgyMX0.ka_yeOhthqqcISMkQHadUWM_jzzsEMRWfgXirYN44dM' \
  3. --form 'cpf=569.576.010-05'

Contributing

Envie suas alterações

A melhor maneira de enviar alterações para o Elixir Bank é fazer um fork do nosso repo e abrir um Pull Request.
GitHub possui um guia como enviar um fork pull request no próprio website.

Você pode utilizar o CLI hub para fazer isso.
Da seguinte forma,
Você pode enviar o pull request do seu fork com os seguintes comandos:

  1. $ hub clone phsacramento/elixir-bank
  2. $ cd elixir-bank
  3. $ hub fork
  4. $ git checkout -b fix_readme
  5. $ vim CONTRIBUTING.md
  6. $ git commit CONTRIBUTING.md
  7. $ git push -u <YOUR GITHUB USERNAME> HEAD
  8. $ hub pull-request

Author

Paulo Henrique Sacramento (@phsacramento)