Quão "difícil" é modificar/estender o Discourse para um desenvolvedor backend

Olá,

Sou um MLE com alguma experiência em backend. Minhas habilidades de frontend são inexistentes/muito fracas.

Estou interessado em hospedar um pequeno fórum que requer os seguintes recursos:

  • Filtrar posts por múltiplas tags de forma fácil
  • Certas categorias ocultas a menos que o usuário esteja logado
  • Cadastros que precisam de aprovação do administrador
  • Carrossel de fotos no topo do site, potencialmente

Esse tipo de coisa é difícil de fazer? Tenho olhado o código de alguns plugins e, embora a implementação real seja bastante curta e simples de ler, parece difícil de escrever.

2 curtidas

Estou no mesmo barco que você. Tenho experiência com backend em nodejs. Também fiz um pouco de html/css/javascript no front-end, mas fiz muito mais backend. Há muito do que parece ser código especializado específico para discourse ou ruby ou um estilo de codificação muito opinativo, mesmo que eu conheça javascript, a base de código do discourse parece intimidante e complexa para mim. Estou pensando seriamente em tentar rodar minha própria IA local na qual eu possa alimentar toda a base de código e, em seguida, fazer perguntas sobre coisas que quero fazer. Fora isso, tudo o que posso fazer é ler o código existente, plugins, etc. e tentar dar o melhor sentido disso que puder. Se você estiver interessado em compartilhar conhecimento ou tentar aprender juntos, estou aberto a isso :slight_smile:

1 curtida

Sim, a curva de aprendizado é bastante acentuada. Mas todas as coisas que você menciona já existem e não será necessário nenhum código.

estão no Discourse principal, e

podem ser feitos com componentes de tema existentes.

5 curtidas

Eu mataria por alguns cursos em vídeo sobre desenvolvimento de discourse na Udemy. Apenas me diga em quem jogar dinheiro. :dollar_banknote::dollar_banknote::dollar_banknote:

2 curtidas

Não é necessário mexer para isso, já é suportado pela API. E você já pode fazer isso pelo front-end! Criei um “widget” (Componente Glimmer!) só para fazer isso!:

Este componente funciona em Blocos e Layouts da Barra Lateral Direita.

1 curtida

Isso poderia ser usado para criar uma hierarquia aninhada?

O fórum que estou considerando atende a pessoas mais velhas que nunca viram discussões como fóruns antes.

Seria bom para eles ainda poderem navegar em estruturas aninhadas como fóruns tradicionais.

1 curtida

Para aninhamento, use Categorias.

2 curtidas

Muitas instâncias do Discourse optam por isso, veja:

2 curtidas

Fora do tópico, mas isso foi muito útil aqui, adoro nosso recurso de explicar usando IA

um MLE no contexto fornecido refere-se a um Engenheiro de Machine Learning. Este é um profissional que se especializa no uso de dados e algoritmos para construir modelos que permitem às máquinas realizar tarefas sem serem explicitamente programadas para essas tarefas específicas. Eles geralmente têm uma forte formação em ciência da computação, estatística e programação, e sua experiência tende a se concentrar nos aspectos de backend da tecnologia, como a construção e implantação de modelos preditivos e outros produtos de machine learning. Quando o autor original menciona “um MLE”, ele está se identificando como um Engenheiro de Machine Learning que está familiarizado com o desenvolvimento de backend, mas que carece de experiência em desenvolvimento de frontend.

5 curtidas

Algumas reflexões sobre isso.

Desenvolvimento de cursos pagos de Discourse

A ideia de cursos relacionados ao desenvolvimento de Discourse em uma plataforma como Udemy ou Coursera é interessante. Suspeito que os principais problemas sejam que não há muitas pessoas fora da equipe do Discourse que seriam qualificadas para criar um curso em desenvolvimento de Discourse e que o número potencial de alunos para um curso é bastante pequeno. Dito isso, tenho certeza de que um bom curso relacionado ao desenvolvimento de temas ou plugins do Discourse poderia atrair alunos suficientes ao longo do tempo para justificar o esforço de criação de um curso.
Há também uma possível questão de que cobrar por cursos de Discourse pode ir contra o espírito deste fórum. Estou apenas especulando sobre isso, no entanto.

Tutoriais de desenvolvimento de Discourse

Acho que a observação de que a implementação real de muitos plugins, temas e componentes de tema do Discourse é bastante simples está correta. Assim como no desenvolvimento para outras plataformas, o problema é superar a barreira inicial de não entender como as partes se encaixam. A equipe do Discourse (ou outros desenvolvedores qualificados) poderia ajudar com isso escrevendo alguns tutoriais que guiam você por todo o processo de criação de temas funcionais, componentes de tema e plugins. Por exemplo, um guia passo a passo para criar algo como o componente de tema Discourse Placeholder.
Percebo que isso exigiria um grande investimento de tempo, então precisaria se alinhar com os objetivos de negócios do Discourse.

Recursos atualmente disponíveis

