Recibir notificaciones a través de la API

Si tiene un sitio web o una aplicación existente y desea fomentar la discusión en su foro de Discourse, puede ser útil mostrar las notificaciones de Discourse dentro de su aplicación. Esta guía le mostrará cómo utilizar la API de Discourse para obtener notificaciones de un usuario y cómo marcarlas como leídas.

La forma recomendada de utilizar la API es hacer que su aplicación realice solicitudes de back-end a Discourse y luego pase esos datos a la capa de front-end/presentación de su aplicación.

Consulte la Documentación de la API para obtener información sobre cómo utilizar la API de Discourse.

Obtener notificaciones para un usuario

Para obtener notificaciones a través de la API, puede realizar una solicitud GET autenticada al endpoint /notifications. Puede especificar el nombre de usuario para el que está obteniendo notificaciones en el encabezado Api-Username o como un parámetro de consulta: /notifications?username=<username>.

Parámetros de consulta opcionales

Parámetro Descripción
username El nombre de usuario para el que se obtendrán las notificaciones
filter Filtrar por estado de lectura: read o unread
filter_by_types Lista separada por comas de nombres de tipos de notificación para filtrar (ej. mentioned,replied)
offset Desplazamiento para la paginación
limit Número de notificaciones a devolver (máx. 60)

Solicitud de ejemplo

curl -X GET "http://localhost:8080/notifications.json?username=blake.erickson" \
-H "Api-Key: e81c4022f148c872a98fb38dac1d9619c7f5b245b42ba98fa467968bbed7551e" \
-H "Api-Username: system"

Esto devolverá la siguiente respuesta JSON:

{
  "notifications": [
    {
      "id": 3,
      "user_id": 5,
      "external_id": null,
      "notification_type": 12,
      "read": true,
      "high_priority": false,
      "created_at": "2019-06-17T20:26:05.670Z",
      "post_number": null,
      "topic_id": null,
      "slug": null,
      "data": {
        "badge_id": 41,
        "badge_name": "First Emoji",
        "badge_slug": "first-emoji",
        "badge_title": false,
        "username": "blake"
      }
    },
    {
      "id": 2,
      "user_id": 5,
      "external_id": null,
      "notification_type": 6,
      "read": true,
      "high_priority": true,
      "created_at": "2019-06-17T20:26:04.305Z",
      "post_number": 1,
      "topic_id": 10,
      "fancy_title": "Greetings!",
      "slug": "greetings",
      "data": {
        "topic_title": "Greetings!",
        "original_post_id": 14,
        "original_post_type": 1,
        "original_username": "discobot",
        "revision_number": null,
        "display_username": "discobot"
      }
    }
  ],
  "total_rows_notifications": 2,
  "seen_notification_id": 3,
  "load_more_notifications": "/notifications?offset=60&username=blake"
}

Esto devuelve un array de notificaciones. Si solo le interesa mostrar las notificaciones no leídas, puede pasar el parámetro de consulta filter=unread para que el servidor devuelva solo las notificaciones no leídas. Por ejemplo:

curl -X GET "http://localhost:8080/notifications.json?username=blake.erickson&filter=unread" \
-H "Api-Key: e81c4022f148c872a98fb38dac1d9619c7f5b245b42ba98fa467968bbed7551e" \
-H "Api-Username: system"

Puede visitar esta página para obtener una lista de tipos de notificación. Por ejemplo, el tipo de notificación 12 corresponde a “granted_badge” (insignia otorgada).

Marcar notificaciones como leídas

Ahora que ha obtenido las notificaciones de un usuario, puede marcarlas como leídas enviando una solicitud PUT a /notifications/mark-read con el id de la notificación en el cuerpo de la solicitud y especificando el nombre de usuario en el encabezado de la solicitud.

Solicitud de ejemplo

curl -X PUT "http://localhost:8080/notifications/mark-read" \
-H "Api-Key: e81c4022f148c872a98fb38dac1d9619c7f5b245b42ba98fa467968bbed7551e" \
-H "Api-Username: blake.erickson" \
-F "id=4"

También puede omitir el ID de la notificación y se marcarán como leídas todas las notificaciones para ese usuario.

Esto devolverá una simple respuesta JSON “OK”:

{
  "success": "OK"
}
11 Me gusta

HI @blake
Thank you for the great instruction!
One question, there is a light blue bubble notifications on avatar when I get notification_type NOT 6… after I clicked on avatar, the bubble disappeard… and notifications.json has no change. How can I tell from notifications.js which one is not in light blue bubble anymore ?

Regards,
siyuan

Oh that will be useful to play with Discourse topics and Gitlab issues / commits / merge requests / etc.

@blake Tengo la misma pregunta. Quiero reflejar el contador de insignias de notificación que se muestra en Discourse en mi propio sitio, de esa manera el usuario puede ver cuándo hay nuevas notificaciones, hacer clic en Discourse y luego continuar allí. Sin embargo, el contador de insignias en Discourse no es un recuento de notificaciones no leídas. Si haces clic en la insignia, el contador desaparece, incluso si todavía hay notificaciones no leídas.

¿Cómo puedo determinar el número en el contador de insignias de Discourse de color azul claro y si es visible a través de la API?

  1. Reaccioné a una publicación de la cuenta A y obtuve datos de notificación en la API de notificaciones para esa notificación. Luego, cuando reaccioné a la misma publicación con la cuenta B, no obtuve los datos en la API de notificaciones. Pero cuando quito mi reacción de la cuenta A, los datos de notificación de la cuenta B llegan a la API de notificaciones. Luego, vuelvo a reaccionar a la publicación con la cuenta A y los datos de notificación llegan a la API, luego quito la notificación de la cuenta B y los datos de notificación de la cuenta A llegan.

    Estoy experimentando este problema con los datos de notificación.