# Fluxos: Modulo Wiki

---

## 18.1 Criar Artigo

```
Usuario
  ↓
Wiki → Botao "Novo Artigo"
  ↓
GET /wiki/editor
  ↓
WikiController@editor
  ↓
View: pages/wiki/editor (rich text editor)
  ↓
Preenche: titulo, conteudo, tipo (article|trail)
  article: seleciona categoria + subcategorias
  trail: seleciona trilha + modulo + submodulo + topico
  ↓
POST /wiki/api/articles
  ↓
ArticleController@store
  ↓
Validacao (por tipo):
  title (required, max 500), content (required)
  article: category_id (required, exists), subcategory_ids (optional)
  trail: trail_id (required, exists), module_id, submodule_id, topic_id
  status: draft|published
  ↓
WikiArticle::create
  slug auto-gerado (unico), excerpt auto-gerado, read_time calculado
  published_at (se published)
WikiArticle.subcategories::sync (se article)
  ↓
JSON {article} (201)
```

**Tela inicial:** Editor Wiki
**Acao do usuario:** Escreve artigo e publica ou salva rascunho
**Requisicao:** `POST /wiki/api/articles`
**Controller:** `ArticleController@store`
**Tabelas alteradas:**
- `wiki_articles` (INSERT)
- `wiki_article_category` (INSERT se article com subcategorias)
**Resultado esperado:** Artigo criado com slug, excerpt e read_time auto-gerados
**Possiveis erros:** Validacao → 422

---

## 18.2 Editar Artigo

```
Usuario
  ↓
Wiki → Meus Rascunhos ou Artigo → Editar
  ↓
GET /wiki/editor/{id}
  ↓
WikiController@editor (com articleId)
  ↓
AJAX: GET /wiki/api/articles/{id}/edit
  ↓
ArticleController@showForEdit (somente owner)
  ↓
Edita conteudo → Salvar
  ↓
PUT /wiki/api/articles/{id}
  ↓
ArticleController@update (somente owner)
  ↓
WikiArticle::update + subcategories::sync
  ↓
JSON {article}
```

**Autorizacao:** Somente o criador pode editar
**Tabelas alteradas:** `wiki_articles`, `wiki_article_category`
**Possiveis erros:** Nao e owner → 403

---

## 18.3 Excluir Artigo

```
DELETE /wiki/api/articles/{id}
  → ArticleController@destroy (somente owner)
  → WikiArticle::delete
  → HTTP 204
```

---

## 18.4 Upload de Imagem no Editor

```
POST /wiki/api/articles/upload-image
  → ArticleController@uploadImage
  → Validacao: image (jpeg/png/webp/gif, max 8MB)
  → Storage: wiki/YYYY/MM/filename (tenant-scoped)
  → JSON {url}
```

**Resultado esperado:** Imagem salva no storage do tenant, URL retornada

---

## 18.5 Gerenciar Categorias

```
POST /wiki/api/categories → CategoryController@store
  → Validacao: label (required, max 150)
  → WikiCategory::create (slug auto-gerado)
  → JSON {category} (201)

PUT /wiki/api/categories/{id} → update
POST /wiki/api/categories/{id}/subcategories → storeSubcategory
PUT /wiki/api/subcategories/{id} → updateSubcategory
```

**Tabelas alteradas:** `wiki_categories`, `wiki_subcategories`

---

## 18.6 Gerenciar Trilhas

```
POST /wiki/api/trails → TrailTaxonomyController@store
PUT  /wiki/api/trails/{id} → updateTrail
POST /wiki/api/trails/{id}/modules → storeModule
PUT  /wiki/api/modules/{id} → updateModule
POST /wiki/api/modules/{id}/submodules → storeSubmodule
PUT  /wiki/api/submodules/{id} → updateSubmodule
POST /wiki/api/submodules/{id}/topics → storeTopic
PUT  /wiki/api/topics/{id} → updateTopic
```

**Validacao:** label (required, max 150) para cada nivel
**Tabelas alteradas:** `wiki_trails`, `wiki_trail_modules`, `wiki_trail_submodules`, `wiki_trail_topics`

---

## 18.7 Buscar e Navegar

```
GET /wiki/api/articles?q=termo → busca full-text (title, excerpt)
GET /wiki/api/articles?category_id=N → artigos por categoria
GET /wiki/api/articles?trail_id=N → artigos por trilha
GET /wiki/api/articles?module_id=N → artigos por modulo
GET /wiki/api/articles?subcategory_id=N → artigos por subcategoria
GET /wiki/api/articles?topic_id=N → artigos por topico
GET /wiki/api/articles → agrupados por categoria (5 recentes cada)
```

**Tabelas consultadas:** `wiki_articles`