Com um pouco de pesquisa, há muitas informações boas sobre o desenvolvimento de Discourse neste fórum. Olhar exemplos de código do repositório GitHub do Discourse também é uma ótima maneira de aprender.
Uma ferramenta recente que não deve ser ignorada é o GitHub Copilot. Se você estruturar seu ambiente de desenvolvimento da maneira certa, ele pode ser útil para ter uma ideia de como desenvolver temas e plugins do Discourse. Para desenvolver temas do Discourse, a melhor abordagem que encontrei é desenvolver o tema (usando o Discourse Theme CLI) no diretório raiz da minha instalação local do Discourse. Estruturar as coisas dessa forma dá ao Copilot acesso fácil à base de código do Discourse. (Note que para desenvolvimento de plugins, a pasta plugins já está no diretório raiz /discourse.) (Note também que posso estar errado sobre o Copilot realmente acessar a base de código do Discourse que carreguei no meu IDE. Em qualquer caso, é útil ter o código principal do Discourse disponível para minha própria referência.)
Para evitar distrações e também para focar no uso do Copilot como uma ferramenta de aprendizado, desligo as Conclusões do Copilot no meu IDE (VS Code) e interajo com o Copilot apenas por meio de chat. Aqui está um exemplo do tipo de assistência que ele pode oferecer. (shopify.js é o arquivo criado pelo Theme CLI no diretório /javascripts/discourse/api-initializers/ do meu tema.)

Conversa com o Copilot

_scossar: Você pode explicar o que o export padrão em shopify.js está fazendo? É essencialmente o código boilerplate que é fornecido pelo Discourse quando um tema é criado com o gem discourse_theme. Eu alterei o código boilerplate para que ele registre cada mudança de página. Eu entendo a chamada para api.onPageChange, mas não tenho uma compreensão clara de como o objeto api está sendo injetado no meu código.

GitHub Copilot: O objeto api é injetado no seu código através da função withPluginApi que é chamada no método initialize do objeto retornado por apiInitializer.

Aqui está uma versão simplificada do que está acontecendo:

  1. Quando o Discourse inicia, ele executa todos os inicializadores.

  2. A função apiInitializer cria um inicializador que é executado após o inicializador \"inject-objects\".

  3. Quando este inicializador é executado, ele chama a função withPluginApi, passando os parâmetros version, cb e opts.

  4. A função withPluginApi verifica se a versão atual do Discourse é compatível com a versão especificada. Se for, ela chama a função de callback (cb) e passa a instância PluginApi como um argumento. Esta instância PluginApi é o objeto api que você vê no seu código.

Portanto, o objeto api é uma instância de PluginApi, e está sendo passado para o seu código pela função withPluginApi. Este objeto fornece vários métodos que permitem interagir com o Discourse, como onPageChange, que você já está usando.

_scossar: Então a função que é o segundo argumento para o export padrão em shopify.js é a função de callback que é aceita por apiInitializer?

GitHub Copilot: Sim, isso está correto. O segundo argumento para apiInitializer é uma função de callback. Esta função é chamada com a instância PluginApi como argumento quando o inicializador é executado (assumindo que a versão atual do Discourse seja compatível com a versão especificada). É assim que o objeto api é disponibilizado no seu arquivo shopify.js.

Depois que eu resolvi isso…

_scossar: …Outro pensamento, api.decorateCooked poderia ser usado para injetar um iframe de classificação hospedado em um aplicativo externo (por exemplo, hospedado pelo aplicativo Shopify que estou desenvolvendo)?

GitHub Copilot: Sim, você pode usar api.decorateCooked para injetar um iframe em uma postagem. Aqui está um exemplo aproximado de como você pode fazer isso:

api.decorateCooked($elem => {
  const postId = $elem.data('post-id');
  const iframe = document.createElement('iframe');
  iframe.src = `https://your-app.com/ratings?post_id=${postId}`;
  iframe.width = '100%';
  iframe.height = '200'; // ajuste conforme necessário
  $elem.append(iframe);
}, { id: 'rating-iframe' });

Neste exemplo, api.decorateCooked é usado para anexar um iframe a cada postagem. A fonte do iframe é definida como uma URL em seu aplicativo externo, com o ID da postagem incluído como um parâmetro de consulta. Você substituiria 'https://your-app.com/ratings' pelo URL real da sua página de classificações.

Por favor, note que este é um exemplo simplificado. Pode ser necessário ajustá-lo para atender às suas necessidades, e você definitivamente deve adicionar tratamento de erros e outras precauções necessárias para garantir que ele funcione corretamente e com segurança.

Não é razoável neste ponto esperar que o Copilot escreva todo o seu código, mas é uma ótima ferramenta para aprender a escrever código do Discourse.

Eu pensaria que ter menos categorias e menos hierarquia seria mais fácil para os idosos.

A menos que você tenha muito tráfego que interesse a pouquíssimas pessoas, você provavelmente não precisa de muitas categorias.