Skip to content

Commit

Permalink
Show hidden comments to moderators if requested
Browse files Browse the repository at this point in the history
  • Loading branch information
AntonKhorev committed Sep 17, 2023
1 parent 85b17a1 commit 014de36
Show file tree
Hide file tree
Showing 4 changed files with 159 additions and 34 deletions.
7 changes: 6 additions & 1 deletion app/controllers/api/changesets_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ class ChangesetsController < ApiController

before_action :check_api_writable, :only => [:create, :update, :upload, :subscribe, :unsubscribe]
before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :subscribe, :unsubscribe]
before_action :setup_user_auth, :only => [:show]
before_action :authorize, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]

authorize_resource
Expand All @@ -24,7 +25,11 @@ class ChangesetsController < ApiController
# return anything about the nodes, ways and relations in the changeset.
def show
@changeset = Changeset.find(params[:id])
@include_discussion = params[:include_discussion].presence
if params[:include_discussion].presence
@comments = @changeset.comments
@comments = @comments.unscope(:where => :visible) if params[:show_hidden_comments].presence && can?(:restore, ChangesetComment)
@comments = @comments.includes(:author)
end
render "changeset"

respond_to do |format|
Expand Down
5 changes: 3 additions & 2 deletions app/views/api/changesets/_changeset.json.jbuilder
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ end

json.tags changeset.tags unless changeset.tags.empty?

if @include_discussion
json.comments(changeset.comments) do |comment|
if @comments
json.comments(@comments) do |comment|
json.id comment.id
json.visible comment.visible
json.date comment.created_at.xmlschema
if comment.author.data_public?
json.uid comment.author.id
Expand Down
7 changes: 4 additions & 3 deletions app/views/api/changesets/_changeset.xml.builder
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,13 @@ xml.changeset(attrs) do |changeset_xml_node|

# include discussion if requested

if @include_discussion
if @comments
changeset_xml_node.discussion do |discussion_xml_node|
changeset.comments.includes(:author).each do |comment|
@comments.each do |comment|
cattrs = {
"id" => comment.id,
"date" => comment.created_at.xmlschema
"date" => comment.created_at.xmlschema,
"visible" => comment.visible
}
if comment.author.data_public?
cattrs["uid"] = comment.author.id
Expand Down
174 changes: 146 additions & 28 deletions test/controllers/api/changesets_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -152,39 +152,83 @@ def test_show
assert_response :success, "cannot get first changeset"

assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
assert_select "osm>changeset[id='#{changeset.id}']", 1
assert_select "osm>changeset>@open", "true"
assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
assert_select "osm>changeset>@closed_at", 0
assert_single_changeset changeset
assert_select "osm>changeset>discussion", 0

get changeset_show_path(changeset), :params => { :include_discussion => true }
assert_response :success, "cannot get first changeset with comments"

assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
assert_select "osm>changeset[id='#{changeset.id}']", 1
assert_select "osm>changeset>@open", "true"
assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
assert_select "osm>changeset>@closed_at", 0
assert_single_changeset changeset
assert_select "osm>changeset>discussion", 1
assert_select "osm>changeset>discussion>comment", 0
end

def test_show_comments
# all comments visible
changeset = create(:changeset, :closed)
comment1, comment2, comment3 = create_list(:changeset_comment, 3, :changeset_id => changeset.id)

get changeset_show_path(changeset), :params => { :include_discussion => true }
assert_response :success, "cannot get closed changeset with comments"

assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
assert_select "osm>changeset[id='#{changeset.id}']", 1
assert_select "osm>changeset>@open", "false"
assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
assert_select "osm>changeset>@closed_at", changeset.closed_at.xmlschema
assert_single_changeset changeset
assert_select "osm>changeset>discussion", 1
assert_select "osm>changeset>discussion>comment", 3
assert_select "osm>changeset>discussion>comment:nth-child(1)>@id", comment1.id.to_s
assert_select "osm>changeset>discussion>comment:nth-child(1)>@visible", "true"
assert_select "osm>changeset>discussion>comment:nth-child(2)>@id", comment2.id.to_s
assert_select "osm>changeset>discussion>comment:nth-child(2)>@visible", "true"
assert_select "osm>changeset>discussion>comment:nth-child(3)>@id", comment3.id.to_s
assert_select "osm>changeset>discussion>comment:nth-child(3)>@visible", "true"

