Project

General

Profile

Actions

Defect #34615

closed

'Search' falsy parameters are not respected

Added by Jakub G over 3 years ago. Updated about 3 years ago.

Status:
Closed
Priority:
Normal
Assignee:
Category:
REST API
Target version:
Start date:
Due date:
% Done:

0%

Estimated time:
Resolution:
Fixed
Affected version:

Description

I'd like to implement search feature using REST API, but i noticed that this feature do not respect passed falsy values (booleans nor numbers). The same behavior can be observed on page.

What i mean is that if i pass 'false' or '0' as value, it's treated like truthy value anyway.

For example, logically, this query:

https://www.redmine.org/projects/redmine/search?q=issue&issues=0&news=0&changesets=0&wiki_pages=1&messages=false&redmine_plugins=0

should return results of only wiki pages with word 'issue' (because for other parameters i passed falsy values: '0' or 'false'). But those values are ignored. Even when i pass empty parameter (like '...&messages=&...') it's stil not working properly.

Why is it so big deal?

Well, since on page there is dedicated form for searching, it's not a problem, but when i'm using API eg. in Node.js, it's more logical and convinient way to pass all search parameters but with bool values (or eventually empty when use 'null' or 'undefined' JS type).

P.S.: Tested on Redmine version 4.1.1


Files

Actions #1

Updated by Marius BĂLTEANU over 3 years ago

  • Status changed from New to Confirmed
Actions #2

Updated by Marius BĂLTEANU over 3 years ago

Thanks Jakub for reporting this issue, I was able to confirm the strange behaviour.

Actions #3

Updated by Marius BĂLTEANU over 3 years ago

I took a look and it seems that some params (for example: all_words, titles_only) already supports passing a "falsy" value, but not by passing 0 (titles_only=0) or false (titles_only=false), but by passing an empty value (titles_only=). In a first phase, I think we can extend this behaviour to module params as well.

The change is quite small, but I'll post a patch in the following days after I check the tests.

diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index d6bb2dd94..1a4a12fcc 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -63,7 +63,7 @@ class SearchController < ApplicationController
       @object_types = @object_types.select {|o| User.current.allowed_to?("view_#{o}".to_sym, projects_to_search)}
     end

-    @scope = @object_types.select {|t| params[t]}
+    @scope = @object_types.select {|t| params[t].present?}
     @scope = @object_types if @scope.empty?

     fetcher = Redmine::Search::Fetcher.new(
(END)

Jakub, please let me know if this cover your needs.

Actions #4

Updated by Marius BĂLTEANU over 3 years ago

  • Assignee set to Marius BĂLTEANU
  • Target version set to Candidate for next major release
Actions #5

Updated by Jakub G about 3 years ago

Marius thanks for review. Would be great if in the future i could pass "0" and/or "false", but for now it's totally OK to pass empty value as well :) I'll just map false and 0 to an empty string in my code and that will do the trick :)

Actions #7

Updated by Go MAEDA about 3 years ago

  • Target version changed from Candidate for next major release to 4.0.8

Setting the target version to 4.0.8.

Actions #8

Updated by Go MAEDA about 3 years ago

  • Status changed from Confirmed to Resolved
  • Assignee set to Go MAEDA
  • Resolution set to Fixed

Committed the patch. thank you.

Actions #9

Updated by Go MAEDA about 3 years ago

  • Status changed from Resolved to Closed

Committed the patch. Thank you.

Actions

Also available in: Atom PDF