# getto-params [rubygems: getto-params](https://rubygems.org/gems/getto-params) Validate parameters like strong-parameters(rails) ```ruby require "getto/params" Getto::Params.new.validate(params) do |v| v.hash( "name" => v.combine([v.string, v.not_empty]){|val| raise ArgumentError, "name should be not empty string: #{val}" }, "token" => v.combine([v.string, v.allow_empty(v.length(5))]), "key" => v.equal("KEY"), "str1" => v.in(["param1","param2"]), "str2" => v.in(["param1","param2"]), "tel" => v.combine([v.string, v.match(%r{\A[0-9]+-[0-9]+-[0-9]+\Z})]), "date" => v.combine([v.string, v.match_date]), "data" => v.not_nil, "number" => v.match_integer, "bool" => v.match_bool, "hash" => v.hash( "array" => v.array(v.string), "keys" => v.array_include(["key1","key2","key3"]), "params" => v.hash( "key" => v.integer, "bool" => v.bool, ), ), "object" => v.hash_strict( "key" => v.integer, "bool" => v.bool, ), ) end # => true : success # => false : fail ``` - misc: format parameters for search ```ruby require "getto/params/search" time = Time # respond to `parse` Getto::Params::Search.new( page: 1, limit: 1000, sort: "name.asc", query: { "name.cont" => "search", "value.eq" => "value1", "date.lteq" => "2018-10-01", "time.gteq" => "2018-10-01", "time.lteq" => "2018-10-01", }, ).to_h do |search| search.sort do |s| s.straight :name end search.convert do |c| c.convert "date.lteq", &c.to_date c.convert "time.gteq", &c.to_beginning_of_day(time) c.convert "time.lteq", &c.to_end_of_day(time) end search.query do |q| q.search "name.cont", &q.not_empty q.search("value.eq"){|val| ["value1","value2"].include? val } q.search "date.lteq", &q.not_nil q.search "time.gteq", &q.not_nil q.search "time.lteq", &q.not_nil end end # => { # limit: 1000, # offset: 0, # sort: { # column: :name, # order: true, # }, # query: { # "name.cont": "search", # "value.eq": "value1", # "date.lteq": Date.parse("2018-10-01"), # "time.gteq": Time.parse("2018-10-01 00:00:00"), # "time.lteq": Time.parse("2018-10-01 23:59:59"), # }, # } ``` ###### Table of Contents - [Requirements](#Requirements) - [Usage](#Usage) - [License](#License) ## Requirements - developed on ruby: 2.5.1 ## Usage ```ruby require "getto/params" Getto::Params.new.validate(params) do |v| # argument `params` should be hash v.hash( # should be String "key" => v.string, # should be Integer "key" => v.integer, # should be Boolean "key" => v.bool, # should be equal to "value" "key" => v.equal("value"), # should be equal to "value1" or "value2" "key" => v.in(["value1","value2"]), # should not be empty "key" => v.not_empty, # length should be 10, "key" => v.length(10), # should match %r{example} "key" => v.match(%r{example}), # should match integer (value is string, but seem to be a Integer) "key" => v.match_integer, # downcase should be equal to "true" or "false" "key" => v.match_bool, # should match date "key" => v.match_date, # should be hash includes :key that value is string "key" => v.hash( key: v.string, ), # should be hash only includes :key that value is string "key" => v.hash_strict( key: v.string, ), # should be array that has string value "key" => v.array(v.string), # should be array that has "value1" or "value2" "key" => v.array_include(["value1","value2"]) # should be match integer if value is not empty "key" => v.allow_empty(v.match_integer), # validate string and not_empty "key" => v.combine([v.string, v.not_empty]), # validate not_nil "key" => v.not_nil, # raise error if valudation failed "key" => v.string{|val| raise ArgumentError, "key should be string: #{val}" } ) end # => true : success # => false : fail ``` ### Getto::Params::Search Format parameters for search api ```ruby require "getto/params/search" time = Time # respond to `parse` Getto::Params::Search.new( page: 1, limit: 1000, sort: "name.asc", query: { "name.cont" => "search", }, ).to_h do |search| search.sort do |s| # sort name as straight order s.straight :name # sort name as invert order s.invert :name end search.convert do |c| c.convert "date.lteq", &c.to_date c.convert "time.gteq", &c.to_beginning_of_day(time) c.convert "time.lteq", &c.to_end_of_day(time) end search.query do |q| # search "name.cont" if value not empty q.search "name.cont", &q.not_empty # search "name.in" if any values not empty q.search "name.in", &q.not_all_empty end end ``` #### pages ```ruby # page: 1, limit: 1000 # => { # limit: 1000, # offset: 0, # } # page: 2, limit: 1000 # => { # limit: 1000, # offset: 1000, # } ``` #### sort order - straight order ```ruby search.sort do |s| # sort name as straight order s.straight :name end # sort: "name.asc" # => sort: { # column: :name, # order: true, # asc => true # } # sort: "name.desc" # => sort: { # column: :name, # order: false, # desc => false # } ``` - invert order ```ruby search.sort do |s| # sort name as invert order s.invert :name end # sort: "name.asc" # => sort: { # column: :name, # order: false, # asc => false # } # sort: "name.desc" # => sort: { # column: :name, # order: true, # desc => true # } ``` #### convert query - to date ```ruby search.convert do |c| c.convert "date.lteq", &c.to_date end # query: { "date.lteq" => "invalid date" } # => query: { # "date.lteq" => nil, # } # query: { "date.lteq" => "2018-10-01" } # => query: { # "date.lteq" => Date.parse("2018-10-01"), # } ``` - to beginning of day, to end of day ```ruby time = Time # respond to `parse` search.convert do |c| c.convert "time.gteq", &c.to_beginning_of_day(time) c.convert "time.lteq", &c.to_end_of_day(time) end # query: { "time.gteq" => "invalid date", "time.lteq" => "invalid date" } # => query: { # "time.gteq" => nil, # "time.lteq" => nil, # } # query: { "time.gteq" => "2018-10-01", "time.lteq" => "2018-10-01" } # => query: { # "time.gteq" => Date.parse("2018-10-01 00:00:00"), # "time.lteq" => Date.parse("2018-10-01 23:59:59"), # } ``` - convert by block ```ruby search.convert do |c| c.convert("name.cont"){|search| search.upcase } end # query: { "name.cont" => "search" } # => query: { # "name.cont" => "SEARCH", # } ``` #### search condition - not empty ```ruby search.query do |q| q.search "name.cont", &q.not_empty end # query: { "name.cont" => "" } # => query: { # } # query: { "name.cont" => "search" } # => query: { # "name.cont": "search", # } ``` - not nil ```ruby search.query do |q| q.search "name.cont", &q.not_nil end # query: { "name.cont" => nil } # => query: { # } # query: { "name.cont" => "search" } # => query: { # "name.cont": "search", # } ``` - not all empty ```ruby search.query do |q| q.search "name.in", &q.not_all_empty end # query: { "name.in" => [""] } # => query: { # } # query: { "name.in" => ["value1","value2"] } # => query: { # "name.in": ["value1","value2"], # } ``` - check by block ```ruby search.query do |q| q.search("value.eq"){|val| ["value1","value2"].include? val } end # query: { "value.eq" => "value3" } # => query: { # } # query: { "value.eq" => "value1" } # => query: { # "value.eq": "value1", # } ``` ## Install Add this line to your application's Gemfile: ```ruby gem 'getto-params' ``` And then execute: ``` $ bundle ``` Or install it yourself as: ``` $ gem install getto-params ``` ## License getto/params is licensed under the [MIT](LICENSE) license. Copyright © since 2018 shun@getto.systems