# 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.

