Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ベストアンサー決定通知をactive_delivery化する #6479

Conversation

ogawa-tomo
Copy link
Contributor

@ogawa-tomo ogawa-tomo commented Apr 27, 2023

Issue

概要

ベストアンサー決定通知をactive_delivery化しました。
対象は、メール通知とサイト内通知の2種類です。
チャットの通知は変更していません。

変更確認方法

  1. feature/replace-notification-on-correct-answer-save-with-active-deliveryをローカルに取り込む
  2. kimuraでログイン(メール通知がONのユーザーならOK)
  3. Q&Aページから適当な質問にアクセスして回答する
  4. ログアウトし、3で回答した質問の質問者でログイン
  5. 3で回答した質問にアクセスし、回答の「ベストアンサーにする」をクリック
  6. http://localhost:3000/letter_opener/ にアクセスし、kimuraに「…kimuraさんの回答がベストアンサーに選ばれました。」というメールが飛んでいることを確認
  7. メールの「回答へ」をクリックすると、回答に遷移することを確認
  8. ログアウトし、もう一度kimuraでログイン
  9. ページ右上の通知で、「…kimuraさんの回答がベストアンサーに選ばれました。」と表示されることを確認
  10. 通知をクリックすると質問に遷移することを確認

Screenshot

とくに画面に変更はないので略

やったこと

  • NotificationFacadeをActivityNotifierに置き換え
  • NotificationMailerをActivityMailerに置き換え
  • Mailerのプレビュー画面を追加

ベストアンサー決定通知処理の全体像と今回変更した箇所

before

flowchart TD
  CorrectAnswersController -- message --> ChatNotifier
  ChatNotifier -- message --> Discord::Notifier
  CorrectAnswersController -- publish --> Newspaper
  Newspaper -. "call" .-> CorrectAnswerNotifier
  CorrectAnswerNotifier -- chose_correct_answer --> NotificationFacade
  NotificationFacade:::orange -- chose_correct_answer --> NotificationMailer
  NotificationMailer:::orange -- mail --> ApplicationMailer
  NotificationFacade -- chose_correct_answer --> ActivityNotifier
  ActivityNotifier -. "call" .-> ActivityDriver
  ActivityDriver -- create! --> Notification
  classDef orange fill:#f96
Loading

After

flowchart TD
  CorrectAnswersController -- message --> ChatNotifier
  ChatNotifier -- message --> Discord::Notifier
  CorrectAnswersController -- publish --> Newspaper
  Newspaper -. "call" .-> CorrectAnswerNotifier
  CorrectAnswerNotifier -- "notify(:chose_correct_answer)" --> ActivityDelivery
  ActivityDelivery:::orange -. chose_correct_answer .-> ActivityMailer
  ActivityMailer:::orange -- mail --> ApplicationMailer
  ActivityDelivery -. chose_correct_answer .-> ActivityNotifier
  ActivityNotifier -. "call" .-> ActivityDriver
  ActivityDriver -- create! --> Notification
  classDef orange fill:#f96
Loading

参考情報

参考リンク

参考PR

(他にもactive_delivery化のPRは多数あるが略)

@ogawa-tomo ogawa-tomo force-pushed the feature/replace-notification-on-correct-answer-save-with-active-delivery branch 3 times, most recently from d354f61 to 2a6435d Compare April 28, 2023 12:20
@@ -1,6 +1,6 @@
# frozen_string_literal: true

class NotificationMailer < ApplicationMailer # rubocop:disable Metrics/ClassLength
class NotificationMailer < ApplicationMailer
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このファイルからメソッドを削除した結果、Rubocopの下記のチェックが通るようになったので削除

app/mailers/notification_mailer.rb:3:1: C: Metrics/ClassLength: Class has too many lines. [103/100]
class NotificationMailer < ApplicationMailer ...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Comment on lines +111 to +155
def chose_correct_answer
answer = Answer.find(ActiveRecord::FixtureSet.identify(:correct_answer1))
receiver = User.find(answer.user_id)

ActivityMailer.with(answer: answer, receiver: receiver).chose_correct_answer
end
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Action Mailerが提供するメールのプレビュー機能
https://railsguides.jp/action_mailer_basics.html#%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AE%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC
こうしておくことで、下記の場所にアクセスするとプレビューが見れる
http://localhost:3000/rails/mailers/activity_mailer/chose_correct_answer

