Criando milhares de convites em massa

Eu suponho que a resposta seja “bombardear a API com milhares de requisições”, mas eu esperava que houvesse algo mais inteligente.

Cenário: Construímos um site comunitário para uma grande cooperativa. Existem mais de 15 mil membros, provavelmente 95% deles nunca abrirão um usuário e mais 4% criarão um usuário, mas nunca o usarão. Criar um único link para 15 mil convites abre o site para abuso, então o que eu quero fazer é criar cerca de 16 mil links de convite, cada um com apenas um convite, e a ferramenta de modelagem de e-mail cuidará de uni-los. A única ressalva é a criação do link de convite. Quero separar os sistemas por privacidade, então não vou alimentar os mais de 15 mil endereços para o Discourse, então o servidor Discourse não carregará a lista inteira de e-mails, apenas a lista de links de convite anônimos.

Se você acha que armazenar endereços no Discourse é mais perigoso do que em qualquer outro lugar onde você os armazena é uma preocupação de privacidade, você precisará criá-los. Se você não gosta da API, você pode fazer isso a partir do rails:

 i=Invite.generate(user, skip_email: true, max_redemptions_allowed: 1)

Isso lhe dá uma chave de convite.

"/invites/#{i.invite_key}"

É o URL. Você poderia fazer algo para escrever todos eles em um arquivo.

Era o que eu pensava, ainda preciso iterar em um loop :slight_smile:
Ok, obrigado!

Ok, eu fui realmente ingênuo. Eu criei a linha curl e pensei que apenas a executaria 16 mil vezes, mas depois de um minuto fui limitado pela taxa do meu próprio discourse :slight_smile: :man_facepalming:

Então, como novato em Rails, preciso abrir um shell no contêiner do discourse, entrar no irb e fazer o quê, na verdade?

Você já tentou usar Convites em Massa?

Esse seria o meu plano, naturalmente, só que eu não tenho a lista de e-mails com antecedência. Este é um site para uma cooperativa de crédito, então a gerência não pode simplesmente me entregar uma lista de 15.500 e-mails e arriscar um desastre de privacidade (e eu não quero correr o risco por conta própria). então eu tenho que criar 16.000 links com um único resgate em cada, e eles vão inserir isso em seu “canhão de e-mails”. Espero que melhore mais tarde.

Também presumo que não haja autenticação SSO que possa ser usada.

Nesse caso, o que @pfaffman sugeriu é o caminho a seguir.

Algo como

user = User.find_by(username: 'system')
16000.times do
  i = Invite.generate(user, skip_email: true, max_redemptions_allowed: 1)
  puts "/invites/#{i.invite_key}"
  # escreva "/invites/#{i.invite_key}" para o arquivo
end

Faria isso. Comece com loops de 1 ou 2 até que funcione como você pretende.

Uma maneira preguiçosa, mas aceitável, de fazer isso seria apenas imprimir todos eles (puts) e registrar sua sessão de terminal :smiley:

Sabe de uma coisa, não quero incomodar ninguém para me ensinar RoR em um fórum. Vejo que adicionar um atraso de 1 segundo entre as chamadas da API não me dá uma multa de velocidade, então esta primeira execução será apenas uma execução lenta.

A chave da API foi criada para o usuário “system”, então todos os convites não estão aparecendo nas minhas telas de gerenciamento de usuário. Agora vou embarcar em uma missão para ver o estado dos convites totais no servidor sem ter que fazer login como “system”, se é que isso é possível.

Obrigado por enquanto, espero ter perguntas mais inteligentes e perspicazes da próxima vez :slight_smile:

É bem fácil fazer login como system, se você for marcado como um “developer” (e-mails fornecidos ao construir o fórum como administradores padrão) do fórum. Você pode simplesmente abrir a página do usuário do @system, selecionar Admin, rolar até o final e clicar em Impersonate.

ah, claro… eu nunca tinha rolado tão para baixo :slight_smile: muito legal. Eu uso o Discourse como usuário em diferentes sites há anos, apenas me passaram algumas nuances básicas como gerente de um deles…