databound 1.0.2 → 1.1.0

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: 75628544c55d555443270f18bec2d723e5247dd9
4
- data.tar.gz: e2ba0d164beae08f7ecffb6700676f3be5130539
3
+ metadata.gz: cba051b706bde49ff4b03cb1bd19bc6eefe5e80d
4
+ data.tar.gz: 242d8947ae63c6dc7493bece2f5bcaca287109f3
5
5
  SHA512:
6
- metadata.gz: a0c9d33f8bc9b6b7cbf0ceb3f1bd8e6a63845e7ed074a1dfe1fb2141df81252816a366add71e1ac6ae676b1187829a6fc1415d374a290ff57530b460b86e05b3
7
- data.tar.gz: 8cd35af44b1cefb63cf46b3a4910b993a275f69a70377cac009ce66c5c0dc1f074bb284ed3c62e1fcb2dd546a387fa9c0bc1280ad24ab9b0abc336bf79f0e3e2
6
+ metadata.gz: 13e7fced989080e8d64ff36329f92cfb0355947e2596bf5ce22e677d6cc2718e23ba867941512424a8682f8447d0b84bfc49dd5cf57464dc5199425af00a7149
7
+ data.tar.gz: fff50fcc18795b848f4c4f7ba172eb7681e2ac6589938312568659c5f13de5a3c26b2230a4c23f93fa364f711cb1681d9efd4ed3c54fc3dad4025f87b6c0be86
data/.travis.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 2.2.0
3
4
  - 2.1.3
4
5
  - 2.0.0
5
6
  script: bundle exec rspec --pattern "spec/**/*_spec.rb"
data/lib/databound.rb CHANGED
@@ -100,6 +100,7 @@ module Databound
100
100
  module ClassMethods
101
101
  attr_reader :dsls
102
102
  attr_reader :stricts
103
+ attr_reader :permit_update_destroy
103
104
 
104
105
  def dsl(name, value, strict: true, &block)
105
106
  @stricts ||= {}
@@ -109,5 +110,9 @@ module Databound
109
110
  @dsls[name.to_s] ||= {}
110
111
  @dsls[name.to_s][value.to_s] = block
111
112
  end
113
+
114
+ def permit_update_destroy?(&block)
115
+ @permit_update_destroy = block
116
+ end
112
117
  end
113
118
  end
@@ -2,12 +2,8 @@ module Databound
2
2
  class NotPermittedError < RuntimeError; end
3
3
  class Manager
4
4
  def initialize(controller)
5
- @model = controller.send(:model)
6
- @permitted_columns = controller.send(:permitted_columns)
7
-
8
- scope_js = controller.params[:scope]
9
- data_js = controller.params[:data]
10
- extra_where_scopes_js = controller.params[:extra_where_scopes] || '[]'
5
+ @controller = controller
6
+ @model = @controller.send(:model)
11
7
 
12
8
  @scope = Databound::Data.new(controller, scope_js)
13
9
  @data = Databound::Data.new(controller, data_js).to_h
@@ -42,27 +38,57 @@ module Databound
42
38
 
43
39
  check_params!
44
40
  record = @model.find(id)
41
+ check_permit_update_destroy!(record)
45
42
  record.update(@data)
46
43
 
47
44
  record
48
45
  end
49
46
 
50
47
  def destroy_from_data
51
- @model.find(@data['id']).destroy
48
+ record = @model.find(@data['id'])
49
+ check_permit_update_destroy!(record)
50
+ record.destroy
52
51
  end
53
52
 
54
53
  private
55
54
 
56
55
  def check_params!
57
- return if @permitted_columns == :all
56
+ return if permitted_columns == :all
58
57
  return if unpermitted_columns.empty?
59
58
 
60
59
  raise NotPermittedError, "Request includes unpermitted columns: #{unpermitted_columns.join(', ')}"
61
60
  end
62
61
 
62
+ def check_permit_update_destroy!(record)
63
+ return unless permit_update_destroy_block
64
+ return if permit_update_destroy_block.call(record)
65
+
66
+ raise NotPermittedError, 'Request for update or destroy not permitted'
67
+ end
68
+
69
+ def permit_update_destroy_block
70
+ @controller.class.permit_update_destroy
71
+ end
72
+
63
73
  def unpermitted_columns
64
74
  requested = [@scope, @data].map(&:to_h).flat_map(&:keys)
65
- requested - @permitted_columns.map(&:to_s)
75
+ requested - permitted_columns.map(&:to_s)
76
+ end
77
+
78
+ def permitted_columns
79
+ @controller.send(:permitted_columns)
80
+ end
81
+
82
+ def scope_js
83
+ @controller.params[:scope]
84
+ end
85
+
86
+ def data_js
87
+ @controller.params[:data]
88
+ end
89
+
90
+ def extra_where_scopes_js
91
+ @controller.params[:extra_where_scopes] || '[]'
66
92
  end
67
93
  end
68
94
  end
@@ -1,3 +1,3 @@
1
1
  module Databound
