Commit 296c0b84 authored by Luke Duncalfe's avatar Luke Duncalfe Committed by Heinrich Lee Yu

Add reposition_note permission

This works as an alias of `admin_note` unless the noteable is a Design,
in which case it will be true if the user can `create_note`.

This allows us to make a new mutation for repositioning a note on a
Design which will allow users who did not create the note to
reposition it.

https://gitlab.com/gitlab-org/gitlab/-/issues/207334
parent db5ff625
...@@ -16,6 +16,7 @@ class Discussion ...@@ -16,6 +16,7 @@ class Discussion
:commit_id, :commit_id,
:confidential?, :confidential?,
:for_commit?, :for_commit?,
:for_design?,
:for_merge_request?, :for_merge_request?,
:noteable_ability_name, :noteable_ability_name,
:to_ability_name, :to_ability_name,
......
...@@ -7,13 +7,15 @@ class NotePolicy < BasePolicy ...@@ -7,13 +7,15 @@ class NotePolicy < BasePolicy
delegate { @subject.noteable if DeclarativePolicy.has_policy?(@subject.noteable) } delegate { @subject.noteable if DeclarativePolicy.has_policy?(@subject.noteable) }
condition(:is_author) { @user && @subject.author == @user } condition(:is_author) { @user && @subject.author == @user }
condition(:is_noteable_author) { @user && @subject.noteable.author_id == @user.id } condition(:is_noteable_author) { @user && @subject.noteable.try(:author_id) == @user.id }
condition(:editable, scope: :subject) { @subject.editable? } condition(:editable, scope: :subject) { @subject.editable? }
condition(:can_read_noteable) { can?(:"read_#{@subject.noteable_ability_name}") } condition(:can_read_noteable) { can?(:"read_#{@subject.noteable_ability_name}") }
condition(:commit_is_deleted) { @subject.for_commit? && @subject.noteable.blank? } condition(:commit_is_deleted) { @subject.for_commit? && @subject.noteable.blank? }
condition(:for_design) { @subject.for_design? }
condition(:is_visible) { @subject.system_note_with_references_visible_for?(@user) } condition(:is_visible) { @subject.system_note_with_references_visible_for?(@user) }
condition(:confidential, scope: :subject) { @subject.confidential? } condition(:confidential, scope: :subject) { @subject.confidential? }
...@@ -28,6 +30,7 @@ class NotePolicy < BasePolicy ...@@ -28,6 +30,7 @@ class NotePolicy < BasePolicy
rule { ~can_read_noteable }.policy do rule { ~can_read_noteable }.policy do
prevent :admin_note prevent :admin_note
prevent :resolve_note prevent :resolve_note
prevent :reposition_note
prevent :award_emoji prevent :award_emoji
end end
...@@ -46,6 +49,7 @@ class NotePolicy < BasePolicy ...@@ -46,6 +49,7 @@ class NotePolicy < BasePolicy
prevent :read_note prevent :read_note
prevent :admin_note prevent :admin_note
prevent :resolve_note prevent :resolve_note
prevent :reposition_note
prevent :award_emoji prevent :award_emoji
end end
...@@ -57,9 +61,14 @@ class NotePolicy < BasePolicy ...@@ -57,9 +61,14 @@ class NotePolicy < BasePolicy
prevent :read_note prevent :read_note
prevent :admin_note prevent :admin_note
prevent :resolve_note prevent :resolve_note
prevent :reposition_note
prevent :award_emoji prevent :award_emoji
end end
rule { can?(:admin_note) | (for_design & can?(:create_note)) }.policy do
enable :reposition_note
end
def parent_namespace def parent_namespace
strong_memoize(:parent_namespace) do strong_memoize(:parent_namespace) do
next if @subject.is_a?(PersonalSnippet) next if @subject.is_a?(PersonalSnippet)
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment