Массовое создание тысяч приглашений

Полагаю, ответ — «бомбить API тысячами запросов», но я надеялся на более умное решение.

Сценарий: мы создали сайт сообщества для крупного кооператива. У нас более 15 000 участников; вероятно, 95% из них никогда не откроют учётную запись, а ещё 4% создадут учётную запись, но не будут её использовать. Создание единой ссылки для 15 000 приглашений открывает сайт для злоупотреблений, поэтому я хочу создать около 16 000 ссылок для приглашений, каждая из которых будет действительна только для одного приглашения, а инструмент для шаблонов рассылки позаботится об их объединении. Единственная сложность — создание ссылок для приглашений. Я хочу разделить системы ради конфиденциальности, поэтому не буду передавать адреса более 15 000 человек в Discourse; сервер Discourse будет хранить не полный список email-адресов, а только список анонимных ссылок для приглашений.

Если вы считаете, что хранение адресов в Discourse более опасно, чем где-либо ещё, и это вызывает у вас опасения по поводу конфиденциальности, вам нужно создавать их самостоятельно. Если вам не нравится API, вы можете сделать это через Rails:

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

Это сгенерирует ключ приглашения.

"/invites/#{i.invite_key}"

— это URL. Вы можете написать скрипт, который запишет все эти ссылки в файл.

Так я и думал, всё ещё нужно итерироваться в цикле :slight_smile:
хорошо, спасибо!

Окей, я был действительно наивен. Я составил команду curl и решил запустить её 16 тысяч раз, но через минуту мой собственный Discourse ограничил мне скорость запросов :slight_smile: :man_facepalming:

Так что, как новичок в Rails, мне нужно открыть оболочку в контейнере Discourse, запустить irb и что именно делать?

Попробовали ли вы использовать массовые приглашения?

Это было бы моим естественным выбором, только у меня нет заранее списка адресов электронной почты. Это сайт кредитного союза, поэтому руководство не может просто передать мне список из 15 500 адресов электронной почты и рисковать катастрофой с точки зрения конфиденциальности (да и я не хочу брать этот риск на себя). Поэтому мне нужно создать 16 000 ссылок, каждая из которых будет активирована только один раз, а затем они вставят их в свою рассылку. Надеюсь, в дальнейшем ситуация улучшится.

Я тоже предполагаю, что SSO-аутентификация здесь не применима.

В таком случае стоит поступить так, как предложил @pfaffman.

Например, вот так:

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}"
  # записать "/invites/#{i.invite_key}" в файл
end

Начните с циклов по 1 или 2 итерации, пока не добьётесь нужного результата.

Ленивый, но приемлемый способ — просто вывести все ссылки (puts) и записать сессию терминала в лог :smiley:

Знаете что, я не хочу начинать надоедать кому-либо, прося научить меня RoR через форум. Я заметил, что если добавлять задержку в 1 секунду между вызовами API, то предупреждения о скорости не возникает, поэтому этот первый запуск будет просто медленным.

Ключ API был создан для пользователя «system», поэтому все приглашения не отображаются на экранах управления моим пользователем. Теперь я займусь поиском способа увидеть общее количество приглашений на сервере без необходимости входа под аккаунтом «system», если это вообще возможно.

Спасибо пока, надеюсь, в следующий раз у меня будут более умные и хитрые вопросы :slight_smile:

Войти как system довольно просто, если вы отмечены как «разработчик» (электронные адреса предоставляются при создании форума в качестве администраторов по умолчанию). Вы можете просто открыть страницу пользователя @system, выбрать Администрирование, прокрутить страницу до самого низа и нажать Выдать себя за.

О, да, конечно… Я просто никогда не прокручивал так низко :slight_smile: Очень круто. Я годами использовал Discourse как пользователь на разных сайтах, но как администратор одного из них упустил несколько базовых нюансов…