Olá, estou trabalhando em um plugin específico, mas ainda não consegui descobrir por onde começar (li o material introdutório aqui, instalei alguns plugins simples e brinquei um pouco com o código-fonte deles).
A configuração: Tenho um arquivo CSV que contém vários nomes de usuário do sistema e algumas tags às quais eles estão relacionados. Por exemplo, uma entrada “user1, tag#1” significa: “user1 conhece a tag#1”. Muitos usuários podem estar relacionados a uma tag e um usuário pode estar relacionado a muitas tags. Além disso, este CSV será atualizado de tempos em tempos (quase todos os dias). O arquivo está no mesmo servidor que hospeda a instância do Discourse.
Como o plugin funcionaria idealmente: Explicarei isso usando um exemplo de CSV e uma imagem.
CSV:
userOP, tag#1
userOP, tag#2
user2, tag#1
Dado este CSV, sempre que um tópico for criado com qualquer uma das tags incluídas no CSV (o autor do tópico pode não estar na lista). O resultado ideal seria o seguinte:
Ou seja, com base na relação definida no CSV, deve haver um pequeno texto ou um distintivo para qualquer usuário (OP ou outros) que postar em um tópico com uma tag à qual ele está relacionado.
Estou aberto a sugestões sobre como realizar isso.
Uma coisa que você precisará fazer no lado do Rails é adicionar essas relações de usuário/tag ao serializador para que esses dados estejam disponíveis para o front-end. Procure por outros plugins que chamam add_to_serializer ou procure por ele no código-fonte do Discourse, pois está bem documentado lá.
Em seguida, você poderá usar um plugin outlet no Ember para adicioná-lo à página. A documentação do componente de tema tem exemplos disso.
Eu provavelmente adicionaria uma rota para gerenciar os campos personalizados de usuário em vez de usar um arquivo CSV, mas se você quiser seguir o caminho do CSV, talvez queira um job que o leia a cada hora ou algo assim, então encontre um plugin que tenha algo em jobs/scheduled.
Existe um repositório do Discourse chamado all_the_plugins que às vezes uso para encontrar exemplos de coisas. Se você navegar por github.com/discourse, deverá encontrá-lo.
Obrigado pela informação. O modelo mental que tenho agora é que devo adicionar um campo personalizado às tags (como tag_description) chamado attached_users. Para o exemplo acima, a tag#1 deve ter attached_users: [“userOP”, “user1”].
Em seguida, devo adicionar isso de alguma forma ao serializador e descobrir como exibi-lo na postagem.
Enquanto pensava nisso, tive outra ideia. Se eu usar o discourse assign (Discourse Assign) para atribuir esses usuários aos tópicos com base em tags. Já consigo recuperar essas informações do tópico e acho que exibi-las seria mais fácil. No entanto, o discourse assign não oferece nenhuma maneira de adicionar usuários programaticamente.
Gostaria de saber se isso sobrecarregaria o servidor. Porque haverá muitas atribuições e, na ideia anterior, é essencialmente apenas uma atribuição a tags e não precisa ser atribuída a cada tópico separadamente.
Adicionar um campo personalizado de usuário chamado known_tags, uma lista de strings.
Adicionar uma interface no perfil do usuário onde o usuário possa editar known_tags. Não acho necessário adicionar uma aba de perfil totalmente nova para isso, mas você pode se quiser. Se você não quiser que os usuários editem sozinhos, basta torná-lo editável apenas por administradores e entrar nos perfis dos usuários e atualizá-lo com base no seu arquivo CSV.
Adicionar um hook de evento que use os eventos before_create_post ou post_created no PostCreator para adicionar o conteúdo que você deseja à postagem com base nas tags do tópico.
Como fazer
As partes 1 e 2 são muito semelhantes aos plugins de exemplo para outros modelos nos tópicos vinculados abaixo. Tente descobrir por analogia. Se você ficar realmente preso, peça-me uma dica lá.
A parte 3 também irá no seu arquivo plugin.rb. Parecerá algo assim
Tente você mesmo. Se você ficar realmente preso, eu ajudarei. Estou sempre mais inclinado a ajudar se houver fortes evidências de que você está tentando descobrir sozinho
Muito obrigado por fornecer um roteiro muito bom, estou nele! Pequena pergunta:
Esta parte tem que ser manual usando essa abordagem (por manual, quero dizer adicionar entradas uma por uma através de uma interface)? Idealmente, eu gostaria de adicionar isso usando minha chave de API de administrador, já que o arquivo csv é um pouco carregado e crescerá com o tempo.
Não, não precisa ser manual. Existem várias maneiras de preencher os campos personalizados do usuário com base no CSV. Realmente depende de como você deseja lidar com as atualizações. Sugiro fazer as outras partes primeiro e apenas testar isso com um pequeno conjunto de dados. Em seguida, se você estiver satisfeito com o funcionamento, adicione uma importação automática para o CSV. Tornar essa parte eficiente é um passo secundário.