수천 개의 초대장을 일괄 생성하기

답은 "API에 수천 개의 요청을 쏟아붓는 것"일 거라 짐작하지만, 더 지능적인 방법이 있기를 바랐습니다.

상황은 이렇습니다. 대형 협동조합(Co-Op)을 위한 커뮤니티 사이트를 구축했습니다. 회원은 15,000명 이상이며, 이 중 95%는 사용자 계정을 만들지 않을 것이고, 나머지 4%는 계정을 만들더라도 사용하지 않을 가능성이 높습니다. 15,000명의 초대장을 위한 단일 링크를 생성하면 사이트가 악용될 수 있으므로, 저는 각 링크에 초대장이 하나씩만 포함된 16,000여 개의 초대 링크를 생성하고, 메일 템플팅 도구가 이를 자동으로 연결하도록 하려 합니다. 유일한 문제는 초대 링크 생성입니다. 프라이버시를 위해 시스템을 분리해야 하므로 15,000개 이상의 이메일 주소를 Discourse에 전달하지 않을 것입니다. 따라서 Discourse 서버는 전체 이메일 목록이 아니라 익명의 초대 링크 목록만 보유하게 됩니다.

Discourse에 주소를 저장하는 것이 다른 곳에 저장하는 것보다 더 위험하다고 생각하여 프라이버시 문제가 된다면, 직접 생성해야 합니다. API가 마음에 들지 않으면 rails에서 처리할 수 있습니다:

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

이렇게 하면 초대 키(invite key)가 반환됩니다.

"/invites/#{i.invite_key}"

이것이 URL입니다. 이들을 모두 파일에 기록하는 작업을 수행할 수 있습니다.

맞아, 그게 내 생각이야. 그래도 루프 안에서 반복해야 해 :slight_smile:
좋아, 고마워!

음, 정말 순진했네요. curl 명령어를 만들고 16,000회 실행하면 되겠지 했는데, 1분 만에 제 자신의 discourse에 의해 속도 제한(rate limit)을 걸렸어요 :slight_smile: :man_facepalming:

그래서, rails 초보자로서 discourse 컨테이너에서 셸을 열고 irb에 들어가서 실제로 무엇을 해야 할까요?

Bulk Invites를 사용해 보셨나요?

당연히 제 첫 번째 선택지는 그 방법이겠지만, 저는 사전에 이메일 목록을 가지고 있지 않습니다. 이건 신용조합 웹사이트인데, 관리부가 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을 가르쳐 달라고 귀찮게 하기엔 좀 그렇다. API 호출 사이에 1초 지연을 넣으면 속도 위반 통보를 받지 않는 걸 보니, 첫 실행은 그냥 느리게 가는 걸로 하자.

API 키가 “system” 사용자를 위해 생성되었기 때문에, 내 사용자 관리 화면에 초대 내역이 전혀 표시되지 않는다. 이제 "system"으로 로그인하지 않고 서버 전체의 초대 현황을 확인할 수 있는지 알아보는 여정을 떠나볼 것이다.

지금까지는 고맙다. 다음에는 좀 더 똑똑하고 영리한 질문을 할 수 있길 바란다 :slight_smile:

포럼의 “developer”(포럼 빌드 시 기본 관리자로 이메일이 제공되는 사용자)로 표시된 경우, system으로 로그인하는 것은 꽤 쉽습니다. @system의 사용자 페이지를 열고 Admin을 선택한 뒤, 맨 아래로 스크롤하여 Impersonate를 클릭하기만 하면 됩니다.

아, 그거였군요… 제가 그 아래까지 스크롤한 적이 없었네요 :slight_smile: 정말 멋진 기능이에요. 저는 다른 사이트에서 수년간 사용자로 Discourse를 이용해 왔지만, 관리자로서는 몇 가지 기본적인 부분들을 놓치고 있었네요…