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.
- checksums.yaml +4 -4
- data/README.md +9 -13
- data/app/controllers/concerns/motor/current_ability.rb +21 -0
- data/app/controllers/concerns/motor/current_user_method.rb +8 -7
- data/app/controllers/motor/alerts_controller.rb +4 -4
- data/app/controllers/motor/api_base_controller.rb +2 -12
- data/app/controllers/motor/application_controller.rb +1 -0
- data/app/controllers/motor/audits_controller.rb +1 -1
- data/app/controllers/motor/auth_tokens_controller.rb +36 -0
- data/app/controllers/motor/configs_controller.rb +2 -2
- data/app/controllers/motor/dashboards_controller.rb +8 -4
- data/app/controllers/motor/data_controller.rb +9 -4
- data/app/controllers/motor/forms_controller.rb +4 -4
- data/app/controllers/motor/icons_controller.rb +2 -0
- data/app/controllers/motor/queries_controller.rb +4 -4
- data/app/controllers/motor/resource_methods_controller.rb +2 -0
- data/app/controllers/motor/resources_controller.rb +2 -2
- data/app/controllers/motor/run_queries_controller.rb +21 -1
- data/app/controllers/motor/ui_controller.rb +1 -1
- data/app/views/motor/ui/show.html.erb +1 -1
- data/config/routes.rb +1 -0
- data/lib/generators/motor/templates/install.rb +1 -0
- data/lib/motor.rb +1 -0
- data/lib/motor/active_record_utils.rb +2 -1
- data/lib/motor/active_record_utils/active_record_connection_column_patch.rb +13 -0
- data/lib/motor/active_record_utils/{active_record_filter.rb → active_record_filter_patch.rb} +0 -0
- data/lib/motor/admin.rb +21 -0
- data/lib/motor/api_query.rb +2 -2
- data/lib/motor/api_query/build_json.rb +101 -47
- data/lib/motor/api_query/filter.rb +11 -1
- data/lib/motor/assets.rb +10 -1
- data/lib/motor/build_schema.rb +3 -1
- data/lib/motor/build_schema/active_storage_attachment_schema.rb +1 -0
- data/lib/motor/build_schema/apply_permissions.rb +50 -0
- data/lib/motor/build_schema/find_icon.rb +5 -1
- data/lib/motor/cancan_utils.rb +7 -0
- data/lib/motor/cancan_utils/ability_patch.rb +29 -0
- data/lib/motor/cancan_utils/can_manage_all.rb +14 -0
- data/lib/motor/configs/build_ui_app_tag.rb +26 -16
- data/lib/motor/configs/load_from_cache.rb +20 -8
- data/lib/motor/queries/render_sql_template.rb +12 -2
- data/lib/motor/queries/run_query.rb +73 -19
- data/lib/motor/version.rb +1 -1
- data/ui/dist/main-fd0f75f789196ce24ffd.css.gz +0 -0
- data/ui/dist/main-fd0f75f789196ce24ffd.js.gz +0 -0
- data/ui/dist/manifest.json +5 -5
- metadata +14 -8
- data/app/controllers/motor/schemas_controller.rb +0 -11
- data/ui/dist/main-1f811bd0c7c600a0e204.css.gz +0 -0
- data/ui/dist/main-1f811bd0c7c600a0e204.js.gz +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b1e931dc58724b3ae9e207d86d4ca7a9c68d7cfeae0e0c482a7cd21d23c4258
|
4
|
+
data.tar.gz: d11ea5ce285bf4c44f6e772970b26bc7deede0b055e7c264c3039833c3d29534
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
[](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
|

|
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
|
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
|

|
64
65
|
|
65
|
-
Queries can include
|
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
|
-
|
7
|
-
current_admin
|
8
|
-
|
9
|
-
current_admin_user
|
10
|
-
|
11
|
-
super
|
12
|
-
|
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
|
@@ -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
|
@@ -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
|
@@ -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
|