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

管理ページに、ユーザーのroleとjobの絞り込み機能追加 #7418

Merged
merged 13 commits into from
May 28, 2024

Conversation

reckyy
Copy link
Contributor

@reckyy reckyy commented Feb 21, 2024

Issue

概要

#7348 (comment) の通りです。

変更確認方法

  1. feature/admin-can-sort-by-user-roles-and-jobs をローカルに取り込む
  2. foreman start -f Procfile.dev
  3. komagata or machidahttp://localhost:3000/admin/users にアクセス。
  4. 絞り込みが正しく動作しているか確認。

Screenshot

変更前

スクリーンショット 2024-02-21 20 31 28

変更後

スクリーンショット 2024-03-08 12 14 32

@reckyy
Copy link
Contributor Author

reckyy commented Feb 21, 2024

@machida
お疲れ様です!
下記ファイルのデザインをお願いしたいです。
お手数をおかけしますが、宜しくお願いいたします。 🙏
app/views/admin/users/_nav.html.slim

スクリーンショット 2024-02-21 20 32 39

@machida
Copy link
Member

machida commented Mar 5, 2024

@reckyy デザイン入れましたー

一点、お願いがあります。

貼り付けた画像_2024_03_05_16_22

職業での絞り込みにも「全員」を追加お願いします🙏
(全員 ... つまり職業では絞り込まないというケースがあります)

@machida machida removed their assignment Mar 5, 2024
@reckyy reckyy force-pushed the feature/admin-can-sort-by-user-roles-and-jobs branch from e6e6858 to 4d3e19b Compare March 6, 2024 01:53
@reckyy
Copy link
Contributor Author

reckyy commented Mar 6, 2024

@machida
デザインありがとうございます!
全員で検索できるように追加しました。
念のためご報告です。

@reckyy reckyy force-pushed the feature/admin-can-sort-by-user-roles-and-jobs branch from 058ccb9 to 7d9c3ff Compare March 8, 2024 03:04
@reckyy
Copy link
Contributor Author

reckyy commented Mar 8, 2024

@SuzukaHori
お疲れ様です!
こちらのPRのレビューをお願いしたく、ご連絡いたしました。
お手隙の際にご対応いただけると嬉しいです。全く急ぎではないです。
もし、ご都合悪ければ仰ってください!
よろしくお願いいたします。

@reckyy reckyy requested a review from SuzukaHori March 8, 2024 13:45
@reckyy reckyy marked this pull request as ready for review March 8, 2024 13:45
@SuzukaHori
Copy link
Contributor

@reckyy
お返事遅くなりました💦
レビュー承知しました👍数日中にお返事しますので、少々お待ちください!

Copy link
Contributor

@SuzukaHori SuzukaHori left a comment

Choose a reason for hiding this comment

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

お待たせしました!
動作はバッチリで、絞り込みが正しく動作していることを確認しました👍

数点コメントしましたので、お手隙の際にご確認ください😊
#7418 (comment)#7418 (comment) など、重箱の隅を突いている部分もあるので、そちらの修正の是非の判断はお任せします🙇‍♀️

@@ -3,11 +3,17 @@
class Admin::UsersController < AdminController
before_action :set_user, only: %i[show edit update]
ALLOWED_TARGETS = %w[all student_and_trainee inactive hibernated retired graduate adviser mentor trainee year_end_party campaign].freeze
ALLOWED_JOBS = User.jobs.keys.prepend('all')
Copy link
Contributor

Choose a reason for hiding this comment

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

定数かつ配列なので、freezeしておいた方がいいかもしれないです❄️

Copy link
Contributor Author

@reckyy reckyy Mar 11, 2024

Choose a reason for hiding this comment

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

おっしゃる通りです。修正しました!
[fix]定数をfreeze

