API REST robusta construída com FastAPI para a plataforma BlogGuide - uma rede social focada em desenvolvedores.
A API do BlogGuide fornece endpoints completos para:
- 🔐 Autenticação JWT - Login, registro e gerenciamento de sessões
- 👥 Gerenciamento de Usuários - CRUD completo com perfis públicos
- 📝 Sistema de Posts - Criação, listagem e gerenciamento de conteúdo
- 🏷️ Sistema de Tags - Categorização dinâmica de posts
- 🛡️ Middleware de Segurança - CORS, validação e tratamento de erros
- FastAPI 0.116.1 - Framework web moderno e rápido
- SQLModel 0.0.24 - ORM baseado em Pydantic e SQLAlchemy
- Uvicorn 0.35.0 - Servidor ASGI de alta performance
- SQLAlchemy 2.0.41 - ORM principal
- PostgreSQL - Produção (via psycopg2-binary)
- SQLite - Desenvolvimento local
- python-jose 3.5.0 - JWT tokens
- passlib 1.7.4 - Hash de senhas com bcrypt
- python-multipart 0.0.20 - Upload de arquivos
- python-dotenv 1.1.1 - Gerenciamento de variáveis de ambiente
- email-validator 2.2.0 - Validação de emails
- sentry-sdk 2.33.0 - Monitoramento de erros
backend/
├── main.py # Aplicação principal FastAPI
├── database.py # Configuração do banco de dados
├── requirements.txt # Dependências Python
├── Dockerfile # Container Docker
├── fly.toml # Configuração Fly.io
├── generate-secret-key.py # Utilitário para gerar chaves
├── .env.example # Template de variáveis
├── auth/
│ └── security.py # Funções de segurança JWT
├── models/
│ ├── user.py # Modelos de usuário
│ ├── post.py # Modelos de post
│ └── auth.py # Modelos de autenticação
├── routes/
│ ├── auth.py # Endpoints de autenticação
│ ├── user.py # Endpoints de usuários
│ ├── post.py # Endpoints de posts
│ └── general.py # Endpoints gerais
└── services/ # Serviços externos (futuro)
- Python 3.11+
- pip ou poetry
- PostgreSQL (produção) ou SQLite (desenvolvimento)
- Clone o repositório
git clone <repository-url>
cd Bloguide/backend- Crie ambiente virtual
python -m venv venv
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activate- Instale dependências
pip install -r requirements.txt- Configure variáveis de ambiente
cp .env.example .envEdite o arquivo .env:
SECRET_KEY=sua-chave-secreta-aqui
DATABASE_URL=sqlite:///./bloguide.db # ou PostgreSQL URL
ENVIRONMENT=development- Gere chave secreta (recomendado)
python generate-secret-key.py- Execute a aplicação
# Desenvolvimento
uvicorn main:app --reload --host 0.0.0.0 --port 8000
# Ou usando Python
python main.py- Acesse a documentação
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
- Health Check: http://localhost:8000/health
docker build -t bloguide-api .docker run -p 8000:8000 \
-e SECRET_KEY=your-secret-key \
-e DATABASE_URL=your-db-url \
bloguide-api- Instalar Fly CLI
# Instalar flyctl
curl -L https://fly.io/install.sh | sh- Login e Deploy
fly auth login
fly deploy- App Name:
blogguidedev-api - Region:
gru(São Paulo) - Memory: 512MB
- Health Check:
/health - Auto-scaling: Habilitado
POST /auth/register # Registrar novo usuário
POST /auth/login # Login do usuário
GET /auth/me # Obter usuário atual
POST /auth/logout # LogoutGET /users # Listar usuários
GET /users/{id} # Obter usuário específico
POST /users # Criar usuário
PUT /users/{id} # Atualizar usuário
DELETE /users/{id} # Deletar usuário
GET /users/{id}/posts # Posts do usuário
GET /users/{username}/profile # Perfil públicoGET /posts # Listar posts
GET /posts/{id} # Obter post específico
POST /posts # Criar post
DELETE /posts/{id} # Deletar postGET /health # Status da API{
"id": 1,
"name": "João Silva",
"username": "joao",
"email": "joao@example.com",
"bio": "Desenvolvedor Python",
"github_url": "https://github.com/joao",
"linkedin_url": "https://linkedin.com/in/joao",
"avatar_url": "https://example.com/avatar.jpg",
"is_active": true,
"created_at": "2024-01-01T00:00:00",
"updated_at": null
}{
"id": 1,
"title": "Introdução ao FastAPI",
"category": "Tutorial",
"content": "FastAPI é um framework...",
"author_id": 1,
"image_url": "https://example.com/image.jpg",
"tags": ["python", "fastapi", "tutorial"],
"likes_count": 0,
"is_published": true,
"created_at": "2024-01-01T00:00:00",
"updated_at": null
}- Algoritmo: HS256
- Expiração: 30 minutos
- Header:
Authorization: Bearer <token>
- CORS: Configurado por ambiente
- Validation: Pydantic models
- Error Handling: HTTPException personalizado
# CORS restrito
origins = [
"https://blog-guide-dev-front.vercel.app",
"https://blogguidedev-api.fly.dev",
]# CORS amplo para testes
origins = [
"http://localhost:3000",
"http://localhost:5173",
]CREATE TABLE user (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
bio VARCHAR(500),
github_url VARCHAR(255),
linkedin_url VARCHAR(255),
avatar_url VARCHAR(255),
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP
);CREATE TABLE post (
id SERIAL PRIMARY KEY,
title VARCHAR(200) NOT NULL,
category VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
author_id INTEGER REFERENCES user(id),
image_url VARCHAR(255),
tags TEXT, -- JSON string
likes_count INTEGER DEFAULT 0,
is_published BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP
);# Desenvolvimento com auto-reload
uvicorn main:app --reload
# Gerar nova chave secreta
python generate-secret-key.py
# Verificar health
curl http://localhost:8000/healthSECRET_KEY=your-jwt-secret-key
DATABASE_URL=sqlite:///./bloguide.db
ENVIRONMENT=development
PORT=8000- Endpoint:
/health - Fly.io: Verifica a cada 15s
- Response:
{"status": "healthy", "environment": "production"}
# Logs do Fly.io
fly logs
# Logs locais
tail -f logs/app.log- Fork o repositório
- Crie uma branch:
git checkout -b feature/nova-funcionalidade - Commit:
git commit -m 'feat: adiciona nova funcionalidade' - Push:
git push origin feature/nova-funcionalidade - Abra um Pull Request
- PEP 8 para formatação
- Type hints obrigatório
- Docstrings para funções públicas
- SQLModel para modelos de dados
Este projeto está sob a licença MIT.
Guilherme Sampaio
Dev Fundador
🚀 API em Produção: https://blogguidedev-api.fly.dev
📖 Documentação: https://blogguidedev-api.fly.dev/docs
Feito com ❤️ para a comunidade de desenvolvedores (readme ainda em desenvolvimento)