mno-enterprise-api 3.3.3 → 3.4.0
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 +5 -5
- data/app/controllers/mno_enterprise/jpi/v1/admin/impac/dashboards_controller.rb +105 -0
- data/app/controllers/mno_enterprise/jpi/v1/admin/impac/widgets_controller.rb +20 -8
- data/app/controllers/mno_enterprise/jpi/v1/admin/invoices_controller.rb +1 -1
- data/app/controllers/mno_enterprise/jpi/v1/admin/organizations_controller.rb +1 -140
- data/app/controllers/mno_enterprise/jpi/v1/admin/sub_tenants_controller.rb +64 -0
- data/app/controllers/mno_enterprise/jpi/v1/admin/users_controller.rb +30 -20
- data/app/views/mno_enterprise/jpi/v1/admin/impac/dashboards/_dashboard.json.jbuilder +12 -0
- data/app/views/mno_enterprise/jpi/v1/admin/impac/dashboards/index.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/admin/impac/dashboards/show.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/admin/impac/widgets/_widget.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/admin/organizations/_organization.json.jbuilder +1 -1
- data/app/views/mno_enterprise/jpi/v1/admin/sub_tenants/_sub_tenant.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/admin/sub_tenants/index.json.jbuilder +2 -0
- data/app/views/mno_enterprise/jpi/v1/admin/sub_tenants/show.json.jbuilder +12 -0
- data/app/views/mno_enterprise/jpi/v1/admin/users/_user.json.jbuilder +1 -1
- data/app/views/mno_enterprise/jpi/v1/admin/users/show.json.jbuilder +5 -5
- data/app/views/mno_enterprise/jpi/v1/current_users/show.json.jbuilder +4 -2
- data/app/views/mno_enterprise/jpi/v1/impac/widgets/_widget.json.jbuilder +1 -0
- data/app/views/mno_enterprise/jpi/v1/organizations/_organization.json.jbuilder +1 -1
- data/config/routes.rb +9 -1
- data/lib/mno_enterprise/concerns/controllers/jpi/v1/admin/organizations_controller.rb +159 -0
- data/lib/mno_enterprise/concerns/controllers/jpi/v1/impac/alerts_controller.rb +3 -6
- data/lib/mno_enterprise/concerns/controllers/jpi/v1/impac/dashboards_controller.rb +29 -38
- data/lib/mno_enterprise/concerns/controllers/jpi/v1/impac/kpis_controller.rb +7 -8
- data/lib/mno_enterprise/concerns/controllers/jpi/v1/impac/widgets_controller.rb +14 -2
- data/lib/mno_enterprise/concerns/controllers/jpi/v1/organizations_controller.rb +1 -1
- data/spec/controllers/mno_enterprise/jpi/v1/admin/impac/dashboard_controller_spec.rb +149 -0
- data/spec/controllers/mno_enterprise/jpi/v1/admin/impac/dashboard_templates_controller_spec.rb +151 -139
- data/spec/controllers/mno_enterprise/jpi/v1/admin/impac/kpis_controller_spec.rb +95 -69
- data/spec/controllers/mno_enterprise/jpi/v1/admin/impac/widgets_controller_spec.rb +169 -81
- data/spec/controllers/mno_enterprise/jpi/v1/admin/invoices_controller_spec.rb +1 -1
- data/spec/controllers/mno_enterprise/jpi/v1/admin/organizations_controller_spec.rb +2 -1
- data/spec/controllers/mno_enterprise/jpi/v1/admin/sub_tenants_controller_spec.rb +172 -0
- data/spec/controllers/mno_enterprise/jpi/v1/admin/users_controller_spec.rb +29 -12
- data/spec/controllers/mno_enterprise/jpi/v1/current_users_controller_spec.rb +4 -2
- data/spec/controllers/mno_enterprise/jpi/v1/impac/dashboards_controller_spec.rb +26 -15
- data/spec/controllers/mno_enterprise/jpi/v1/impac/kpis_controller_spec.rb +11 -7
- data/spec/routing/mno_enterprise/jpi/v1/admin/impac/dashboards_controller_routing_spec.rb +28 -0
- data/spec/routing/mno_enterprise/jpi/v1/impac/dashboards_controller_routing_spec.rb +4 -0
- metadata +85 -70
@@ -0,0 +1,12 @@
|
|
1
|
+
json.extract! dashboard, :id, :name, :full_name, :currency
|
2
|
+
|
3
|
+
json.metadata dashboard.settings
|
4
|
+
|
5
|
+
json.data_sources dashboard.organizations.map do |org|
|
6
|
+
json.id org.id
|
7
|
+
json.uid org.uid
|
8
|
+
json.label org.name
|
9
|
+
end
|
10
|
+
|
11
|
+
json.kpis dashboard.kpis, partial: 'mno_enterprise/jpi/v1/admin/impac/kpis/kpi', as: :kpi
|
12
|
+
json.widgets dashboard.widgets, partial: 'mno_enterprise/jpi/v1/admin/impac/widgets/widget', as: :widget
|
@@ -0,0 +1 @@
|
|
1
|
+
json.array! @dashboards, partial: 'dashboard', as: :dashboard
|
@@ -0,0 +1 @@
|
|
1
|
+
json.partial! 'dashboard', dashboard: @dashboard
|
@@ -1 +1 @@
|
|
1
|
-
json.extract! organization, :id, :name, :uid, :soa_enabled, :created_at, :account_frozen
|
1
|
+
json.extract! organization, :id, :name, :uid, :soa_enabled, :created_at, :account_frozen, :financial_year_end_month
|
@@ -0,0 +1 @@
|
|
1
|
+
json.extract! sub_tenant, :id, :name, :created_at, :updated_at, :client_ids, :account_manager_ids
|
@@ -0,0 +1,12 @@
|
|
1
|
+
json.sub_tenant do
|
2
|
+
json.partial! 'sub_tenant', sub_tenant: @sub_tenant
|
3
|
+
|
4
|
+
json.clients @sub_tenant_clients do |org|
|
5
|
+
json.extract! org, :id, :uid, :name, :created_at
|
6
|
+
end
|
7
|
+
|
8
|
+
json.account_managers @sub_tenant_account_managers do |user|
|
9
|
+
json.extract! user, :id, :uid, :name, :surname, :email, :created_at, :admin_role
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -1 +1 @@
|
|
1
|
-
json.extract! user, :id, :uid, :email, :phone, :name, :surname, :admin_role, :created_at, :confirmed_at, :last_sign_in_at, :sign_in_count
|
1
|
+
json.extract! user, :id, :uid, :email, :phone, :name, :surname, :admin_role, :created_at, :updated_at, :confirmed_at, :last_sign_in_at, :sign_in_count, :mnoe_sub_tenant_id, :client_ids
|
@@ -2,10 +2,10 @@ json.user do
|
|
2
2
|
json.partial! 'user', user: @user
|
3
3
|
|
4
4
|
json.organizations @user_organizations do |org|
|
5
|
-
json.
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
json.
|
5
|
+
json.extract! org, :id, :uid, :name, :account_frozen, :created_at
|
6
|
+
end
|
7
|
+
|
8
|
+
json.clients @user_clients do |org|
|
9
|
+
json.extract! org, :id, :uid, :name, :account_frozen, :created_at
|
10
10
|
end
|
11
11
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
json.cache! ['
|
1
|
+
json.cache! ['v2', @user.cache_key, session[:impersonator_user_id]] do
|
2
2
|
json.current_user do
|
3
3
|
json.id @user.id
|
4
4
|
json.name @user.name
|
@@ -17,6 +17,7 @@ json.cache! ['v1', @user.cache_key, session[:impersonator_user_id]] do
|
|
17
17
|
json.admin_role @user.admin_role
|
18
18
|
json.avatar_url avatar_url(@user)
|
19
19
|
json.tos_accepted_at @user.meta_data[:tos_accepted_at] || false
|
20
|
+
json.mnoe_sub_tenant_id @user.mnoe_sub_tenant_id
|
20
21
|
if current_impersonator
|
21
22
|
json.current_impersonator true
|
22
23
|
json.current_impersonator_role current_impersonator.admin_role
|
@@ -29,7 +30,7 @@ json.cache! ['v1', @user.cache_key, session[:impersonator_user_id]] do
|
|
29
30
|
# Embed association if user is persisted
|
30
31
|
if @user.id
|
31
32
|
json.organizations do
|
32
|
-
json.array! (@user.organizations.active || []) do |o|
|
33
|
+
json.array! (@user.organizations.active.include_acl(session[:impersonator_user_id]) || []) do |o|
|
33
34
|
json.id o.id
|
34
35
|
json.uid o.uid
|
35
36
|
json.name o.name
|
@@ -37,6 +38,7 @@ json.cache! ['v1', @user.cache_key, session[:impersonator_user_id]] do
|
|
37
38
|
json.current_user_role o.role
|
38
39
|
json.has_myob_essentials_only o.has_myob_essentials_only?
|
39
40
|
json.financial_year_end_month o.financial_year_end_month
|
41
|
+
json.acl o.acl
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
json.extract! organization, :id, :name, :soa_enabled, :payment_restriction, :account_frozen #, :current_support_plan
|
1
|
+
json.extract! organization, :id, :name, :soa_enabled, :payment_restriction, :account_frozen, :financial_year_end_month #, :current_support_plan
|
2
2
|
# json.show_new_db_features !!organization.get_meta_data(:show_new_db_features)
|
3
3
|
# if organization.support_plan
|
4
4
|
# json.custom_training_credits organization.support_plan.custom_training_credits
|
data/config/routes.rb
CHANGED
@@ -95,7 +95,7 @@ MnoEnterprise::Engine.routes.draw do
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
# Maestrano-hub events
|
98
|
-
resources :events, only: [:create]
|
98
|
+
resources :events, only: [:create]
|
99
99
|
end
|
100
100
|
|
101
101
|
#============================================================
|
@@ -198,6 +198,7 @@ MnoEnterprise::Engine.routes.draw do
|
|
198
198
|
resource :invites, only: [:create]
|
199
199
|
end
|
200
200
|
end
|
201
|
+
resources :sub_tenants, only: [:index, :show, :destroy, :update, :create]
|
201
202
|
resources :tenant_invoices, only: [:index, :show]
|
202
203
|
resources :invoices, only: [:index, :show] do
|
203
204
|
collection do
|
@@ -222,6 +223,13 @@ MnoEnterprise::Engine.routes.draw do
|
|
222
223
|
|
223
224
|
# Dashboard templates designer
|
224
225
|
namespace :impac do
|
226
|
+
post 'dashboards/:id/copy', to: 'dashboards#copy'
|
227
|
+
|
228
|
+
# TODO: DRY between both?
|
229
|
+
resources :dashboards, only: [:index, :create, :update, :destroy] do
|
230
|
+
resources :widgets, shallow: true, only: [:create, :update, :destroy]
|
231
|
+
resources :kpis, shallow: true, only: [:create, :update, :destroy]
|
232
|
+
end
|
225
233
|
resources :dashboard_templates, only: [:index, :show, :destroy, :update, :create] do
|
226
234
|
resources :widgets, shallow: true, only: [:create, :update, :destroy]
|
227
235
|
resources :kpis, shallow: true, only: [:create, :update, :destroy]
|
@@ -0,0 +1,159 @@
|
|
1
|
+
module MnoEnterprise::Concerns::Controllers::Jpi::V1::Admin::OrganizationsController
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
#==================================================================
|
5
|
+
# Included methods
|
6
|
+
#==================================================================
|
7
|
+
# 'included do' causes the included code to be evaluated in the
|
8
|
+
# context where it is included rather than being executed in the module's context
|
9
|
+
included do
|
10
|
+
end
|
11
|
+
|
12
|
+
#==================================================================
|
13
|
+
# Instance methods
|
14
|
+
#==================================================================
|
15
|
+
# GET /mnoe/jpi/v1/admin/organizations
|
16
|
+
def index
|
17
|
+
if params[:terms]
|
18
|
+
# Search mode
|
19
|
+
@organizations = []
|
20
|
+
JSON.parse(params[:terms]).map { |t| @organizations = @organizations | MnoEnterprise::Organization.where(Hash[*t]).fetch }
|
21
|
+
response.headers['X-Total-Count'] = @organizations.count
|
22
|
+
else
|
23
|
+
# Index mode
|
24
|
+
query = MnoEnterprise::Organization
|
25
|
+
query = query.limit(params[:limit]) if params[:limit]
|
26
|
+
query = query.skip(params[:offset]) if params[:offset]
|
27
|
+
query = query.order_by(params[:order_by]) if params[:order_by]
|
28
|
+
query = query.where(params[:where]) if params[:where]
|
29
|
+
all = query.all
|
30
|
+
|
31
|
+
all.params[:sub_tenant_id] = params[:sub_tenant_id]
|
32
|
+
all.params[:account_manager_id] = params[:account_manager_id]
|
33
|
+
|
34
|
+
@organizations = all.fetch
|
35
|
+
|
36
|
+
response.headers['X-Total-Count'] = @organizations.metadata[:pagination][:count]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# GET /mnoe/jpi/v1/admin/organizations/1
|
41
|
+
def show
|
42
|
+
@organization = MnoEnterprise::Organization.find(params[:id])
|
43
|
+
@organization_active_apps = @organization.app_instances.active.to_a
|
44
|
+
end
|
45
|
+
|
46
|
+
# GET /mnoe/jpi/v1/admin/organizations/in_arrears
|
47
|
+
def in_arrears
|
48
|
+
@arrears = MnoEnterprise::ArrearsSituation.all.fetch
|
49
|
+
end
|
50
|
+
|
51
|
+
# GET /mnoe/jpi/v1/admin/organizations/count
|
52
|
+
def count
|
53
|
+
organizations_count = MnoEnterprise::Tenant.get('tenant').organizations_count
|
54
|
+
render json: {count: organizations_count }
|
55
|
+
end
|
56
|
+
|
57
|
+
# POST /mnoe/jpi/v1/admin/organizations
|
58
|
+
def create
|
59
|
+
# Create new organization
|
60
|
+
@organization = MnoEnterprise::Organization.create(organization_update_params)
|
61
|
+
|
62
|
+
# OPTIMIZE: move this into a delayed job?
|
63
|
+
update_app_list
|
64
|
+
|
65
|
+
@organization_active_apps = @organization.app_instances
|
66
|
+
|
67
|
+
render 'show'
|
68
|
+
end
|
69
|
+
|
70
|
+
# PATCH /mnoe/jpi/v1/admin/organizations/1
|
71
|
+
def update
|
72
|
+
# get organization
|
73
|
+
@organization = MnoEnterprise::Organization.find(params[:id])
|
74
|
+
|
75
|
+
update_app_list
|
76
|
+
|
77
|
+
@organization_active_apps = @organization.app_instances.active
|
78
|
+
|
79
|
+
render 'show'
|
80
|
+
end
|
81
|
+
|
82
|
+
# POST /mnoe/jpi/v1/admin/organizations/1/users
|
83
|
+
# Invite a user to the organization (and create it if needed)
|
84
|
+
# This does not send any emails (emails are manually triggered later)
|
85
|
+
def invite_member
|
86
|
+
@organization = MnoEnterprise::Organization.find(params[:id])
|
87
|
+
|
88
|
+
# Find or create a new user - We create it in the frontend as MnoHub will send confirmation instructions for newly
|
89
|
+
# created users
|
90
|
+
user = MnoEnterprise::User.find_by(email: user_params[:email]) || create_unconfirmed_user(user_params)
|
91
|
+
|
92
|
+
# Create the invitation
|
93
|
+
invite = @organization.org_invites.create(
|
94
|
+
user_email: user.email,
|
95
|
+
user_role: params[:user][:role],
|
96
|
+
referrer_id: current_user.id,
|
97
|
+
status: 'staged' # Will be updated to 'accepted' for unconfirmed users
|
98
|
+
)
|
99
|
+
|
100
|
+
@user = if user.confirmed?
|
101
|
+
invite.accept!(user)
|
102
|
+
invite.reload
|
103
|
+
else
|
104
|
+
user.reload
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
protected
|
109
|
+
|
110
|
+
def organization_permitted_update_params
|
111
|
+
[:name]
|
112
|
+
end
|
113
|
+
|
114
|
+
def organization_update_params
|
115
|
+
params.fetch(:organization, {}).permit(*organization_permitted_update_params)
|
116
|
+
end
|
117
|
+
|
118
|
+
def user_params
|
119
|
+
params.require(:user).permit(:email, :name, :surname, :phone)
|
120
|
+
end
|
121
|
+
|
122
|
+
# Create an unconfirmed user and skip the confirmation notification
|
123
|
+
# TODO: monkey patch User#confirmation_required? to simplify this? Use refinements?
|
124
|
+
def create_unconfirmed_user(user_params)
|
125
|
+
user = MnoEnterprise::User.new(user_params)
|
126
|
+
user.skip_confirmation_notification!
|
127
|
+
user.save
|
128
|
+
|
129
|
+
# Reset the confirmation field so we can track when the invite is send - #confirmation_sent_at is when the confirmation_token was generated (not sent)
|
130
|
+
# Not ideal as we do 2 saves, and the previous save trigger a call to the backend to validate the token uniqueness
|
131
|
+
user.assign_attributes(confirmation_sent_at: nil, confirmation_token: nil)
|
132
|
+
user.save
|
133
|
+
user
|
134
|
+
end
|
135
|
+
|
136
|
+
# Update App List to match the list passed in params
|
137
|
+
def update_app_list
|
138
|
+
# Differentiate between a null app_nids params and no app_nids params
|
139
|
+
return unless params[:organization].key?(:app_nids) && (desired_nids = Array(params[:organization][:app_nids]))
|
140
|
+
|
141
|
+
existing_apps = @organization.app_instances.active
|
142
|
+
|
143
|
+
existing_apps.each do |app_instance|
|
144
|
+
desired_nids.delete(app_instance.app.nid) || app_instance.terminate
|
145
|
+
end
|
146
|
+
|
147
|
+
desired_nids.each do |nid|
|
148
|
+
begin
|
149
|
+
@organization.app_instances.create(product: nid)
|
150
|
+
rescue => e
|
151
|
+
Rails.logger.error { "#{e.message} #{e.backtrace.join("\n")}" }
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
# Force reload
|
157
|
+
existing_apps.reload
|
158
|
+
end
|
159
|
+
end
|
@@ -19,8 +19,7 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::AlertsController
|
|
19
19
|
def create
|
20
20
|
return render_bad_request('attach alert to kpi', 'no alert specified') unless params.require(:alert)
|
21
21
|
return render_not_found('kpi') unless kpi_alert.kpi
|
22
|
-
|
23
|
-
authorize! :manage_alert, kpi_alert
|
22
|
+
authorize! :update_impac_kpis, kpi_alert.kpi
|
24
23
|
|
25
24
|
if (@alert = current_user.alerts.create(kpi_alert.attributes))
|
26
25
|
render 'show'
|
@@ -33,11 +32,10 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::AlertsController
|
|
33
32
|
def update
|
34
33
|
return render_bad_request('update alert attributes', 'no alert hash specified') unless params.require(:alert)
|
35
34
|
return render_not_found('alert') unless alert
|
35
|
+
authorize! :update_impac_kpis, alert.kpi
|
36
36
|
|
37
37
|
attributes = params.require(:alert).permit(:title, :webhook, :sent)
|
38
38
|
|
39
|
-
authorize! :manage_alert, alert
|
40
|
-
|
41
39
|
if alert.update(attributes)
|
42
40
|
render 'show'
|
43
41
|
else
|
@@ -48,8 +46,7 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::AlertsController
|
|
48
46
|
# DELETE /jpi/v1/impac/alerts/:id
|
49
47
|
def destroy
|
50
48
|
return render_not_found('alert') unless alert
|
51
|
-
|
52
|
-
authorize! :manage_alert, alert
|
49
|
+
authorize! :update_impac_kpis, alert.kpi
|
53
50
|
|
54
51
|
service = alert.service
|
55
52
|
if alert.destroy
|
@@ -28,15 +28,10 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::DashboardsControlle
|
|
28
28
|
# POST /mnoe/jpi/v1/impac/dashboards
|
29
29
|
# -> POST /api/mnoe/v1/users/1/dashboards
|
30
30
|
def create
|
31
|
-
|
32
|
-
|
33
|
-
# @dashboard = dashboards.build(dashboard_create_params)
|
34
|
-
# TODO: enable authorization
|
35
|
-
# authorize! :manage_dashboard, @dashboard
|
36
|
-
# if @dashboard.save
|
31
|
+
authorize! :create_impac_dashboards, dashboards.build(dashboard_create_params)
|
32
|
+
|
37
33
|
if @dashboard = dashboards.create(dashboard_create_params)
|
38
34
|
MnoEnterprise::EventLogger.info('dashboard_create', current_user.id, 'Dashboard Creation', @dashboard)
|
39
|
-
|
40
35
|
render 'show'
|
41
36
|
else
|
42
37
|
render_bad_request('create dashboard', @dashboard.errors)
|
@@ -47,9 +42,7 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::DashboardsControlle
|
|
47
42
|
# -> PUT /api/mnoe/v1/dashboards/1
|
48
43
|
def update
|
49
44
|
return render_not_found('dashboard') unless dashboard
|
50
|
-
|
51
|
-
# TODO: enable authorization
|
52
|
-
# authorize! :manage_dashboard, dashboard
|
45
|
+
authorize! :update_impac_dashboards, dashboard
|
53
46
|
|
54
47
|
if dashboard.update(dashboard_update_params)
|
55
48
|
render 'show'
|
@@ -62,9 +55,7 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::DashboardsControlle
|
|
62
55
|
# -> DELETE /api/mnoe/v1/dashboards/1
|
63
56
|
def destroy
|
64
57
|
return render_not_found('dashboard') unless dashboard
|
65
|
-
|
66
|
-
# TODO: enable authorization
|
67
|
-
# authorize! :manage_dashboard, dashboard
|
58
|
+
authorize! :destroy_impac_dashboards, dashboard
|
68
59
|
|
69
60
|
if dashboard.destroy
|
70
61
|
MnoEnterprise::EventLogger.info('dashboard_delete', current_user.id, 'Dashboard Deletion', dashboard)
|
@@ -81,6 +72,7 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::DashboardsControlle
|
|
81
72
|
# POST mnoe/jpi/v1/impac/dashboards/1/copy
|
82
73
|
def copy
|
83
74
|
return render_not_found('template') unless template
|
75
|
+
authorize! :create_impac_dashboards, template
|
84
76
|
|
85
77
|
# Owner is the current user by default, can be overriden to something else (eg: current organization)
|
86
78
|
@dashboard = template.copy(current_user, dashboard_params[:name], dashboard_params[:organization_ids])
|
@@ -91,35 +83,34 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::DashboardsControlle
|
|
91
83
|
|
92
84
|
private
|
93
85
|
|
94
|
-
|
95
|
-
|
96
|
-
|
86
|
+
def dashboards
|
87
|
+
@dashboards ||= current_user.dashboards
|
88
|
+
end
|
97
89
|
|
98
|
-
|
99
|
-
|
100
|
-
|
90
|
+
def dashboard
|
91
|
+
@dashboard ||= current_user.dashboards.find(params[:id].to_i)
|
92
|
+
end
|
101
93
|
|
102
|
-
|
103
|
-
|
104
|
-
|
94
|
+
def templates
|
95
|
+
@templates ||= MnoEnterprise::Impac::Dashboard.templates
|
96
|
+
end
|
105
97
|
|
106
|
-
|
107
|
-
|
108
|
-
|
98
|
+
def template
|
99
|
+
@template ||= templates.find(params[:id].to_i)
|
100
|
+
end
|
109
101
|
|
110
|
-
|
111
|
-
|
112
|
-
|
102
|
+
def whitelisted_params
|
103
|
+
[:name, :currency, { widgets_order: [] }, { organization_ids: [] }]
|
104
|
+
end
|
113
105
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
end
|
120
|
-
.except(:metadata)
|
106
|
+
# Allows all metadata attrs to be permitted, and maps it to :settings
|
107
|
+
# for the Her "meta_data" issue.
|
108
|
+
def dashboard_params
|
109
|
+
params.require(:dashboard).permit(*whitelisted_params).tap do |whitelisted|
|
110
|
+
whitelisted[:settings] = params[:dashboard][:metadata] || {}
|
121
111
|
end
|
122
|
-
|
123
|
-
|
124
|
-
|
112
|
+
.except(:metadata)
|
113
|
+
end
|
114
|
+
alias :dashboard_update_params :dashboard_params
|
115
|
+
alias :dashboard_create_params :dashboard_params
|
125
116
|
end
|
@@ -49,16 +49,15 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::KpisController
|
|
49
49
|
# POST /mnoe/jpi/v1/impac/dashboards/:dashboard_id/kpis
|
50
50
|
# -> POST /api/mnoe/v1/dashboards/:id/kpis
|
51
51
|
# -> POST /api/mnoe/v1/users/:id/alerts
|
52
|
+
# TODO: nest alert in as a param, with the current user as a recipient.
|
52
53
|
def create
|
53
54
|
if params[:kpi][:widget_id].present?
|
54
55
|
return render_not_found('widget') if widget.blank?
|
55
|
-
authorize! :manage_widget, widget
|
56
56
|
else
|
57
57
|
return render_not_found('dashboard') if dashboard.blank?
|
58
|
-
authorize! :manage_dashboard, dashboard
|
59
58
|
end
|
59
|
+
authorize! :create_impac_kpis, kpi_parent.kpis.build(kpi_create_params)
|
60
60
|
|
61
|
-
# TODO: nest alert in as a param, with the current user as a recipient.
|
62
61
|
@kpi = kpi_parent.kpis.create(kpi_create_params)
|
63
62
|
unless kpi.errors?
|
64
63
|
# Creates a default alert for kpis created with targets defined.
|
@@ -80,8 +79,7 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::KpisController
|
|
80
79
|
# -> PUT /api/mnoe/v1/kpis/:id
|
81
80
|
def update
|
82
81
|
render_not_found('kpi') unless kpi.present?
|
83
|
-
|
84
|
-
authorize! :manage_kpi, kpi
|
82
|
+
authorize! :update_impac_kpis, kpi
|
85
83
|
|
86
84
|
params = kpi_update_params
|
87
85
|
|
@@ -113,8 +111,7 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::KpisController
|
|
113
111
|
# -> DELETE /api/mnoe/v1/kpis/:id
|
114
112
|
def destroy
|
115
113
|
render_not_found('kpi') unless kpi.present?
|
116
|
-
|
117
|
-
authorize! :manage_kpi, kpi
|
114
|
+
authorize! :destroy_impac_kpis, kpi
|
118
115
|
|
119
116
|
if kpi.destroy
|
120
117
|
head status: :ok
|
@@ -147,7 +144,9 @@ module MnoEnterprise::Concerns::Controllers::Jpi::V1::Impac::KpisController
|
|
147
144
|
|
148
145
|
def kpi_create_params
|
149
146
|
whitelist = [:dashboard_id, :widget_id, :endpoint, :source, :element_watched, {extra_watchables: []}]
|
150
|
-
extract_params(whitelist)
|
147
|
+
create_params = extract_params(whitelist)
|
148
|
+
create_params[:settings][:organization_ids] ||= HashWithIndifferentAccess.new(kpi_parent.settings)[:organization_ids]
|
149
|
+
create_params
|
151
150
|
end
|
152
151
|
|
153
152
|
def kpi_update_params
|