こんにちは、簡単な質問です。APIを使ってユーザーに通知を送信することはできますか?(または別の方法で)。
ドキュメントを確認しましたが、ユーザーの通知を取得する方法や既読マークをつける方法は見つかりましたが、通知を投稿(POST)する方法は見つかりませんでした。もしそれが不可能であれば、プライベートメッセージを使う方法もあるかと思います。
この件についてご意見をいただければ幸いです。ありがとうございます。
プラグインが必要になると思います。どのような通知をお望みですか?ユースケースについて詳しく教えていただけますか?
一般的には、外部サービスからのメール通知を Discourse の通知に置き換えることを想定しています。このサービスはメンバーに対して無料で提供されます(*)。これにより、すべてを Discourse に一元化でき、フォーラムへの(定期的な)ログインを促すインセンティブを与えることができます。これが私が考えていたアイデアです。この考えが妥当かどうか、あるいは論理に欠陥があるかどうかは確信が持てません。ご提案やご批判を歓迎します。
[(*):メンバーとはフォーラムの参加者を指します。少なくともフォーラムに登録している人々です。最低限の参加度や信頼レベルが必要かどうか、それとも登録だけで十分かは未定です。]
このプラグインは情報を受け取り、Discourse 内で通知をトリガーするのでしょうか?通知はプラグインから(より簡単に)実装可能でしょうか?
ユーザーID(またはメールアドレス)、URL、タイトルを指定して通知を作成できるようなルートを追加するプラグインを想像できます。プラグインなしではそれは難しいと思いますが、コードを詳しく見ていないので確信はありません。
昨日、私が開発しているプラグインに通知機能を追加することを考え始めたばかりなので、その仕組みについてはあまり詳しくありません。
私も同様のプラグインを計画しており、私のウェブサイトのメール以外の通知を Discourse 中心に構成し、MessageBus を経由して購読し、プッシュ通知設定を一元化しようと考えています。
私の計画は、カスタム通知を作成するためのカスタムエンドポイントを用意することですが、これらのスニペットを見てみると、実現可能だと感じています。
カスタム通知の作成方法については:
通知リスト上で通知アイテムをどのように表示するかをカスタマイズするには:
https://github.com/discourse/discourse-code-review/blob/master/assets/javascripts/discourse/widgets/code-review-commit-approved-notification-item.js.es6
もし通知を作成するためのコア API があれば、この通知アイテムウィジェットはテーマコンポーネントで実装でき、さらに簡単になると思います。
それがどのくらい複雑になるかはわかりませんが、通知の作成を API に直接追加するのは理にかなっていると思いませんか?チームがこの案に前向きであるか、あるいは PR を受け入れる(誰かが可能で、やる気がある場合)かもしれません。
まだ文書化されていませんが、通知作成 API エンドポイントは存在します。
POST /notifications(.:format) notifications#create {:format=>/(json|html|\*\/\*)/}
独自の通知タイプを作成する代わりに、custom 通知タイプを使用できる可能性があります。
素晴らしいですね!ありがとうございます。
つまり、エンドポイントについて正しく理解しているなら、DefaultNotificationItem をオーバーライドする必要がある場合でも、カスタムウィジェットで使用する追加の通知タイプを登録するために、やはりプラグインが必要になるのでしょうか?
Notification.types[:following] = 800
(出典: discourse-follow/plugin.rb at main · discourse/discourse-follow · GitHub)
custom タイプを使用すると、https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/widgets/custom-notification-item.js を介してレンダリングされます。したがって、宛先 url をオーバーライドするには、やはりカスタムウィジェットが必要になるのでしょうか?
同様のシナリオで、あるプラグインが「custom-notification-item」をオーバーライドしているのを見かけました (clothing-deals/assets/javascripts/discourse/app/widgets/custom-notification-item.js.es6 at master · Borasification/clothing-deals · GitHub)。data に特定のものが含まれている場合に url をオーバーライドし、そうでない場合は this._super.url にフォールバックするのは安全でしょうか?
@renato さん、ありがとうございます!
こちらが私が用意したコードです。
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
)
通知は表示されますが、予想通りクリックしても 何の変化もありません(編集後)。また、message が任意の文字列ではなく I18n キーであることは、実際に試すまで私には明確ではありませんでした……。私が実現したいのは、呼び出したモデルへの URL を設定できるようにすることです。
「何も起きない」という意味でしょうか?
もしクリックして、API 経由で参加した URL にリダイレクトされるのであれば、それは素晴らしいことですね。
DefaultNotificationItem は、data.badge_id、topic_id、または data.group_id を設定すると、自動的に url を作成します。
このアプローチをテストしましたが、問題なく動作します。data.url に値を設定し、テーマコンポーネントで以下のように使用してください。
api.reopenWidget("custom-notification-item", {
url(data) {
return data.url || this._super(data);
}
})
これが機能しません…
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"
}
}
応答として以下を受け取ります:
{
"errors": [
"Data can't be blank"
],
"error_type": "record_invalid"
}
フォーマットエラー、誤解ですか?それともdataで何か見落としていますか?
Webからこれをリバースエンジニアリングできません。それとも、このAPIはどこかで呼び出されていますか?
data の値をエンコードする必要があります。
例:
"data": "{\"topic_title\":\"Test\",\"original_post_id\":2222,\"original_post_type\":1,\"original_username\":\"User.Name\",\"revision_number\":1,\"display_username\":\"Text\"}"