]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/api/changesets_controller.rb
Merge remote-tracking branch 'upstream/pull/5685'
[rails.git] / app / controllers / api / changesets_controller.rb
index 2bca8813a0f04ddee75c24b91e5f8ca4924f98d6..3df7b75cea752aeb11a0681b728377d6f6a0d0e0 100644 (file)
@@ -2,8 +2,9 @@
 
 module Api
   class ChangesetsController < ApiController
+    include QueryMethods
+
     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]
 
@@ -12,12 +13,49 @@ module Api
     before_action :require_public_data, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
     before_action :set_request_formats, :except => [:create, :close, :upload]
 
-    around_action :api_call_handle_error
-    around_action :api_call_timeout, :except => [:upload]
+    skip_around_action :api_call_timeout, :only => [:upload]
 
     # Helper methods for checking consistency
     include ConsistencyValidations
 
+    ##
+    # query changesets by bounding box, time, user or open/closed status.
+    def index
+      raise OSM::APIBadUserInput, "cannot use order=oldest with time" if params[:time] && params[:order] == "oldest"
+
+      # find any bounding box
+      bbox = BoundingBox.from_bbox_params(params) if params["bbox"]
+
+      # create the conditions that the user asked for. some or all of
+      # these may be nil.
+      changesets = Changeset.all
+      changesets = conditions_bbox(changesets, bbox)
+      changesets = conditions_user(changesets, params["user"], params["display_name"])
+      changesets = conditions_time(changesets, params["time"])
+      changesets = query_conditions_time(changesets)
+      changesets = conditions_open(changesets, params["open"])
+      changesets = conditions_closed(changesets, params["closed"])
+      changesets = conditions_ids(changesets, params["changesets"])
+
+      # sort the changesets
+      changesets = if params[:order] == "oldest"
+                     changesets.order(:created_at => :asc)
+                   else
+                     changesets.order(:created_at => :desc)
+                   end
+
+      # limit the result
+      changesets = query_limit(changesets)
+
+      # preload users, tags and comments, and render result
+      @changesets = changesets.preload(:user, :changeset_tags, :comments)
+
+      respond_to do |format|
+        format.xml
+        format.json
+      end
+    end
+
     ##
     # Return XML giving the basic info about the changeset. Does not
     # return anything about the nodes, ways and relations in the changeset.
@@ -144,45 +182,6 @@ module Api
       end
     end
 
-    ##
-    # query changesets by bounding box, time, user or open/closed status.
-    def query
-      raise OSM::APIBadUserInput, "cannot use order=oldest with time" if params[:time] && params[:order] == "oldest"
-
-      # find any bounding box
-      bbox = BoundingBox.from_bbox_params(params) if params["bbox"]
-
-      # create the conditions that the user asked for. some or all of
-      # these may be nil.
-      changesets = Changeset.all
-      changesets = conditions_bbox(changesets, bbox)
-      changesets = conditions_user(changesets, params["user"], params["display_name"])
-      changesets = conditions_time(changesets, params["time"])
-      changesets = conditions_from_to(changesets, params["from"], params["to"])
-      changesets = conditions_open(changesets, params["open"])
-      changesets = conditions_closed(changesets, params["closed"])
-      changesets = conditions_ids(changesets, params["changesets"])
-
-      # sort the changesets
-      changesets = if params[:order] == "oldest"
-                     changesets.order(:created_at => :asc)
-                   else
-                     changesets.order(:created_at => :desc)
-                   end
-
-      # limit the result
-      changesets = changesets.limit(result_limit)
-
-      # preload users, tags and comments, and render result
-      @changesets = changesets.preload(:user, :changeset_tags, :comments)
-      render "changesets"
-
-      respond_to do |format|
-        format.xml
-        format.json
-      end
-    end
-
     ##
     # updates a changeset's tags. none of the changeset's attributes are
     # user-modifiable, so they will be ignored.
@@ -332,7 +331,7 @@ module Api
         changesets.where("closed_at >= ? and created_at <= ?", from, to)
       else
         # if there is no comma, assume its a lower limit on time
-        changesets.where("closed_at >= ?", Time.parse(time).utc)
+        changesets.where(:closed_at => Time.parse(time).utc..)
       end
       # stupid Time seems to throw both of these for bad parsing, so
       # we have to catch both and ensure the correct code path is taken.
@@ -340,33 +339,6 @@ module Api
       raise OSM::APIBadUserInput, e.message.to_s
     end
 
-    ##
-    # restrict changesets to those opened during a particular time period
-    # works similar to from..to of notes controller, including the requirement of 'from' when specifying 'to'
-    def conditions_from_to(changesets, from, to)
-      if from
-        begin
-          from = Time.parse(from).utc
-        rescue ArgumentError
-          raise OSM::APIBadUserInput, "Date #{from} is in a wrong format"
-        end
-
-        begin
-          to = if to
-                 Time.parse(to).utc
-               else
-                 Time.now.utc
-               end
-        rescue ArgumentError
-          raise OSM::APIBadUserInput, "Date #{to} is in a wrong format"
-        end
-
-        changesets.where(:created_at => from..to)
-      else
-        changesets
-      end
-    end
-
     ##
     # return changesets which are open (haven't been closed yet)
     # we do this by seeing if the 'closed at' time is in the future. Also if we've
@@ -406,19 +378,5 @@ module Api
         changesets.where(:id => ids)
       end
     end
-
-    ##
-    # Get the maximum number of results to return
-    def result_limit
-      if params[:limit]
-        if params[:limit].to_i.positive? && params[:limit].to_i <= Settings.max_changeset_query_limit
-          params[:limit].to_i
-        else
-          raise OSM::APIBadUserInput, "Changeset limit must be between 1 and #{Settings.max_changeset_query_limit}"
-        end
-      else
-        Settings.default_changeset_query_limit
-      end
-    end
   end
 end