photum/backend/README.md

267 lines
6.7 KiB
Markdown

# Photum Backend API
Backend para o sistema Photum, desenvolvido em Go com Gin Framework.
## 🚀 Tecnologias
- **Go 1.21+**
- **Gin Framework** - Web framework
- **PostgreSQL 15** - Banco de dados
- **SQLC** - Geração de código type-safe para SQL
- **JWT** - Autenticação via tokens
- **Swagger** - Documentação da API
- **Docker** - Containerização
## 📋 Pré-requisitos
- [Go 1.21+](https://golang.org/dl/)
- [Docker Desktop](https://www.docker.com/products/docker-desktop/)
- [SQLC](https://sqlc.dev/) - `go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest`
- [Swag](https://github.com/swaggo/swag) - `go install github.com/swaggo/swag/cmd/swag@latest`
## ⚙️ Setup Rápido
### Opção 1: Usando o script PowerShell (Recomendado para Windows)
```powershell
# Iniciar ambiente completo (banco de dados + aplicação)
.\setup.ps1 dev
# Ou comandos individuais:
.\setup.ps1 db-up # Apenas iniciar banco de dados
.\setup.ps1 sqlc-generate # Gerar código SQLC
.\setup.ps1 swagger # Gerar documentação Swagger
.\setup.ps1 run # Executar aplicação
```
### Opção 2: Passo a passo manual
```powershell
# 1. Iniciar o banco de dados PostgreSQL
docker-compose up -d
# 2. Aguardar o banco ficar pronto (5-10 segundos)
# O schema será aplicado automaticamente
# 3. Gerar código SQLC (se houver mudanças nas queries)
sqlc generate
# 4. Gerar documentação Swagger
swag init -g cmd/api/main.go -o docs
# 5. Executar a aplicação
go run cmd/api/main.go
```
## 🔧 Configuração
O arquivo `.env` contém as configurações do ambiente:
```env
APP_ENV=dev
APP_PORT=8080
DB_DSN=postgres://user:pass@localhost:5432/photum?sslmode=disable
JWT_ACCESS_SECRET=troque_essa_chave
JWT_REFRESH_SECRET=troque_essa_tbm
JWT_ACCESS_TTL_MINUTES=15
JWT_REFRESH_TTL_DAYS=30
```
⚠️ **IMPORTANTE**: Altere os secrets JWT antes de usar em produção!
## 📚 Documentação da API
Após iniciar a aplicação, acesse:
**Swagger UI**: http://localhost:8080/swagger/index.html
## 🔐 Endpoints Disponíveis
### Autenticação (Público)
- `POST /auth/register` - Registrar novo usuário
- `POST /auth/login` - Login
- `POST /auth/refresh` - Renovar access token
- `POST /auth/logout` - Logout
### Protegido (Requer autenticação)
- `GET /api/me` - Informações do usuário autenticado
## 🗄️ Estrutura do Banco de Dados
### Tabela `usuarios`
- `id` (UUID) - Primary Key
- `email` (VARCHAR) - Único
- `senha_hash` (VARCHAR) - Hash bcrypt da senha
- `role` (VARCHAR) - Papel do usuário (default: 'profissional')
- `ativo` (BOOLEAN) - Status do usuário
- `criado_em`, `atualizado_em` (TIMESTAMPTZ)
### Tabela `refresh_tokens`
- `id` (UUID) - Primary Key
- `usuario_id` (UUID) - Foreign Key para usuarios
- `token_hash` (VARCHAR) - Hash SHA256 do token
- `user_agent`, `ip` - Informações do dispositivo
- `expira_em` (TIMESTAMPTZ)
- `revogado` (BOOLEAN)
### Tabela `cadastro_profissionais`
- Informações detalhadas dos profissionais
- Vinculada a `usuarios` via `usuario_id`
## 🧪 Testando a API
### Exemplo de Registro
```bash
curl -X POST http://localhost:8080/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "andre.fr93@gmail.com",
"senha": "j87q9t0"
}'
```
### Exemplo de Login
```bash
curl -X POST http://localhost:8080/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "andre.fr93@gmail.com",
"senha": "j87q9t0"
}'
```
### Testando rota protegida
```bash
curl -X GET http://localhost:8080/api/me \
-H "Authorization: Bearer SEU_ACCESS_TOKEN_AQUI"
```
## 🛠️ Comandos Úteis
```powershell
# Ver logs do banco de dados
docker-compose logs -f postgres
# Parar banco de dados
docker-compose down
# Resetar banco de dados (apaga todos os dados)
docker-compose down -v
docker-compose up -d
# Executar testes
go test -v ./...
# Atualizar dependências
go mod tidy
```
## 📁 Estrutura do Projeto
```
photum-backend/
├── cmd/
│ └── api/
│ └── main.go # Entry point da aplicação
├── internal/
│ ├── auth/ # Módulo de autenticação
│ │ ├── handler.go # Handlers HTTP
│ │ ├── service.go # Lógica de negócio
│ │ ├── tokens.go # Geração de tokens JWT
│ │ ├── middleware.go # Middleware de autenticação
│ │ └── utils.go # Utilitários (hash de senha)
│ ├── config/ # Configurações
│ │ └── config.go
│ └── db/
│ ├── schema.sql # Schema do banco de dados
│ ├── queries/ # Queries SQL
│ │ ├── usuarios.sql
│ │ ├── auth.sql
│ │ └── profissionais.sql
│ └── generated/ # Código gerado pelo SQLC
├── docs/ # Documentação Swagger (gerada)
├── .env # Variáveis de ambiente
├── docker-compose.yml # Configuração Docker
├── sqlc.yaml # Configuração SQLC
├── go.mod # Dependências Go
└── README.md
```
## 🐛 Troubleshooting
### Erro: "failed to register user"
**Causa**: Banco de dados não está rodando ou não foi inicializado.
**Solução**:
```powershell
# Verificar se Docker está rodando
docker ps
# Se não estiver, iniciar o banco
docker-compose up -d
# Aguardar alguns segundos e tentar novamente
```
### Erro: "connection refused"
**Causa**: PostgreSQL não está acessível.
**Solução**:
```powershell
# Verificar logs do container
docker-compose logs postgres
# Reiniciar o container
docker-compose restart postgres
```
### Erro: "relation usuarios does not exist"
**Causa**: Schema não foi aplicado ao banco.
**Solução**:
```powershell
# Resetar banco de dados
docker-compose down -v
docker-compose up -d
```
## 📝 Notas de Desenvolvimento
### Fluxo de Autenticação
1. **Registro**: Cria usuário com senha hasheada (bcrypt)
2. **Login**:
- Valida credenciais
- Gera Access Token (JWT, 15 min)
- Gera Refresh Token (UUID hasheado, 30 dias)
- Armazena Refresh Token no banco
- Retorna Access Token + define cookie HttpOnly com Refresh Token
3. **Refresh**: Usa Refresh Token para gerar novo Access Token
4. **Logout**: Revoga Refresh Token
### Segurança
- Senhas hasheadas com bcrypt (custo 10)
- Refresh Tokens armazenados como SHA256 hash
- Access Tokens JWT assinados com HS256
- Cookies HttpOnly para web (CSRF protection)
- Suporte a tokens no body para mobile
## 📄 Licença
Este projeto é privado e proprietário.
## 👥 Contato
Para dúvidas ou suporte, entre em contato com a equipe de desenvolvimento.