Как программно получить external_id для темы

Всем привет,

Мне нужно программно получить remote_id для темы. Контекст: я запускаю скрипт на api.onPageChange, который извлекает информацию о текущей теме/категории/группе, а затем выполняет Ajax-запрос к внешней системе для получения дополнительной информации, специфичной для сущности.

У меня есть событие (ember?) api.onPageChange, и, кажется, я могу получить всю необходимую информацию, кроме значения remote_id (я использую имя поля из API).

Вот что у меня есть на данный момент:

const topicController = api.container.lookup(“controller:topic”);
if (topicController) {
const thisTopic = topicController.get(“model”);
if (thisTopic) {
console.log(thisTopic.category.id); // например .. работает отлично.

.. я могу получить различные поля, всё работает прекрасно .. но я не могу найти способ получить Remote ID (хотя он мне нужен). Я знаю, что могу получить его через JSON-запрос (добавив .json к URL текущей страницы), но это кажется неэффективным.. или я ошибаюсь, и мне стоит использовать этот подход? Есть ли какие-либо другие рекомендации?

Заранее спасибо!

Просто для уточнения: remote_id — это реальное имя поля, которое вы ищете? Насколько мне известно, Discourse не использует это поле.

Аах.. извините, @simon (и спасибо, что проверили вопрос) .. «external_id» — это правильное имя, согласно API.

Я думаю, что на самом деле проверял правильное имя (external_id), но потом перепутал его, когда писал вопрос здесь .. но мне определенно нужно это проверить. Прямо сейчас я не могу этого сделать, но вернусь к этому позже сегодня.

Еще раз спасибо, я ценю это!

Так-так… Я по ошибке искал не то поле/значение, а правильное (external_id). Извините за потраченное время… Если это хоть как-то утешит, я сам потратил на это кучу своего времени :frowning: :slight_smile:

Плохая новость в том, что я нигде не могу найти external_id в модели Ember. Я не знаком с Ember, поэтому просто шарюсь наугад… Я могу найти много другой очень полезной информации о Topic, но не external_id (я вывел модель Topic в консоль и уже обыскался).

Есть какие-то подсказки, @simon или кто-нибудь? Спасибо еще раз.

external_id — это свойство модели SingleSignOnRecord. Оно используется для связывания пользователя с внешним сайтом, когда DiscourseConnect применяется для входа в Discourse через внешний ресурс. Если вы ищете именно это, то на уровне темы (Topic) оно недоступно. Насколько мне известно, Discourse возвращает external_id на фронтенде только для CurrentUser. Поэтому, если вы пытаетесь получить external_id автора темы, это может оказаться нетривиальной задачей.

Если вы предоставите больше подробностей о том, что именно вы хотите достичь, кто-то здесь сможет помочь. Возможно, существуют более простые способы решения вашей задачи, чем тот, который вы сейчас используете.

Ничего страшного. Для этого мы здесь и находимся :slight_smile:

Большое спасибо всем участникам!

Итак, я планирую запускать несколько экземпляров Discourse, а также общую (не связанную с Discourse) систему администрирования и координации на заднем плане. Темы будут добавляться в Discourse двумя способами: либо пользователями через стандартный механизм создания тем в Discourse, либо системой администрирования/координации через API.

Если тема создаётся через API, она обычно представляет собой задачу или аналогичный элемент рабочего процесса, у которого уже есть свой собственный идентификатор вне Discourse — назовём его «внешним ID» (External ID).

Если же тема создаётся пользователем внутри Discourse, мы будем использовать вебхуки для запуска Azure-функции, которая создаст в центральной системе подобный «заглушечный» клон (чтобы сообщения из Discourse были связаны с более широким потоком контента, задач и т. д.). Таким образом, тема в Discourse также косвенно получит уникальный «внешний ID», который мы предлагаем обновлять в теме через API.

У нас есть собственный компонент темы Discourse, который при каждой загрузке темы с помощью Ajax запрашивает информацию, не связанную напрямую с Discourse, из центральной системы и отображает её на экране темы.

Хотя мы могли бы использовать ID темы в Discourse для параметризации Ajax-запроса и поиска соответствующих данных, эффективнее использовать «внешний ID» (это просто чище, есть несколько причин — это избегает лишних поисков и т. д.).

Мы могли бы легко хранить «внешний ID» в пользовательском поле — у нас уже есть такое поле для других данных, — но мы заметили, что в API тем есть поле «external_id», которое выглядит в точности как то, что нам нужно, и я предпочитаю использовать его по разным причинам: это упрощает включение этого важного поля в отчёты, экспорт, возможно, будущие поиски и т. д.

Смотрите скриншот с Discourse API Docs

Полагаю, это довольно новое поле — большинство советов на форуме относятся к полю User external_id, которое мне сейчас не нужно. Как уже упоминалось выше, я получаю модель Ember для темы (в рамках моего пользовательского компонента темы) и могу получить почти всю информацию о теме через неё… но не поле external_id.

(Как уже сказано выше — я получаю тему с помощью этого кода, заимствованного откуда-то с этого сайта, сейчас не помню откуда:

        const topicController = api.container.lookup("controller:topic");
        if (topicController) {
            const thisTopic = topicController.get("model");      

Итак, вопрос: поле external_id, специфичное для темы, где-то спрятано в модели («thisTopic»), или я неправильно понимаю эти концепции и мне просто следует использовать пользовательское поле для хранения этого внешнего ID (я знаю, что могу заставить этот подход работать, и как!.. Мне просто нравится чистота и готовность к будущему при использовании отдельного external_id, если он действительно доступен).

Ещё раз спасибо за помощь, я очень ценю это!

Раньше я этого не замечал. Несколько лет назад я искал что-то подобное для связывания идентификаторов записей WordPress с темами Discourse.

Свойство external_id темы будет возвращено на клиенте только в том случае, если у темы есть external_id. Если у темы его нет, вы не получите значение null. Это работает у меня для тем, у которых есть external_id:

<script type="text/discourse-plugin" version="0.11.0">
api.onPageChange (() => {
    const c = api.container.lookup("controller:topic");
    if (c) {
        const m = c.get("model");
        if (m && m.hasOwnProperty('external_id')) {
        console.log("the external_id is ", m.external_id);
        }
    }
});
</script>

… и вот так, из «невозможного» это превращается в «потрясающее» :slight_smile: … великолепно, это настоящий прорыв для меня. Я даже не подумал, что модель может быть переменной, но это имеет полный смысл.

Огромное спасибо, @simon, в том числе за элегантный фрагмент кода!