2
- VERSION = '1.0.2'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe PermitUpdateDestroyController, type: :controller do
4
+ CURRENT_USER_ID = 1
5
+
6
+ before :each do
7
+ Project.create(city: 'LA', user_id: 5)
8
+ Project.create(city: 'LA', user_id: 1)
9
+ end
10
+
11
+ describe '#update' do
12
+ it 'raise when scope is not permitted' do
13
+ data = {
14
+ data: {
15
+ id: 1,
16
+ city: 'Barcelona',
17
+ },
18
+ scope: {},
19
+ }
20
+
21
+ expect { post(:update, javascriptize(data)) }.to raise_error(
22
+ Databound::NotPermittedError,
23
+ 'Request for update or destroy not permitted',
24
+ )
25
+ end
26
+
27
+ it 'should update when param is permitted' do
28
+ data = {
29
+ data: {
30
+ id: 2,
31
+ city: 'Barcelona',
32
+ },
33
+ scope: {},
34
+ }
35
+
36
+ expect { post(:update, javascriptize(data)) }.not_to raise_error
37
+ end
38
+ end
39
+
40
+ describe '#destroy' do
41
+ it 'raise when scope is not permitted' do
42
+ data = {
43
+ data: {
44
+ id: 1,
45
+ },
46
+ scope: {},
47
+ }
48
+
49
+ expect { post(:destroy, javascriptize(data)) }.to raise_error(
50
+ Databound::NotPermittedError,
51
+ 'Request for update or destroy not permitted',
52
+ )
53
+ end
54
+
55
+ it 'should destroy when param is permitted' do
56
+ data = {
57
+ data: {
58
+ id: 2,
59
+ },
60
+ scope: {},
61
+ }
62
+
63
+ expect { post(:destroy, javascriptize(data)) }.not_to raise_error
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,13 @@
1
+ class PermitUpdateDestroyController < ApplicationController
2
+ include Databound
3
+
4
+ private
5
+
6
+ def model
7
+ Project
8
+ end
9
+
10
+ permit_update_destroy? do |record|
11
+ record.user_id == CURRENT_USER_ID
12
+ end
13
+ end
@@ -0,0 +1,2 @@
1
+ class Project < ActiveRecord::Base
2
+ end
@@ -5,4 +5,5 @@ Rails.application.routes.draw do
5
5
  databound :dsl
6
6
  databound :loose_dsl
7
7
  databound :messages
8
+ databound :permit_update_destroy
8
9
  end
@@ -10,4 +10,10 @@ ActiveRecord::Schema.define do
10
10
  t.string :city
11
11
  t.timestamps
12
12
  end
13
+
14
+ create_table(:projects, force: true) do |t|
15
+ t.string :city
16
+ t.integer :user_id
17
+ t.timestamps
18
+ end
13
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: databound
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Domas Bitvinskas
@@ -152,14 +152,17 @@ files:
152
152
  - spec/controllers/loose_dsl_controller_spec.rb
153
153
  - spec/controllers/no_model_controller_spec.rb
154
154
  - spec/controllers/on_the_fly_spec.rb
155
+ - spec/controllers/permit_update_destroy_controller_spec.rb
155
156
  - spec/controllers/permitted_columns_controller_spec.rb
156
157
  - spec/internal/app/controllers/application_controller.rb
157
158
  - spec/internal/app/controllers/dsl_controller.rb
158
159
  - spec/internal/app/controllers/loose_dsl_controller.rb
159
160
  - spec/internal/app/controllers/no_model_controller.rb
161
+ - spec/internal/app/controllers/permit_update_destroy_controller.rb
160
162
  - spec/internal/app/controllers/permitted_columns_controller.rb
161
163
  - spec/internal/app/controllers/users_controller.rb
162
164
  - spec/internal/app/models/message.rb
165
+ - spec/internal/app/models/project.rb
163
166
  - spec/internal/app/models/user.rb
164
167
  - spec/internal/config/database.yml
165
168
  - spec/internal/config/routes.rb
@@ -247,14 +250,17 @@ test_files:
247
250
  - spec/controllers/loose_dsl_controller_spec.rb
248
251
  - spec/controllers/no_model_controller_spec.rb
249
252
  - spec/controllers/on_the_fly_spec.rb
253
+ - spec/controllers/permit_update_destroy_controller_spec.rb
250
254
  - spec/controllers/permitted_columns_controller_spec.rb
251
255
  - spec/internal/app/controllers/application_controller.rb
252
256
  - spec/internal/app/controllers/dsl_controller.rb
253
257
  - spec/internal/app/controllers/loose_dsl_controller.rb
254
258
  - spec/internal/app/controllers/no_model_controller.rb
259
+ - spec/internal/app/controllers/permit_update_destroy_controller.rb
255
260
  - spec/internal/app/controllers/permitted_columns_controller.rb
256
261
  - spec/internal/app/controllers/users_controller.rb
257
262
  - spec/internal/app/models/message.rb
263
+ - spec/internal/app/models/project.rb
258
264
  - spec/internal/app/models/user.rb
259
265
  - spec/internal/config/database.yml
260
266
  - spec/internal/config/routes.rb