user_scope = User.users_role(@target, allowed_targets: ALLOWED_TARGETS, default_target: 'student_and_trainee')
if @job.present? && ALLOWED_JOBS.include?(@job)
scoped_job = @job == 'all' ? @job : "job_#{@job}"
user_scope = user_scope.public_send(scoped_job)
Copy link
Contributor

Choose a reason for hiding this comment

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

ALLOWED_JOBSで絞り込みはされていますが、ユーザーが直接入力できるparams[:job]をpublic_sendで直接メソッド名として使うのは、危険性もあるかなと思います。

sendを使用せず書くのが理想的だと思うのですが、難しいならALLOWED_JOBS.include?(@job)が何かの拍子に消されたりしないよう、users_roleと似たコメントを残すのが良いと思いました!

bootcamp/app/models/user.rb

Lines 403 to 411 in a917aa0

# このメソッドはユーザから送信された値をsendに渡すので、悪意のあるコードが実行される危険性がある
# そのため、このメソッドを使用する際には安全性の確保のために以下の引数を指定すること
# allowed_targets: 呼び出したいscope名に対応するtargetを過不足なく指定した配列。
# default_target: targetに不正な値が渡された際、users_roleが返すスコープ名に対応するtargetを指定する。デフォルトでは:noneを指定しているため何も返さない。
def users_role(target, allowed_targets: [], default_target: :none)
key = (ALL_ALLOWED_TARGETS & allowed_targets).include?(target) ? target : default_target
scope_name = TARGET_TO_SCOPE.fetch(key, key)
send(scope_name)
end

Copy link
Contributor Author

@reckyy reckyy Mar 11, 2024

Choose a reason for hiding this comment

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

send以外の方法が思いつかなかったんですよね〜。。
ただ、確かにコードの改竄を防ぐためのコメントの必要性はごもっともです。
なので、追加しました!ありがとうございます 🙇
[chore]コードの意図を説明するコメント追加

Copy link
Contributor

Choose a reason for hiding this comment

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

コメントの追加を確認しました👍ありがとうございます!

send以外の方法を私も考えてみたのですが、↓のように全部に条件分岐を書くぐらいしか思いつきませんでした💦

      user_scope = case @job
                   when 'all'
                     user_scope
                   when 'student'
                     user_scope.job_student
                   when 'office_worker'
                     user_scope.job_office_worker
                   when 'part_time_worker'
                     user_scope.job_part_time_worker
                   when 'vacation'
                     user_scope.job_vacation
                   when 'unemployed'
                     user_scope.job_unemployed
                   end

komagataさんのレビューでsendを使わず簡潔に書ける方法が見つかれば、私も勉強させていただきます🙇‍♀️

Copy link
Member

Choose a reason for hiding this comment

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

@reckyy @SuzukaHori

ALLOWED_JOBSで絞ってるんだったらsendしてもいいかな~とおもいました。

test 'show listing hibernated and student' do
visit_with_auth '/admin/users?target=hibernated&job=office_worker', 'komagata'
assert_equal '管理ページ | FBC', title
assert_text 'kyuukai(Kyu Kai)'
Copy link
Contributor

Choose a reason for hiding this comment

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

users_controller.rbのjobの絞り込みの処理(13~16行目)をコメントアウトしても、テストが通ってしまうように見えました。
「条件に当てはまらないユーザが表示されていないこと」も合わせてテストするといいと思いました!

Copy link
Contributor Author

@reckyy reckyy Mar 11, 2024

Choose a reason for hiding this comment

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

おっしゃる通りです。
検索対象のみが表示されていることを確認するテストに修正しました。
[fix]正常にテストできていなかったため、修正

@@ -0,0 +1,24 @@
.page-main-filter
.container
= form_with url: admin_users_path(target: @target), local: true, method: 'get', class: 'page-main-filter__inner' do
Copy link
Contributor

Choose a reason for hiding this comment

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

細かいですが、特に理由がないならadmin_users_path(@target)の書き方でもいいかもと思いました🙇‍♀️

Copy link
Contributor Author

Choose a reason for hiding this comment

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

