Проблемы с созданием поста и закрытием темы через API

Я блокирую тему через API (gem), и могу её заблокировать и разблокировать, если это единственная команда в цепочке. Однако, если я сначала создаю пост в теме, а следующей командой идёт её блокировка, то пост создаётся, тема блокируется, но затем она немедленно разблокируется!

Это очень странно. Если я только создаю пост или только блокирую тему, всё работает нормально. Но если я пытаюсь сделать и то, и другое, в конце тема разблокируется сама собой!

Пока я решил просто не блокировать тему, но подумал, что стоит написать здесь, на случай если это стоит investigate.

Вы блокируете тему сразу после создания поста? Если да, попробуйте подождать минуту, а затем снова заблокировать её и посмотреть, останется ли она заблокированной. Просто мысль.

Хорошее замечание, я изучу это, как только появится возможность. Объединение этих двух вызовов API в один запрос не совсем соответствует тому, как это делается в интерфейсе (нельзя создать новую тему с заблокированным статусом), поэтому данный конечный пункт API, скорее всего, не ожидает флага заблокированности или по умолчанию устанавливает его в разблокированное состояние при создании темы.

Я сегодня немного изучил этот вопрос, чтобы понять, можно ли быстро внести изменения, но многие действия, которые можно применять к темам, лучше выполнять после того, как тема уже создана. Одна из причин в том, что нам действительно следует использовать TopicStatusUpdater для закрытия темы, а не обновлять её напрямую в базе данных. Однако при обновлении статуса во время создания темы она, похоже, закрывается до создания первого поста, что приводит к такому странному поведению:

На данный момент вам потребуется выполнить два отдельных API-запроса: POST-запрос к /posts.json, а затем, если он успешен, PUT-запрос к /t/{id}/status.json.

Привет, Блейк, тема, для которой я пробовал это, уже существует :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).

Кстати, глядя на код в gem-библиотеке api, мы вообще не используем переменную slug, поэтому я обновлю код, чтобы удалить её.