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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a9fdba8888dc484edfca49f3cf1b66efe1b25a65
4
- data.tar.gz: f4e8ddcb1e5fdd383406f262ef39fd80f84445c6
3
+ metadata.gz: cd846f2eb7e3ed0e419e5ebe8f4b772c57dd1ae7
4
+ data.tar.gz: 9d1e197f470244f5f60c39a78b116236a487a7e6
5
5
  SHA512:
6
- metadata.gz: 2c1c8cb94ebb2c13afcf86bb02f56b7ff7c7e288a077ad38e850175ba76f26aa62548763ae2da538d1483b12759be1ca671980d122a7eb3705bd26273b764a41
7
- data.tar.gz: 1e87d2cbf8051934f92d016b042aa3ddacc63860bc52a931100546e5d7f9b35b24abf20c8c3d6124ca24d7d0da331433bc4e5a237a33607259ea2dd7ee2053f9
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 = policy_scope(_RC.includes(belongs_tos))
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
@@ -17,7 +17,7 @@ module Controller
17
17
  @error[:type] = 'RecordNotFound'
18
18
  @error[:message] = 'Sorry, the record was not found.'
19
19
 
20
- render json: @error
20
+ render json: @error, status: 404
21
21
  end
22
22
 
23
23
  def user_not_authorized
@@ -2,32 +2,62 @@ module Model
2
2
  module FilterBy
3
3
  def filter_by(filters = {})
4
4
  records = self
5
- column_names = self.column_names
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
- if simple_ops[operator]
14
- records = records.where("#{field} #{simple_ops[operator]} ?", value)
15
- elsif operator == :ne
16
- records = records.where.not("#{field} = ?", value)
17
- elsif operator == :in
18
- records = records.where("#{field} IN (?)", value.split(','))
19
- elsif operator == :nin
20
- records = records.where.not("#{field} IN (?)", value.split(','))
21
- elsif operator == :like
22
- if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
23
- records = records.where("#{field} ILIKE ?", "%#{value}%")
24
- else
25
- records = records.where("#{field} LIKE ?", "%#{value}%")
26
- end
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
- records = records.where("#{field} = ?", value)
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
@@ -1,3 +1,3 @@
1
1
  module Resourcify
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
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.3
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: 2015-02-24 00:00:00.000000000 Z
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: []