roda-rest_api 1.2 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/roda/plugins/rest_api.rb +49 -3
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 18243f3f83d51a37b30d2389674711bca46623ee
4
- data.tar.gz: 7456b216acbc32c860eca0276365b4cf3604b519
3
+ metadata.gz: 42c73fcdd8dc133305e3e284ce92f28bd5385b65
4
+ data.tar.gz: 15e78dd9fc92f0908a1e03db07ed0b328ca88028
5
5
  SHA512:
6
- metadata.gz: 0d3e364aec4f2ebe92bc00aecd821743c065df73e2ecb37f4ee87ba95a4a861762c483150152ce2fb2c9778abe937a2cdb8d260a8858f97afe547224c9d47e2e
7
- data.tar.gz: 12f0e8021df214bf30b218a8864ee235e7d3b3251d53eaadf836ce54b40f7eff3a1e7a19d02cec9b04bbb0371bacf6d967177fdd58d2cd73c6ecdb1f37dd4959
6
+ metadata.gz: 3a0757b51b9020966a968300ea5a4917ce87fbb48ea6cdf6fdf23542cecb3f505f1055eb4897e1759305e5b5d613b1a5fd5cff4b71f1cec2c10e7bd5f8847279
7
+ data.tar.gz: 1dbe2aae5b951805f37f21b1bed5d29dbb78ba9d6bc92dfeeb0d08e8f88ca2225056da3e84c8a6dec6b180cb31728875f9c5fea2df644ed5e8ea217e97219640
@@ -60,6 +60,10 @@ class Roda
60
60
  def routes(*routes)
61
61
  @routes = routes
62
62
  end
63
+
64
+ def permit(*permitted)
65
+ @permitted = permitted
66
+ end
63
67
 
64
68
  def routes!
65
69
  unless @routes
@@ -72,15 +76,57 @@ class Roda
72
76
  def perform(method, id = nil)
73
77
  begin
74
78
  args = method === :save ? JSON.parse(@request.body) : @request.GET
75
- args.merge!(@primary_key => id) if id
76
- args.merge!(@parent_key => @captures[0]) if @captures
79
+ args = permitted_params(args)
80
+ args.merge!(@primary_key.to_sym => id) if id
81
+ args.merge!(@parent_key.to_sym => @captures[0]) if @captures
77
82
  self.send(method).call(args)
78
83
  rescue StandardError => e
79
84
  raise if ENV['RACK_ENV'] == 'development'
80
85
  @request.response.status = method === :save ? 422 : 404
81
86
  end
82
87
  end
83
-
88
+
89
+ private
90
+
91
+ def permitted_params(params, keypath = [])
92
+ permitted = nil
93
+ case params
94
+ when Hash
95
+ permitted = Hash.new
96
+ params.each_pair do |k,v|
97
+ keypath << k.to_sym
98
+ if permitted?(keypath)
99
+ value = permitted_params(v, keypath)
100
+ permitted[k.to_sym] = value if value
101
+ end
102
+ keypath.pop
103
+ end
104
+ else
105
+ permitted = params if permitted?(keypath)
106
+ end
107
+ permitted
108
+ end
109
+
110
+ def permitted?(keypath)
111
+ return false unless @permitted
112
+ permitted = @permitted
113
+ find_key = ->(items, key){
114
+ items.find do |item|
115
+ case item
116
+ when Hash
117
+ !!item.keys.index(key)
118
+ when Symbol
119
+ item === key
120
+ end
121
+ end
122
+ }
123
+ keypath.each do |key|
124
+ found = find_key.call(permitted, key)
125
+ permitted = found.is_a?(Hash) ? found.values.flatten : []
126
+ return false unless found
127
+ end
128
+ end
129
+
84
130
  end
85
131
 
86
132
  module RequestMethods
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roda-rest_api
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.2'
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michel Benevento