Closed okkez closed 7 years ago
@kou 何かアイデアがあれば、教えてください。。。
Project.allowed_to_condition
とIssue.visible_condition
を見ると複雑なのでこれをGroongaレベルでも再実装するのは(バグって見えちゃいけないものが見えるのが怖いので)避けたいですね。。。
別途SQLを3回実行することになってしまいますが、こんなんでいけないですかねぇ。SQLはクエリーキャッシュが効く気がするのであんまり遅くならないかも。
--filter \
'(in_values(project_id, #{User.current.visible_project_ids.join(", ")}) &! \
in_values(original_type, "Issue", "Journal") || \
(original_type == "Issue" && \
in_values(original_id, #{Issue.visible.pluck(:id).join(", ")})) || \
(original_type == "Journal" && \
in_values(original_id, #{Journal.visible.pluck(:id).join(", ")}))'
なるほど filter でがんばるんですね!あとで試してみます。
Issue
とJournal
のvisibleなIDのリストは長くなりそうなので、invisibleなIDのリストにできた方がよさそうなんですが、そうするとそのロジックをプラグイン側でメンテナンスしないといけなくなるのがアレなんですよねぇ。
SQLでNOT visibleなcondition
みたいな条件が効率よく動くならそっちの方がいいかもしれません。(全体からのNOT
は効率よくなりにくいので難しい気がしますが。。。)
original_idのリストが長くなりそうな気がしたのでfiterで↓のようにしようと考えています。 数が多いので、一つだけ例示します。これだと権限の数だけSQLを発行すればいいです。 プロジェクトの数はそんなに多くないはずなので、最初はこれでいいかなぁと思います。
(original_type == "Issue" && is_private == false && in_values(project_id, #{Project.allowed_to(user, :view_issues).pluck(:id).join(",")})
プライベートなやissue/journalは全部対象外にするってことですね。 最初のステップとしては妥当だと思います。
:memo:
bin/rails r
で実行できるやつ:memo: 残作業
以上について動作を確認した。
権限まわりをGroonga側に寄せる方法がよくわからない。
ログイン必須かどうかは関係なし。
User.current
が admin の場合も権限チェック不要326b032 までだと、Groonga側に作るテーブルはsearcher_recordsだけ。
Redmine本体側だと、projectにmemberがいてmemberにroleが設定されている。
Groonga側のテーブルが searcher_records 1つだけだと、権限まわりの情報を表現できない。
権限のカスタマイズをしていなければ、searcher_records.project_id はあるので公開プジェクトのidと
User.current.projects.map(&:id)
を渡せば検索できる。