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.
Penso che servirà un plugin. Che tipo di notifica desideri? Puoi descrivere il tuo caso d’uso?
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?
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.
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.
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)?
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.
È 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?
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.
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.
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);
}
})
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?
È 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\"}"