resourcify 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -1
- data/lib/resourcify/controller/actions/index.rb +4 -2
- data/lib/resourcify/controller/base.rb +1 -1
- data/lib/resourcify/model/filter_by.rb +52 -22
- data/lib/resourcify/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd846f2eb7e3ed0e419e5ebe8f4b772c57dd1ae7
|
4
|
+
data.tar.gz: 9d1e197f470244f5f60c39a78b116236a487a7e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8bb1ff9385382650f9fcd1042129d8dda4f5e436e80d95c5d37ecd9e1adb27a881f661bb1ef81d090038af23c810643252fa8b6b997dc854c49350b773e1b3e8
|
7
|
+
data.tar.gz: afb5c6b95b7761a51d8436601f54f48e21fa8a7a2660c271305caf6b1d597ce65901a417f6060c48df3be0d88ed3d223730eee2d61786ae5f58668956155058c
|
data/README.md
CHANGED
@@ -12,7 +12,7 @@ The resourcify gem currently depends on [Pundit](https://github.com/elabs/pundit
|
|
12
12
|
Include the gem in your Gemfile:
|
13
13
|
|
14
14
|
```ruby
|
15
|
-
gem 'resourcify'
|
15
|
+
gem 'resourcify', '0.1.4'
|
16
16
|
```
|
17
17
|
|
18
18
|
## Usage
|
@@ -31,6 +31,14 @@ class PostsController < ApplicationController
|
|
31
31
|
# Include the resourcify module
|
32
32
|
resourcify
|
33
33
|
|
34
|
+
end
|
35
|
+
```
|
36
|
+
```ruby
|
37
|
+
class PostsController < ApplicationController
|
38
|
+
# Include the resourcify module with preferred actions as an array
|
39
|
+
# Valid actions are: :index, :create, :show, :udpate, :destroy
|
40
|
+
resourcify actions: [:index, :show]
|
41
|
+
|
34
42
|
end
|
35
43
|
```
|
36
44
|
|
@@ -2,14 +2,16 @@ module Controller::Actions
|
|
2
2
|
module Index
|
3
3
|
def index
|
4
4
|
authorize _RC.new
|
5
|
-
|
6
|
-
@records =
|
5
|
+
|
6
|
+
@records = _RC.includes(belongs_tos)
|
7
7
|
|
8
8
|
# apply filter_by if present
|
9
9
|
if @records.respond_to? "filter_by"
|
10
10
|
@records = @records.filter_by(params.except(:controller, :action, :page, :size))
|
11
11
|
end
|
12
12
|
|
13
|
+
@records = policy_scope(@records)
|
14
|
+
|
13
15
|
response.headers['_meta_total'] = @records.count.to_s
|
14
16
|
|
15
17
|
page = params[:page] || 1
|
@@ -2,32 +2,62 @@ module Model
|
|
2
2
|
module FilterBy
|
3
3
|
def filter_by(filters = {})
|
4
4
|
records = self
|
5
|
-
|
6
|
-
simple_ops = { eq: '=', lt: '<', gt: '>', lte: '<=', gte: '>=' }
|
7
|
-
filters.select { |e| column_names.include?(e.split('.').first) }.each do |key, value|
|
8
|
-
next if value.blank?
|
9
|
-
|
10
|
-
field, operator = key.split('.')
|
11
|
-
operator = (operator)? operator.to_sym : :eq
|
5
|
+
columns_hash = self.columns_hash
|
12
6
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
7
|
+
def sanitize_value(field, value)
|
8
|
+
field_type = columns_hash[field].type
|
9
|
+
if field_type == :datetime || field_type == :date
|
10
|
+
value = Time.parse(value).to_s(:db)
|
11
|
+
end
|
12
|
+
value
|
13
|
+
end
|
14
|
+
|
15
|
+
def query_params(q)
|
16
|
+
ops = { eq: '=', lt: '<', gt: '>', lte: '<=', gte: '>=', ne: '!='}
|
17
|
+
field, op, value = q[:name], (q[:op] || 'eq').to_sym, q[:value]
|
18
|
+
|
19
|
+
if ops[op]
|
20
|
+
["#{field} #{ops[op]} ?", sanitize_value(field, value)]
|
21
|
+
elsif op == :in
|
22
|
+
vals = value.split(',')
|
23
|
+
vals = vals.map { |e| sanitize_value(field, e) }
|
24
|
+
["#{field} IN (?)", vals]
|
25
|
+
elsif op == :nin
|
26
|
+
vals = value.split(',')
|
27
|
+
vals = vals.map { |e| sanitize_value(field, e) }
|
28
|
+
["#{field} NOT IN (?)", vals]
|
29
|
+
elsif op == :between
|
30
|
+
vals = value.split('||')
|
31
|
+
query_string = '(' + vals.map { |e| "(#{field} >= ? AND #{field} <= ?)" }.join(' OR ') + ')'
|
32
|
+
vals = vals.map { |e| e.split('|') }.flatten
|
33
|
+
vals = vals.map { |e| sanitize_value(field, e) }
|
34
|
+
vals.unshift(query_string)
|
35
|
+
vals
|
36
|
+
elsif op == :like
|
37
|
+
like_key = (ActiveRecord::Base.connection.adapter_name == "PostgreSQL")? 'ILIKE' : 'LIKE'
|
38
|
+
vals = value.split('|').map { |val| "%#{val}%" }
|
39
|
+
query_string = '(' + vals.map { |e| "#{field} #{like_key} ?" }.join(' OR ') + ')'
|
40
|
+
vals.unshift(query_string)
|
41
|
+
vals
|
27
42
|
else
|
28
|
-
|
43
|
+
["#{field} = ?", sanitize_value(field, value)]
|
29
44
|
end
|
30
45
|
end
|
46
|
+
|
47
|
+
filters.map do |key, value|
|
48
|
+
name, op = key.to_s.split('.')
|
49
|
+
{ name: name, op: op, value: value }
|
50
|
+
end.group_by do |q|
|
51
|
+
q[:name]
|
52
|
+
end.select do |key|
|
53
|
+
columns_hash.include? key
|
54
|
+
end.map do |key, value|
|
55
|
+
qparams = value.map { |e| query_params(e) }
|
56
|
+
qstring = qparams.map { |e| e.first }.join(' OR ')
|
57
|
+
qparams.map { |e| e[1..-1] }.flatten(1).unshift(qstring)
|
58
|
+
end.each do |qparam|
|
59
|
+
records = records.where(*qparam)
|
60
|
+
end
|
31
61
|
|
32
62
|
records
|
33
63
|
end
|
data/lib/resourcify/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resourcify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Baidu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -124,7 +124,8 @@ files:
|
|
124
124
|
- test/resourcify_test.rb
|
125
125
|
- test/test_helper.rb
|
126
126
|
homepage: https://github.com/stephenbaidu/resourcify
|
127
|
-
licenses:
|
127
|
+
licenses:
|
128
|
+
- MIT
|
128
129
|
metadata: {}
|
129
130
|
post_install_message:
|
130
131
|
rdoc_options: []
|