# Backend - GoHorse Jobs API

[![Go](https://img.shields.io/badge/Go-1.24-00ADD8?style=flat-square&logo=go)](https://golang.org/)
[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-16-336791?style=flat-square&logo=postgresql)](https://postgresql.org/)

API REST desenvolvida em Go seguindo princípios de **Clean Architecture** e **DDD**.

---

## 🏗️ Arquitetura

```
internal/
├── api/                    # Clean Architecture Layer
│   ├── handlers/           # HTTP Handlers (Controllers)
│   └── middleware/         # Auth, CORS, Rate Limiting
│
├── core/                   # Domain Layer (DDD)
│   ├── domain/entity/      # Entidades puras (sem deps externas)
│   ├── ports/              # Interfaces (Repository, Service)
│   └── usecases/           # Casos de uso (Business Logic)
│
├── infrastructure/         # Infrastructure Layer
│   ├── auth/               # JWT Service implementation
│   └── persistence/        # Repository implementations
│
├── handlers/               # Legacy controllers
├── middleware/             # Security middlewares
├── models/                 # GORM models
├── services/               # Business logic (legacy)
└── utils/                  # Helpers (JWT, Sanitizer)
```

---

## 🔒 Segurança

### Middlewares Implementados

| Middleware | Arquivo | Descrição |
|------------|---------|-----------|
| **Auth** | `middleware/auth.go` | Validação JWT + RBAC |
| **CORS** | `middleware/cors.go` | Whitelist de origens via `CORS_ORIGINS` |
| **Rate Limiting** | `middleware/rate_limit.go` | 100 req/min por IP |
| **Security Headers** | `middleware/security_headers.go` | OWASP headers (XSS, CSP, etc.) |

### Validação de JWT

O servidor valida no boot que `JWT_SECRET` tenha pelo menos 32 caracteres. Em produção (`ENV=production`), o servidor **não inicia** com secrets fracos.

---

## 📡 Endpoints

### Públicos

| Método | Endpoint | Descrição |
|--------|----------|-----------|
| `GET` | `/health` | Health check |
| `GET` | `/swagger/*` | Documentação Swagger |
| `POST` | `/api/v1/auth/login` | Autenticação |
| `POST` | `/api/v1/companies` | Registro de empresa |
| `GET` | `/jobs` | Listar vagas |

### Protegidos (JWT Required)

| Método | Endpoint | Roles | Descrição |
|--------|----------|-------|-----------|
| `GET` | `/api/v1/users` | `superadmin`, `companyAdmin` | Listar usuários |
| `POST` | `/api/v1/users` | `superadmin`, `companyAdmin` | Criar usuário |
| `DELETE` | `/api/v1/users/{id}` | `superadmin` | Deletar usuário |
| `POST` | `/jobs` | `companyAdmin`, `recruiter` | Criar vaga |

---

### Exemplo: atualizar candidatura para "Contratado"

Use este fluxo para marcar uma candidatura como aprovada (status `hired`).

1. **Endpoint**: `PUT /applications/{id}/status`
   - Substitua `{id}` pelo identificador numérico da candidatura. Exemplo: `/applications/1234/status`.
2. **Payload (`application/json`)**:

```json
{
  "status": "hired",
  "notes": "Candidato APROVADO após a entrevista final. Salário de R$ 5.500,00 acordado. Início em 01/02/2026."
}
```

- O campo `status` é obrigatório e deve ser `"hired"` para confirmar a contratação.
- O campo `notes` é opcional e pode registrar observações do recrutador.

3. **Próximo passo recomendado**: Após o `200 OK`, crie a conta de usuário interno do contratado com `POST /api/v1/users`.

---

## 🚀 Desenvolvimento

### Executar

```bash
# Copie o .env
cp .env.example .env

# Execute
go run ./cmd/api
```

### Testes

```bash
# Todos os testes
go test ./...

# Com verbose
go test -v ./internal/middleware/... ./internal/utils/...
```

### Regenerar Swagger

```bash
swag init -g cmd/api/main.go --parseDependency --parseInternal
```

---

## 🐳 Docker

```bash
# Build
docker build -t gohorse-backend .

# Run
docker run -p 8080:8080 --env-file .env gohorse-backend
```

**Imagem otimizada:** ~73MB (Alpine + non-root user)

---

## 📁 Arquivos Importantes

| Arquivo | Descrição |
|---------|-----------|
| `cmd/api/main.go` | Entrypoint da aplicação |
| `internal/router/router.go` | Configuração de todas as rotas |
| `internal/database/database.go` | Conexão GORM com PostgreSQL |
| `migrations/*.sql` | Migrations do banco de dados |
| `docs/swagger.json` | Documentação OpenAPI gerada |
