Make api create way path resourceful

This commit is contained in:
Anton Khorev 2025-02-01 13:25:23 +03:00
parent 96671cf0c0
commit 2ad75d72af
2 changed files with 23 additions and 18 deletions

View file

@ -39,7 +39,6 @@ OpenStreetMap::Application.routes.draw do
put "node/:id" => "nodes#update", :id => /\d+/ put "node/:id" => "nodes#update", :id => /\d+/
delete "node/:id" => "nodes#delete", :id => /\d+/ delete "node/:id" => "nodes#delete", :id => /\d+/
put "way/create" => "ways#create"
get "way/:id/history" => "old_ways#history", :as => :api_way_history, :id => /\d+/ get "way/:id/history" => "old_ways#history", :as => :api_way_history, :id => /\d+/
get "way/:id/full" => "ways#full", :as => :way_full, :id => /\d+/ get "way/:id/full" => "ways#full", :as => :way_full, :id => /\d+/
get "way/:id/relations" => "relations#relations_for_way", :as => :way_relations, :id => /\d+/ get "way/:id/relations" => "relations#relations_for_way", :as => :way_relations, :id => /\d+/
@ -64,7 +63,8 @@ OpenStreetMap::Application.routes.draw do
resources :nodes, :only => [:index, :create] resources :nodes, :only => [:index, :create]
put "node/create" => "nodes#create", :as => nil put "node/create" => "nodes#create", :as => nil
resources :ways, :only => :index resources :ways, :only => [:index, :create]
put "way/create" => "ways#create", :as => nil
resources :relations, :only => :index resources :relations, :only => :index

View file

