Creazione di notifiche via API

Ciao, una domanda veloce: è possibile inviare notifiche agli utenti tramite API (o in altro modo)?
Nella documentazione ho trovato come ottenere le notifiche dell’utente e come segnalarle come lette, ma non come inviarne di nuove tramite POST. Se non è possibile, immagino che rimanga sempre la possibilità di utilizzare i messaggi privati.
Apprezzerei molto un tuo parere in merito. Grazie.

2 Mi Piace

Penso che servirà un plugin. Che tipo di notifica desideri? Puoi descrivere il tuo caso d’uso?

2 Mi Piace

Tipicamente, sostituire le notifiche email di un servizio esterno con le notifiche di Discourse. Il servizio verrebbe offerto gratuitamente ai membri (*). Questo permetterebbe di centralizzare tutto su Discourse e di incentivare l’accesso (regolare) al forum. Questa era l’idea che avevo in mente. Non sono sicuro che abbia senso o se ci siano lacune nel ragionamento. Sono aperto a qualsiasi suggerimento o critica.

[ (*): Membri = partecipanti al forum. Almeno le persone registrate al forum. Resta da vedere se sia richiesto un livello minimo di partecipazione o fiducia, o se la registrazione sia sufficiente. ]

Il plugin riceverebbe le informazioni e attiverebbe le notifiche in Discourse? Le notifiche possono essere implementate (più facilmente) tramite un plugin?

2 Mi Piace

Posso immaginare un plugin che aggiunga una rotta e consenta di inviare un carico contenente l’ID utente (o l’indirizzo email), un URL e un titolo per creare una notifica. Non credo che sia possibile farlo senza un plugin, ma non ho esaminato il codice in modo approfondito.

Solo ieri ho iniziato a valutare l’aggiunta di notifiche a un plugin che sto sviluppando, quindi non sono molto familiare con il suo funzionamento.

3 Mi Piace

Sto pianificando un plugin simile, focalizzando le notifiche non email del mio sito web su Discourse, a cui è possibile iscriversi tramite MessageBus e configurare un’unica notifica push centrale.

Ciò che ho in mente è semplicemente avere un endpoint personalizzato per creare notifiche personalizzate; dopo aver visto questi frammenti di codice, credo che sia fattibile.

Per creare una notifica personalizzata:

Per personalizzare la visualizzazione dell’elemento della notifica nell’elenco delle notifiche:
https://github.com/discourse/discourse-code-review/blob/master/assets/javascripts/discourse/widgets/code-review-commit-approved-notification-item.js.es6

Se esistesse un’API core per creare la notifica, penso che questo widget dell’elemento di notifica potrebbe essere realizzato come componente di un tema, il che sarebbe ancora più semplice.

4 Mi Piace

Non so quanto possa essere potenzialmente più complicato farlo, ma non avrebbe senso aggiungere la creazione delle notifiche direttamente all’API? Forse il team sarebbe disposto a farlo, o essere disposto a una PR (se qualcuno può ed è disposto a farlo)?

2 Mi Piace

Non è ancora documentato, ma esiste un endpoint API per la creazione di notifiche:

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

Potresti essere in grado di utilizzare il tipo di notifica custom invece di doverne creare uno tuo.

5 Mi Piace

È ottimo! Grazie.

Quindi, se ho capito bene, con l’endpoint, se c’è la necessità di sovrascrivere DefaultNotificationItem, è comunque necessario un plugin per registrare il tipo di notifica aggiuntivo da utilizzare in un widget personalizzato?

Notification.types[:following] = 800

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

Utilizzando il tipo custom, verrà renderizzato tramite https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/widgets/custom-notification-item.js, quindi per sovrascrivere l’url di destinazione è comunque necessario un widget personalizzato?

Ho visto un plugin che sovrascrive “custom-notification-item” (clothing-deals/assets/javascripts/discourse/app/widgets/custom-notification-item.js.es6 at master · Borasification/clothing-deals · GitHub) in uno scenario simile; è sicuro sovrascrivere semplicemente url quando ci sono dati specifici in data e ricadere su this._super.url altrimenti?

2 Mi Piace

Grazie, @renato!

Ecco cosa ho ottenuto.

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
)

Vedo la notifica, ma, come prevedibile, (MODIFICA:) NULLA succede se ci clicco. Inoltre (non mi era evidente finché non l’ho fatto), il campo message è un I18n, non una stringa arbitraria… . Ciò che vorrei è poter inserire l’URL del modello che l’ha chiamata.

2 Mi Piace

Immagino che tu volessi dire che non succede “nulla”?
Se potessi cliccarci e essere reindirizzato a un URL a cui ti sei unito tramite l’API, sarebbe davvero fantastico.

2 Mi Piace

Il DefaultNotificationItem crea automaticamente un url se compili data.badge_id, topic_id o data.group_id.

Ho testato questo approccio e funziona. Basta compilare data.url e utilizzarlo in un componente del tema:

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

Non riesco a farlo funzionare…

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

}

Come risposta ottengo:


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

Errore di formattazione, incomprensione? O mi manca qualcosa in data?

Non riesco a fare il reverse engineering di questo dal web - O questa API viene chiamata da qualche parte?

1 Mi Piace

È necessario codificare il valore data.

ad esempio:

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