# Plugin Gatsby para usar o Discourse como CMS headless

**URL:** https://meta.discourse.org/t/gatsby-plugin-to-use-discourse-as-headless-cms/150532
**Category:** Development
**Created:** [5 Maio , 2020 22:07 UTC](https://meta.discourse.org/t/gatsby-plugin-to-use-discourse-as-headless-cms/150532 "2020-05-05T22:07:31Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![kristoferlund](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kristoferlund/32/140560_2.png) [@kristoferlund](https://meta.discourse.org/u/kristoferlund)
#### Post date: [5 Maio , 2020 22:07 UTC](https://meta.discourse.org/t/gatsby-plugin-to-use-discourse-as-headless-cms/150532/1 "2020-05-05T22:07:31Z")

</div>

Criei um plugin, não para o Discourse, mas para o Gatsby. O plugin busca listas de tópicos de uma instalação do Discourse e as transforma em nós do Gatsby. Ele simplifica o uso do Discourse como um CMS headless.

Usamos isso em um projeto para criar um microblog e um calendário que se atualiza automaticamente quando novo conteúdo é adicionado ao fórum.

Aqui está o microblog:

Origem: [https://foodshift.se/t/forenade-inkop-nyheter-blogg/290/9](https://foodshift.se/t/forenade-inkop-nyheter-blogg/290/9)  
Resultado: [https://forenadeinkop.se/blogg](https://forenadeinkop.se/blogg)

E, aqui está o calendário:

Origem: [https://foodshift.se/tags/c/events/13/forenade-inkop/l/agenda](https://foodshift.se/tags/c/events/13/forenade-inkop/l/agenda)  
Resultado: [https://forenadeinkop.se](https://forenadeinkop.se) (na parte inferior)

Espero que alguém mais encontre útil!

* * *

 ![Logo of gatsby-source-discourse-topic-list-logo](https://global.discourse-cdn.com/meta/original/3X/b/a/bac656b11ad65ee184d9c7217a26abccf640b510.png)

[![npm version](https://global.discourse-cdn.com/meta/original/3X/7/2/72ba11ceeae37a2546305f38790d1e5a8c887c27.svg)](https://www.npmjs.com/package/gatsby-source-discourse-topic-list) [![npm downloads](https://global.discourse-cdn.com/meta/original/3X/8/4/84029d948855f0d404c1c54b875e7ebefa93238f.svg)](https://www.npmjs.com/package/gatsby-source-discourse-topic-list)

**gatsby-source-discourse-topic-list** ajuda você a buscar listas de tópicos da plataforma de fórum de discussão [Discourse](https://www.discourse.org/) e transformá-las em nós do Gatsby.

Além da lista de tópicos fornecida pela API do Discourse, o plugin também busca o texto bruto de cada tópico.

## Começando

1. Instale o pacote com **yarn** ou **npm**

`yarn add gatsby-source-discourse-topic-list`

1. Adicione aos plugins no seu gatsby-config.js

```javascript
module.exports = {
    plugins: [
        {
            resolve: "gatsby-source-discourse-topic-list",
            options: {
                url: "https://meu-servidor-discourse.com"
                endPoint: 'top.json',
            }
        }
    ]
};

```

## Opções

| **Nome** | **Tipo** | **Descrição** |
| --- | --- | --- |
| url | objeto ou string | `Obrigatório.` URL da sua instalação do Discourse como uma string. Se você tiver duas APIs diferentes para desenvolvimento e produção, defina um objeto com as chaves `production` e `development`. |
| endPoint | string | `Obrigatório.` Qualquer endpoint da API do Discourse que retorne uma `topic_list`. |
| rootKey | string | `Opcional.` Nomeie sua API. |

### Exemplos de endpoints da API do Discourse

Tópicos mais recentes em uma categoria:

```plaintext
options: {
    url: "https://meta.discourse.org"
    endPoint: 'c/1.json',
}

```

Tópicos mais recentes em uma categoria, filtrados por tag:

```plaintext
options: {
    url: "https://meta.discourse.org"
    endPoint: 'tags/c/bug/1/pr-welcome.json',
}

```

Tópicos principais em uma categoria:

```plaintext
options: {
    url: "https://meta.discourse.org"
    endPoint: 'c/support/6/l/top.json',
}

```

Veja a [documentação da API do Discourse](https://docs.discourse.org/) para uma lista completa de endpoints.

### Exemplo de resultado

Observe o campo `raw` adicionado contendo o texto completo do tópico do post sem processamento.

```plaintext
{
  "users": [
    {
      "id": 0,
      "username": "string",
      "avatar_template": "string"
    }
  ],
  "topic_list": {
    "can_create_topic": true,
    "draft": {},
    "draft_key": "string",
    "draft_sequence": 0,
    "for_period": "string",
    "per_page": 0,
    "topics": [
      {
        "id": 0,
        "title": "string",
        "fancy_title": "string",
        "slug": "string",
        "raw": "O texto completo do tópico sem processamento no formato markdown", 
        ...
      }
    ]
  }
}

```

## Múltiplas Fontes? Múltiplas Instâncias!

Se você deseja buscar vários endpoints no seu projeto, basta instanciar o plugin várias vezes. Apenas certifique-se de definir uma `rootKey` diferente para cada instância.

## Créditos

Este plugin é baseado no excelente [gatsby-source-custom-api](https://github.com/AndreasFaust/gatsby-source-custom-api) de [Andreas Faust](https://github.com/AndreasFaust). 🙏

## Contribuindo

Toda contribuição é muito apreciada.  
Sinta-se à vontade para reportar bugs, recursos e solicitações de pull.

❤ Se este plugin for útil para você, dê uma estrela no [GitHub](https://github.com/kristoferlund/gatsby-source-discourse-topic-list).

---

<div class="post-metadata">

### Author: ![gingerman](https://avatars.discourse-cdn.com/v4/letter/g/47e85d/32.png) [@gingerman](https://meta.discourse.org/u/gingerman)
#### Post date: [6 Maio , 2020 02:59 UTC](https://meta.discourse.org/t/gatsby-plugin-to-use-discourse-as-headless-cms/150532/2 "2020-05-06T02:59:19Z")

</div>

Isso parece legal. Isso funciona com tópicos de categorias privadas? Estou falando do cenário de usar o Discourse como um CMS headless.

---

<div class="post-metadata">

### Author: ![kristoferlund](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kristoferlund/32/140560_2.png) [@kristoferlund](https://meta.discourse.org/u/kristoferlund)
#### Post date: [6 Maio , 2020 05:48 UTC](https://meta.discourse.org/t/gatsby-plugin-to-use-discourse-as-headless-cms/150532/3 "2020-05-06T05:48:37Z")

</div>

Atualmente não, mas é uma boa ideia. Não seria difícil adicionar. O acesso a conteúdo privado requer autenticação. Um nome de usuário e uma chave de API poderiam ser adicionados ao arquivo de configuração do Gatsby.

> [@How to allow user-agent access to private discourse?](https://meta.discourse.org/t/how-to-allow-user-agent-access-to-private-discourse/35537/8):
>
> Yes we do! To crawl the topics via Discourse API just provide your API key and username, and the requests made will be authenticated as regular user. For example: To achieve the same via cURL request, pass api\_key and api\_username as param. For example: curl -X GET -d api\_key="API\_KEY" -d api\_username="ADMIN\_USERNAME" http://discourse.example.com/latest.json ``` Both of the above examples will fetch all the latest topics (even for private Discourse instance). @Joey\_Tuan for more detaile…
