Skip to content

RESTful API for managing wallets, deposits, transfers and transactions, built with ASP.NET Core, Entity Framework Core and PostgreSQL

Notifications You must be signed in to change notification settings

ViniciusMarins/wallet-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

API de Carteira Digital

Uma API RESTful para gerenciamento de carteiras, depósitos, transferências e transações, construída com ASP.NET Core, Entity Framework Core e PostgreSQL. A API suporta autenticação de usuários, operações com carteiras e histórico de transações com timestamps em UTC. Testes unitários estão incluídos para garantir confiabilidade.

Índice

  • Funcionalidades
  • Tecnologias
  • Estrutura do Projeto
  • Instruções de Configuração
    • Pré-requisitos
    • Rodando o PostgreSQL com Docker
    • Configurando a Aplicação
    • Executando a API
  • Endpoints da API
    • Endpoints de Autenticação
    • Endpoints de Usuário
    • Endpoints de Carteira
  • Testes Unitários

Funcionalidades

  • Gerenciamento de Usuários: Criação de usuários com carteiras associadas.
  • Operações com Carteiras: Consulta de saldo, depósitos e transferências entre carteiras.
  • Histórico de Transações: Recuperação do histórico de transações com filtro por intervalo de datas.
  • Autenticação: Autenticação baseada em JWT para acesso seguro.
  • Timestamps em UTC: Todos os timestamps de transações são armazenados e retornados em UTC (formato ISO 8601 com sufixo Z).
  • Testes Unitários: Testes abrangentes para controladores usando xUnit e Moq.
  • Banco de Dados: PostgreSQL com Entity Framework Core para persistência de dados.
  • Docker: PostgreSQL executado em um contêiner Docker para configuração fácil.

Tecnologias

  • ASP.NET Core 8.0: Framework para API web.
  • Entity Framework Core: ORM para operações com banco de dados.
  • PostgreSQL: Banco de dados relacional.
  • Npgsql: Provedor PostgreSQL para EF Core.
  • xUnit & Moq: Testes unitários e mocking.
  • Docker: Contêinerização para PostgreSQL.
  • ShortId: Geração de códigos únicos para carteiras.
  • JWT: Autenticação.

Instruções de Configuração

Pré-requisitos

  • .NET SDK 8.0: Instalar
  • Docker: Instalar
  • Cliente PostgreSQL (opcional): Para acesso manual ao banco (ex.: pgAdmin, DBeaver).
  • Git: Para clonar o repositório.

Rodando o PostgreSQL com Docker

  1. Configure o arquivo docker-compose.yml na raiz do projeto:
      version: '3.8'
      
      services:
        postgres:
          image: postgres:latest
          environment:
            POSTGRES_USER: seusuario
            POSTGRES_PASSWORD: suasenha
            POSTGRES_DB: walletdb
          ports:
            - "5432:5432"
          volumes:
            - postgres_data:/var/lib/postgresql/data
          networks:
            - app-network
      
      volumes:
        postgres_data:
      
      networks:
        app-network:
          driver: bridge
  2. Inicie o PostgreSQL:
    docker-compose up -d
    • Isso inicia um contêiner PostgreSQL com:
      • Usuário: seusuario
      • Senha: suasenha
      • Banco de dados: walletdb
      • Porta: 5432
    • A flag -d executa o contêiner em modo detached.

