Création de notifications via l'API

Bonjour, une question rapide : pouvez-vous envoyer des notifications aux utilisateurs via l’API (ou par un autre moyen) ?
Dans la documentation, j’ai trouvé comment obtenir les notifications de l’utilisateur et comment les marquer comme lues, mais pas comment en envoyer (POST). Si cela n’est pas possible, je suppose qu’il reste toujours la possibilité d’utiliser les messages privés à la place.
Je vous serais reconnaissant de toute information à ce sujet. Merci.

2 « J'aime »

Je pense qu’il faudrait un plugin. Quel type de notification souhaitez-vous ? Pouvez-vous décrire votre cas d’usage ?

2 « J'aime »

Généralement, il s’agit de remplacer les notifications par e-mail provenant d’un service externe par des notifications Discourse. Le service serait offert gratuitement aux membres (*). Cela permettrait de centraliser tout vers Discourse et d’inciter les utilisateurs à se connecter (régulièrement) au forum. C’était l’idée que j’avais en tête. Je ne suis pas sûr que cela ait du sens ou non, ni s’il y a des failles dans le raisonnement. Je suis ouvert à toutes suggestions et critiques.

[ (*): Membres = participants du forum. Au minimum, les personnes inscrites au forum. Reste à voir s’il faut un niveau minimum de participation ou de confiance, ou si l’inscription suffit. ]

Le plugin recevrait les informations et déclencherait des notifications dans Discourse ? Les notifications peuvent-elles être (plus facilement) gérées via un plugin ?

2 « J'aime »

Je peux imaginer un plugin qui ajouterait une route et vous permettrait d’envoyer une charge avec l’identifiant utilisateur (ou l’adresse e-mail), une URL et un titre, ce qui créerait une notification. Je ne pense pas que ce soit possible sans plugin, mais je n’ai pas examiné le code en détail.

C’est seulement hier que j’ai commencé à envisager d’ajouter des notifications à un plugin que je développe, donc je ne connais pas encore très bien son fonctionnement.

3 « J'aime »

Je prévois moi-même un plugin similaire, en centrant les notifications non liées aux e-mails de mon site autour de Discourse, auquel vous pouvez vous abonner via MessageBus et configurer une notification push centralisée.

Ce que je prévois, c’est simplement d’avoir un point de terminaison personnalisé pour créer des notifications personnalisées. Après avoir vu ces extraits, je pense que c’est faisable.

Pour créer une notification personnalisée :

Pour personnaliser l’affichage de l’élément de notification dans la liste des notifications :
https://github.com/discourse/discourse-code-review/blob/master/assets/javascripts/discourse/widgets/code-review-commit-approved-notification-item.js.es6

S’il existait une API principale pour créer la notification, je pense que ce widget d’élément de notification pourrait être réalisé via un composant de thème, ce qui serait encore plus simple.

4 « J'aime »

Je ne sais pas à quel point cela pourrait être plus compliqué à faire, mais est-ce que cela n’aurait pas du sens d’ajouter la création de notifications directement à l’API ? Peut-être que l’équipe serait ouverte à cette idée, ou ouverte à une PR (si quelqu’un peut et est prêt à le faire) ?

2 « J'aime »

Cela n’est pas encore documenté, mais il existe un point de terminaison de l’API de création de notification :

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

Vous pourriez peut-être utiliser le type de notification custom plutôt que de devoir en créer un vous-même.

5 « J'aime »

C’est super ! Merci.

Donc, si j’ai bien compris, avec ce point de terminaison, s’il est nécessaire de remplacer DefaultNotificationItem, un plugin serait toujours requis simplement pour enregistrer le type de notification supplémentaire à utiliser dans un widget personnalisé ?

Notification.types[:following] = 800

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

En utilisant le type custom, il sera rendu via https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/widgets/custom-notification-item.js. Ainsi, pour remplacer l’url de destination, un widget personnalisé serait-il toujours nécessaire ?

J’ai vu un plugin qui remplace « custom-notification-item » (clothing-deals/assets/javascripts/discourse/app/widgets/custom-notification-item.js.es6 at master · Borasification/clothing-deals · GitHub) dans un scénario similaire. Est-il sûr de simplement remplacer url lorsqu’il y a des éléments spécifiques dans data, et de revenir à this._super.url dans le cas contraire ?

2 « J'aime »

Merci, @renato !

Voici ce que j’ai obtenu.

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
)

Je vois la notification, mais, comme prévu, (MODIF :slight_smile: RIEN ne se passe si je clique. De plus (ce qui n’était pas évident pour moi avant de l’avoir fait), le champ message est une clé I18n, et non une chaîne arbitraire… . . ). Ce que je voudrais, c’est pouvoir y placer l’URL du modèle qui l’a appelée.

2 « J'aime »

Je suppose que vous vouliez dire « rien » ne se passe ?
Si vous pouviez cliquer dessus et être redirigé vers une URL à laquelle vous avez rejoint via l’API, ce serait vraiment génial.

2 « J'aime »

Le DefaultNotificationItem crée automatiquement une url si vous remplissez data.badge_id, topic_id ou data.group_id.

J’ai testé cette approche et cela fonctionne. Il suffit de remplir data.url et de l’utiliser dans un composant de thème :

  api.reopenWidget("custom-notification-item", {
      url(data) {
          return data.url || this._super(data);
      }
  })
4 « J'aime »

Je n’arrive pas à faire fonctionner ça…

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"
            }

}

J’obtiens comme réponse :


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

Erreur de formatage, incompréhension ? Ou est-ce que quelque chose manque dans data ?

Je n’arrive pas vraiment à faire de rétro-ingénierie à partir du web - Ou est-ce que cette API est appelée quelque part ?

1 « J'aime »

Vous devez encoder la valeur data.

par exemple :

"data": "{\"topic_title\":\"Test\",\"original_post_id\":2222,\"original_post_type\":1,\"original_username\":\"User.Name\",\"revision_number\":1,\"display_username\":\"Text\"}"
4 « J'aime »