# Contratos de API e Integração - Blog inMotion

## 1. API Endpoints

### Artigos
- `GET /api/articles` - Listar todos os artigos (com filtros opcionais)
- `GET /api/articles/:slug` - Obter artigo por slug
- `POST /api/articles` - Criar novo artigo (admin)
- `PUT /api/articles/:id` - Atualizar artigo (admin)
- `DELETE /api/articles/:id` - Eliminar artigo (admin)
- `GET /api/articles/featured` - Obter artigos em destaque

### Categorias
- `GET /api/categories` - Listar todas as categorias
- `POST /api/categories` - Criar nova categoria (admin)
- `DELETE /api/categories/:id` - Eliminar categoria (admin)

### Comentários
- `GET /api/articles/:articleId/comments` - Obter comentários de um artigo
- `POST /api/articles/:articleId/comments` - Criar novo comentário

### Mensagens de Contacto
- `GET /api/messages` - Listar mensagens (admin)
- `POST /api/messages` - Criar nova mensagem
- `PATCH /api/messages/:id/read` - Marcar mensagem como lida (admin)

## 2. Modelos MongoDB

### Article
```python
{
    "_id": ObjectId,
    "title": str,
    "slug": str (unique, indexed),
    "excerpt": str,
    "content": str,
    "author": str,
    "category": str,
    "tags": List[str],
    "imageUrl": str,
    "featured": bool,
    "publishedAt": datetime,
    "createdAt": datetime,
    "updatedAt": datetime
}
```

### Category
```python
{
    "_id": ObjectId,
    "name": str (unique),
    "slug": str (unique, indexed),
    "count": int (computed field)
}
```

### Comment
```python
{
    "_id": ObjectId,
    "articleId": str,
    "author": str,
    "content": str,
    "createdAt": datetime
}
```

### ContactMessage
```python
{
    "_id": ObjectId,
    "name": str,
    "email": str,
    "message": str,
    "read": bool (default: False),
    "createdAt": datetime
}
```

## 3. Dados Mock a Substituir

### Em mock.js:
- `mockArticles` → GET /api/articles
- `mockCategories` → GET /api/categories
- `mockComments` → GET /api/articles/:articleId/comments
- `mockContactMessages` → GET /api/messages

### Componentes a Atualizar:

#### Home.jsx
- Substituir `import { mockArticles } from '../mock'`
- Usar `axios.get('/api/articles/featured')` para artigos em destaque
- Usar `axios.get('/api/articles?limit=3')` para artigos recentes

#### Blog.jsx
- Substituir `import { mockArticles, mockCategories } from '../mock'`
- Usar `axios.get('/api/articles')` com query params para pesquisa/filtros
- Usar `axios.get('/api/categories')`

#### Article.jsx
- Substituir `import { mockArticles, mockComments } from '../mock'`
- Usar `axios.get(/api/articles/${slug})`
- Usar `axios.get(/api/articles/${articleId}/comments)`
- Usar `axios.post(/api/articles/${articleId}/comments)` para criar comentário

#### Contact.jsx
- Usar `axios.post('/api/messages')` no formulário

#### Admin.jsx
- Substituir todos os mocks por chamadas API
- CRUD completo de artigos, categorias e mensagens

## 4. Integração Frontend-Backend

### Criar serviço API centralizado
- Ficheiro: `/app/frontend/src/services/api.js`
- Configurar axios com baseURL do backend
- Funções para todos os endpoints

### Ordem de Implementação
1. Backend: Modelos + Endpoints
2. Frontend: Serviço API centralizado
3. Frontend: Atualizar componentes um por um
4. Testes de integração

## 5. Dados Iniciais (Seed)

Ao iniciar, popular MongoDB com:
- 4 artigos de exemplo (os do mock.js)
- 5 categorias
- 2 comentários de exemplo

## 6. Validações Backend

- Slugs únicos e automáticos
- Validação de emails
- Sanitização de conteúdo HTML
- Limites de tamanho para textos

## 7. Melhorias Futuras (Não implementar agora)
- Autenticação admin
- Upload de imagens
- Paginação avançada
- Sistema de likes
- RSS feed
