Как назначить тему через API

Есть ли способ назначить через API? Я не вижу этого в документации, но был бы рад сюрпризу :slight_smile:

Редактирование: похоже, мне придётся попробовать реверс-инжиниринг этого!

Прежде всего, наша цель — обеспечить стабильность API. Это многолетняя задача, но мы определённо стремимся к этому результату.

В качестве разумного приёма на 2025 год вы можете положиться на ИИ-агентов, чтобы разобраться в подобных вопросах:

Вот пример того, как можно использовать нашего помощника GitHub для ответа на этот вопрос!

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

Привет!
Ещё нет! Этот проект был отложен в пользу более срочного, но я вернусь к нему на следующей неделе :slight_smile:

@tobiaseigen у меня это работает с Node.js

var https = require('https');

// Конфигурация
var CONFIG = {
  apiUrl: 'ВАШ_ДОМЕН_DISCOURSE',
  apiKey: 'ВАШ_API_КЛЮЧ',
  apiUsername: 'ВАШ_ПОЛЬЗОВАТЕЛЬ_API',
  assignToUsername: 'ИМЯ_ПОЛЬЗОВАТЕЛЯ_ДЛЯ_НАЗНАЧЕНИЯ'  // Имя пользователя, которому назначать темы
};

// ID тем для назначения
var topicIds = [634]; // замените на ID нужной темы

function assignTopic(topicId, callback) {
  var postData = JSON.stringify({
    target_id: topicId,
    target_type: 'Topic',
    username: CONFIG.assignToUsername
  });

  var options = {
    hostname: CONFIG.apiUrl,
    port: 443,
    path: '/assign/assign.json',
    method: 'PUT',
    rejectUnauthorized: false,
    headers: {
      'Api-Key': CONFIG.apiKey,
      'Api-Username': CONFIG.apiUsername,
      'Content-Type': 'application/json',
      'Content-Length': postData.length
    }
  };

  var req = https.request(options, function(res) {
    var data = '';

    res.on('data', function(chunk) {
      data += chunk;
    });

    res.on('end', function() {
      console.log('Статус:', res.statusCode);
      console.log('Полный ответ:', data);
      try {
        var response = JSON.parse(data);
        if (res.statusCode === 200) {
          console.log('Тема ' + topicId + ' успешно назначена');
        } else {
          console.log('Ошибка для темы ' + topicId + ':', response.errors || response.error_type || response);
        }
      } catch (e) {
        console.log('Ошибка парсинга:', e.message);
      }
      if (callback) callback();
    });

  });

  req.on('error', function(e) {
    console.error('Ошибка запроса для темы ' + topicId + ':', e);
    if (callback) callback();
  });

  req.write(postData);
  req.end();
}

// Выполнение последовательно
var index = 0;
function next() {
  if (index < topicIds.length) {
    assignTopic(topicIds[index], function() {
      index++;
      setTimeout(next, 500);
    });
  }
}

console.log('Назначение тем:', topicIds.join(', '));
console.log('Назначить пользователю:', CONFIG.assignToUsername);
console.log('');
next();

Discourse Assign предоставляет следующие API-эндпоинты:

Назначение (PUT /assign/assign.json)

Обязательные параметры:

  • target_id — ID темы или сообщения
  • target_type — либо "Topic", либо "Post"

Плюс один из следующих:

  • username — имя пользователя, которому назначается задача
  • group_name — имя группы, которой назначается задача

Необязательные параметры:

  • note — заметка о назначении
  • status — статус назначения
  • should_notify — отправлять уведомления (по умолчанию: true)

Отмена назначения (PUT /assign/unassign.json)

Обязательные параметры:

  • target_id — ID темы или сообщения
  • target_type — либо "Topic", либо "Post"

Примеры (curl)

# Назначить тему 123 пользователю "john"
curl -X PUT "https://your-discourse.com/assign/assign.json" \
  -H "Api-Key: YOUR_API_KEY" \
  -H "Api-Username: YOUR_USERNAME" \
  -H "Content-Type: application/json" \
  -d '{"target_id": 123, "target_type": "Topic", "username": "john"}'

# Назначить вместо этого группе
curl -X PUT "https://your-discourse.com/assign/assign.json" \
  -H "Api-Key: YOUR_API_KEY" \
  -H "Api-Username: YOUR_USERNAME" \
  -H "Content-Type: application/json" \
  -d '{"target_id": 123, "target_type": "Topic", "group_name": "support-team"}'

Примечания

  • Пользователь API должен иметь права на назначение (входить в группу, которой разрешено назначение)
  • Также можно назначать отдельные сообщения, используя target_type: "Post" с ID сообщения

@opcourdis пример на Node.js выше выглядит правильно! :+1:

Спасибо за информацию, приятно видеть, что мы можем включить все эти параметры