# required params: answer, receiver
def chose_correct_answer
@user = @receiver
@answer = params[:answer]
Copy link
Contributor Author

@ogawa-tomo ogawa-tomo Apr 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

既存の他の通知の実装を見ると、paramsだけでなくargsも受け取れるようになっています。

def came_answer(args = {})
@answer = params&.key?(:answer) ? params[:answer] : args[:answer]

ただ、今回は(既存の他の通知でも)、ActivityDeliveryからはparamsを渡す方法でしか呼び出していません。
https://github.com/palkan/active_delivery#parameterized-deliveries

動作を見る限りでもargsを受け取れるようにする必要はなさそうなので、今回はargsを受け取る実装はしていません。
(もし現時点でargsを受け取れるようにすべき理由があればご指摘ください:bow:)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

argsの有無については自分では判断がつかないです🙏

確かに使われていないなら必要ないのかな〜とも思います。
自分としてはogawa-tomoさんがこちらの日報でおっしゃられているような感じで、実装しといて問題ないから、なのかなと思っています。

@komagata さんのご意見を伺ってみたいなと思いました🙇‍♂️

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OKです、ではこの箇所に関してはいったんこのままで駒形さんのレビューに回すことにしますね

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ogawa-tomo (CC: @djkazunoko )
同期・非同期どちらでも使えるように他の実装もそうなっているので両方対応でお願いしたいです。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@komagata 一応の確認ですが、ここで問題にしているのは「同期版と非同期版を両方実装すべきか」でなく「args版とparams版を両方実装すべきか」なのですが、他の実装に合わせて両方実装すべきということで合っていますか?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5/31ミーティング
📝 params版だけだと、同期・非同期の両方に対応することができない
参考:https://api.rubyonrails.org/classes/ActionMailer/Parameterized.html

Copy link
Contributor Author

@ogawa-tomo ogawa-tomo Jun 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

argsによる呼び出しに対応しました
86ec797

Comment on lines +235 to +369
assert_difference -> { AbstractNotifier::Testing::Driver.deliveries.count }, 1 do
ActivityDelivery.with(**params).notify!(:chose_correct_answer)
end

assert_difference -> { AbstractNotifier::Testing::Driver.enqueued_deliveries.count }, 1 do
ActivityDelivery.with(**params).notify(:chose_correct_answer)
end
Copy link
Contributor Author

@ogawa-tomo ogawa-tomo Apr 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

既存の他の通知のテストではパラメータをnotifyメソッドの引数で渡す場合もテストしていますが、下記コメントしたように現時点ではその場合の実装はしていないのでテストも行っていません
#6479 (comment)

Copy link
Contributor Author

@ogawa-tomo ogawa-tomo Jun 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

argsによる呼び出しのテストを追加しました
4df77fb

@ogawa-tomo ogawa-tomo marked this pull request as ready for review April 29, 2023 12:06
@ogawa-tomo
Copy link
Contributor Author

@djkazunoko こちら、よろしければレビューお願いできますでしょうか?

@ogawa-tomo ogawa-tomo requested a review from djkazunoko April 29, 2023 12:12
@djkazunoko
Copy link
Contributor

@ogawa-tomo
かしこまりました!1週間ほどでレビューできると思います🙌

Copy link
Contributor

@djkazunoko djkazunoko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ogawa-tomo
クラス図があってわかりやすかったです🙌

レビュー大変お待たせいたしました🙇‍♂️
2点コメントさせていただきましたので、ご確認をよろしくお願いします。

@@ -1,5 +1,5 @@
= render 'notification_mailer_template',
= render '/notification_mailer/notification_mailer_template',
title: "#{@answer.receiver.login_name}さんの質問【 #{@answer.question.title} 】で#{@answer.sender.login_name}さんの回答がベストアンサーが選ばれました。",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

タイポがありました〜
ベストアンサー選ばれました。 → ベストアンサー選ばれました。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

おお~ありがとうございます!これはどうやら元からですね。
修正しました!
16c8155

test 'not send chose_correct_answer email to user with mail_notification off' do
answer = correct_answers(:correct_answer1)
receiver = answer.user
receiver.update(mail_notification: false)
Copy link
Contributor

