Hola, actualmente estoy trabajando en un plugin específico pero aún no he podido averiguar por dónde empezar (he leído el material introductorio aquí, he instalado algunos plugins sencillos y he jugado un poco con su código fuente).
La configuración: Tengo un archivo CSV que contiene varios nombres de usuario del sistema y algunas etiquetas a las que están relacionados. Por ejemplo, una entrada “usuario1, etiqueta#1” dice: “usuario1 conoce la etiqueta#1”. Muchos usuarios pueden estar relacionados con una etiqueta y un usuario puede estar relacionado con muchas etiquetas. Además, este CSV se actualizará de vez en cuando (una vez casi todos los días). El archivo está en el mismo servidor que aloja la instancia de Discourse.
Cómo funcionaría idealmente el plugin: Lo explicaré usando un ejemplo de CSV y una imagen.
Dado este CSV, cada vez que se cree un tema con alguna de las etiquetas incluidas en el CSV (el autor del tema podría no estar en la lista). El resultado ideal debería ser el siguiente:
Es decir, basándose en la relación definida en el CSV, debería haber un texto pequeño o una insignia para cualquier usuario (OP u otros) que publique en un tema con una etiqueta con la que esté relacionado.
Estoy abierto a sugerencias sobre cómo lograr esto.
Por el lado de Rails, deberás agregar esas relaciones de usuario/etiqueta al serializador para que esos datos estén disponibles para el frontend. Busca otros complementos que llamen a add_to_serializer o búscalo en el código fuente de Discourse, ya que está bien documentado allí.
Luego, podrás usar un outlet de complemento en Ember para agregarlo a la página. La documentación del componente temático tiene ejemplos de eso.
Probablemente agregaría una ruta para administrar los campos de usuario personalizados en lugar de usar un archivo CSV, pero si quieres usar la vía del CSV, podrías tener un trabajo que lo lea cada hora o algo así, así que busca un complemento que tenga algo en jobs/scheduled.
Hay un repositorio de Discourse llamado all_the_plugins que a veces busco para encontrar ejemplos de cosas. Si navegas por github.com/discourse, deberías poder encontrarlo.
Gracias por la información. El modelo mental que tengo ahora es que debería agregar un campo personalizado a las etiquetas (como tag_description) llamado attached_users. Para el ejemplo anterior, la etiqueta n.º 1 debería tener attached_users: [“userOP”, “user1”].
Luego, debería agregar esto de alguna manera al serializador y averiguar cómo mostrarlo en la publicación.
Mientras pensaba en esto, tuve otra idea. Si uso discourse assign (Discourse Assign) para asignar estos usuarios a los temas según las etiquetas. Ya puedo recuperar esta información del tema y supongo que mostrarla sería más fácil. Sin embargo, discourse assign no proporciona ninguna forma de agregar usuarios mediante programación.
Me pregunto si pondría demasiado peso en el servidor. Porque habrá muchas asignaciones y, en la idea anterior, es esencialmente solo una asignación a etiquetas y no tiene que asignarse a cada tema por separado.
Añadir un campo personalizado de usuario llamado known_tags, una lista de cadenas.
Añadir una interfaz en el perfil de usuario donde el usuario pueda editar known_tags. No creo que sea necesario añadir una pestaña de perfil completamente nueva para esto, pero podrías hacerlo si quisieras. Si no quieres que los usuarios lo editen ellos mismos, haz que solo sea editable por los administradores y simplemente ve a los perfiles de usuario y actualízalo basándote en tu archivo CSV.
Añadir un hook de eventos que utilice los eventos before_create_post o post_created en el PostCreator para añadir el contenido que deseas a la publicación basándote en las etiquetas del tema.
Cómo hacerlo
Las partes 1 y 2 son muy similares a los plugins de ejemplo para otros modelos en el tema enlazado a continuación. Intenta deducirlo por analogía. Si te atascas de verdad, pídemelo y te daré una pista.
La parte 3 también irá en tu archivo plugin.rb. Se parecerá a esto:
Inténtalo tú mismo. Si te atascas de verdad, te ayudaré. Siempre estoy más inclinado a ayudar si hay pruebas sólidas de que estás intentando resolverlo tú mismo
Muchas gracias por proporcionar una hoja de ruta muy buena, ¡estoy en ello! Una pequeña pregunta:
¿Tiene que ser manual esta parte con este enfoque (por manual, me refiero a añadir entradas una por una a través de una interfaz)? Idealmente, me gustaría añadir esto usando mi clave API de administrador ya que el archivo csv está un poco cargado y crecerá con el tiempo.
No, no necesita ser manual. Hay bastantes maneras diferentes en las que podrías completar los campos personalizados del usuario basándote en el CSV. Realmente depende de cómo quieras manejar las actualizaciones. Sugeriría hacer las otras partes primero y simplemente probar esto con un pequeño conjunto de datos. Luego, si estás satisfecho con cómo funciona, añade una importación automática para el CSV. Hacer que esa parte sea eficiente es un paso secundario.