Skip to content

NedSInt/fastapi_crud_mysql

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FastAPI CRUD de Produtos

Um projeto CRUD completo de produtos utilizando FastAPI, MySQL e padrão arquitetural MVC com boas práticas de Clean Code.

🏗️ Arquitetura

O projeto segue o padrão MVC (Model-View-Controller) com as seguintes camadas:

  • Models: Entidades do banco de dados (SQLAlchemy)
  • Views: Schemas Pydantic para validação e serialização
  • Controllers: Endpoints da API (FastAPI)
  • Services: Lógica de negócio
  • Repositories: Acesso aos dados

📁 Estrutura do Projeto

fastapi_crud_mysql/
├── app/
│   ├── config/
│   │   ├── __init__.py
│   │   └── database.py
│   ├── controllers/
│   │   ├── __init__.py
│   │   └── product_controller.py
│   ├── models/
│   │   ├── __init__.py
│   │   └── product.py
│   ├── repositories/
│   │   ├── __init__.py
│   │   └── product_repository.py
│   ├── schemas/
│   │   ├── __init__.py
│   │   └── product.py
│   ├── services/
│   │   ├── __init__.py
│   │   └── product_service.py
│   └── main.py
├── config.env.example
├── requirements.txt
├── run.py
├── test_api.py
├── .gitignore
└── README.md

🚀 Como Executar

1. Configuração do Ambiente

# Ativar o ambiente virtual
venv\Scripts\activate  # Windows
source venv/bin/activate  # Linux/Mac

# Instalar dependências
pip install -r requirements.txt

2. Configuração do Banco de Dados

  1. Certifique-se de que o MySQL está instalado e rodando
  2. Crie um banco de dados chamado fastapi_crud
  3. Configure as credenciais no arquivo config.env:
# Copie o arquivo de exemplo
cp config.env.example config.env

# Edite o arquivo config.env com suas credenciais
DATABASE_URL=mysql+mysqlconnector://seu_usuario:sua_senha@localhost:3306/fastapi_crud
DATABASE_HOST=localhost
DATABASE_PORT=3306
DATABASE_NAME=fastapi_crud
DATABASE_USER=seu_usuario
DATABASE_PASSWORD=sua_senha

3. Executar a Aplicação

# Executar com uvicorn
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

# Ou executar diretamente
python app/main.py

📚 Endpoints da API

Produtos

Método Endpoint Descrição
POST /products/ Criar novo produto
GET /products/ Listar todos os produtos
GET /products/{id} Buscar produto por ID
PUT /products/{id} Atualizar produto
DELETE /products/{id} Remover produto
GET /products/search/ Buscar produtos por nome
GET /products/low-stock/ Produtos com estoque baixo
GET /products/statistics/ Estatísticas dos produtos

Outros Endpoints

Método Endpoint Descrição
GET / Informações da API
GET /health Status da API
GET /docs Documentação Swagger
GET /redoc Documentação ReDoc

🔧 Exemplos de Uso

Criar Produto

curl -X POST "http://localhost:8000/products/" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Smartphone Samsung Galaxy",
    "description": "Smartphone com tela de 6.1 polegadas",
    "price": 1299.99,
    "stock_quantity": 50
  }'

Listar Produtos

curl -X GET "http://localhost:8000/products/?skip=0&limit=10"

Buscar Produto por ID

curl -X GET "http://localhost:8000/products/1"

Atualizar Produto

curl -X PUT "http://localhost:8000/products/1" \
  -H "Content-Type: application/json" \
  -d '{
    "price": 1199.99,
    "stock_quantity": 45
  }'

Remover Produto

curl -X DELETE "http://localhost:8000/products/1"

🎯 Características do Projeto

✅ Boas Práticas Implementadas

  • Separação de Responsabilidades: Cada camada tem sua responsabilidade específica
  • Injeção de Dependência: Uso de Depends() do FastAPI
  • Validação de Dados: Schemas Pydantic para validação
  • Tratamento de Erros: HTTPExceptions apropriadas
  • Documentação: Docstrings completas
  • Type Hints: Tipagem estática em todo o código
  • Clean Code: Código limpo e legível
  • Repository Pattern: Encapsulamento do acesso aos dados
  • Service Layer: Lógica de negócio separada

🔒 Validações Implementadas

  • Preço deve ser maior que zero
  • Quantidade em estoque não pode ser negativa
  • Nome do produto é obrigatório
  • Limites de tamanho para strings
  • Paginação para listagens

📊 Funcionalidades Extras

  • Busca por nome (busca parcial)
  • Produtos com estoque baixo
  • Estatísticas dos produtos
  • Paginação em todas as listagens
  • Documentação automática (Swagger/ReDoc)

🛠️ Tecnologias Utilizadas

  • FastAPI: Framework web moderno e rápido
  • SQLAlchemy: ORM para Python
  • MySQL: Banco de dados relacional
  • Pydantic: Validação de dados
  • Uvicorn: Servidor ASGI
  • Python-dotenv: Gerenciamento de variáveis de ambiente

📝 Notas Importantes

  1. Configuração do Banco: Certifique-se de que o MySQL está rodando e as credenciais estão corretas
  2. Ambiente Virtual: Sempre use o ambiente virtual para evitar conflitos de dependências
  3. Variáveis de Ambiente: Configure o arquivo config.env com suas credenciais
  4. Documentação: Acesse /docs para ver a documentação interativa da API
  5. Git: O arquivo config.env está no .gitignore para proteger suas credenciais

🔒 Segurança e Versionamento

Arquivos Ignorados pelo Git

O projeto inclui um .gitignore completo que protege:

  • Credenciais: config.env (contém senhas do banco)
  • Ambiente Virtual: venv/ (dependências locais)
  • Cache Python: __pycache__/, *.pyc
  • Logs: *.log
  • Arquivos de IDE: .vscode/, .idea/
  • Arquivos de Sistema: .DS_Store, Thumbs.db

Configuração Segura

  1. Nunca commite o arquivo config.env (já está no .gitignore)
  2. Use config.env.example como template
  3. Mantenha suas credenciais seguras
  4. Compartilhe apenas o código, não as configurações sensíveis

🤝 Contribuição

Para contribuir com o projeto:

  1. Faça um fork do repositório
  2. Crie uma branch para sua feature
  3. Implemente suas mudanças seguindo as boas práticas
  4. Teste suas alterações
  5. Faça um pull request

📄 Licença

Este projeto está sob a licença MIT.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages