Creación de notificaciones a través de la API

Hola, una pregunta rápida: ¿Puedes enviar notificaciones a los usuarios mediante la API? (o de otra manera).
En la documentación, encontré cómo obtener las notificaciones del usuario y cómo marcarlas como leídas, pero no cómo enviarlas mediante POST. Si no es posible, supongo que siempre existe la posibilidad de usar mensajes privados en su lugar.
Agradecería cualquier aporte al respecto. Gracias.

2 Me gusta

Creo que sería necesario un plugin. ¿Qué tipo de notificación deseas? ¿Podrías describir tu caso de uso?

2 Me gusta

Normalmente, se trata de reemplazar las notificaciones por correo electrónico de un servicio externo por las notificaciones de Discourse. El servicio se proporcionaría de forma gratuita a los miembros (*). Esto permitiría centralizar todo en Discourse y ofrecer un incentivo para iniciar sesión (regularmente) en el foro. Esa era la idea que tenía en mente. No estoy seguro de si tiene sentido o no, o si hay fallos en el razonamiento. Estoy abierto a cualquier sugerencia o crítica.

[ (*): Miembros = participantes del foro. Al menos las personas registradas en el foro. Queda por ver si se requiere un nivel mínimo de participación o confianza, o si el registro es suficiente. ]

¿El plugin recibiría la información y activaría las notificaciones en Discourse? ¿Las notificaciones se pueden realizar (más fácilmente) desde un plugin?

2 Me gusta

Puedo imaginar un plugin que agregara una ruta y permitiera enviar una carga con el ID de usuario (o dirección de correo electrónico), una URL y un título para crear una notificación. No creo que sea posible hacerlo sin un plugin, pero no he examinado el código con demasiada atención.

Ayer mismo empecé a considerar agregar notificaciones a un plugin que estoy desarrollando, por lo que no estoy muy familiarizado con cómo funciona.

3 Me gusta

Estoy planeando un plugin similar, centrando las notificaciones de mi sitio web (no por correo electrónico) en Discourse, a las cuales luego puedes suscribirte a través de MessageBus y tener una configuración central de notificaciones push.

Lo que planeo es simplemente tener un endpoint personalizado para crear notificaciones personalizadas; tras ver estos fragmentos, creo que es viable.

Para crear una notificación personalizada:

Para personalizar cómo se muestra el elemento de notificación en la lista de notificaciones:
https://github.com/discourse/discourse-code-review/blob/master/assets/javascripts/discourse/widgets/code-review-commit-approved-notification-item.js.es6

Si existiera una API central para crear la notificación, creo que este widget de elemento de notificación podría implementarse en un componente de tema, lo cual sería aún más sencillo.

4 Me gusta

No sé qué tan más complicado pueda ser hacerlo, pero ¿no tendría sentido agregar la creación de notificaciones directamente a la API? Quizás el equipo estaría dispuesto a hacerlo, o estarían abiertos a una PR (si alguien puede y está dispuesto a hacerlo)?

2 Me gusta

Aún no está documentado, pero existe un punto final de la API para crear notificaciones:

 POST /notifications(.:format) notifications#create {:format=>/(json|html|\*\/\*)/}

Es posible que puedas usar el tipo de notificación custom en lugar de tener que crear uno propio.

5 Me gusta

¡Eso es genial! Gracias.

Así que, si lo entiendo correctamente, con el endpoint, si hay necesidad de sobrescribir DefaultNotificationItem, ¿aún se necesitaría un plugin solo para registrar el tipo de notificación adicional que se usará en un widget personalizado?

Notification.types[:following] = 800

(de discourse-follow/plugin.rb at main · discourse/discourse-follow · GitHub)

Al usar el tipo custom, se renderizará utilizando https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/widgets/custom-notification-item.js, ¿así que para sobrescribir la url de destino aún se necesitaría un widget personalizado?

Vi que un plugin sobrescribe “custom-notification-item” (clothing-deals/assets/javascripts/discourse/app/widgets/custom-notification-item.js.es6 at master · Borasification/clothing-deals · GitHub) en un escenario similar. ¿Es seguro sobrescribir simplemente url cuando hay algo específico en data y recurrir a this._super.url en caso contrario?

2 Me gusta

¡Gracias, @renato!

Aquí está lo que tengo.

Notification.create!(
  notification_type: Notification.types[:custom],
  user_id: 1,
  topic_id: nil,
  post_number: nil,
  high_priority: true,
  data: {
    message: 'pfaffmanager.title',
    display_username: 'pfaffman',
    topic_title: 'my title'
  }.to_json
)

Veo la notificación, pero, previsiblemente, (EDIT:) NO PASA NADA si hago clic. Además (no me resultó obvio hasta que lo hice), el message es una I18n, no una cadena arbitraria… Lo que me gustaría es poder incluir la URL del modelo que la llamó.

2 Me gusta

Supongo que querías decir que no ocurre “nada”.
Si pudieras hacer clic y ser redirigido a una URL a la que te uniste a través de la API, eso sería realmente increíble.

2 Me gusta

El DefaultNotificationItem crea automáticamente una url si rellenas data.badge_id, topic_id o data.group_id.

Probé este enfoque y funciona. Solo rellena data.url y úsalo en un componente de tema:

  api.reopenWidget("custom-notification-item", {
      url(data) {
          return data.url || this._super(data);
      }
  })
4 Me gusta

No consigo que esto funcione…

POST https://XXX/notifications
Api-Key:XXX
Api-Username:system
Content-Type:application/json
Accept:application/json

{
    "notification_type":9,
    "user_id": 123,
    "post_number": 1,
    "topic_id": 956,
    "data": {
        "topic_title": "Test",
        "original_post_id": 2222,
        "original_post_type": 1,
        "original_username": "User.Name",
        "revision_number": 1,
        "display_username": "Text"
            }

}

Como respuesta obtengo:


{
  "errors": [
    "Data can't be blank"
  ],
  "error_type": "record_invalid"
}

¿Error de formato, malentendido? ¿O me falta algo en data?

No puedo realmente hacer ingeniería inversa de esto desde la web - ¿O se llama a esta API en algún sitio?

1 me gusta

Necesitas codificar el valor de data.

por ejemplo:

"data": "{\"topic_title\":\"Test\",\"original_post_id\":2222,\"original_post_type\":1,\"original_username\":\"User.Name\",\"revision_number\":1,\"display_username\":\"Text\"}"
4 Me gusta