From: Anton Khorev Date: Fri, 23 Aug 2024 14:40:26 +0000 (+0300) Subject: Move changeset comments controller to feeds module X-Git-Tag: live~372^2~1 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/09d5ae68ddae20abc653d0d6b2cf3ef9dc12da2e Move changeset comments controller to feeds module --- diff --git a/app/controllers/changeset_comments_controller.rb b/app/controllers/changeset_comments_controller.rb deleted file mode 100644 index 637ac7be6..000000000 --- a/app/controllers/changeset_comments_controller.rb +++ /dev/null @@ -1,50 +0,0 @@ -class ChangesetCommentsController < ApplicationController - before_action :authorize_web - before_action :set_locale - - authorize_resource - - before_action -> { check_database_readable(:need_api => true) } - around_action :web_timeout - - ## - # Get a feed of recent changeset comments - def index - if params[:id] - # Extract the arguments - id = params[:id].to_i - - # Find the changeset - changeset = Changeset.find(id) - - # Return comments for this changeset only - @comments = changeset.comments.includes(:author, :changeset).reverse_order.limit(comments_limit) - else - # Return comments - @comments = ChangesetComment.includes(:author, :changeset).where(:visible => true).order("created_at DESC").limit(comments_limit).preload(:changeset) - end - - # Render the result - respond_to do |format| - format.rss - end - rescue OSM::APIBadUserInput - head :bad_request - end - - private - - ## - # Get the maximum number of comments to return - def comments_limit - if params[:limit] - if params[:limit].to_i.positive? && params[:limit].to_i <= 10000 - params[:limit].to_i - else - raise OSM::APIBadUserInput, "Comments limit must be between 1 and 10000" - end - else - 100 - end - end -end diff --git a/app/controllers/feeds/changeset_comments_controller.rb b/app/controllers/feeds/changeset_comments_controller.rb new file mode 100644 index 000000000..e24b353b8 --- /dev/null +++ b/app/controllers/feeds/changeset_comments_controller.rb @@ -0,0 +1,52 @@ +module Feeds + class ChangesetCommentsController < ApplicationController + before_action :authorize_web + before_action :set_locale + + authorize_resource + + before_action -> { check_database_readable(:need_api => true) } + around_action :web_timeout + + ## + # Get a feed of recent changeset comments + def index + if params[:id] + # Extract the arguments + id = params[:id].to_i + + # Find the changeset + changeset = Changeset.find(id) + + # Return comments for this changeset only + @comments = changeset.comments.includes(:author, :changeset).reverse_order.limit(comments_limit) + else + # Return comments + @comments = ChangesetComment.includes(:author, :changeset).where(:visible => true).order("created_at DESC").limit(comments_limit).preload(:changeset) + end + + # Render the result + respond_to do |format| + format.rss + end + rescue OSM::APIBadUserInput + head :bad_request + end + + private + + ## + # Get the maximum number of comments to return + def comments_limit + if params[:limit] + if params[:limit].to_i.positive? && params[:limit].to_i <= 10000 + params[:limit].to_i + else + raise OSM::APIBadUserInput, "Comments limit must be between 1 and 10000" + end + else + 100 + end + end + end +end diff --git a/app/views/changeset_comments/_comment.html.erb b/app/views/feeds/changeset_comments/_comment.html.erb similarity index 100% rename from app/views/changeset_comments/_comment.html.erb rename to app/views/feeds/changeset_comments/_comment.html.erb diff --git a/app/views/changeset_comments/_comment.rss.builder b/app/views/feeds/changeset_comments/_comment.rss.builder similarity index 100% rename from app/views/changeset_comments/_comment.rss.builder rename to app/views/feeds/changeset_comments/_comment.rss.builder diff --git a/app/views/changeset_comments/index.rss.builder b/app/views/feeds/changeset_comments/index.rss.builder similarity index 79% rename from app/views/changeset_comments/index.rss.builder rename to app/views/feeds/changeset_comments/index.rss.builder index f055c2014..c86b938f7 100644 --- a/app/views/changeset_comments/index.rss.builder +++ b/app/views/feeds/changeset_comments/index.rss.builder @@ -6,7 +6,7 @@ xml.rss("version" => "2.0", else xml.title t(".title_all") end - xml.link url_for(:controller => "site", :action => "index", :only_path => false) + xml.link root_url xml << render(:partial => "comment", :collection => @comments) end diff --git a/app/views/changeset_comments/timeout.atom.builder b/app/views/feeds/changeset_comments/timeout.atom.builder similarity index 100% rename from app/views/changeset_comments/timeout.atom.builder rename to app/views/feeds/changeset_comments/timeout.atom.builder diff --git a/app/views/changeset_comments/timeout.html.erb b/app/views/feeds/changeset_comments/timeout.html.erb similarity index 100% rename from app/views/changeset_comments/timeout.html.erb rename to app/views/feeds/changeset_comments/timeout.html.erb diff --git a/config/locales/en.yml b/config/locales/en.yml index 80811cd1f..a6bde26a1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -246,6 +246,18 @@ en: entry: comment: Comment full: Full note + feeds: + changeset_comments: + comment: + comment: "New comment on changeset #%{changeset_id} by %{author}" + commented_at_by_html: "Updated %{when} by %{user}" + comments: + comment: "New comment on changeset #%{changeset_id} by %{author}" + index: + title_all: OpenStreetMap changeset discussion + title_particular: "OpenStreetMap changeset #%{changeset_id} discussion" + timeout: + sorry: "Sorry, the list of changeset comments you requested took too long to retrieve." account: deletions: show: @@ -490,17 +502,6 @@ en: relations_paginated: "Relations (%{x}-%{y} of %{count})" timeout: sorry: "Sorry, the list of changesets you requested took too long to retrieve." - changeset_comments: - comment: - comment: "New comment on changeset #%{changeset_id} by %{author}" - commented_at_by_html: "Updated %{when} by %{user}" - comments: - comment: "New comment on changeset #%{changeset_id} by %{author}" - index: - title_all: OpenStreetMap changeset discussion - title_particular: "OpenStreetMap changeset #%{changeset_id} discussion" - timeout: - sorry: "Sorry, the list of changeset comments you requested took too long to retrieve." dashboards: contact: km away: "%{count}km away" diff --git a/config/routes.rb b/config/routes.rb index 125d6f810..e84b49b4b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -126,7 +126,7 @@ OpenStreetMap::Application.routes.draw do resources :changesets, :path => "changeset", :id => /\d+/, :only => :show do match :subscribe, :unsubscribe, :on => :member, :via => [:get, :post] end - get "/changeset/:id/comments/feed" => "changeset_comments#index", :as => :changeset_comments_feed, :id => /\d*/, :defaults => { :format => "rss" } + get "/changeset/:id/comments/feed" => "feeds/changeset_comments#index", :as => :changeset_comments_feed, :id => /\d*/, :defaults => { :format => "rss" } resources :notes, :path => "note", :id => /\d+/, :only => [:show, :new] get "/user/:display_name/history" => "changesets#index" @@ -164,7 +164,7 @@ OpenStreetMap::Application.routes.draw do get "/communities" => "site#communities" get "/history" => "changesets#index" get "/history/feed" => "changesets#feed", :defaults => { :format => :atom } - get "/history/comments/feed" => "changeset_comments#index", :as => :changesets_comments_feed, :defaults => { :format => "rss" } + get "/history/comments/feed" => "feeds/changeset_comments#index", :as => :changesets_comments_feed, :defaults => { :format => "rss" } get "/export" => "site#export" get "/login" => "sessions#new" post "/login" => "sessions#create" diff --git a/test/controllers/changeset_comments_controller_test.rb b/test/controllers/changeset_comments_controller_test.rb deleted file mode 100644 index b03640eab..000000000 --- a/test/controllers/changeset_comments_controller_test.rb +++ /dev/null @@ -1,70 +0,0 @@ -require "test_helper" - -class ChangesetCommentsControllerTest < ActionDispatch::IntegrationTest - ## - # test all routes which lead to this controller - def test_routes - assert_routing( - { :path => "/changeset/1/comments/feed", :method => :get }, - { :controller => "changeset_comments", :action => "index", :id => "1", :format => "rss" } - ) - assert_routing( - { :path => "/history/comments/feed", :method => :get }, - { :controller => "changeset_comments", :action => "index", :format => "rss" } - ) - end - - ## - # test comments feed - def test_feed - changeset = create(:changeset, :closed) - create_list(:changeset_comment, 3, :changeset => changeset) - - get changesets_comments_feed_path(:format => "rss") - assert_response :success - assert_equal "application/rss+xml", @response.media_type - assert_select "rss", :count => 1 do - assert_select "channel", :count => 1 do - assert_select "item", :count => 3 - end - end - - get changesets_comments_feed_path(:format => "rss", :limit => 2) - assert_response :success - assert_equal "application/rss+xml", @response.media_type - assert_select "rss", :count => 1 do - assert_select "channel", :count => 1 do - assert_select "item", :count => 2 - end - end - - get changeset_comments_feed_path(:id => changeset.id, :format => "rss") - assert_response :success - assert_equal "application/rss+xml", @response.media_type - last_comment_id = -1 - assert_select "rss", :count => 1 do - assert_select "channel", :count => 1 do - assert_select "item", :count => 3 do |items| - items.each do |item| - assert_select item, "link", :count => 1 do |link| - match = assert_match(/^#{changeset_url changeset}#c(\d+)$/, link.text) - comment_id = match[1].to_i - assert_operator comment_id, "<", last_comment_id if last_comment_id != -1 - last_comment_id = comment_id - end - end - end - end - end - end - - ## - # test comments feed - def test_feed_bad_limit - get changesets_comments_feed_path(:format => "rss", :limit => 0) - assert_response :bad_request - - get changesets_comments_feed_path(:format => "rss", :limit => 100001) - assert_response :bad_request - end -end diff --git a/test/controllers/feeds/changeset_comments_controller_test.rb b/test/controllers/feeds/changeset_comments_controller_test.rb new file mode 100644 index 000000000..aff04778b --- /dev/null +++ b/test/controllers/feeds/changeset_comments_controller_test.rb @@ -0,0 +1,72 @@ +require "test_helper" + +module Feeds + class ChangesetCommentsControllerTest < ActionDispatch::IntegrationTest + ## + # test all routes which lead to this controller + def test_routes + assert_routing( + { :path => "/changeset/1/comments/feed", :method => :get }, + { :controller => "feeds/changeset_comments", :action => "index", :id => "1", :format => "rss" } + ) + assert_routing( + { :path => "/history/comments/feed", :method => :get }, + { :controller => "feeds/changeset_comments", :action => "index", :format => "rss" } + ) + end + + ## + # test comments feed + def test_feed + changeset = create(:changeset, :closed) + create_list(:changeset_comment, 3, :changeset => changeset) + + get changesets_comments_feed_path(:format => "rss") + assert_response :success + assert_equal "application/rss+xml", @response.media_type + assert_select "rss", :count => 1 do + assert_select "channel", :count => 1 do + assert_select "item", :count => 3 + end + end + + get changesets_comments_feed_path(:format => "rss", :limit => 2) + assert_response :success + assert_equal "application/rss+xml", @response.media_type + assert_select "rss", :count => 1 do + assert_select "channel", :count => 1 do + assert_select "item", :count => 2 + end + end + + get changeset_comments_feed_path(:id => changeset.id, :format => "rss") + assert_response :success + assert_equal "application/rss+xml", @response.media_type + last_comment_id = -1 + assert_select "rss", :count => 1 do + assert_select "channel", :count => 1 do + assert_select "item", :count => 3 do |items| + items.each do |item| + assert_select item, "link", :count => 1 do |link| + match = assert_match(/^#{changeset_url changeset}#c(\d+)$/, link.text) + comment_id = match[1].to_i + assert_operator comment_id, "<", last_comment_id if last_comment_id != -1 + last_comment_id = comment_id + end + end + end + end + end + end + + ## + # test comments feed + def test_feed_bad_limit + get changesets_comments_feed_path(:format => "rss", :limit => 0) + assert_response :bad_request + + get changesets_comments_feed_path(:format => "rss", :limit => 100001) + assert_response :bad_request + end + end +end