Criar usuários staged via API?

Estou pensando na ideia de construir um serviço de ponte webhook+API para conectar categorias específicas em dois fóruns Discourse diferentes. A ideia geral seria:

  1. Um webhook em cada servidor para eventos de Tópico e Postagem[1]
  2. Um listener que recebe esses eventos e os replica no servidor oposto via API
    • Uh, algo para evitar loops, obviamente[2]
    • Verificar se um usuário com o mesmo endereço de e-mail existe no servidor oposto[3]
    • Se nenhum usuário existir, criar um usuário “staged” (preparado)
    • Alterar as configurações de notificação do usuário “staged” para que ele não receba notificações por e-mail[4]
    • Criar ou atualizar a postagem sob o usuário real ou “staged” apropriado
  3. Provavelmente uma rotina programada para percorrer os tópicos e garantir que nada foi perdido, e possivelmente reordenar para que ambos os lados concordem.

Do Understanding user statuses, roles, and permissions, acho que os usuários “staged” fariam basicamente o que queremos – se alguém criasse uma conta com esse endereço de e-mail mais tarde, ele poderia “reivindicá-la” e interagir com todas as suas postagens como se estivesse lá o tempo todo.

Mas, existe uma maneira de criar um usuário “staged” a partir da API? Não vejo isso em Discourse API Docs.


  1. e possivelmente também eventos de Curtir e Resolvido, mas não na primeira versão ↩︎

  2. Eu definitivamente pensei sobre isso antes de escrever esta lista ↩︎

  3. usando endereços de e-mail como chave porque os sistemas de contas podem não ter os mesmos nomes de usuário ↩︎

  4. Vi uma postagem sobre isso ser possível em algum lugar por aqui… ↩︎

Não tenho certeza se é isso que você quer?

3 curtidas

Bem, mais ou menos. Como o OP naquele tópico diz, em resposta a isso…

… e lá, a resposta é basicamente injetar um e-mail e deixar o código de tratamento de e-mail cuidar disso. Mas isso não funciona para este caso, porque preciso intervir e desativar as notificações por e-mail para o usuário antes de criar a postagem.

Acontece que temos SSO-overrides-username ativado para um lado da ponte proposta, então acho que apenas criar algo como ‘othersite-user’ pode ser uma solução alternativa… mas isso não funcionará necessariamente sem essa configuração de SSO.

Se passar staged: true para a chamada de criação de usuário administrador não funcionar, suspeito que estaríamos abertos a um PR para habilitar isso.

(É um recurso um tanto quanto nichado fora do seu caso de uso, eu acho?)

Talvez você pudesse usar a rota handle_mail para postar um e-mail falso como o usuário? (Ah, como @blake sugere)

Isso criaria o usuário em staging, se necessário, e o tópico ao mesmo tempo.

2 curtidas

Com essa abordagem, parecerá que os usuários criaram tópicos e respostas por e-mail. Usuários em estágio só podem criar postagens por e-mail. Você receberá um erro de acesso inválido se tentar criar uma postagem não por e-mail para um usuário em estágio por meio da API.

Algo sobre a abordagem de usuário em estágio não me parece certo. Pode valer a pena consultar seus usuários para ver se eles têm alguma preocupação. Se você pudesse obter permissão de seus usuários, poderia simplesmente criar usuários ativos não em estágio no site espelhado e, em seguida, postar seus tópicos e comentários por meio da API.

Passar staged: true cria um usuário em estágio. Presumo que um usuário criado dessa forma poderá postar por e-mail. Meu site de desenvolvimento local não está configurado para enviar e-mails para o Discourse, então não posso testar isso no momento.

1 curtida

Eu tenho pensado em usar o Discourse como um processador genérico de formulários para lidar com formulários de contato. Eu odeio formulários de contato, mas alguns usuários preferem usar um formulário de contato do que enviar um e-mail. Mesmo que eu ache que essas pessoas tomam decisões ruins, eu gostaria de facilitar o contato delas comigo para que possam me dar dinheiro.

Seria muito útil poder criar uma mensagem que crie um usuário em estágio sem ter que recorrer a algum outro sistema para processar o formulário e enviar um e-mail.

Eu presumo que precisarei criar um plugin para fazer isso, mas esse é o meu plano.

Esta é uma das únicas coisas que me restam para descobrir para me livrar do WordPress.

Então, talvez o que eu faça no plugin seja criar a postagem como se fosse um e-mail. Isso pode não ser muito difícil em um plugin. E isso provavelmente tornaria possível via API.

2 curtidas

Eu acho que você poderia usar um Wizard (:mage: Custom Wizard Plugin) para conseguir isso sem muito incômodo. Você pode fazer wizards anônimos agora. Ficarei feliz em te ajudar se precisar!

3 curtidas

Sim, isso funciona: Creating a staged user with an API call - #8 by blake.

1 curtida

Ah! Claro. É assim que o receptor de e-mail entrega o e-mail. Acho que quero um endpoint que aceite campos arbitrários de qualquer formulário, os coloque em um tópico e os entregue para mim. Isso me impediria de ter que expor uma chave de API (com escopo apenas para entregar e-mail, não parece tão ruim, ter javascript processando o formulário e depois entregando-o ao endpoint existente).

1 curtida