Tenho um site de membros (também em Rails) e estou usando a API do Discourse para criar e preencher automaticamente grupos de fórum restritos para todos os meus grupos de usuários. Isso funciona muito bem; até estou dando a cada grupo uma postagem de wiki para começar. (Já publiquei meu código.)
Agora, deparei-me com o problema de que, às vezes, preciso sincronizar manualmente a participação no grupo, por exemplo, ao fundir grupos no meu site ou quando o coordenador acidentalmente excluiu/adicionou pessoas via fórum. Para isso, quero excluir TODOS os membros do grupo no Discourse e depois re-adicionar aqueles que deveriam estar nele.
Primeiro problema: a API do Discourse parece não ter uma opção para excluir TODOS os membros de um grupo de uma vez, então preciso especificar os nomes de todos que devem ser excluídos.
Segundo problema: não consigo realmente recuperar a participação atual do grupo no Discourse, pois, por alguma razão, está pedindo o NOME do grupo em vez do ID. No meu site, armazenei apenas o ID do grupo, pois é isso que o Discourse usa para as solicitações PUT/POST/DELETE relacionadas.
Terceiro problema: deveria ser óbvio, mas não vejo como recuperar o nome do grupo fornecendo seu ID, a menos que queira recuperar todos os 200+ grupos e iterar sobre eles até encontrar um cujo ID corresponda. Isso parece um esforço ridículo e também vai contra as convenções do Rails.
O que estou esquecendo?
EDIT: @codinghorror foi muito útil da última vez — alguma ideia agora?
Parece que você está certo quanto a isso — não é possível acessar recursos de grupo usando o número do ID, apenas o nome.
O ID referenciado aqui não é um ID, mas sim o nome, conforme
Provavelmente faz sentido refatorar a rota /g/<nome-do-grupo> para seguir o mesmo padrão que usamos agora para tópicos e categorias. Algo como /g/<nome-do-grupo>/<id> ou /g/patrons/41, e permitir que /g/41 funcione da mesma forma.
Até que isso seja corrigido, no entanto, parece que a única maneira de realizar o que você deseja é:
Armazenar o nome do grupo junto com o ID
Fazer uma requisição GET em g/<nome-do-grupo>/members.json para obter os membros
Iterar sobre eles para deletar cada um, permitindo assim a re-sincronização.
Essa é uma questão incrível para investigar. Obrigado por trazê-la à tona, @Judith! Os grupos são muito poderosos e têm um potencial enorme! Notei esse problema recentemente também, ao analisar a manutenção da associação a grupos no WordPress. Seria bem legal poder adicionar/remover automaticamente pessoas dos grupos com base no país e região do mundo onde dizem estar, nos idiomas que falam, nos temas de interesse, etc., quando elas se cadastram e atualizam seus perfis no WordPress.
A sugestão do @justin de armazenar tanto o nome do grupo quanto o ID do grupo é excelente, e vou repassá-la às pessoas que estão trabalhando nessa integração agora.
Uma funcionalidade que também adoraria ver adicionada à interface é a capacidade de administradores ou proprietários de grupos removerem em massa todos os membros de um grupo e depois readicioná-los. Isso permitiria que eles resetassem manualmente as associações ao grupo de tempos em tempos com base em exportações do WordPress, mesmo que não tenham um sistema automatizado para adicionar/remover pessoas dos grupos conforme elas atualizam seus perfis no WordPress.
Recomendo usar SSO entre seu site principal e o Discourse. Assim, você terá o gerenciamento de associação a grupos de graça e contará com um endpoint sync_sso para atualizar a associação de maneira direta.
No início, eu usava apenas o SSO, mas depois encontrei o problema de que ele só atualiza a associação a grupos quando as pessoas fazem login. No caso de pessoas que não foram reeleitas, ou que de outra forma perderam o direito de acessar um grupo, ou ganharam o direito de acessar um grupo (e devem receber notificações por e-mail para mensagens no subfórum do grupo restrito), preciso adicioná-las/removê-las via API.
O sync_sso existe para resolver exatamente esse problema! Você pode acionar o que é efetivamente um login SSO “virtual” sempre que houver uma alteração de associação para sincronizar totalmente um usuário.