motor-admin 0.1.56 → 0.1.62

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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -13
  3. data/app/controllers/concerns/motor/current_ability.rb +21 -0
  4. data/app/controllers/concerns/motor/current_user_method.rb +8 -7
  5. data/app/controllers/motor/alerts_controller.rb +4 -4
  6. data/app/controllers/motor/api_base_controller.rb +2 -12
  7. data/app/controllers/motor/application_controller.rb +1 -0
  8. data/app/controllers/motor/audits_controller.rb +1 -1
  9. data/app/controllers/motor/auth_tokens_controller.rb +36 -0
  10. data/app/controllers/motor/configs_controller.rb +2 -2
  11. data/app/controllers/motor/dashboards_controller.rb +8 -4
  12. data/app/controllers/motor/data_controller.rb +9 -4
  13. data/app/controllers/motor/forms_controller.rb +4 -4
  14. data/app/controllers/motor/icons_controller.rb +2 -0
  15. data/app/controllers/motor/queries_controller.rb +4 -4
  16. data/app/controllers/motor/resource_methods_controller.rb +2 -0
  17. data/app/controllers/motor/resources_controller.rb +2 -2
  18. data/app/controllers/motor/run_queries_controller.rb +21 -1
  19. data/app/controllers/motor/ui_controller.rb +1 -1
  20. data/app/views/motor/ui/show.html.erb +1 -1
  21. data/config/routes.rb +1 -0
  22. data/lib/generators/motor/templates/install.rb +1 -0
  23. data/lib/motor.rb +1 -0
  24. data/lib/motor/active_record_utils.rb +2 -1
  25. data/lib/motor/active_record_utils/active_record_connection_column_patch.rb +13 -0
  26. data/lib/motor/active_record_utils/{active_record_filter.rb → active_record_filter_patch.rb} +0 -0
  27. data/lib/motor/admin.rb +21 -0
  28. data/lib/motor/api_query.rb +2 -2
  29. data/lib/motor/api_query/build_json.rb +101 -47
  30. data/lib/motor/api_query/filter.rb +11 -1
  31. data/lib/motor/assets.rb +10 -1
  32. data/lib/motor/build_schema.rb +3 -1
  33. data/lib/motor/build_schema/active_storage_attachment_schema.rb +1 -0
  34. data/lib/motor/build_schema/apply_permissions.rb +50 -0
  35. data/lib/motor/build_schema/find_icon.rb +5 -1
  36. data/lib/motor/cancan_utils.rb +7 -0
  37. data/lib/motor/cancan_utils/ability_patch.rb +29 -0
  38. data/lib/motor/cancan_utils/can_manage_all.rb +14 -0
  39. data/lib/motor/configs/build_ui_app_tag.rb +26 -16
  40. data/lib/motor/configs/load_from_cache.rb +20 -8
  41. data/lib/motor/queries/render_sql_template.rb +12 -2
  42. data/lib/motor/queries/run_query.rb +73 -19
  43. data/lib/motor/version.rb +1 -1
  44. data/ui/dist/main-fd0f75f789196ce24ffd.css.gz +0 -0
  45. data/ui/dist/main-fd0f75f789196ce24ffd.js.gz +0 -0
  46. data/ui/dist/manifest.json +5 -5
  47. metadata +14 -8
  48. data/app/controllers/motor/schemas_controller.rb +0 -11
  49. data/ui/dist/main-1f811bd0c7c600a0e204.css.gz +0 -0
  50. data/ui/dist/main-1f811bd0c7c600a0e204.js.gz +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 636cbcca8a6ab6e4f15e066e8727aab49511b6f2b7c3d9794360e297e1035a8e
4
- data.tar.gz: dcd4161710151dc7a4cffc43848a69ece9bed649f1e8c2de690569fcedec4a56
3
+ metadata.gz: 2b1e931dc58724b3ae9e207d86d4ca7a9c68d7cfeae0e0c482a7cd21d23c4258
4
+ data.tar.gz: d11ea5ce285bf4c44f6e772970b26bc7deede0b055e7c264c3039833c3d29534
5
5
  SHA512:
