resourcify 0.1.3 → 0.1.4
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.
- 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: []
|