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.

4 curtidas

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

1 curtida

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.

1 curtida

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:

3 curtidas

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:

1 curtida

É 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.

1 curtida

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…

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.