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 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: []