# one hidden comment not included because not asked for
comment2.update(:visible => false)

get changeset_show_path(changeset), :params => { :include_discussion => true }
assert_response :success, "cannot get closed changeset with comments"

assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
assert_single_changeset changeset
assert_select "osm>changeset>discussion", 1
assert_select "osm>changeset>discussion>comment", 2
assert_select "osm>changeset>discussion>comment:nth-child(1)>@id", comment1.id.to_s
assert_select "osm>changeset>discussion>comment:nth-child(1)>@visible", "true"
assert_select "osm>changeset>discussion>comment:nth-child(2)>@id", comment3.id.to_s
assert_select "osm>changeset>discussion>comment:nth-child(2)>@visible", "true"

# one hidden comment not included because no permissions
get changeset_show_path(changeset), :params => { :include_discussion => true, :show_hidden_comments => true }
assert_response :success, "cannot get closed changeset with comments"

assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
assert_single_changeset changeset
assert_select "osm>changeset>discussion", 1
assert_select "osm>changeset>discussion>comment", 2
assert_select "osm>changeset>discussion>comment:nth-child(1)>@id", comment1.id.to_s
assert_select "osm>changeset>discussion>comment:nth-child(1)>@visible", "true"
# maybe will show an empty comment element with visible=false in the future
assert_select "osm>changeset>discussion>comment:nth-child(2)>@id", comment3.id.to_s
assert_select "osm>changeset>discussion>comment:nth-child(2)>@visible", "true"

# one hidden comment shown to moderators
moderator_user = create(:moderator_user)
auth_header = basic_authorization_header moderator_user.email, "test"
get changeset_show_path(changeset), :params => { :include_discussion => true, :show_hidden_comments => true },
:headers => auth_header
assert_response :success, "cannot get closed changeset with comments"

assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
assert_single_changeset changeset
assert_select "osm>changeset>discussion", 1
assert_select "osm>changeset>discussion>comment", 3
assert_select "osm>changeset>discussion>comment:nth-child(1)>@id", comment1.id.to_s
assert_select "osm>changeset>discussion>comment:nth-child(1)>@visible", "true"
assert_select "osm>changeset>discussion>comment:nth-child(2)>@id", comment2.id.to_s
assert_select "osm>changeset>discussion>comment:nth-child(2)>@visible", "false"
assert_select "osm>changeset>discussion>comment:nth-child(3)>@id", comment3.id.to_s
assert_select "osm>changeset>discussion>comment:nth-child(3)>@visible", "true"
end

def test_show_json
Expand All @@ -198,10 +242,7 @@ def test_show_json

assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
assert_equal changeset.id, js["changeset"]["id"]
assert js["changeset"]["open"]
assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
assert_nil js["changeset"]["closed_at"]
assert_single_changeset_json changeset, js
assert_nil js["changeset"]["tags"]
assert_nil js["changeset"]["comments"]
assert_equal changeset.user.id, js["changeset"]["uid"]
Expand All @@ -214,17 +255,17 @@ def test_show_json
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
assert_equal changeset.id, js["changeset"]["id"]
assert js["changeset"]["open"]
assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
assert_nil js["changeset"]["closed_at"]
assert_single_changeset_json changeset, js
assert_nil js["changeset"]["tags"]
assert_nil js["changeset"]["min_lat"]
assert_nil js["changeset"]["min_lon"]
assert_nil js["changeset"]["max_lat"]
assert_nil js["changeset"]["max_lon"]
assert_equal 0, js["changeset"]["comments"].count
end

def test_show_comments_json
# all comments visible
changeset = create(:changeset, :closed)
comment0, comment1, comment2 = create_list(:changeset_comment, 3, :changeset_id => changeset.id)

