erp_tech_svcs 4.0.0 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -24
  3. data/app/controllers/api/v1/audit_log_items_controller.rb +33 -0
  4. data/app/controllers/api/v1/audit_logs_controller.rb +32 -0
  5. data/app/controllers/api/v1/capabilities_controller.rb +160 -0
  6. data/app/controllers/api/v1/file_assets_controller.rb +40 -0
  7. data/app/controllers/api/v1/groups_controller.rb +236 -0
  8. data/app/controllers/api/v1/security_roles_controller.rb +276 -0
  9. data/app/controllers/api/v1/users_controller.rb +262 -0
  10. data/app/controllers/erp_tech_svcs/session_controller.rb +8 -5
  11. data/app/controllers/erp_tech_svcs/user_controller.rb +14 -15
  12. data/app/mailers/user_mailer.rb +8 -5
  13. data/app/models/audit_log.rb +111 -36
  14. data/app/models/audit_log_item.rb +30 -0
  15. data/app/models/audit_log_item_type.rb +1 -0
  16. data/app/models/audit_log_type.rb +19 -0
  17. data/app/models/capability.rb +22 -6
  18. data/app/models/extensions/tracked_status_type.rb +3 -0
  19. data/app/models/file_asset.rb +245 -20
  20. data/app/models/file_asset_holder.rb +20 -0
  21. data/app/models/group.rb +38 -25
  22. data/app/models/notification.rb +32 -13
  23. data/app/models/notification_type.rb +13 -0
  24. data/app/models/security_role.rb +17 -4
  25. data/app/models/user.rb +116 -29
  26. data/app/validators/password_strength_validator.rb +1 -1
  27. data/app/views/user_mailer/activation_needed_email.html.erb +293 -15
  28. data/app/views/user_mailer/reset_password_email.html.erb +268 -13
  29. data/config/initializers/logger.rb +19 -0
  30. data/config/initializers/sorcery.rb +2 -0
  31. data/config/initializers/wickedpdf.rb +4 -0
  32. data/config/routes.rb +64 -0
  33. data/db/data_migrations/20110802200222_schedule_delete_expired_sessions_job.rb +1 -5
  34. data/db/data_migrations/20150819140550_create_job_tracker_for_notification.rb +14 -0
  35. data/db/migrate/20080805000010_base_tech_services.rb +99 -39
  36. data/db/migrate/20150414151421_add_nested_set_columns_to_security_role.rb +13 -0
  37. data/db/migrate/20150609003216_update_user_for_sorcery.rb +11 -0
  38. data/db/migrate/20150819135108_add_custom_fields_to_notifications.rb +5 -0
  39. data/db/migrate/20160122155402_add_description_to_file_asset.rb +13 -0
  40. data/db/migrate/20160310163060_add_created_by_updated_by_to_erp_tech_svcs.rb +35 -0
  41. data/db/migrate/20160313161611_add_tenant_id_to_audit_log.rb +16 -0
  42. data/lib/erp_tech_svcs.rb +6 -10
  43. data/lib/erp_tech_svcs/config.rb +7 -2
  44. data/lib/erp_tech_svcs/delayed_jobs/delete_expired_sessions_job.rb +49 -0
  45. data/lib/erp_tech_svcs/delayed_jobs/notification_job.rb +50 -0
  46. data/lib/erp_tech_svcs/engine.rb +0 -1
  47. data/lib/erp_tech_svcs/erp_tech_svcs_audit_log.rb +12 -6
  48. data/lib/erp_tech_svcs/extensions.rb +0 -1
  49. data/lib/erp_tech_svcs/extensions/active_record/has_capability_accessors.rb +57 -29
  50. data/lib/erp_tech_svcs/extensions/active_record/has_file_assets.rb +57 -31
  51. data/lib/erp_tech_svcs/extensions/active_record/has_security_roles.rb +12 -4
  52. data/lib/erp_tech_svcs/extensions/active_record/is_json.rb +22 -15
  53. data/lib/erp_tech_svcs/extensions/active_record/scoped_by.rb +16 -13
  54. data/lib/erp_tech_svcs/extensions/compass_ae/erp_base_erp_svcs/controllers/api/parties_controller.rb +15 -0
  55. data/lib/erp_tech_svcs/file_support.rb +1 -0
  56. data/lib/erp_tech_svcs/file_support/file_system_manager.rb +77 -44
  57. data/lib/erp_tech_svcs/file_support/manager.rb +12 -3
  58. data/lib/erp_tech_svcs/file_support/railties/compass_ae_resolver.rb +49 -0
  59. data/lib/erp_tech_svcs/file_support/s3_manager.rb +73 -51
  60. data/lib/erp_tech_svcs/utils/compass_access_negotiator.rb +11 -2
  61. data/lib/erp_tech_svcs/utils/default_nested_set_methods.rb +238 -46
  62. data/lib/erp_tech_svcs/version.rb +1 -1
  63. data/lib/tasks/erp_tech_svcs_tasks.rake +43 -5
  64. metadata +73 -42
  65. data/app/models/user_defined_data.rb +0 -6
  66. data/app/models/user_defined_field.rb +0 -8
  67. data/config/initializers/pdfkit.rb +0 -18
  68. data/db/data_migrations/20121130212146_note_capabilities.rb +0 -23
  69. data/db/migrate/20121116151510_create_groups.rb +0 -18
  70. data/db/migrate/20121126171612_upgrade_security.rb +0 -53
  71. data/db/migrate/20121126173506_upgrade_security2.rb +0 -274
  72. data/db/migrate/20130410135419_add_queue_to_delayed_jobs.rb +0 -13
  73. data/db/migrate/20130610163240_create_notifications.rb +0 -37
  74. data/db/migrate/20130725212647_add_party_id_idx_to_users.rb +0 -9
  75. data/db/migrate/20131113213843_add_audit_log_item_old_value.rb +0 -13
  76. data/db/migrate/20131113213844_add_erp_tech_svcs_missing_indexes.rb +0 -31
  77. data/db/migrate/20131129203603_add_user_defined_fields.rb +0 -43
  78. data/db/migrate/20141013060204_add_custom_fields_to_notifications.rb +0 -12
  79. data/db/migrate/20141108182427_add_scoped_by_to_file_assets.rb +0 -14
  80. data/lib/erp_tech_svcs/extensions/active_record/has_user_defined_data.rb +0 -147
  81. data/lib/erp_tech_svcs/sessions/delete_expired_sessions_job.rb +0 -47
  82. data/lib/erp_tech_svcs/sessions/delete_expired_sessions_service.rb +0 -15
  83. data/lib/erp_tech_svcs/utils/compass_logger.rb +0 -87
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7bc1ac2673d51f0305cefdda4751e83b2e5c9c8b
4
- data.tar.gz: 8cd8163998ed18e9830e422bb8b711cb7444aba5
3
+ metadata.gz: 6d1afe3f18154c03bf81d9834702592ce388f4aa
4
+ data.tar.gz: 71878b46f921999cfcb0d5651f2a544215756971
5
5
  SHA512:
