Digital Wallet é uma API com as principais funcionalidades de uma aplicação financeira.
- A aplicação foi construída utilizando NodeJS, Typescript com o framework Express.
- O ORM escolhido foi o TypeORM.
- O banco é o PostgreSQL
- Migrations foram utilizadas.
- As rotas são protegidas no padrão Bearer Authentication.
Uma pessoa deseja se cadastrar em sua aplicação para usufruir dos serviços financeiros oferecidos:
- Pessoa pode ter várias contas.
- Conta pode ter vários cartões.
- Cartão pode ser do tipo físico ou virtual, onde é possível ter apenas um físico e vários virtuais por conta.
- Conta possui diversas transações de crédito e débito.
- Criar uma pessoa: o documento deve ser único por pessoa, deve ser um CPF ou um CNPJ válidos.
- Adicionar e listar contas de uma pessoa.
- Adicionar e listar cartões de uma conta.
- Listar cartões de uma pessoa.
- Realizar transações em uma conta, validando o saldo (não é permitido saldo negativo).
- Listar transações em uma conta com filtros.
- Consultar o saldo de uma conta.
Para usar a aplicação, você precisará configurar as variáveis de ambiente.
Renomeie o arquivo raiz do projeto .env.example
para .env
. Este arquivo contém todas as variáveis necessárias para iniciar o aplicativo.
$ npm install
# development
$ npm run dev
# production mode
$ npm start
O aplicativo usa o banco de dados PostgreSQL. Certifique-se de tê-lo instalado em seu computador ou crie um contêiner Docker. A aplicação possui os scripts necessários para criar ou excluir o banco de dados.
Ao iniciar a aplicação, o banco de dados será criado automaticamente.
Scripts:
npm run db:create
para criar seu banco de dados.npm run db:drop
para excluir o banco de dados.npm run migração:run
para executar as migrações.
Todo endpoint de listagem de uma entidade é paginado, seguindo este padrão via query string:
- itemsPerPage: Quantidade de itens que devem ser retornados por página.
- currentPage: Página que deve ser paginada.
Quando a paginação não for informada, a aplicação considera os seguintes valores como padrão:
- itemsPerPage: 10
- currentPage: 1
Sempre será retornado uma propriedade com as seguintes informações da paginação:
- totalCount: Total de itens que satisfazem a busca.
- itemsPerPage: Quantidade de itens que devem ser retornados por página.
- currentPage: Página atual.
- pageCount: Total de páginas de acordo com a busca.
Exemplo: GET /entity?itemsPerPage=10¤tPage=1
Response:
{
"entities": [
{
"id": "74a85245-bf7b-43f9-b4f8-88c6f8c47dce",
"name": "ab",
},
{
"id": "74a85245-bf7b-43f9-b4f8-88c6f8c47dce",
"name": "cd",
},
],
"pagination": {
"totalCount": 4,
"itemsPerPage": 2,
"currentPage": 1,
"pageCount": 2,
}
}
Objetivo: Realizar a criação de uma pessoa.
- O documento deve ser único por pessoa, deve ser um CPF ou um CNPJ válidos.
Request:
{
"name": "Carolina Rosa Marina Barros",
"document": "569.679.155-76",
"password": "senhaforte"
}
Response:
{
"id": "4ca3`-08-01T14:30:41.203653"
}
Objetivo: Realizar o login de uma pessoa.
- O token é retornado no padrão Bearer.
- O token expira em 10 minutos.
Request:
{
"document": "56967915576",
"password": "senhaforte"
}
Response:
{
"token": "Bearer "
}
De agora em diante, as ações devem ser realizadas na pessoa/conta(s) da pessoa autenticada.
O token retornado do login deve ser enviado no header com o nome de Authorization
.
Exemplo:
Authorization: Bearer {TOKEN_AQUI}
Objetivo: Realizar a criação de uma conta para uma pessoa.
- A agência, propriedade
branch
, deve possuir exatos 3 dígitos. - O número da conta deve ser único no sistema.
Request:
{
"branch": "001",
"account": "20333925",
}
Response:
{
"id": "b0a0ec35-6161-4ebf-bb4f-7cf73cf6448f",
"branch": "001",
"account": "2033392-5",
"createdAt": "2022-08-01T14:30:41.203653",
"updatedAt": "2022-08-01T14:30:41.203653"
}
Objetivo: Realizar a listagem de todas as contas da pessoa.
Response:
{
"cards": [
{
"id": "48bb7773-8ccc-4686-83f9-79581a5e5cd8",
"branch": "001",
"account": "2033392-5",
"createdAt": "2022-08-01T14:30:41.203653",
"updatedAt": "2022-08-01T14:30:41.203653"
}
]
}
Objetivo: Realizar a criação de um cartão em uma conta.
- Tipo do cartão: Um cartão pode ser do tipo
physical
ouvirtual
. - Uma conta pode ter vários cartões, porém é permitido somente um cartão físico por conta. Virtuais são ilimitados.
- No campo
number
, o número completo do cartão deve ser informado na criação. - O cvv deve conter exatos 3 dígitos.
Request:
{
"type": "virtual",
"number": "5179 7447 8594 6978",
"cvv": "512"
}
Response:
{
"id": "b0a0ec35-6161-4ebf-bb4f-7cf73cf6448f",
"type": "virtual",
"number": "6978",
"cvv": "512",
"createdAt": "2022-08-01T14:30:41.203653",
"updatedAt": "2022-08-01T14:30:41.203653"
}
Objetivo: Realizar a listagem de todos os cartões de uma conta.
Response:
{
"cards": [
{
"id": "05a0ab2d-5ece-45b6-b7d3-f3ecce2713d5",
"type": "physical",
"number": "5978",
"cvv": "231",
"createdAt": "2022-08-01T14:30:41.203653",
"updatedAt": "2022-08-01T14:30:41.203653"
},
{
"id": "b0a0ec35-6161-4ebf-bb4f-7cf73cf6448f",
"type": "virtual",
"number": "1325",
"cvv": "512",
"createdAt": "2022-08-01T14:30:41.203653",
"updatedAt": "2022-08-01T14:30:41.203653"
}
]
}
Objetivo: Realizar a listagem de todos os cartões de uma pessoa.
Response:
{
"cards": [
{
"id": "05a0ab2d-5ece-45b6-b7d3-f3ecce2713d5",
"type": "physical",
"number": "0423",
"cvv": "231",
"createdAt": "2022-08-01T14:30:41.203653",
"updatedAt": "2022-08-01T14:30:41.203653"
},
{
"id": "b0a0ec35-6161-4ebf-bb4f-7cf73cf6448f",
"type": "virtual",
"number": "6978",
"cvv": "512",
"createdAt": "2022-08-01T14:30:41.203653",
"updatedAt": "2022-08-01T14:30:41.203653"
}
]
}
Objetivo: Realizar a criação de uma transação em uma conta. Uma transação pode ser de débito ou crédito.
- Caso a operação seja de débito, o saldo é validado. Não é permitido saldo negativo.
- Os tipos de transação aceitos são:
credit
edebit
.
Request:
{
"value": 100.00,
"description": "Pizzaria São Tomé",
"type": "credit"
}
Response:
{
"id": "05a0ab2d-5ece-45b6-b7d3-f3ecce2713d5",
"value": 100.00,
"description": "Calça Jeans",
"createdAt": "2022-08-01T14:30:41.203653",
"updatedAt": "2022-08-01T14:30:41.203653"
}
Objetivo: Listagem de todas as transações de uma conta, com filtros opcionais via query string. Filtros que devem ser aplicados:
- type: credit ou debit
- search: Busca por descrição da transação.
Response:
{
"transactions": [
{
"id": "05a0ab2d-5ece-45b6-b7d3-f3ecce2713d5",
"value": 100.00,
"description": "Pagamento João",
"createdAt": "2022-08-01T14:30:41.203653",
"updatedAt": "2022-08-01T14:30:41.203653"
}
]
}
Objetivo: Retorna o saldo de uma conta.
Response:
{
"balance": 100.00
}
Projeto desenvolvido por Thais R Kotovicz.