一応理由としては、「クエリパラメータとして追加される」ということを明記するためにこの書き方を採用しています。(必要なさそうですかね、、?😶)
そちらを踏まえて、再度ご意見をお伺いしたいです!👀

Copy link
Contributor

Choose a reason for hiding this comment

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

お返事ありがとうございます🙇‍♀️
明示的にクエリパラメータに追加する方が適切だと思いましたので、このままでお願いします!

user_scope = User.users_role(@target, allowed_targets: ALLOWED_TARGETS, default_target: 'student_and_trainee')
if @job.present? && ALLOWED_JOBS.include?(@job)
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.

こちらに関してですが、「仕事の状況で絞り込み」が他で行われるケースが思いつきませんでした。😭
どのような可能性を想定されたか、教えていただきたいです!

Copy link
Contributor

Choose a reason for hiding this comment

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

すみません、前のコメントにちゃんと書いておけばよかったです😅

あまり確固たるイメージはなく、相談部屋(/talks)にも同じ検索機能を作ったり、通常ユーザのユーザ一覧(/users)でも「学生」を検索できるようになったりすることを漠然とイメージしていました。
加えて、行数オーバーのコントローラのリファクタリングに苦労しているPRを最近見たので(多分100行以上?だとrubocopで警告が出る)、無理がないならこの段階でコントローラーの行数を削っておいた方がいいのかな?という気持ちでした👀

ただ現状そのような機能の実装予定はなく、考えすぎな気もしたので、元のままでも大丈夫だと思います🙇‍♀️

Copy link
Contributor Author

Choose a reason for hiding this comment

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

詳細ありがとうございます!

なるほど〜。

相談部屋(/talks)にも同じ検索機能を作ったり、通常ユーザのユーザ一覧(/users)でも「学生」を検索できるようになったりすることを漠然とイメージしていました。

後者は職業が非公開情報であることから優先度は低めに感じますが、前者は確かになるほどですね〜。(管理者視点での相談ページを見たことがなかったので、このご意見はとても参考になります。)

komagataさんに確認してみます!

Copy link
Member

Choose a reason for hiding this comment

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

@SuzukaHori @reckyy

そもそもcontrollerがfatなのでほとんどの処理をmodelに持っていきたい感じがします。

Copy link
Contributor Author

@reckyy reckyy Mar 25, 2024

Choose a reason for hiding this comment

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

@@ -44,6 +44,12 @@ class Admin::UsersTest < ApplicationSystemTestCase
assert_text 'kensyu(Kensyu Seiko)'
end

test 'show listing hibernated and student' do
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.

@reckyy
Copy link
Contributor Author

reckyy commented Mar 11, 2024

@SuzukaHori
コメントありがとうございます!
細かく見ていただき、とてもありがたいです 🙇
修正&コメントしていますので、お手隙の際にご確認いただけますと幸いです。

Copy link
Contributor

@SuzukaHori SuzukaHori left a comment

Choose a reason for hiding this comment

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

修正ありがとうございます!
お返事とコメントしましたので、お手隙の際ご確認をお願いします🙇‍♀️

#7418 (comment) に意見を書きましたが、このままにされる場合も問題ないと思いますので、私からはAprroveさせていただきます😊

user_scope = User.users_role(@target, allowed_targets: ALLOWED_TARGETS, default_target: 'student_and_trainee')
if @job.present? && ALLOWED_JOBS.include?(@job)
Copy link
Contributor

Choose a reason for hiding this comment

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

すみません、前のコメントにちゃんと書いておけばよかったです😅

あまり確固たるイメージはなく、相談部屋(/talks)にも同じ検索機能を作ったり、通常ユーザのユーザ一覧(/users)でも「学生」を検索できるようになったりすることを漠然とイメージしていました。
加えて、行数オーバーのコントローラのリファクタリングに苦労しているPRを最近見たので(多分100行以上?だとrubocopで警告が出る)、無理がないならこの段階でコントローラーの行数を削っておいた方がいいのかな?という気持ちでした👀