@ -14,7 +14,7 @@ module Api
{ :controller => "api/ways", :action => "index", :format => "json" } { :controller => "api/ways", :action => "index", :format => "json" }
) )
assert_routing( assert_routing(
{ :path => "/api/0.6/way/create", :method => :put }, { :path => "/api/0.6/ways", :method => :post },
{ :controller => "api/ways", :action => "create" } { :controller => "api/ways", :action => "create" }
) )
assert_routing( assert_routing(
@ -41,6 +41,11 @@ module Api
{ :path => "/api/0.6/way/1", :method => :delete }, { :path => "/api/0.6/way/1", :method => :delete },
{ :controller => "api/ways", :action => "delete", :id => "1" } { :controller => "api/ways", :action => "delete", :id => "1" }
) )
assert_recognizes(
{ :controller => "api/ways", :action => "create" },
{ :path => "/api/0.6/way/create", :method => :put }
)
end end
## ##
@ -155,7 +160,7 @@ module Api
xml = "<osm><way changeset='#{changeset_id}'>" \ xml = "<osm><way changeset='#{changeset_id}'>" \
"<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \ "<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \
"<tag k='test' v='yes' /></way></osm>" "<tag k='test' v='yes' /></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
# hope for failure # hope for failure
assert_response :forbidden, assert_response :forbidden,
"way upload did not return forbidden status" "way upload did not return forbidden status"
@ -170,7 +175,7 @@ module Api
xml = "<osm><way changeset='#{changeset_id}'>" \ xml = "<osm><way changeset='#{changeset_id}'>" \
"<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \ "<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \
"<tag k='test' v='yes' /></way></osm>" "<tag k='test' v='yes' /></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
# hope for success # hope for success
assert_response :success, assert_response :success,
"way upload did not return success status" "way upload did not return success status"
@ -213,7 +218,7 @@ module Api
# create a way with non-existing node # create a way with non-existing node
xml = "<osm><way changeset='#{private_open_changeset.id}'>" \ xml = "<osm><way changeset='#{private_open_changeset.id}'>" \
"<nd ref='0'/><tag k='test' v='yes' /></way></osm>" "<nd ref='0'/><tag k='test' v='yes' /></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
# expect failure # expect failure
assert_response :forbidden, assert_response :forbidden,
"way upload with invalid node using a private user did not return 'forbidden'" "way upload with invalid node using a private user did not return 'forbidden'"
@ -221,7 +226,7 @@ module Api
# create a way with no nodes # create a way with no nodes
xml = "<osm><way changeset='#{private_open_changeset.id}'>" \ xml = "<osm><way changeset='#{private_open_changeset.id}'>" \
"<tag k='test' v='yes' /></way></osm>" "<tag k='test' v='yes' /></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
# expect failure # expect failure
assert_response :forbidden, assert_response :forbidden,
"way upload with no node using a private userdid not return 'forbidden'" "way upload with no node using a private userdid not return 'forbidden'"
@ -229,7 +234,7 @@ module Api
# create a way inside a closed changeset # create a way inside a closed changeset
xml = "<osm><way changeset='#{private_closed_changeset.id}'>" \ xml = "<osm><way changeset='#{private_closed_changeset.id}'>" \
"<nd ref='#{node.id}'/></way></osm>" "<nd ref='#{node.id}'/></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
# expect failure # expect failure
assert_response :forbidden, assert_response :forbidden,
"way upload to closed changeset with a private user did not return 'forbidden'" "way upload to closed changeset with a private user did not return 'forbidden'"
@ -241,7 +246,7 @@ module Api
# create a way with non-existing node # create a way with non-existing node
xml = "<osm><way changeset='#{open_changeset.id}'>" \ xml = "<osm><way changeset='#{open_changeset.id}'>" \
"<nd ref='0'/><tag k='test' v='yes' /></way></osm>" "<nd ref='0'/><tag k='test' v='yes' /></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
# expect failure # expect failure
assert_response :precondition_failed, assert_response :precondition_failed,
"way upload with invalid node did not return 'precondition failed'" "way upload with invalid node did not return 'precondition failed'"
@ -250,7 +255,7 @@ module Api
# create a way with no nodes # create a way with no nodes
xml = "<osm><way changeset='#{open_changeset.id}'>" \ xml = "<osm><way changeset='#{open_changeset.id}'>" \
"<tag k='test' v='yes' /></way></osm>" "<tag k='test' v='yes' /></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
# expect failure # expect failure
assert_response :precondition_failed, assert_response :precondition_failed,
"way upload with no node did not return 'precondition failed'" "way upload with no node did not return 'precondition failed'"
@ -259,7 +264,7 @@ module Api
# create a way inside a closed changeset # create a way inside a closed changeset
xml = "<osm><way changeset='#{closed_changeset.id}'>" \ xml = "<osm><way changeset='#{closed_changeset.id}'>" \
"<nd ref='#{node.id}'/></way></osm>" "<nd ref='#{node.id}'/></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
# expect failure # expect failure
assert_response :conflict, assert_response :conflict,
"way upload to closed changeset did not return 'conflict'" "way upload to closed changeset did not return 'conflict'"
@ -269,7 +274,7 @@ module Api
"<nd ref='#{node.id}'/>" \ "<nd ref='#{node.id}'/>" \
"<tag k='foo' v='#{'x' * 256}'/>" \ "<tag k='foo' v='#{'x' * 256}'/>" \
"</way></osm>" "</way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
# expect failure # expect failure
assert_response :bad_request, assert_response :bad_request,
"way upload to with too long tag did not return 'bad_request'" "way upload to with too long tag did not return 'bad_request'"
@ -696,7 +701,7 @@ module Api
way_str << "</way></osm>" way_str << "</way></osm>"
# try and upload it # try and upload it
put way_create_path, :params => way_str, :headers => auth_header post api_ways_path, :params => way_str, :headers => auth_header
assert_response :forbidden, assert_response :forbidden,
"adding new duplicate tags to a way with a non-public user should fail with 'forbidden'" "adding new duplicate tags to a way with a non-public user should fail with 'forbidden'"
@ -711,7 +716,7 @@ module Api
way_str << "</way></osm>" way_str << "</way></osm>"
# try and upload it # try and upload it
put way_create_path, :params => way_str, :headers => auth_header post api_ways_path, :params => way_str, :headers => auth_header
assert_response :bad_request, assert_response :bad_request,
"adding new duplicate tags to a way should fail with 'bad request'" "adding new duplicate tags to a way should fail with 'bad request'"
assert_equal "Element way/ has duplicate tags with key addr:housenumber", @response.body assert_equal "Element way/ has duplicate tags with key addr:housenumber", @response.body
@ -775,7 +780,7 @@ module Api
xml = "<osm><way changeset='#{changeset.id}'>" \ xml = "<osm><way changeset='#{changeset.id}'>" \
"<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \ "<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \
"<tag k='test' v='yes' /></way></osm>" "<tag k='test' v='yes' /></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
assert_response :success, "way create did not return success status" assert_response :success, "way create did not return success status"
# get the id of the way we created # get the id of the way we created
@ -797,7 +802,7 @@ module Api
xml = "<osm><way changeset='#{changeset.id}'>" \ xml = "<osm><way changeset='#{changeset.id}'>" \
"<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \ "<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \
"<tag k='test' v='yes' /></way></osm>" "<tag k='test' v='yes' /></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
assert_response :too_many_requests, "way create did not hit rate limit" assert_response :too_many_requests, "way create did not hit rate limit"
end end
@ -832,7 +837,7 @@ module Api
xml = "<osm><way changeset='#{changeset.id}'>" \ xml = "<osm><way changeset='#{changeset.id}'>" \
"<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \ "<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \
"<tag k='test' v='yes' /></way></osm>" "<tag k='test' v='yes' /></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
assert_response :success, "way create did not return success status" assert_response :success, "way create did not return success status"
# get the id of the way we created # get the id of the way we created
@ -854,7 +859,7 @@ module Api
xml = "<osm><way changeset='#{changeset.id}'>" \ xml = "<osm><way changeset='#{changeset.id}'>" \
"<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \ "<nd ref='#{node1.id}'/><nd ref='#{node2.id}'/>" \
"<tag k='test' v='yes' /></way></osm>" "<tag k='test' v='yes' /></way></osm>"
put way_create_path, :params => xml, :headers => auth_header post api_ways_path, :params => xml, :headers => auth_header
assert_response :too_many_requests, "way create did not hit rate limit" assert_response :too_many_requests, "way create did not hit rate limit"
end end