API를 통해 게시글 생성 및 토픽 잠금 시 발생하는 문제

API(gem)를 통해 토픽을 잠금 처리하고 있습니다. 잠금 해제 명령만 단독으로 실행하는 경우 잠금 및 해제가 정상적으로 작동하지만, 토픽에 게시글을 먼저 작성한 후 다음 명령으로 잠금 처리를 시도하면 게시글이 작성되고 토픽이 잠기긴 하지만, 그 직후 즉시 잠금이 해제됩니다!

이것은 정말 이상합니다. 게시글 작성만 하거나, 토픽 잠금만 단독으로 실행하면 정상적으로 작동합니다. 하지만 두 가지를 동시에 시도하면, 마지막에 토픽이 알아서 잠금 해제됩니다!

현재로서는 토픽을 잠금 처리하지 않기로 결정했지만, 조사할 가치가 있는 문제일 수도 있으므로 여기에 공유해 봅니다.

게시글을 생성한 직후 바로 잠금 처리하나요? 그렇다면 1분 정도 기다린 뒤 잠금 처리를 시도해서 잠금 상태가 유지되는지 확인해 보세요. 그냥 제 생각일 뿐입니다.

좋은 지적입니다. 시간이 되면 이 문제를 조사해 보겠습니다. 이 두 API 호출을 하나의 요청으로 결합하는 방식은 UI에서 사용되는 방식과 정확히 일치하지 않습니다(잠긴 상태의 새 주제를 생성할 수 없으므로). 따라서 해당 API 엔드포인트는 locked 플래그를 확인하지 않거나, 주제 생성 시 기본값으로 unlocked로 설정하는 것으로 보입니다.

오늘 이 문제를 잠깐 살펴보고 간단히 수정할 수 있을지 확인해 보았지만, 토픽에 적용할 수 있는 많은 작업들은 토픽이 생성된 후에 수행하는 것이 가장 좋습니다. 그 이유 중 하나는 토픽을 닫을 때 데이터베이스를 직접 업데이트하는 대신 TopicStatusUpdater를 사용해야 하기 때문입니다. 그러나 토픽 생성 중에 상태를 업데이트하면 첫 번째 게시물이 생성되기 전에 토픽이 닫히게 되어 다음과 같은 이상한 동작이 발생합니다:

현재로서는 두 개의 별도 API 요청을 보내야 합니다. 먼저 /posts.json으로 POST 요청을 보내고, 성공하면 /t/{id}/status.json으로 PUT 요청을 보내야 합니다.

블레이크, 안녕하세요. 제가 테스트했던 주제는 이미 존재합니다 :slight_smile:

제 작업 과정은 다음과 같습니다:

  bot.create_post(topic_id, post_content)
  bot.switch_to_master_bot!("system")
  bot.lock_topic("", topic_id)

  def create_post(topic_id, post_content)
    @client.create_post(
      topic_id: "#{topic_id}",
      raw: "#{post_content}",
    )
  end

  def lock_topic(slug, topic_id)
    params = { status: 'closed', enabled: true }
    @client.change_topic_status(slug, topic_id, params)
  end

저는 Discourse API Gem을 사용하고 있습니다.

위 코드가 작동해야 한다는(혹은 당신에게는 작동한다는) 말씀이신가요?

아, 알겠습니다. 제가 정확히 무엇을 하려는지 오해했네요. 기존 토픽에서 게시물을 작성한 뒤 동시에 닫으려는 줄 알았습니다. 하지만 기존 토픽에서 게시물을 작성하고 동시에 닫는 경우라면 이전 답변은 여전히 유효합니다. 두 개의 별도 엔드포인트를 사용하시면 됩니다.

블레이크, API Gem이 올바른/별개의 엔드포인트를 사용하고 있나요? (그렇게 알고 있었는데?)

client.create_post와 client.change_topic_status 메서드는 API Gem의 일부입니다 :slight_smile:

네, 해당 메서드들은 올바른 엔드포인트를 사용하고 있어요 :slightly_smiling_face:

그러면 이제 되겠지? (근데 안 돼 :sob:)

방금 로컬에서 코드를 테스트해 봤는데, 제 환경에서는 정상적으로 작동합니다. 어떤 부분이 작동하지 않는 건가요? 게시글은 생성되고 있지만, 토픽만 닫히지 않는다고 추정해 봅니다. 그렇다면 puts를 사용해 @client.change_topic_status(slug, topic_id, params)의 결과를 출력해 주시겠습니까?

참고로 API gem의 코드를 살펴봤는데, slug 변수를 전혀 사용하지 않고 있습니다. 따라서 해당 변수를 제거하도록 업데이트하겠습니다.