ただ現状そのような機能の実装予定はなく、考えすぎな気もしたので、元のままでも大丈夫だと思います🙇‍♀️

user_scope = User.users_role(@target, allowed_targets: ALLOWED_TARGETS, default_target: 'student_and_trainee')
if @job.present? && ALLOWED_JOBS.include?(@job)
scoped_job = @job == 'all' ? @job : "job_#{@job}"
user_scope = user_scope.public_send(scoped_job)
Copy link
Contributor

Choose a reason for hiding this comment

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

コメントの追加を確認しました👍ありがとうございます!

send以外の方法を私も考えてみたのですが、↓のように全部に条件分岐を書くぐらいしか思いつきませんでした💦

      user_scope = case @job
                   when 'all'
                     user_scope
                   when 'student'
                     user_scope.job_student
                   when 'office_worker'
                     user_scope.job_office_worker
                   when 'part_time_worker'
                     user_scope.job_part_time_worker
                   when 'vacation'
                     user_scope.job_vacation
                   when 'unemployed'
                     user_scope.job_unemployed
                   end

komagataさんのレビューでsendを使わず簡潔に書ける方法が見つかれば、私も勉強させていただきます🙇‍♀️

@@ -0,0 +1,24 @@
.page-main-filter
.container
= form_with url: admin_users_path(target: @target), local: true, method: 'get', class: 'page-main-filter__inner' do
Copy link
Contributor

Choose a reason for hiding this comment

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

お返事ありがとうございます🙇‍♀️
明示的にクエリパラメータに追加する方が適切だと思いましたので、このままでお願いします!

@reckyy
Copy link
Contributor Author

reckyy commented Mar 11, 2024

@SuzukaHori
お疲れ様です!コメントありがとうございます!

#7418 (comment) に意見を書きましたが、このままにされる場合も問題ないと思いますので、私からはAprroveさせていただきます😊

承知しました〜。
丁寧にレビューいただき、ありがとうございました。 🙇

@reckyy
Copy link
Contributor Author

reckyy commented Mar 11, 2024

@komagata
お疲れ様です!チームメンバーにApproveいただいたので、レビューをお願いいたします。

お尋ねしたいこと

下記議論について、ご意見をお伺いしたいです。
#7418 (comment)

  • 将来を見越して、 ALLOWED_JOBSの情報をuser.rbに定義するべきかどうか。

#7418 (comment)

  • public_sendを使った実装のままで良いか。

@komagata
Copy link
Member

@reckyy それぞれのスレッドにコメントさせていただきました~

@reckyy reckyy force-pushed the feature/admin-can-sort-by-user-roles-and-jobs branch from 49aa56d to 8c917bc Compare March 25, 2024 05:12
@reckyy
Copy link
Contributor Author

reckyy commented Mar 25, 2024

@komagata
お疲れ様です。
コメントありがとうございます。

コミットメッセージの先頭に記号を入れるルールは採用しているプロジェクトではよいですが、一人だけ採用すると統一感がなくなって余計にわかりずらくなってしまうので、プロジェクト全体で同意をとってから導入するようにしてください。

コミットメッセージのprefixについてですが、こちらprefixがないコミットメッセージを採用した別PRを再作成したほうがよろしいでしょうか。

他のPR2つでも同様の質問を行なっています。もし3つのPRのうち、一つにご回答いただければ他PRでのこの質問内容に関しては、スルーしていただいて大丈夫です。 🙇
(ただ、コミットメッセージ以外の質問も行なっている場合がありますので、コメントに関してはご確認いただきたいです。)

@reckyy reckyy force-pushed the feature/admin-can-sort-by-user-roles-and-jobs branch from 8c917bc to 21b35ae Compare March 27, 2024 03:51
@reckyy reckyy force-pushed the feature/admin-can-sort-by-user-roles-and-jobs branch from 21b35ae to 77e8fa0 Compare March 29, 2024 03:06
@reckyy
Copy link
Contributor Author

