Se você possui um site comunitário que também (mas não exclusivamente) usa o Discourse, talvez queira fornecer um subfórum restrito para cada um dos seus grupos, por exemplo, como um espaço de trabalho. Veja como fazer isso em Ruby:
-
Certifique-se de que suas chamadas de API sejam autenticadas como um usuário com privilégios de Administrador.
-
Crie um grupo de fórum incluindo os líderes do seu grupo e os usuários regulares
params = {
"group": {
"name": "<group_name_with_underscores>",
"full_name": "<group name>",
"title": "Membro de <group name>", # opcional: flair do fórum para membros do grupo
"mentionable_level": 99, # opcional: quem pode @ mencionar este grupo?
"messageable_level": 99, # opcional: quem pode enviar mensagens para todo o grupo?
"owner_usernames": "<nomes de usuário do fórum dos líderes do grupo separados por vírgula>",
"usernames": "<nomes de usuário do fórum dos outros membros do grupo separados por vírgula>"
}
}
r = Discourse.make_request("/admin/groups.json", params, "POST", true)
Se for bem-sucedido, localize o campo ‘id’ na resposta e anote-o; esse é o ID do seu grupo.
- Mantenha o grupo externo e o grupo de fórum sincronizados
# novos membros simples
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<novos_membros como string separada por vírgula>"}, "PUT", true)
# novos líderes
r = Discourse.make_request("/admin/groups/#{group_id}/owners.json", {"group": { "usernames": "<novos nomes de usuário de líderes do fórum separados por vírgula>" }}, "PUT", true)
# remover membros que saíram
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<membros_saindo como string separada por vírgula>"}, "DELETE", true)
- Crie uma subcategoria (também conhecida como subfórum) acessível apenas a este grupo. Recomendo criar manualmente um subfórum “Workspaces” ou “Restricted” ou algo similar, que será a categoria pai para todos esses, e posicioná-lo no final das suas categorias. Observe que este fórum contêiner deve ter a permissão “Todos podem ver” (caso contrário, o Discourse retornará um erro) e provavelmente não deve permitir que ninguém escreva. Em seguida, você pode criar programaticamente subfóruns para cada novo grupo.
params = {
"name": "<nome do subfórum, por exemplo, o mesmo que o nome completo do grupo>",
"color": "<qualquer coisa>", # opcional
"text_color": "<qualquer coisa>", # opcional
"permissions": {
"<seu nome de grupo com underlines>": "1",
"admins": "1", # se você não tiver isso, talvez não consiga excluir seu subfórum, exceto via API
"moderators": "1"
},
"parent_category_id": "<veja a nota acima>",
"allow_badges": true, # opcional
"suppress_from_latest": true, # opcional
}
r = Discourse.make_request("/categories.json", params, "POST", true)
Se for bem-sucedido, anote o ID da categoria que você recebe em retorno.
- Talvez você queira pré-preencher este subfórum. Vou dar ao meu grupo um post wiki fixado para compartilhamento de conhecimento e planejamento.
# faça um post regular neste subfórum
post_msg = "Bem-vindo! Este post é editável por todos os membros do grupo e pode ser usado como um repositório de conhecimento, bem como para acompanhar projetos comuns.\n\n**A seguir, um modelo que você pode decidir usar ou não.**\n\n**Links úteis para membros do grupo:**\n\n- Link 1\n\n- Link 2\n\n- Link 3\n\n**Estes são os projetos em que estamos trabalhando atualmente:**\n\n- Projeto 1 - *iniciado*. Envolvidos: Membro 1, 2 e 3\n\n- Projeto 2 - *fase de planejamento*. A ser discutido em nossa próxima reunião na segunda-feira."
params = { "raw": post_msg, title: "Wiki de Conhecimento para #{group_name}", "category": category_id, "archetype": "regular"}
r = Discourse.make_request("/posts", params, "POST", true)
if r and r.status == 200
my_post = JSON.parse(r.body)
post_id = my_post["id"]
topic_id = my_post["topic_id"]
# transforme-o em um wiki
begin
r = Discourse.make_request("/posts/#{post_id}/wiki", {"wiki": true}, "PUT", false)
rescue JSON::ParserError # A API do Discourse retornará uma resposta JSON inválida, mas felizmente não precisamos analisar isso
end
# fixe este tópico
r = Discourse.make_request("/t/topic/#{topic_id}/status", {
"status": "pinned",
"enabled": "true", # cuidado: deve ser uma string, caso contrário, desfixa o tópico
"until": "3020-01-01 08:00+1:00" # para sempre
}, "PUT", false)
end
Divirta-se!