Cómo asignar un tema a través de la API

¿Hay alguna forma de asignar a través de la API? No lo veo en la documentación, pero me encantaría que me sorprendieran :slight_smile:

Editar: parece que intentaré hacer ingeniería inversa!

3 Me gusta

En primer lugar, nuestro objetivo es tener una API estable, es un esfuerzo de varios años llegar a eso, pero ciertamente es un lugar al que queremos llegar.

Mientras tanto, un truco razonable para 2025 que puedes usar es apoyarte en agentes de IA para resolver estas cosas:

Esto muestra cómo puedes aprovechar nuestro ayudante de GitHub para responder la pregunta:

4 Me gusta

¿Descubriste esto? Si es así, ¿puedes compartir lo que aprendiste aquí?

1 me gusta

¡Hola!
¡Aún no! Este proyecto se pospuso por algo más urgente, pero volveré a él la próxima semana :slight_smile:

4 Me gusta

@tobiaseigen esto me funciona usando node js

var https = require(‘https’);

// Configuración
var CONFIG = {
apiUrl: ‘YOURDISCOURSEDOMAIN’,
apiKey: ‘YOURAPIKEY’,
apiUsername: ‘YOURAPIUSER’,
assignToUsername: ‘USERNAMETOASSIGNTO’  // Nombre de usuario al que asignar temas
};

// IDs de temas a asignar
var topicIds = [634]; // cambiar con el id del tema

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('Status:', res.statusCode);
  console.log('Raw response:', data);
  try {
    var response = JSON.parse(data);
    if (res.statusCode === 200) {
      console.log('Tema ' + topicId + ' asignado correctamente');
    } else {
      console.log('Error en el tema ' + topicId + ':', response.errors || response.error_type || response);
    }
  } catch (e) {
    console.log('Error al analizar:', e.message);
  }
  if (callback) callback();
});

});

req.on(‘error’, function(e) {
console.error('Error de solicitud para el tema ' + topicId + ‘:’, e);
if (callback) callback();
});

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

// Ejecutar secuencialmente
var index = 0;
function next() {
if (index < topicIds.length) {
assignTopic(topicIds[index], function() {
index++;
setTimeout(next, 500);
});
}
}

console.log('Asignando temas:', topicIds.join(‘, ‘));
console.log('Asignar a:', CONFIG.assignToUsername);
console.log(’’);
next();
1 me gusta

El Discourse Assign expone estos endpoints de API:

Asignar (PUT /assign/assign.json)

Parámetros requeridos:

  • target_id - El ID del tema o publicación
  • target_type - Ya sea "Topic" o "Post"

Más uno de:

  • username - Nombre de usuario al que asignar
  • group_name - Nombre del grupo al que asignar

Parámetros opcionales:

  • note - Nota de asignación
  • status - Estado de la asignación
  • should_notify - Enviar notificaciones (por defecto: true)

Desasignar (PUT /assign/unassign.json)

Parámetros requeridos:

  • target_id - El ID del tema o publicación
  • target_type - Ya sea "Topic" o "Post"

Ejemplos (curl)

# Asignar el tema 123 al usuario "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"}'

# Asignar a un grupo en su lugar
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"}'

Notas

  • El usuario de la API debe tener permisos de asignación (estar en un grupo permitido para asignar)
  • También puedes asignar publicaciones individuales usando target_type: "Post" con el ID de la publicación

@opcourdis ¡El ejemplo de Node.js anterior parece correcto! :+1:

2 Me gusta

Gracias por compartir, es bueno ver que podemos incluir todos esos parámetros