reckyy commented Mar 30, 2024

@komagata
お疲れ様です。

  • modelへの移行
  • コミットメッセージのprefix削除

上記2点が完了しましたので、再度ご確認をお願いいたします。

@@ -8,4 +8,33 @@ class UsersHelperTest < ActionView::TestCase
assert_includes countries['JP'], %w[北海道 01]
assert_includes countries['US'], %w[アラスカ州 AK]
end

test 'roles_for_select returns array for select_tag containing role info' do
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
test 'roles_for_select returns array for select_tag containing role info' do
test '#roles_for_select' do

他に合わせて正常系のみのテストであればこういう命名でいいかなと思いました。

Copy link
Contributor Author

@reckyy reckyy Apr 20, 2024

Choose a reason for hiding this comment

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

おっしゃる通り、正常系のみのテストなのでメソッド名のみに命名し直しました。
testの命名を変更

@reckyy
Copy link
Contributor Author

reckyy commented Apr 20, 2024

@komagata
お疲れ様です。
コメントありがとうございます!
テスト名変更しましたので、再度ご確認のほどよろしくお願いいたします。

@@ -7,7 +7,9 @@ class Admin::UsersController < AdminController
def index
@direction = params[:direction] || 'desc'
@target = params[:target]
@job = params[:job]
Copy link
Member

Choose a reason for hiding this comment

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

@jobはviewで使っていますか?
もし使っていなければインスタンス変数である必要はないかもです。

Copy link
Contributor Author

@reckyy reckyy Apr 28, 2024

Choose a reason for hiding this comment

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

こちら、渡しそびれていました。
気づいていただきありがとうございます!

下記でsortするときに渡すクエリパラメータのために、用意していたインスタンス変数になります。

  • ユーザー名
  • 企業
  • 最終活動日時
  • 登録日時
スクリーンショット 2024-04-28 21 58 13

渡しそびれていたインスタンス変数を追記

Copy link
Member

Choose a reason for hiding this comment

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

@reckyy なるほどです~

@reckyy
Copy link
Contributor Author

reckyy commented Apr 28, 2024

@komagata
お疲れ様です。
#7418 (comment) の内容について対応しました。
ご確認いただけますと幸いです。
よろしくお願いいたします。

@reckyy reckyy force-pushed the feature/admin-can-sort-by-user-roles-and-jobs branch 2 times, most recently from 00a5b38 to d381f3f Compare May 8, 2024 13:16
@reckyy
Copy link
Contributor Author

reckyy commented May 9, 2024

@komagata
コンフリクトを解消したら、なぜかテストが落ちるようになったので、解消し次第またメンションさせていただきます。

@reckyy reckyy force-pushed the feature/admin-can-sort-by-user-roles-and-jobs branch 6 times, most recently from d10cf7b to d175997 Compare May 10, 2024 13:39
@reckyy reckyy force-pushed the feature/admin-can-sort-by-user-roles-and-jobs branch from d175997 to d7fe6a0 Compare May 10, 2024 13:41
@reckyy
Copy link
Contributor Author

reckyy commented May 10, 2024

@komagata
お疲れ様です。
コンフリクトを解消しました。お手隙の際にレビューよろしくお願いいたします。

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です~👌

@@ -7,7 +7,9 @@ class Admin::UsersController < AdminController
def index
@direction = params[:direction] || 'desc'
@target = params[:target]
@job = params[:job]
Copy link
Member

Choose a reason for hiding this comment

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

@reckyy なるほどです~

@komagata komagata merged commit f73c490 into main May 28, 2024
2 checks passed
@komagata komagata deleted the feature/admin-can-sort-by-user-roles-and-jobs branch May 28, 2024 19:14
@github-actions github-actions bot mentioned this pull request May 28, 2024
18 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.

4 participants