Expand All @@ -235,14 +276,67 @@ def test_show_json
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
assert_equal changeset.id, js["changeset"]["id"]
assert_not js["changeset"]["open"]
assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
assert_equal changeset.closed_at.xmlschema, js["changeset"]["closed_at"]
assert_single_changeset_json changeset, js
assert_equal 3, js["changeset"]["comments"].count
assert_equal comment0.id, js["changeset"]["comments"][0]["id"]
assert js["changeset"]["comments"][0]["visible"]
assert_equal comment1.id, js["changeset"]["comments"][1]["id"]
assert js["changeset"]["comments"][1]["visible"]
assert_equal comment2.id, js["changeset"]["comments"][2]["id"]
assert js["changeset"]["comments"][2]["visible"]

# one hidden comment not included because not asked for
comment1.update(:visible => false)

get changeset_show_path(changeset), :params => { :format => "json", :include_discussion => true }
assert_response :success, "cannot get closed changeset with comments"

js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
assert_single_changeset_json changeset, js
assert_equal 2, js["changeset"]["comments"].count
assert_equal comment0.id, js["changeset"]["comments"][0]["id"]
assert js["changeset"]["comments"][0]["visible"]
assert_equal comment2.id, js["changeset"]["comments"][1]["id"]
assert js["changeset"]["comments"][1]["visible"]

# one hidden comment not included because no permissions
get changeset_show_path(changeset), :params => { :format => "json", :include_discussion => true, :show_hidden_comments => true }
assert_response :success, "cannot get closed changeset with comments"

js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
assert_single_changeset_json changeset, js
assert_equal 2, js["changeset"]["comments"].count
assert_equal comment0.id, js["changeset"]["comments"][0]["id"]
assert js["changeset"]["comments"][0]["visible"]
# maybe will show an empty comment element with visible=false in the future
assert_equal comment2.id, js["changeset"]["comments"][1]["id"]
assert js["changeset"]["comments"][1]["visible"]

# one hidden comment shown to moderators
moderator_user = create(:moderator_user)
auth_header = basic_authorization_header moderator_user.email, "test"
get changeset_show_path(changeset), :params => { :format => "json", :include_discussion => true, :show_hidden_comments => true },
:headers => auth_header
assert_response :success, "cannot get closed changeset with comments"

js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
assert_single_changeset_json changeset, js
assert_equal 3, js["changeset"]["comments"].count
assert_equal comment0.id, js["changeset"]["comments"][0]["id"]
assert js["changeset"]["comments"][0]["visible"]
assert_equal comment1.id, js["changeset"]["comments"][1]["id"]
refute js["changeset"]["comments"][1]["visible"]
assert_equal comment2.id, js["changeset"]["comments"][2]["id"]
assert js["changeset"]["comments"][2]["visible"]
end

def test_show_tag_and_discussion_json
Expand Down Expand Up @@ -270,10 +364,7 @@ def test_show_tag_and_discussion_json
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
assert_equal changeset.id, js["changeset"]["id"]
assert_not js["changeset"]["open"]
assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
assert_equal changeset.closed_at.xmlschema, js["changeset"]["closed_at"]
assert_single_changeset_json changeset, js
assert_equal 2, js["changeset"]["tags"].count
assert_equal 3, js["changeset"]["comments"].count
assert_equal 3, js["changeset"]["comments_count"]
Expand Down Expand Up @@ -2355,6 +2446,33 @@ def test_unsubscribe_fail

private

##
# check that the output consists of one specific changeset
def assert_single_changeset(changeset)
assert_select "osm>changeset", 1
assert_select "osm>changeset>@id", changeset.id.to_s
assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
if changeset.open?
assert_select "osm>changeset>@open", "true"
assert_select "osm>changeset>@closed_at", 0
else
assert_select "osm>changeset>@open", "false"
assert_select "osm>changeset>@closed_at", changeset.closed_at.xmlschema
end
end

def assert_single_changeset_json(changeset, js)
assert_equal changeset.id, js["changeset"]["id"]
assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
if changeset.open?
assert js["changeset"]["open"]
assert_nil js["changeset"]["closed_at"]
else
assert_not js["changeset"]["open"]
assert_equal changeset.closed_at.xmlschema, js["changeset"]["closed_at"]
end
end

##
# check that certain changesets exist in the output
def assert_changesets(changesets)
Expand Down

0 comments on commit 014de36

Please sign in to comment.