6
- metadata.gz: b05a87fbda29e7a21d9ce740a2bad21ced5ff359cdc99685bdb4538516beae0eabc30733621d9e1c5919109ad1fa84559a4b2f00ea97bca455d1148ff01d6218
7
- data.tar.gz: 0a6bb2c5cbb497360561bb79b16c36cc71e52251721ce3adf604ad8fe9e4409c222f969a33e166abd5692ee9e26aa237a0a07776657adb0c86e870bc24da4de3
6
+ metadata.gz: 2e9fe984a85bda80e67b9252d55433e1ed45f6d236cb38de233c88da6eae3778cbdb1332d318ad2cead6e190fcadfff5781df59dcbe0c91a44b6f283c7cd76fe
7
+ data.tar.gz: db7c9b363d446511aea7d6425c08d8d4dd4328237d372b9a15daa787b8d783f78f1dc41756d0c9598e9c1c9eb7d1be91c4f9391fdd78f03159d4d058a18bab24
data/README.md CHANGED
@@ -61,27 +61,3 @@ To override these settings simple create a erp_tech_svcs.rb file in your initial
61
61
  config.s3_protocol = 'https' # Can be either 'http' or 'https'
62
62
  end
63
63
  Rails.application.config.erp_tech_svcs.configure!
64
-
65
- ##Notes
66
-
67
- We use [pdfkit](https://github.com/jdpace/PDFKit) and there is an initializer in erp\_tech\_svcs to set it up with some defaults. You will need to create your
68
- own initializer to overwrite this if you have wkhtmltopdf in another location
69
-
70
- # config/initializers/pdfkit.rb
71
- PDFKit.configure do |config|
72
- if RUBY_PLATFORM =~ /(:?mswin|mingw)/
73
- # set path to wkhtmltopdf on windows here
74
- config.wkhtmltopdf = '/opt/local/bin/wkhtmltopdf'
75
- else
76
- config.wkhtmltopdf = '/opt/local/bin/wkhtmltopdf'
77
- end
78
-
79
- config.default_options = {
80
- :page_size => 'Letter',
81
- :print_media_type => true,
82
- :disable_smart_shrinking => true,
83
- :dpi => 300,
84
- :no_background => true
85
- # :use_xserver => true
86
- }
87
- end
@@ -0,0 +1,33 @@
1
+ module Api
2
+ module V1
3
+ class AuditLogItemsController < BaseController
4
+
5
+ def index
6
+ sort_hash = params[:sort].blank? ? {} : Hash.symbolize_keys(JSON.parse(params[:sort]).first)
7
+ sort = sort_hash[:property] || 'description'
8
+ dir = sort_hash[:direction] || 'ASC'
9
+ limit = params[:limit] || 25
10
+ start = params[:start] || 0
11
+ # query_filter = params[:query_filter].blank? ? {} : JSON.parse(params[:query_filter]).symbolize_keys
12
+
13
+ if params[:audit_log_id].present?
14
+ audit_log_items = AuditLogItem.where(audit_log_id: params[:audit_log_id])
15
+
16
+ total_count = audit_log_items.count
17
+ audit_log_items = audit_log_items.limit(limit).offset(start)
18
+ audit_log_items.order("#{sort} #{dir}")
19
+
20
+ render json: {success: true,
21
+ total_count: total_count,
22
+ audit_log_items: audit_log_items.collect { |audit_log_item| audit_log_item.to_data_hash }}
23
+
24
+ else
25
+ render json: {success: false,
26
+ message: 'Audit Log id must be passed'}
27
+ end
28
+
29
+ end
30
+
31
+ end # AuditLogItemsController
32
+ end # V1
33
+ end # Api
@@ -0,0 +1,32 @@
1
+ module Api
2
+ module V1
3
+ class AuditLogsController < BaseController
4
+
5
+ def index
6
+ sort_hash = params[:sort].blank? ? {} : Hash.symbolize_keys(JSON.parse(params[:sort]).first)
7
+ sort = sort_hash[:property] || 'description'
8
+ dir = sort_hash[:direction] || 'ASC'
9
+ limit = params[:limit] || 25
10
+ start = params[:start] || 0
11
+ query_filter = params[:query_filter].blank? ? {} : JSON.parse(params[:query_filter]).symbolize_keys
12
+
13
+ # if no file asset holder was passed we need to scope by dba_organization
14
+ unless query_filter[:tenant].present?
15
+ query_filter[:tenant] = current_user.dba_organization
16
+ end
17
+
18
+ # apply filters
19
+ audit_logs = AuditLog.apply_filters(query_filter)
20
+
21
+ total_count = audit_logs.count
22
+ audit_logs = audit_logs.limit(limit).offset(start)
23
+ audit_logs.order("#{sort} #{dir}")
24
+
25
+ render json: {success: true,
26
+ total_count: total_count,
27
+ file_assets: audit_logs.collect { |audit_log| audit_log.to_data_hash }}
28
+ end
29
+
30
+ end # AuditLogsController
31
+ end # V1
32
+ end # Api
@@ -0,0 +1,160 @@
1
+ module Api
2
+ module V1
3
+ class CapabilitiesController < BaseController
4
+
5
+ def index
6
+ if params[:user_id].present?
7
+ capabilities = User.find(params[:user_id]).capabilities
8
+ else
9
+ capabilities = Capability
10
+ end
11
+
12
+ respond_to do |format|
13
+ format.json do
14
+ query = params[:query]
15
+ sort_hash = params[:sort].blank? ? {} : Hash.symbolize_keys(JSON.parse(params[:sort]).first)
16
+ sort = sort_hash[:property] || 'description'
17
+ dir = sort_hash[:direction] || 'ASC'
18
+ limit = params[:limit]
19
+ start = params[:start]
20
+
21
+ if query
22
+ capability_role_tbl = Capability.arel_table
23
+ capabilities = capabilities.where(capability_role_tbl[:description].matches("%#{query}%"))
24
+
25
+ total_count = capabilities.count
26
+ capabilities = capabilities.order("#{sort} #{dir}")
27
+ else
28
+ total_count = capabilities.count
29
+ capabilities = capabilities.order("#{sort} #{dir}")
30
+ end
31
+
32
+ if limit and start
33
+ capabilities = capabilities.limit(limit).offset(start)
34
+ end
35
+
36
+ render json: {success: true, total_count: total_count, capabilities: capabilities.collect{|capability| capability.to_data_hash}}
37
+ end
38
+ format.tree do
39
+ nodes = [].tap do |nodes|
40
+ capabilities.all.each do |capability|
41
+ nodes.push({
42
+ leaf: true,
43
+ internal_identifier: capability.id,
44
+ text: capability.description
45
+ })
46
+ end
47
+ end
48
+
49
+ render json: {success: true, capabilities: nodes}
50
+ end
51
+ end
52
+ end
53
+
54
+ def available
55
+ type = params[:type]
56
+ id = params[:id]
57
+
58
+ sort = (params[:sort] || 'description').downcase
59
+ sort = 'capabilities.description' if sort == 'description'
60
+ dir = (params[:dir] || 'asc').downcase
61
+ query_filter = params[:query_filter].strip rescue nil
62
+ scope_type_ids = [ScopeType.find_by_internal_identifier('class').id, ScopeType.find_by_internal_identifier('query').id]
63
+
64
+ statement = id.blank? ? Capability.joins(:capability_type) : type.constantize.find(id).capabilities_not.where("scope_type_id IN (#{scope_type_ids.join(',')})")
65
+ statement = (params[:query_filter].blank? ? statement : statement.where("(UPPER(capabilities.description) LIKE UPPER('%#{query_filter}%'))"))
66
+ available = statement.paginate(:page => page, :per_page => per_page, :order => "#{sort} #{dir}")
67
+
68
+ render :json => {:total_count => statement.count, :capabilities => available.map { |capability| capability.to_data_hash }}
69
+ end
70
+
71
+ def selected
72
+ type = params[:type]
73
+ id = params[:id]
74
+
75
+ sort = (params[:sort] || 'description').downcase
76
+ sort = 'capabilities.description' if sort == 'description'
77
+ dir = (params[:dir] || 'asc').downcase
78
+ query_filter = params[:query_filter].strip rescue nil
79
+ scope_type_ids = [ScopeType.find_by_internal_identifier('class').id, ScopeType.find_by_internal_identifier('query').id]
80
+
81
+ statement = id.blank? ? Capability.joins(:capability_type) : type.constantize.find(id).capabilities.where("scope_type_id IN (#{scope_type_ids.join(',')})")
82
+ statement = (params[:query_filter].blank? ? statement : statement.where("(UPPER(capabilities.description) LIKE UPPER('%#{query_filter}%'))"))
83
+ selected = statement.paginate(:page => page, :per_page => per_page, :order => "#{sort} #{dir}")
84
+
85
+ render :json => {:total_count => statement.count, :capabilities => selected.map { |capability| capability.to_data_hash }}
86
+ end
87
+
88
+ def add
89
+ begin
90
+ type = params[:type]
91
+ id = params[:id]
92
+ capability_ids = JSON.parse(params[:capability_ids])
93
+
94
+ assign_to = type.constantize.find(id)
95
+ capability_ids.each do |capability_id|
96
+ capability = Capability.find(capability_id)
97
+ case type
98
+ when 'User'
99
+ assign_to.add_capability(capability)
100
+ when 'SecurityRole'
101
+ assign_to.add_capability(capability)
102
+ when 'Group'
103
+ assign_to.add_capability(capability)
104
+ end
105
+ end
106
+
107
+ render :json => {:success => true, :message => 'Capability(s) Added'}
108
+ rescue Exception => e
109
+ Rails.logger.error e.message
110
+ Rails.logger.error e.backtrace.join("\n")
111
+ render :inline => {
112
+ :success => false,
113
+ :message => e.message
114
+ }.to_json
115
+ end
116
+ end
117
+
118
+ def remove
119
+ begin
120
+ type = params[:type]
121
+ id = params[:id]
122
+ capability_ids = JSON.parse(params[:capability_ids])
123
+
124
+ assign_to = type.constantize.find(id)
125
+ capability_ids.each do |capability_id|
126
+ capability = Capability.find(capability_id)
127
+ case type
128
+ when 'User'
129
+ assign_to.remove_capability(capability)
130
+ when 'SecurityRole'
131
+ assign_to.remove_capability(capability)
132
+ when 'Group'
133
+ assign_to.remove_capability(capability)
134
+ end
135
+ end
136
+
137
+ render :json => {:success => true, :message => 'Capability(s) Removed'}
138
+ rescue Exception => e
139
+ Rails.logger.error e.message
140
+ Rails.logger.error e.backtrace.join("\n")
141
+ render :inline => {
142
+ :success => false,
143
+ :message => e.message
144
+ }.to_json
145
+ end
146
+ end
147
+
148
+
149
+ def page
150
+ offset = params[:start].to_f
151
+ offset > 0 ? (offset / params[:limit].to_f).to_i + 1 : 1
152
+ end
153
+
154
+ def per_page
155
+ params[:limit].nil? ? 10 : params[:limit].to_i
156
+ end
157
+
158
+ end # CapabilitiesController
159
+ end # V1
160
+ end # Api
@@ -0,0 +1,40 @@
1
+ module Api
2
+ module V1
3
+ class FileAssetsController < BaseController
4
+
5
+ def index
6
+ sort_hash = params[:sort].blank? ? {} : Hash.symbolize_keys(JSON.parse(params[:sort]).first)
7
+ sort = sort_hash[:property] || 'description'
8
+ dir = sort_hash[:direction] || 'ASC'
9
+ limit = params[:limit] || 25
10
+ start = params[:start] || 0
11
+ query_filter = params[:query_filter].blank? ? {} : JSON.parse(params[:query_filter]).symbolize_keys
12
+
13
+ # apply filters
14
+ file_assets = FileAsset.apply_filters(query_filter)
15
+
16
+ # if no file asset holder was passed we need to scope by dba_organization
17
+ if !query_filter[:file_asset_holder_type].present? && !query_filter[:file_asset_holder_id].present?
18
+ file_assets = file_assets.scope_by_dba_org(current_user.party.dba_organization)
19
+ end
20
+
21
+ total_count = file_assets.count
22
+ file_assets = file_assets.limit(limit).offset(start)
23
+ file_assets.order("#{sort} #{dir}")
24
+
25
+ render json: {success: true,
26
+ total_count: total_count,
27
+ file_assets: file_assets.collect { |file| file.to_data_hash }}
28
+ end
29
+
30
+ def destroy
31
+ file_asset = FileAsset.find(params[:id])
32
+
33
+ file_asset.destroy
34
+
35
+ render json: {success: true}
36
+ end
37
+
38
+ end # FileAssetsController
39
+ end # V1
40
+ end # Api
@@ -0,0 +1,236 @@
1
+ module Api
2
+ module V1
3
+ class GroupsController < BaseController
4
+
5
+ def index
6
+ if params[:user_id].present?
7
+ groups = User.find(params[:user_id]).groups
8
+ else
9
+ groups = Group
10
+ end
11
+
12
+ respond_to do |format|
13
+ format.json do
14
+ query = params[:query]
15
+ sort_hash = params[:sort].blank? ? {} : Hash.symbolize_keys(JSON.parse(params[:sort]).first)
16
+ sort = sort_hash[:property] || 'description'
17
+ dir = sort_hash[:direction] || 'ASC'
18
+ limit = params[:limit]
19
+ start = params[:start]
20
+
21
+ if query
22
+ group_role_tbl = Group.arel_table
23
+ groups = groups.where(group_role_tbl[:description].matches("%#{query}%"))
24
+
25
+ total_count = groups.count
26
+ groups = groups.order("#{sort} #{dir}")
27
+ else
28
+ total_count = groups.count
29
+ groups = groups.order("#{sort} #{dir}")
30
+ end
31
+
32
+ if limit and start
33
+ groups = groups.limit(limit).offset(start)
34
+ end
35
+
36
+ render json: {success: true, total_count: total_count, groups: groups.collect{|group| group.to_data_hash}}
37
+ end
38
+ format.tree do
39
+ nodes = [].tap do |nodes|
40
+ groups.all.each do |group|
41
+ nodes.push({
42
+ leaf: true,
43
+ internal_identifier: group.id,
44
+ text: group.description
45
+ })
46
+ end
47
+ end
48
+
49
+ render json: {success: true, groups: nodes}
50
+ end
51
+ end
52
+ end
53
+
54
+ def available
55
+ type = params[:type]
56
+ id = params[:id]
57
+
58
+ sort = (params[:sort] || 'description').downcase
59
+ sort = 'groups.description' if sort == 'description'
60
+ dir = (params[:dir] || 'asc').downcase
61
+ query_filter = params[:query_filter].strip rescue nil
62
+
63
+ statement = id.blank? ? Group : type.constantize.find(id).groups_not
64
+
65
+ statement = (params[:query_filter].blank? ? statement : statement.where("UPPER(groups.description) LIKE UPPER('%#{query_filter}%')"))
66
+ available = statement.paginate(:page => page, :per_page => per_page, :order => "#{sort} #{dir}")
67
+
68
+ render :json => {:total_count => statement.count, :groups => available.map { |group| group.to_data_hash }}
69
+ end
70
+
71
+ def selected
72
+ type = params[:type]
73
+ id = params[:id]
74
+
75
+ sort = (params[:sort] || 'description').downcase
76
+ sort = 'groups.description' if sort == 'description'
77
+ dir = (params[:dir] || 'asc').downcase
78
+ query_filter = params[:query_filter].strip rescue nil
79
+
80
+ statement = id.blank? ? Group : type.constantize.find(id).groups
81
+ statement = (params[:query_filter].blank? ? statement : ar.where("UPPER(groups.description) LIKE UPPER('%#{query_filter}%')"))
82
+ selected = statement.paginate(:page => page, :per_page => per_page, :order => "#{sort} #{dir}")
83
+
84
+ render :json => {:total_count => statement.count, :groups => selected.map { |group| group.to_data_hash }}
85
+ end
86
+
87
+ def add
88
+ begin
89
+ type = params[:type]
90
+ id = params[:id]
91
+ selected = JSON.parse(params[:group_ids])
92
+
93
+ assign_to = type.constantize.find(id)
94
+ selected.each do |group_id|
95
+ group = Group.find(group_id)
96
+ case type
97
+ when 'User'
98
+ group.add_user(assign_to)
99
+ when 'SecurityRole'
100
+ group.add_role(assign_to)
101
+ when 'Capability'
102
+ group.add_capability(assign_to)
103
+ end
104
+ end
105
+
106
+ render :json => {:success => true, :message => 'Group(s) Added'}
107
+ rescue => ex
108
+ Rails.logger.error ex.message
109
+ Rails.logger.error ex.backtrace.join("\n")
110
+
111
+ ExceptionNotifier.notify_exception(ex) if defined? ExceptionNotifier
112
+
113
+ render :json => {:success => false, :message => ex.message}
114
+ end
115
+ end
116
+
117
+ def remove
118
+ begin
119
+ type = params[:type]
120
+ id = params[:id]
121
+ selected = JSON.parse(params[:group_ids])
122
+
123
+ assign_to = type.constantize.find(id)
124
+ selected.each do |group_id|
125
+ group = Group.find(group_id)
126
+ case type
127
+ when 'User'
128
+ group.remove_user(assign_to)
129
+ when 'SecurityRole'
130
+ group.remove_role(assign_to)
131
+ when 'Capability'
132
+ group.remove_capability(assign_to)
133
+ end
134
+ end
135
+
136
+ render :json => {:success => true, :message => 'Group(s) Removed'}
137
+ rescue => ex
138
+ Rails.logger.error ex.message
139
+ Rails.logger.error ex.backtrace.join("\n")
140
+
141
+ ExceptionNotifier.notify_exception(ex) if defined? ExceptionNotifier
142
+
143
+ render :json => {:success => false, :message => ex.message}
144
+ end
145
+ end
146
+
147
+ def create
148
+ begin
149
+ ActiveRecord::Base.connection.transaction do
150
+ group = Group.create(description: params[:description].strip)
151
+
152
+ render json: {success: true, security_role: group.to_data_hash}
153
+ end
154
+ rescue ActiveRecord::RecordInvalid => invalid
155
+ Rails.logger.error invalid.record.errors
156
+
157
+ message = "<ul>"
158
+ invalid.record.errors.collect do |e, m|
159
+ message << "<li>#{e} #{m}</li>"
160
+ end
161
+ message << "</ul>"
162
+
163
+ render :json => {:success => false, :message => message}
164
+ rescue StandardError => ex
165
+ Rails.logger.error ex.message
166
+ Rails.logger.error ex.backtrace.join("\n")
167
+
168
+ ExceptionNotifier.notify_exception(ex) if defined? ExceptionNotifier
169
+
170
+ render :json => {:success => false, :message => 'Error creating Group'}
171
+ end
172
+ end
173
+
174
+ def update
175
+ begin
176
+ ActiveRecord::Base.connection.transaction do
177
+ group = Group.find(params[:id])
178
+
179
+ group.description = params[:description].strip
180
+ group.save!
181
+
182
+ render json: {success: true, group: group.to_data_hash}
183
+ end
184
+ rescue ActiveRecord::RecordInvalid => invalid
185
+ Rails.logger.error invalid.record.errors
186
+
187
+ message = "<ul>"
188
+ invalid.record.errors.collect do |e, m|
189
+ message << "<li>#{e} #{m}</li>"
190
+ end
191
+ message << "</ul>"
192
+
193
+ render :json => {:success => false, :message => message}
194
+ rescue StandardError => ex
195
+ Rails.logger.error ex.message
196
+ Rails.logger.error ex.backtrace.join("\n")
197
+
198
+ ExceptionNotifier.notify_exception(ex) if defined? ExceptionNotifier
199
+
200
+ render :json => {:success => false, :message => 'Error update Group'}
201
+ end
202
+ end
203
+
204
+ def destroy
205
+ group = Group.find(params[:id])
206
+
207
+ render json: {success: group.destroy}
208
+ end
209
+
210
+ def effective_security
211
+ begin
212
+ render :json => {:success => true, :capabilities => Group.find(params[:id]).class_capabilities_to_hash}
213
+ rescue => ex
214
+ Rails.logger.error ex.message
215
+ Rails.logger.error ex.backtrace.join("\n")
216
+
217
+ ExceptionNotifier.notify_exception(ex) if defined? ExceptionNotifier
218
+
219
+ render :inline => {:success => false, :message => ex.message}
220
+ end
221
+ end
222
+
223
+ protected
224
+
225
+ def page
226
+ offset = params[:start].to_f
227
+ offset > 0 ? (offset / params[:limit].to_f).to_i + 1 : 1
228
+ end
229
+
230
+ def per_page
231
+ params[:limit].nil? ? 10 : params[:limit].to_i
232
+ end
233
+
234
+ end # GroupsController
235
+ end # V1
236
+ end # Api