6
- metadata.gz: 227f976e31fe8f6fdac7c3e62d9c47a39b4310d136d1b8bb748153e29aeccf4e314b37aaf7ff377b966831f9f9e942e5112ea63c86149fa83fd00a0b64338966
7
- data.tar.gz: 9d6acd9089a7f84a7bcb8d088ea05718b15f171c9ffe00ac6419a3d234760a271119577f155e718f40e8dbc1f5a6e5b1ded478fc3d99f4524ac15bfbea0fbdf1
6
+ metadata.gz: 05bef6829304b10adab88dc9860ad2b97c44a50cce1017cba21efcbc8799a7b996125bcc21abc8dbda3d333e4fd0aaa4200c03a565e51393d9d5c3018b00cd62
7
+ data.tar.gz: 40041861d8e1d81e76065862db59ab88713e799b9859867e91979f1e5ccc73bf6eeab77c3130108ac063da128d3a7d41db1da600c5c50f2301a4ddbefd15a29e
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # ⚡ Motor Admin
1
+ # ⚡ Motor Admin
2
2
 
3
3
  Low-code Admin panel and Business intelligence Rails engine **(no DSL - configurable from the UI)**.
4
4
 
5
- 🤓 [Demo App](https://motor-admin.herokuapp.com/demo) | [Features overview](https://www.youtube.com/watch?v=ngVoci8Hll4&list=PLu7llEMh0KcOkR3Uy_RJT0cXPZQKAYVsq&index=1)
5
+ 🤓 [Demo App](https://motor-admin.herokuapp.com/demo) | 👀 [Features overview](https://www.youtube.com/watch?v=ngVoci8Hll4&list=PLu7llEMh0KcOkR3Uy_RJT0cXPZQKAYVsq&index=1) | ⭐ [Stargathers](https://github.com/omohokcoj/motor-admin/stargazers)
6
6
 
7
7
  [![Admin Panel](https://user-images.githubusercontent.com/5418788/119318538-1f30e300-bc82-11eb-94a4-107c31c93b13.png)](https://motor-admin.herokuapp.com/demo)
8
8
 
@@ -32,6 +32,7 @@ $ rails motor:install && rake db:migrate
32
32
  * [Data visualization](#data-visualization)
33
33
  * [Dashboards](#dashboards)
34
34
  * [Email alerts](#email-alerts)
35
+ * [Authorization](#authorization)
35
36
  * [Intelligence search](#intelligence-search)
36
37
  * [Optimized for mobile](#optimized-for-mobile)
37
38
  * [Configurations sync between environments](#configurations-sync)
@@ -42,9 +43,9 @@ $ rails motor:install && rake db:migrate
42
43
 
43
44
  ![Settings UI](https://user-images.githubusercontent.com/5418788/119263883-90708780-bbe9-11eb-9f9f-f76fed0b7f27.png)
44
45
 
45
- Everything in the admin panel can be configured using intuitive settings UI, which can be opened via the icon in the top right corner.
46
+ Everything in the admin panel can be configured using the intuitive settings UI, which can be opened via the icon in the top right corner.
46
47
 
47
- Data displayed on the resource page can be completely custimized via [SQL queries](#sql-queries) and [dashboards](#dashboards) attached to the resource as a tab. Usually, queries used to display resource data should contain `{{resource_name_id}}` [variable](#sql-queries).
48
+ Data displayed on the resource page can be completely customized via [SQL queries](#sql-queries) and [dashboards](#dashboards) attached to the resource as a tab. Usually, queries used to display resource data should contain `{{resource_name_id}}` [variable](#sql-queries).
48
49
 
49
50
  ### Custom Actions
50
51
 
@@ -62,7 +63,7 @@ Values from the form fields can be used in API path via `{field_name}` syntax: `
62
63
 
63
64
  ![SQL query](https://user-images.githubusercontent.com/5418788/119264127-84d19080-bbea-11eb-9903-ef465d1d2c97.png)
64
65
 
65
- Queries can include embeded variables via `{{variable}}` syntax ([mustache](https://mustache.github.io)). `{{#variable}} ... {{/variable}}` syntax allows to decide if conditions inside the scope should be included in the query.
66
+ Queries can include embedded variables via `{{variable}}` syntax ([mustache](https://mustache.github.io)). `{{#variable}} ... {{/variable}}` syntax allows to decide if conditions inside the scope should be included in the query.
66
67
 
67
68
  ### Data Visualization
68
69
 
@@ -90,6 +91,9 @@ Sender address can be specified using `MOTOR_ALERTS_FROM_ADDRESS` environment va
90
91
 
91
92
  Intelligence search can be opened via the top right corner button or using <kbd>Cmd</kbd> + <kbd>P</kbd> shortcut.
92
93
 
94
+ ### Authorization
95
+
96
+ Motor Admin allows to set row-level and column-level permissions via [cancan](https://github.com/CanCanCommunity/cancancan) gem. Admin UI permissions should be defined in `app/models/motor/ability.rb` file in `Motor::Ability` class. See [Motor Admin guide](https://github.com/omohokcoj/motor-admin/blob/master/guides/defining_permissions.md) and [CanCan documentation](https://github.com/CanCanCommunity/cancancan/blob/develop/docs/Defining-Abilities.md) to learn how to define user permissions.
93
97
 
94
98
  ### Optimized for Mobile
95
99
 
@@ -139,14 +143,6 @@ Start example application in development mode:
139
143
  MOTOR_DEVELOPMENT=true rails s
140
144
  ```
141
145
 
142
- ## Comming Soon
143
-
144
- * User groups
145
- * Row-level permissions
146
- * Multiple databases
147
- * NoSQL data sources
148
- * Pro Bussines intelligence features
149
-
150
146
  ## License
151
147
 
152
148
  The gem is available as open source under the terms of the [MIT License](https://github.com/omohokcoj/motor-admin/blob/master/LICENSE).
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Motor
4
+ module CurrentAbility
5
+ def current_ability
6
+ @current_ability ||=
7
+ if defined?(Motor::Ability) && current_user
8
+ klass = Motor::Ability.dup.tap do |k|
9
+ k.prepend(Motor::CancanUtils::AbilityPatch)
10
+ end
11
+
12
+ params = [current_user]
13
+ params << request if Motor::Ability.instance_method(:initialize).arity == 2
14
+
15
+ klass.new(*params)
16
+ else
17
+ Motor::CancanUtils::CanManageAll.new
18
+ end
19
+ end
20
+ end
21
+ end
@@ -3,13 +3,14 @@
3
3
  module Motor
4
4
  module CurrentUserMethod
5
5
  def current_user
6
- if defined?(current_admin)
7
- current_admin
8
- elsif defined?(current_admin_user)
9
- current_admin_user
10
- elsif defined?(super)
11
- super
12
- end
6
+ @current_user ||=
7
+ if defined?(current_admin)
8
+ current_admin
9
+ elsif defined?(current_admin_user)
10
+ current_admin_user
11
+ elsif defined?(super)
12
+ super
13
+ end
13
14
  end
14
15
  end
15
16
  end
@@ -10,11 +10,11 @@ module Motor
10
10
  authorize_resource :alert, only: :create
11
11
 
12
12
  def index
13
- render json: { data: Motor::ApiQuery::BuildJson.call(@alerts.active, params) }
13
+ render json: { data: Motor::ApiQuery::BuildJson.call(@alerts.active, params, current_ability) }
14
14
  end
15
15
 
16
16
  def show
17
- render json: { data: Motor::ApiQuery::BuildJson.call(@alert, params) }
17
+ render json: { data: Motor::ApiQuery::BuildJson.call(@alert, params, current_ability) }
18
18
  end
19
19
 
20
20
  def create
@@ -25,7 +25,7 @@ module Motor
25
25
  Motor::Alerts::ScheduledAlertsCache.clear
26
26
  Motor::Configs::WriteToFile.call
27
27
 
28
- render json: { data: Motor::ApiQuery::BuildJson.call(@alert, params) }
28
+ render json: { data: Motor::ApiQuery::BuildJson.call(@alert, params, current_ability) }
29
29
  end
30
30
  rescue Motor::Alerts::Persistance::InvalidInterval
31
31
  invalid_interval_response
@@ -36,7 +36,7 @@ module Motor
36
36
  Motor::Alerts::ScheduledAlertsCache.clear
37
37
  Motor::Configs::WriteToFile.call
38
38
 
39
- render json: { data: Motor::ApiQuery::BuildJson.call(@alert, params) }
39
+ render json: { data: Motor::ApiQuery::BuildJson.call(@alert, params, current_ability) }
40
40
  rescue Motor::Alerts::Persistance::NameAlreadyExists
41
41
  name_already_exists_response
42
42
  rescue Motor::Alerts::Persistance::InvalidInterval
@@ -3,25 +3,15 @@
3
3
  module Motor
4
4
  class ApiBaseController < ActionController::API
5
5
  include Motor::CurrentUserMethod
6
-
7
- class CanCanAbilityManageAll
8
- include CanCan::Ability
9
-
10
- def initialize(_)
11
- can :manage, :all
12
- end
13
- end
6
+ include Motor::CurrentAbility
14
7
 
15
8
  unless Rails.env.test?
16
9
  rescue_from StandardError do |e|
17
10
  Rails.logger.error(e)
11
+ Rails.logger.error(e.backtrace.join("\n"))
18
12
 
19
13
  render json: { errors: [e.message] }, status: :internal_server_error
20
14
  end
21
15
  end
22
-
23
- def current_ability
24
- CanCanAbilityManageAll.new(current_user)
25
- end
26
16
  end
27
17
  end
@@ -3,5 +3,6 @@
3
3
  module Motor
4
4
  class ApplicationController < ActionController::Base
5
5
  include Motor::CurrentUserMethod
6
+ include Motor::CurrentAbility
6
7
  end
7
8
  end
@@ -8,7 +8,7 @@ module Motor
8
8
  audits = Motor::ApiQuery.call(@audits, params)
9
9
 
10
10
  render json: {
11
- data: Motor::ApiQuery::BuildJson.call(audits, params),
11
+ data: Motor::ApiQuery::BuildJson.call(audits, params, current_ability),
12
12
  meta: Motor::ApiQuery::BuildMeta.call(audits, params)
13
13
  }
14
14
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Motor
4
+ class AuthTokensController < ApiBaseController
5
+ GENERIC_TOKEN_TTL = 2.hours
6
+
7
+ skip_authorization_check
8
+
9
+ def create
10
+ return render json: {} unless current_user
11
+
12
+ if defined?(Devise::JWT)
13
+ respond_with_devise_jwt
14
+ elsif defined?(JWT)
15
+ respond_with_generic_jwt
16
+ else
17
+ render json: {}
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def respond_with_devise_jwt
24
+ warden.set_user(current_user)
25
+
26
+ render json: { token: request.env['warden-jwt_auth.token'] }
27
+ end
28
+
29
+ def respond_with_generic_jwt
30
+ payload = { uid: current_user.id, exp: GENERIC_TOKEN_TTL.from_now.to_i }
31
+ token = JWT.encode(payload, Rails.application.secrets.secret_key_base)
32
+
33
+ render json: { token: token }
34
+ end
35
+ end
36
+ end
@@ -7,7 +7,7 @@ module Motor
7
7
  load_and_authorize_resource
8
8
 
9
9
  def index
10
- render json: { data: Motor::ApiQuery::BuildJson.call(@configs, params) }
10
+ render json: { data: Motor::ApiQuery::BuildJson.call(@configs, params, current_ability) }
11
11
  end
12
12
 
13
13
  def create
@@ -19,7 +19,7 @@ module Motor
19
19
  @config.save!
20
20
  Motor::Configs::WriteToFile.call
21
21
 
22
- render json: { data: Motor::ApiQuery::BuildJson.call(@config, params) }
22
+ render json: { data: Motor::ApiQuery::BuildJson.call(@config, params, current_ability) }
23
23
  rescue ActiveRecord::RecordNotUnique
24
24
  retry
25
25
  end
@@ -10,11 +10,11 @@ module Motor
10
10
  authorize_resource :dashboard, only: :create
11
11
 
12
12
  def index
13
- render json: { data: Motor::ApiQuery::BuildJson.call(@dashboards.active, params) }
13
+ render json: { data: Motor::ApiQuery::BuildJson.call(@dashboards.active, params, current_ability) }
14
14
  end
15
15
 
16
16
  def show
17
- render json: { data: Motor::ApiQuery::BuildJson.call(@dashboard, params) }
17
+ render json: { data: Motor::ApiQuery::BuildJson.call(@dashboard, params, current_ability) }
18
18
  end
19
19
 
20
20
  def create
@@ -24,7 +24,7 @@ module Motor
24
24
  ApplicationRecord.transaction { @dashboard.save! }
25
25
  Motor::Configs::WriteToFile.call
26
26
 
27
- render json: { data: Motor::ApiQuery::BuildJson.call(@dashboard, params) }
27
+ render json: { data: Motor::ApiQuery::BuildJson.call(@dashboard, params, current_ability) }
28
28
  end
29
29
  rescue ActiveRecord::RecordNotUnique
30
30
  retry
@@ -34,7 +34,7 @@ module Motor
34
34
  Motor::Dashboards::Persistance.update_from_params!(@dashboard, dashboard_params)
35
35
  Motor::Configs::WriteToFile.call
36
36
 
37
- render json: { data: Motor::ApiQuery::BuildJson.call(@dashboard, params) }
37
+ render json: { data: Motor::ApiQuery::BuildJson.call(@dashboard, params, current_ability) }
38
38
  rescue Motor::Dashboards::Persistance::TitleAlreadyExists
39
39
  render json: { errors: [{ source: 'title', detail: 'Title already exists' }] }, status: :unprocessable_entity
40
40
  end
@@ -51,6 +51,10 @@ module Motor
51
51
 
52
52
  def build_dashboard
53
53
  @dashboard = Motor::Dashboards::Persistance.build_from_params(dashboard_params)
54
+
55
+ @dashboard.define_singleton_method(:tags) do
56
+ taggable_tags.map(&:tag)
57
+ end
54
58
  end
55
59
 
56
60
  def dashboard_params
@@ -11,19 +11,19 @@ module Motor
11
11
  @resources = Motor::ApiQuery.call(@resources, params)
12
12
 
13
13
  render json: {
14
- data: Motor::ApiQuery::BuildJson.call(@resources, params),
14
+ data: Motor::ApiQuery::BuildJson.call(@resources, params, current_ability),
15
15
  meta: Motor::ApiQuery::BuildMeta.call(@resources, params)
16
16
  }
17
17
  end
18
18
 
19
19
  def show
20
- render json: { data: Motor::ApiQuery::BuildJson.call(@resource, params) }
20
+ render json: { data: Motor::ApiQuery::BuildJson.call(@resource, params, current_ability) }
21
21
  end
22
22
 
23
23
  def create
24
24
  @resource.save!
25
25
 
26
- render json: { data: Motor::ApiQuery::BuildJson.call(@resource, params) }
26
+ render json: { data: Motor::ApiQuery::BuildJson.call(@resource, params, current_ability) }
27
27
  rescue ActiveRecord::RecordInvalid
28
28
  render json: { errors: @resource.errors }, status: :unprocessable_entity
29
29
  end
@@ -31,7 +31,7 @@ module Motor
31
31
  def update
32
32
  @resource.update!(resource_params)
33
33
 
34
- render json: { data: Motor::ApiQuery::BuildJson.call(@resource, params) }
34
+ render json: { data: Motor::ApiQuery::BuildJson.call(@resource, params, current_ability) }
35
35
  rescue ActiveRecord::RecordInvalid
36
36
  render json: { errors: @resource.errors }, status: :unprocessable_entity
37
37
  end
@@ -47,6 +47,11 @@ module Motor
47
47
  end
48
48
 
49
49
  def execute
50
+ resource_preferences = Motor::Resource.find_by(name: @resource.class.name.underscore).preferences
51
+ resource_action = resource_preferences[:actions].find { |a| a[:preferences][:method_name] == params[:method] }
52
+
53
+ authorize!(resource_action[:name].to_sym, @resource)
54
+
50
55
  @resource.public_send(params[:method].to_sym)
51
56
 
52
57
  head :ok
@@ -10,11 +10,11 @@ module Motor
10
10
  authorize_resource :form, only: :create
11
11
 
12
12
  def index
13
- render json: { data: Motor::ApiQuery::BuildJson.call(@forms.active, params) }
13
+ render json: { data: Motor::ApiQuery::BuildJson.call(@forms.active, params, current_ability) }
14
14
  end
15
15
 
16
16
  def show
17
- render json: { data: Motor::ApiQuery::BuildJson.call(@form, params) }
17
+ render json: { data: Motor::ApiQuery::BuildJson.call(@form, params, current_ability) }
18
18
  end
19
19
 
20
20
  def create
@@ -24,7 +24,7 @@ module Motor
24
24
  ApplicationRecord.transaction { @form.save! }
25
25
  Motor::Configs::WriteToFile.call
26
26
 
27
- render json: { data: Motor::ApiQuery::BuildJson.call(@form, params) }
27
+ render json: { data: Motor::ApiQuery::BuildJson.call(@form, params, current_ability) }
28
28
  end
29
29
  rescue ActiveRecord::RecordNotUnique
30
30
  retry
@@ -34,7 +34,7 @@ module Motor
34
34
  Motor::Forms::Persistance.update_from_params!(@form, form_params)
35
35
  Motor::Configs::WriteToFile.call
36
36
 
37
- render json: { data: Motor::ApiQuery::BuildJson.call(@form, params) }
37
+ render json: { data: Motor::ApiQuery::BuildJson.call(@form, params, current_ability) }
38
38
  rescue Motor::Forms::Persistance::NameAlreadyExists
39
39
  render json: { errors: [{ source: 'name', detail: 'Name already exists' }] }, status: :unprocessable_entity
40
40
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Motor
4
4
  class IconsController < ApiBaseController
5
+ skip_authorization_check
6
+
5
7
  CACHE_STORE = ActiveSupport::Cache::MemoryStore.new
6
8
 
7
9
  def index
@@ -10,11 +10,11 @@ module Motor
10
10
  authorize_resource :query, only: :create
11
11
 
12
12
  def index
13
- render json: { data: Motor::ApiQuery::BuildJson.call(@queries.active, params) }
13
+ render json: { data: Motor::ApiQuery::BuildJson.call(@queries.active, params, current_ability) }
14
14
  end
15
15
 
16
16
  def show
17
- render json: { data: Motor::ApiQuery::BuildJson.call(@query, params) }
17
+ render json: { data: Motor::ApiQuery::BuildJson.call(@query, params, current_ability) }
18
18
  end
19
19
 
20
20
  def create
@@ -24,7 +24,7 @@ module Motor
24
24
  ApplicationRecord.transaction { @query.save! }
25
25
  Motor::Configs::WriteToFile.call
26
26
 
27
- render json: { data: Motor::ApiQuery::BuildJson.call(@query, params) }
27
+ render json: { data: Motor::ApiQuery::BuildJson.call(@query, params, current_ability) }
28
28
  end
29
29
  rescue ActiveRecord::RecordNotUnique
30
30
  retry
@@ -34,7 +34,7 @@ module Motor
34
34
  Motor::Queries::Persistance.update_from_params!(@query, query_params)
35
35
  Motor::Configs::WriteToFile.call
36
36
 
37
- render json: { data: Motor::ApiQuery::BuildJson.call(@query, params) }
37
+ render json: { data: Motor::ApiQuery::BuildJson.call(@query, params, current_ability) }
38
38
  rescue Motor::Queries::Persistance::NameAlreadyExists
39
39
  render json: { errors: [{ source: 'name', detail: 'Name already exists' }] }, status: :unprocessable_entity
40
40
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Motor
4
4
  class ResourceMethodsController < ApiBaseController
5
+ skip_authorization_check
6
+
5
7
  before_action :authorize_resource
6
8
 
7
9
  def show
@@ -7,14 +7,14 @@ module Motor
7
7
  load_and_authorize_resource
8
8
 
9
9
  def index
10
- render json: { data: Motor::ApiQuery::BuildJson.call(@resources, params) }
10
+ render json: { data: Motor::ApiQuery::BuildJson.call(@resources, params, current_ability) }
11
11
  end
12
12
 
13
13
  def create
14
14
  Motor::BuildSchema::PersistResourceConfigs.call(@resource)
15
15
  Motor::Configs::WriteToFile.call
16
16
 
17
- render json: { data: Motor::ApiQuery::BuildJson.call(@resource, params) }
17
+ render json: { data: Motor::ApiQuery::BuildJson.call(@resource, params, current_ability) }
18
18
  end
19
19
 
20
20
  private