Configurando a Aplicação

  1. Clone o repositório:
    git clone https://github.com/ViniciusMarins/wallet-api.git
    cd wallet-api
  2. Crie/Atualize o appsettings.json:
    {
      "ConnectionStrings": {
        "DefaultConnection": "Host=localhost;Port=5432;Database=seubanco;Username=seuusuario;Password=suasenha"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*",
      "Jwt": {
        "SecretKey":"",
        "Issuer": "",
        "Audience": "",
        "ExpirationInMinutes": ""
      }
    • Atualize o DefaultConnection para corresponder às configurações do PostgreSQL.
    • Defina uma Jwt:Key segura para autenticação.

Executando a API

  1. Aplique as migrações do banco de dados:
    Update-Database
  2. Execute a aplicação:
    dotnet run --project api
    • A API estará disponível em "http://localhost:5214"

Endpoints da API

Endpoints de Autenticação

  • POST /api/v1/auth
    • Descrição: Realiza o login de um usuário previamente cadastrado.
    • Corpo da Requisição:
        {
            "cpf": "1111111111",
            "password": "test123",
        }
    • Resposta (200 OK):
      {
        "token": "eyAMSDAO_@MAS...",
      }
    • Erro (401 Unauthorized):
      {
        "message": "Cpf or password invalid."
      }

Endpoints de Usuário

  • POST /api/v1/users
    • Descrição: Cria um novo usuário com uma carteira associada.
    • Corpo da Requisição:
      {
        "name": "Vinicius",
        "cpf": "1111111111",
        "email": "v@gmail.com",
        "password": "test123"
      }
    • Resposta (201 Created):
      {
        "message": "User created successfully.",
        "name": "Vinicius",
        "cpf": "1111111111",
        "walletCode": "ASDW2132_XA"
      }

Endpoints de Carteira

  • GET /api/v1/wallets/{code}/balance

    • Descrição: Consulta o saldo de uma carteira.
    • Autorização: Token Bearer necessário.
    • Resposta (200 OK):
      {
        "balance": 100.00
      }
    • Erro (404 Not Found):
      {
        "message": "Wallet not found or does not belong to the user."
      }
  • POST /api/v1/wallets/{code}/deposit

    • Descrição: Deposita fundos em uma carteira.
    • Autorização: Token Bearer necessário.
    • Corpo da Requisição:
      {
        "amount": 50.00
      }
    • Resposta (200 OK):
      {
        "message": "Deposit completed successfully.",
        "balance": 150.00
      }
    • Erro (404 Not Found):
      {
        "message": "Wallet not found or does not belong to the user."
      }
  • POST /api/v1/wallets/transfer

    • Descrição: Transfere fundos entre carteiras.
    • Autorização: Token Bearer necessário.
    • Corpo da Requisição:
      {
        "amount": 50.00,
        "fromWalletCode": "FROM_WALLET",
        "toWalletCode": "TO_WALLET"
      }
    • Resposta (200 OK):
      {
        "message": "Transfer completed successfully."
      }
    • Erro (404 Not Found):
      {
        "message": "Source wallet not found or does not belong to the user."
      }
      {
        "message": "Destination wallet not found."
      }
  • GET /api/v1/wallets/{code}/transactions

    • Descrição: Recupera o histórico de transações de uma carteira.
    • Autorização: Token Bearer necessário.
    • Parâmetros de Consulta:
      • startDate: Opcional, ISO 8601 (ex.: 2025-05-11T00:00:00Z).
      • endDate: Opcional, ISO 8601 (ex.: 2025-05-12T23:59:59Z).
    • Resposta (200 OK):
      [
        {
          "createdAt": "2025-05-11T04:00:00Z",
          "amount": 100.00,
          "transactionType": "DEPOSIT",
          "status": "COMPLETED",
          "fromWalletCode": "WALLET_CODE",
          "toWalletCode": null
        }
      ]
    • Erro (404 Not Found):
      {
        "message": "Wallet not found or does not belong to the user."
      }

Testes Unitários

Testes unitários foram implementados para os controllers e services usando xUnit e Moq. Os testes cobrem:

  • Operações bem-sucedidas (ex.: consulta de saldo, depósitos, transferências, histórico de transações).
  • Casos de erro (ex.: carteira não encontrada, acesso não autorizado).
  • Códigos de status (200 OK, 201 Created, 404 Not Found).
  • Tratamento de tipos anônimos para validação de respostas.
  • Confiabilidade dos dados e retorno.

Executando os Testes

  1. Navegue até o projeto de testes::
    cd api.Tests
  2. Execute os testes::
    dotnet test

About

RESTful API for managing wallets, deposits, transfers and transactions, built with ASP.NET Core, Entity Framework Core and PostgreSQL

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages