From 71654e563ebe04856b931a7ad62a2f4bf2a04c65 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Fri, 8 Sep 2023 15:25:15 +0300 Subject: [PATCH] Add show user block api endpoint --- app/abilities/api_ability.rb | 1 + app/controllers/api/user_blocks_controller.rb | 18 +++++++++++++ .../api/user_blocks/_user_block.xml.builder | 14 ++++++++++ app/views/api/user_blocks/show.xml.builder | 5 ++++ config/routes.rb | 2 ++ .../api/user_blocks_controller_test.rb | 26 +++++++++++++++++++ 6 files changed, 66 insertions(+) create mode 100644 app/controllers/api/user_blocks_controller.rb create mode 100644 app/views/api/user_blocks/_user_block.xml.builder create mode 100644 app/views/api/user_blocks/show.xml.builder create mode 100644 test/controllers/api/user_blocks_controller_test.rb diff --git a/app/abilities/api_ability.rb b/app/abilities/api_ability.rb index 9b274ec84..fe39f5eb5 100644 --- a/app/abilities/api_ability.rb +++ b/app/abilities/api_ability.rb @@ -21,6 +21,7 @@ class ApiAbility can [:history, :version], OldNode can [:history, :version], OldWay can [:history, :version], OldRelation + can [:show], UserBlock end if user&.active? diff --git a/app/controllers/api/user_blocks_controller.rb b/app/controllers/api/user_blocks_controller.rb new file mode 100644 index 000000000..19fd4b400 --- /dev/null +++ b/app/controllers/api/user_blocks_controller.rb @@ -0,0 +1,18 @@ +module Api + class UserBlocksController < ApiController + before_action :check_api_readable + + authorize_resource + + around_action :api_call_handle_error, :api_call_timeout + before_action :set_request_formats + + def show + raise OSM::APIBadUserInput, "No id was given" unless params[:id] + + @user_block = UserBlock.find(params[:id]) + rescue ActiveRecord::RecordNotFound + raise OSM::APINotFoundError + end + end +end diff --git a/app/views/api/user_blocks/_user_block.xml.builder b/app/views/api/user_blocks/_user_block.xml.builder new file mode 100644 index 000000000..a41dc56d7 --- /dev/null +++ b/app/views/api/user_blocks/_user_block.xml.builder @@ -0,0 +1,14 @@ +attrs = { + "id" => user_block.id, + "created_at" => user_block.created_at.xmlschema, + "updated_at" => user_block.updated_at.xmlschema, + "ends_at" => user_block.ends_at.xmlschema, + "needs_view" => user_block.needs_view +} + +xml.user_block(attrs) do + xml.user :uid => user_block.user_id, :user => user_block.user.display_name + xml.creator :uid => user_block.creator_id, :user => user_block.creator.display_name + xml.revoker :uid => user_block.revoker_id, :user => user_block.revoker.display_name if user_block.revoker + xml.reason user_block.reason +end diff --git a/app/views/api/user_blocks/show.xml.builder b/app/views/api/user_blocks/show.xml.builder new file mode 100644 index 000000000..eff666ba7 --- /dev/null +++ b/app/views/api/user_blocks/show.xml.builder @@ -0,0 +1,5 @@ +xml.instruct! + +xml.osm(OSM::API.new.xml_root_attributes) do |osm| + osm << (render(@user_block) || "") +end diff --git a/config/routes.rb b/config/routes.rb index 415f8a01b..404e7b0a3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -102,6 +102,8 @@ OpenStreetMap::Application.routes.draw do post "notes/editPOIexec" => "api/notes#comment" get "notes/getGPX" => "api/notes#index", :format => "gpx" get "notes/getRSSfeed" => "api/notes#feed", :format => "rss" + + resources :user_blocks, :only => [:show], :constraints => { :id => /\d+/ }, :controller => "api/user_blocks", :as => :api_user_blocks end # Data browsing diff --git a/test/controllers/api/user_blocks_controller_test.rb b/test/controllers/api/user_blocks_controller_test.rb new file mode 100644 index 000000000..eef54e931 --- /dev/null +++ b/test/controllers/api/user_blocks_controller_test.rb @@ -0,0 +1,26 @@ +require "test_helper" + +module Api + class UserBlocksControllerTest < ActionDispatch::IntegrationTest + def test_routes + assert_routing( + { :path => "/api/0.6/user_blocks/1", :method => :get }, + { :controller => "api/user_blocks", :action => "show", :id => "1" } + ) + end + + def test_show + block = create(:user_block) + + get api_user_block_path(:id => block) + assert_response :success + assert_select "user_block[id='#{block.id}']", 1 + end + + def test_show_not_found + get api_user_block_path(:id => 123) + assert_response :not_found + assert_equal "text/plain", @response.media_type + end + end +end -- 2.39.5