@djkazunoko djkazunoko May 5, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

update_columnsではなくupdateを使っている理由を教えていただきたいです🙏

どちらを使うべきか自分では判断がつかないんですけど、update_columnsはバリデーション等をスキップするため、updateより高速なのかなと、だから他のテストではupdate_columnsが使われているのかなと考えました!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

とくに深い理由はなく、テストの高速化という観点もありませんでした!
ただ、このファイルの他の箇所ではupdate_columnsを使っていますが、他にこれを使っているテストはtest/system/users_test.rbくらいで、bootcampリポジトリ全体ではupdateを使っているテストがほとんどのようです。ここだけ高速化を意識する必要はとくになさそうに感じまして、であれば素直にupdateを使えばいいのかなと思いました。
(なぜこのファイルの他の箇所でupdate_columnsを使っているのかは自分も分かりません・・・)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご回答いただきありがとうございます!

bootcampリポジトリ全体ではupdateを使っているテストがほとんどのようです。

なるほど〜、むしろupdate_columnsの方が少数派だったんですね。

どちらが一般的なのかなと思って質問させていただきました。勉強になりました🙇‍♂️

@ogawa-tomo
Copy link
Contributor Author

@djkazunoko レビューありがとうございます!修正・コメントしましたので再度ご確認お願いします:bow:

@ogawa-tomo ogawa-tomo requested a review from djkazunoko May 5, 2023 07:45
Copy link
Contributor

@djkazunoko djkazunoko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ogawa-tomo
修正いただきありがとうございます!
自分からはApproveとさせていただきます〜🙌

@ogawa-tomo
Copy link
Contributor Author

@komagata こちら、メンバーのレビューが通りましたので、ご確認お願いいたします:bow:

Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

conflictの修正をお願いします〜

@ogawa-tomo ogawa-tomo force-pushed the feature/replace-notification-on-correct-answer-save-with-active-delivery branch 2 times, most recently from e92fd4a to 4114313 Compare May 17, 2023 11:10
@ogawa-tomo
Copy link
Contributor Author

@komagata こちら、コンフリクトを修正したうえでCIが通りましたので、ご確認お願いします:bow:

Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

conflictの解消をお願いします〜

@ogawa-tomo ogawa-tomo force-pushed the feature/replace-notification-on-correct-answer-save-with-active-delivery branch 3 times, most recently from 86ec797 to 4df77fb Compare June 1, 2023 12:52
@ogawa-tomo
Copy link
Contributor Author

@komagata
こちら、以下の対応を行いましたので再度ご確認をお願いいたします:bow:

  • コンフリクトの解消
  • argsによる呼び出しに対応→ 86ec797

@ogawa-tomo ogawa-tomo requested a review from komagata June 1, 2023 13:26
Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再度conflictの解消をお願いします〜

@ogawa-tomo ogawa-tomo force-pushed the feature/replace-notification-on-correct-answer-save-with-active-delivery branch from 4df77fb to f852fe3 Compare June 15, 2023 12:15
@ogawa-tomo ogawa-tomo force-pushed the feature/replace-notification-on-correct-answer-save-with-active-delivery branch from d564155 to 116ab50 Compare June 15, 2023 12:43
@ogawa-tomo
Copy link
Contributor Author

@komagata 再度コンフリクト解消しましたので、ご確認お願いいたします!

@ogawa-tomo ogawa-tomo requested a review from komagata June 16, 2023 09:31
Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

conflictの修正お願いします〜。

@ogawa-tomo ogawa-tomo force-pushed the feature/replace-notification-on-correct-answer-save-with-active-delivery branch from 116ab50 to 83d5221 Compare June 21, 2023 11:56
@ogawa-tomo
Copy link
Contributor Author

@komagata 再度コンフリクト解消しましたので、ご確認お願いいたします!

@ogawa-tomo ogawa-tomo requested a review from komagata June 21, 2023 12:39
Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確認させて頂きました。OKです〜🙆‍♂️

@komagata komagata merged commit 5b03afc into main Jun 21, 2023
@komagata komagata deleted the feature/replace-notification-on-correct-answer-save-with-active-delivery branch June 21, 2023 14:27
@github-actions github-actions bot mentioned this pull request Jun 21, 2023
13 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants