Blog
Posts, categorias e comentários do blog da loja, com agendamento, tradução e imagem de destaque gerada por IA.
O blog é o espaço de conteúdo editorial da loja: guias de compra, novidades, bastidores. Esta seção é a API de administração: criar e editar posts, organizá-los em categorias, traduzi-los, moderar os comentários dos leitores e gerar a imagem de destaque com IA. A leitura pública do blog fica na vitrine e não está aqui.
Como funciona
O caminho normal de um post: criar como draft, escrever e traduzir, definir categoria e imagem de destaque e, quando estiver pronto, mudar para published (agora ou com uma data futura). Depois de publicado, leitores podem comentar na vitrine; os comentários caem na fila de moderação.
| Estado do post | Letra | Significado |
|---|---|---|
draft | R | Rascunho, só no painel. |
published | A | Publicado. Se published_at está no futuro, está agendado e a vitrine ainda não o mostra. |
archived | D | Arquivado, fora da vitrine. |
| Estado do comentário | Significado |
|---|---|
pending | Aguardando moderação. Não aparece. |
approved | Aprovado, aparece abaixo do post. |
rejected | Rejeitado, escondido mas guardado. |
Conceitos importantes
Slug
O slug é o trecho da URL pública do post. Na criação, um slug repetido recebe sufixo (-2, -3). Na atualização, um slug repetido é recusado.
Texto do post
O texto é sanitizado ao gravar: scripts e atributos de evento saem. O meta_title e a meta_description vazios são preenchidos a partir do título e dos primeiros 160 caracteres do texto.
Tradução
Cada post e cada categoria pode ter conteúdo por idioma. As rotas de descriptions leem e gravam esse conteúdo; title (ou name) é obrigatório em cada idioma enviado.
Post da loja e de seller
Posts e categorias sem vendor_id são da loja inteira. Posts de seller aparecem só na vitrine do seller. A lista mistura os dois por padrão.
Identificadores inválidos
Um id que não é UUID faz várias rotas responderem 500 em vez de 404. Valide o formato antes de chamar.
Endpoints
| Método | Caminho | Para que serve | Autenticação |
|---|---|---|---|
| GET | /api/v1/admin/blog/posts | Lista os posts do blog | admin |
| GET | /api/v1/admin/blog/posts/{id} | Devolve um post pelo id | admin |
| POST | /api/v1/admin/blog/posts | Cria um post do blog | admin |
| PUT | /api/v1/admin/blog/posts/{id} | Altera campos de um post | admin |
| DELETE | /api/v1/admin/blog/posts/{id} | Apaga um post definitivamente | admin |
| GET | /api/v1/admin/blog/posts/{id}/descriptions | Lista o conteúdo do post em cada idioma | admin |
| PUT | /api/v1/admin/blog/posts/{id}/descriptions | Cria ou atualiza o conteúdo por idioma | admin |
| GET | /api/v1/admin/blog/categories | Lista as categorias do blog | admin |
| POST | /api/v1/admin/blog/categories | Cria uma categoria do blog | admin |
| PUT | /api/v1/admin/blog/categories/{id} | Altera campos de uma categoria | admin |
| DELETE | /api/v1/admin/blog/categories/{id} | Apaga uma categoria do blog | admin |
| GET | /api/v1/admin/blog/categories/{id}/descriptions | Lista nome e descrição da categoria por idioma | admin |
| PUT | /api/v1/admin/blog/categories/{id}/descriptions | Cria ou atualiza nome e descrição por idioma | admin |
| GET | /api/v1/admin/blog/comments | Lista os comentários dos posts para moderação | admin |
| PUT | /api/v1/admin/blog/comments/{id}/approve | Aprova um comentário | admin |
| PUT | /api/v1/admin/blog/comments/{id}/reject | Rejeita um comentário | admin |
| DELETE | /api/v1/admin/blog/comments/{id} | Apaga um comentário | admin |
| POST | /api/v1/admin/blog/ai/featured-image/suggest-prompt | Sugere um texto para gerar a imagem de destaque | admin |
| POST | /api/v1/admin/blog/ai/featured-image/generate | Gera a imagem de destaque de um post com IA | admin |
Erros comuns
- Ler
statusdo post esperandopublished: a resposta traz a letraA. - Criar o post como
publishedcompublished_atno futuro e achar que ele sumiu: está agendado e só a vitrine o esconde; o painel mostra. - Reaproveitar o slug de outro post numa atualização: recusado com 500
already in use. - Apagar uma categoria em uso sem conferir os posts.
- Chamar
generaterepetidas vezes: cada sucesso gera custo. - Esquecer
titleem um idioma dedescriptions: a chamada inteira é recusada com 400.