diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f8556f1dd..798a191c2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -62,9 +62,9 @@ class ApplicationController < ActionController::Base when ActionController::UnknownFormat, ActionView::MissingTemplate render_error_page(406, exception, message: "#{request.format.to_s} is not a supported format for this page") when Danbooru::Paginator::PaginationError - render_error_page(410, exception) + render_error_page(410, exception, template: "static/pagination_error", message: "You cannot go beyond page #{Danbooru.config.max_numbered_pages}.") when Post::SearchError - render_error_page(422, exception) + render_error_page(422, exception, template: "static/tag_limit_error", message: "You cannot search for more than #{CurrentUser.tag_query_limit} tags at a time.") when ApiLimitError render_error_page(429, exception) when NotImplementedError diff --git a/app/logical/danbooru/paginator/active_record_extension.rb b/app/logical/danbooru/paginator/active_record_extension.rb index 1e9488495..98112a3c6 100644 --- a/app/logical/danbooru/paginator/active_record_extension.rb +++ b/app/logical/danbooru/paginator/active_record_extension.rb @@ -54,7 +54,7 @@ module Danbooru page = [page.to_i, 1].max if page > Danbooru.config.max_numbered_pages - raise ::Danbooru::Paginator::PaginationError.new("You cannot go beyond page #{Danbooru.config.max_numbered_pages}. Please narrow your search terms.") + raise ::Danbooru::Paginator::PaginationError end extending(NumberedCollectionExtension).limit(records_per_page).offset((page - 1) * records_per_page).tap do |obj| diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index d3082ffa8..84906269d 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -122,7 +122,7 @@ class PostQueryBuilder relation = read_only ? PostReadOnly.all : Post.all if q[:tag_count].to_i > Danbooru.config.tag_query_limit - raise ::Post::SearchError.new("You cannot search for more than #{Danbooru.config.tag_query_limit} tags at a time") + raise ::Post::SearchError end if CurrentUser.safe_mode? diff --git a/app/views/static/pagination_error.html.erb b/app/views/static/pagination_error.html.erb new file mode 100644 index 000000000..d9cc0b5c0 --- /dev/null +++ b/app/views/static/pagination_error.html.erb @@ -0,0 +1,17 @@ +

Search Error

+ +

+ <%= @message %> + + <% if CurrentUser.is_platinum? %> + Try narrowing your search terms. + <% else %> + Try narrowing your search terms, or <%= link_to "upgrade your account", new_user_upgrade_path %> to go beyond page <%= Danbooru.config.max_numbered_pages %>. + <% end %> +

+ +<%= link_to "Go back", :back, rel: "prev" %> + +<% content_for(:page_title) do %> + Search Error - <%= Danbooru.config.app_name %> +<% end %> diff --git a/app/views/static/tag_limit_error.html.erb b/app/views/static/tag_limit_error.html.erb new file mode 100644 index 000000000..5e81a5b4a --- /dev/null +++ b/app/views/static/tag_limit_error.html.erb @@ -0,0 +1,15 @@ +

Search Error

+ +

+ <%= @message %> + + <% unless CurrentUser.is_platinum? %> + <%= link_to "Upgrade your account", new_user_upgrade_path %> to search for more tags at once. + <% end %> +

+ +<%= link_to "Go back", :back, rel: "prev" %> + +<% content_for(:page_title) do %> + Search Error - <%= Danbooru.config.app_name %> +<% end %> diff --git a/test/functional/posts_controller_test.rb b/test/functional/posts_controller_test.rb index 0e660d49d..16ab3d9d7 100644 --- a/test/functional/posts_controller_test.rb +++ b/test/functional/posts_controller_test.rb @@ -66,6 +66,20 @@ class PostsControllerTest < ActionDispatch::IntegrationTest get posts_path, params: {:tags => "1girl solo"} assert_response :success end + + should "render an error when searching for too many tags" do + get posts_path, params: { tags: "1 2 3" } + + assert_response 422 + assert_select "h1", "Search Error" + end + + should "render an error when exceeding the page limit" do + get posts_path, params: { page: 1001 } + + assert_response 410 + assert_select "h1", "Search Error" + end end context "with an md5 param" do