267 lines
6.7 KiB
Markdown
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.
|
|
|