Использование Discourse в качестве платформы для обзоров и обсуждений комиксов

У меня есть довольно специфичный сценарий использования, и я не уверен, подходит ли для него Discourse.

Я хотел бы создать платформу для обсуждений, посвящённую 5000–7000 комиксам. Однако мне не хочется размещать все обсуждения в рамках одной темы, так как в рамках одного комикса трудно отслеживать разные направления дискуссий. Поэтому я подумал создать «категорию» для каждого комикса, а под ней — отдельные темы. Кроме того, я читал, что это может создать нагрузку как на серверной, так и на клиентской стороне.

Отмечу, что навигация не является проблемой: у каждого комикса есть уникальный идентификатор, который известен участникам сообщества, поэтому никто не будет перебирать категории. Пользователь просто введёт идентификатор, чтобы найти нужную категорию.

Есть ли более подходящий способ реализовать аналогичную функциональность? Помогут ли теги?

Коротко: да, это правильный путь.

Могу ли я принудительно требовать использования тегов в каждом сообщении? В идеале на форуме не должно быть ничего, что не относится ни к одному из комиксов.

Посмотрите настройки «Категории — Теги»:

Можно ли программно заполнять теги? Одна из моих идей — создать тему для каждого тега (я полагаю, это единственный способ создания тега), но я не смог найти много информации о процедурной генерации тем.

Именно так я поступаю в своём сообществе настольных игр: всякий раз, когда в мою базу данных добавляется (или переименовывается) настольная игра, создаётся или обновляется тег и два пользовательских топика.

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

Что-то вроде этого:

const formData = new FormData();
formData.append("file", Buffer.from("the-tag-name,an-optional-tag-group"), {
  contentType: "text/csv",
  filename: "tags.csv",
});
const { data } = await axios.post(`${process.env.DISCOURSE_URL}/tags/upload.json`, formData, {
  headers: {
    ...formData.getHeaders(),
    "Api-Key": process.env.API_KEY,
  },
});

Понятно, можно посмотреть, как выглядит tags.csv?

См. What CSV format is needed for importing tags?

Я изучал похожий случай из практики США, где теги из одной группы тегов были обязательными и фактически использовались как структура верхнего уровня (заменяя категории).

В данный момент для тегов в атрибуте данных хранится только их название. Было бы здорово, если бы в атрибуте также хранилась их группа. Тогда мы могли бы различать группы тегов в пользовательском интерфейсе.

edit: опубликовал запрос на реализацию этой функции: Add a data-tag-group attribute for tags

Извините за множество вопросов, но меня интересует ещё одна функция, связанная с тегами и темами.

Возможно ли «закрепить» тему за определённым тегом так, чтобы при выборе этого тега закрепленная тема первой отображалась в списке тем?

Вы не можете закрепить тему в теге через стандартное модальное окно закрепления. Я знаю два варианта:

  • у тегов есть описания, которые можно отображать с помощью компонента баннеров тегов
  • некоторое время назад я создал компонент, позволяющий отображать темы на любых путях. Можете попробовать его: Topic Banners component

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

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