]> git.openstreetmap.org Git - rails.git/commitdiff
Merge branch 'master' into notes-search
authorENT8R <info.ent8r@gmail.com>
Tue, 9 Oct 2018 09:41:22 +0000 (11:41 +0200)
committerENT8R <info.ent8r@gmail.com>
Tue, 9 Oct 2018 09:41:22 +0000 (11:41 +0200)
1  2 
app/controllers/notes_controller.rb

index 690467f0dade10aedc25ede3c8da0d5f69164e01,fc7a9e3c758ac17ca6c20cfdb4d60f08d54e452d..ba2df36807debb434acb7b77dbef8f148682c888
@@@ -211,7 -211,7 +211,7 @@@ class NotesController < ApplicationCont
      # Find the note and check it is valid
      @note = Note.find(params[:id])
      raise OSM::APINotFoundError unless @note
-     raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || (current_user && current_user.moderator?)
+     raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || current_user&.moderator?
  
      # Render the result
      respond_to do |format|
    ##
    # Return a list of notes matching a given string
    def search
 -    # Check the arguments are sane
 -    raise OSM::APIBadUserInput, "No query string was given" unless params[:q]
 +    # Filter either by the name or the id of the user
 +    if params[:display_name]
 +      @user = User.find_by(:display_name => params[:display_name])
 +    elsif params[:id]
 +      @user = User.find_by(:id => params[:id])
 +    end
  
 -    # Get any conditions that need to be applied
 -    @notes = closed_condition(Note.all)
 -    @notes = @notes.joins(:comments).where("to_tsvector('english', note_comments.body) @@ plainto_tsquery('english', ?)", params[:q])
 +    if @user
 +      @notes = @user.notes
 +      @notes = closed_condition(@notes)
 +    elsif params[:display_name] || params[:id]
 +      # Return an error message because obviously the user could not be found
 +      raise OSM::APIBadUserInput, "The user could not be found"
 +    else
 +      @notes = closed_condition(Note.all)
 +    end
 +
 +    # Filter by a given string
 +    if params[:q]
 +      # TODO: why doesn't this work if we want to filter the notes of a given user?
 +      @notes = @notes.joins(:comments).where("to_tsvector('english', note_comments.body) @@ plainto_tsquery('english', ?)", params[:q]) unless params[:display_name] || params[:id]
 +    end
 +
 +    # Filter by a given start date and an optional end date
 +    if params[:from]
 +      begin
 +        from = Time.parse(params[:from])
 +        to = if params[:to]
 +               Time.parse(params[:to])
 +             else
 +               Time.now
 +             end
 +      rescue ArgumentError
 +        # return a more generic error so that everybody knows what is wrong
 +        raise OSM::APIBadUserInput, "The date is in a wrong format"
 +      end
 +
 +      @notes = @notes.where("(created_at > '#{from}' AND created_at < '#{to}')")
 +    end
  
      # Find the notes we want to return
 -    @notes = @notes.order("updated_at DESC").limit(result_limit).preload(:comments)
 +    @notes = @notes.order("updated_at DESC").distinct.limit(result_limit).preload(:comments)
  
      # Render the result
      respond_to do |format|
          @page = (params[:page] || 1).to_i
          @page_size = 10
          @notes = @user.notes
-         @notes = @notes.visible unless current_user && current_user.moderator?
+         @notes = @notes.visible unless current_user&.moderator?
          @notes = @notes.order("updated_at DESC, id").distinct.offset((@page - 1) * @page_size).limit(@page_size).preload(:comments => :author).to_a
        else
-         @title = t "user.no_such_user.title"
+         @title = t "users.no_such_user.title"
          @not_found_user = params[:display_name]
  
-         render :template => "user/no_such_user", :status => :not_found
+         render :template => "users/no_such_user", :status => :not_found
        end
      end
    end
    # Get the maximum number of results to return
    def result_limit
      if params[:limit]
-       if params[:limit].to_i > 0 && params[:limit].to_i <= 10000
+       if params[:limit].to_i.positive? && params[:limit].to_i <= 10000
          params[:limit].to_i
        else
          raise OSM::APIBadUserInput, "Note limit must be between 1 and 10000"
                       7
                     end
  
-     if closed_since < 0
-       notes.where("status != 'hidden'")
-     elsif closed_since > 0
-       notes.where("(status = 'open' OR (status = 'closed' AND closed_at > '#{Time.now - closed_since.days}'))")
+     if closed_since.negative?
+       notes.where.not(:status => "hidden")
+     elsif closed_since.positive?
+       notes.where(:status => "open")
+            .or(notes.where(:status => "closed")
+                     .where(notes.arel_table[:closed_at].gt(Time.now - closed_since.days)))
      else
-       notes.where("status = 'open'")
+       notes.where(:status => "open")
      end
    end