activity_notification 1.0.2 → 1.1.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 +4 -4
- data/.codeclimate.yml +33 -0
- data/.rubocop.yml +1157 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +25 -0
- data/Gemfile.lock +15 -17
- data/README.md +154 -27
- data/activity_notification.gemspec +1 -1
- data/app/controllers/activity_notification/notifications_controller.rb +30 -104
- data/app/controllers/activity_notification/notifications_with_devise_controller.rb +1 -33
- data/app/controllers/activity_notification/subscriptions_controller.rb +184 -0
- data/app/controllers/activity_notification/subscriptions_with_devise_controller.rb +6 -0
- data/app/mailers/activity_notification/mailer.rb +3 -3
- data/app/views/activity_notification/notifications/default/_index.html.erb +3 -0
- data/app/views/activity_notification/notifications/default/index.html.erb +8 -10
- data/app/views/activity_notification/notifications/default/show.html.erb +24 -2
- data/app/views/activity_notification/subscriptions/default/_form.html.erb +52 -0
- data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +89 -0
- data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +73 -0
- data/app/views/activity_notification/subscriptions/default/_subscriptions.html.erb +13 -0
- data/app/views/activity_notification/subscriptions/default/create.js.erb +5 -0
- data/app/views/activity_notification/subscriptions/default/destroy.js.erb +5 -0
- data/app/views/activity_notification/subscriptions/default/index.html.erb +197 -0
- data/app/views/activity_notification/subscriptions/default/show.html.erb +177 -0
- data/app/views/activity_notification/subscriptions/default/subscribe.js.erb +8 -0
- data/app/views/activity_notification/subscriptions/default/subscribe_to_email.js.erb +6 -0
- data/app/views/activity_notification/subscriptions/default/unsubscribe.js.erb +8 -0
- data/app/views/activity_notification/subscriptions/default/unsubscribe_to_email.js.erb +6 -0
- data/gemfiles/Gemfile.rails-4.2.lock +18 -20
- data/gemfiles/Gemfile.rails-5.0.lock +18 -20
- data/lib/activity_notification.rb +7 -3
- data/lib/activity_notification/apis/notification_api.rb +95 -61
- data/lib/activity_notification/apis/subscription_api.rb +51 -0
- data/lib/activity_notification/common.rb +1 -1
- data/lib/activity_notification/config.rb +65 -17
- data/lib/activity_notification/controllers/common_controller.rb +118 -0
- data/lib/activity_notification/controllers/devise_authentication_controller.rb +41 -0
- data/lib/activity_notification/helpers/view_helpers.rb +131 -3
- data/lib/activity_notification/mailers/helpers.rb +6 -8
- data/lib/activity_notification/models/concerns/notifiable.rb +45 -27
- data/lib/activity_notification/models/concerns/subscriber.rb +149 -0
- data/lib/activity_notification/models/concerns/target.rb +100 -66
- data/lib/activity_notification/models/notification.rb +7 -5
- data/lib/activity_notification/models/subscription.rb +93 -0
- data/lib/activity_notification/rails/routes.rb +148 -33
- data/lib/activity_notification/renderable.rb +3 -4
- data/lib/activity_notification/roles/acts_as_notifiable.rb +14 -1
- data/lib/activity_notification/roles/acts_as_target.rb +11 -8
- data/lib/activity_notification/version.rb +1 -1
- data/lib/generators/activity_notification/controllers_generator.rb +2 -2
- data/lib/generators/activity_notification/install_generator.rb +0 -1
- data/lib/generators/activity_notification/migration/migration_generator.rb +8 -2
- data/lib/generators/activity_notification/models_generator.rb +53 -0
- data/lib/generators/activity_notification/views_generator.rb +7 -7
- data/lib/generators/templates/activity_notification.rb +17 -3
- data/lib/generators/templates/controllers/notifications_controller.rb +18 -17
- data/lib/generators/templates/controllers/notifications_with_devise_controller.rb +18 -17
- data/lib/generators/templates/controllers/subscriptions_controller.rb +79 -0
- data/lib/generators/templates/controllers/subscriptions_with_devise_controller.rb +87 -0
- data/lib/generators/templates/migrations/migration.rb +57 -0
- data/lib/generators/templates/models/README +10 -0
- data/lib/generators/templates/{notification → models}/notification.rb +1 -3
- data/lib/generators/templates/models/subscription.rb +4 -0
- data/spec/concerns/apis/notification_api_spec.rb +48 -11
- data/spec/concerns/apis/subscription_api_spec.rb +167 -0
- data/spec/concerns/models/notifiable_spec.rb +60 -0
- data/spec/concerns/models/subscriber_spec.rb +525 -0
- data/spec/concerns/models/target_spec.rb +271 -42
- data/spec/controllers/common_controller_spec.rb +25 -0
- data/spec/controllers/dummy_common_controller.rb +5 -0
- data/spec/controllers/notifications_controller_shared_examples.rb +2 -6
- data/spec/controllers/subscriptions_controller_shared_examples.rb +735 -0
- data/spec/controllers/subscriptions_controller_spec.rb +12 -0
- data/spec/controllers/subscriptions_with_devise_controller_spec.rb +91 -0
- data/spec/factories/dummy/dummy_subscriber.rb +4 -0
- data/spec/factories/subscriptions.rb +8 -0
- data/spec/generators/controllers_generator_spec.rb +25 -2
- data/spec/generators/migration/migration_generator_spec.rb +3 -3
- data/spec/generators/models_generator_spec.rb +96 -0
- data/spec/generators/views_generator_spec.rb +84 -0
- data/spec/helpers/view_helpers_spec.rb +143 -0
- data/spec/mailers/mailer_spec.rb +5 -4
- data/spec/models/dummy/dummy_subscriber_spec.rb +5 -0
- data/spec/models/notification_spec.rb +7 -7
- data/spec/models/subscription_spec.rb +158 -0
- data/spec/rails_app/app/controllers/users/notifications_controller.rb +67 -0
- data/spec/rails_app/app/controllers/users/notifications_with_devise_controller.rb +75 -0
- data/spec/rails_app/app/controllers/users/subscriptions_controller.rb +79 -0
- data/spec/rails_app/app/controllers/users/subscriptions_with_devise_controller.rb +87 -0
- data/spec/rails_app/app/models/admin.rb +1 -0
- data/spec/rails_app/app/models/dummy/dummy_subscriber.rb +4 -0
- data/spec/rails_app/app/models/user.rb +2 -1
- data/spec/rails_app/app/views/activity_notification/mailer/dummy_subscribers/test_key.text.erb +1 -0
- data/spec/rails_app/app/views/articles/index.html.erb +6 -0
- data/spec/rails_app/config/initializers/activity_notification.rb +17 -3
- data/spec/rails_app/config/routes.rb +2 -2
- data/spec/rails_app/db/migrate/20160715050420_create_activity_notification_tables.rb +33 -0
- data/spec/rails_app/db/schema.rb +18 -0
- data/spec/roles/acts_as_notifiable_spec.rb +1 -1
- data/spec/roles/acts_as_target_spec.rb +1 -1
- metadata +70 -11
- data/lib/generators/activity_notification/notification/notification_generator.rb +0 -20
- data/lib/generators/templates/active_record/migration.rb +0 -18
- data/spec/generators/notification/notification_generator_spec.rb +0 -41
- data/spec/rails_app/db/migrate/20160715050420_create_notifications.rb +0 -18
@@ -27,7 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
|
28
28
|
s.add_development_dependency 'sqlite3', '~> 1.3.12'
|
29
29
|
s.add_development_dependency 'rspec-rails', '~> 3.5.1'
|
30
|
-
s.add_development_dependency 'factory_girl_rails', '~> 4.
|
30
|
+
s.add_development_dependency 'factory_girl_rails', '~> 4.8.0'
|
31
31
|
s.add_development_dependency 'simplecov', '~> 0.12.0'
|
32
32
|
s.add_development_dependency 'yard', '~> 0.9.5'
|
33
33
|
s.add_development_dependency 'yard-activesupport-concern', '~> 0.0.1'
|
@@ -1,19 +1,13 @@
|
|
1
1
|
module ActivityNotification
|
2
2
|
# Controller to manage notifications.
|
3
3
|
class NotificationsController < ActivityNotification.config.parent_controller.constantize
|
4
|
-
# Include
|
5
|
-
include
|
6
|
-
# Include PolymorphicHelpers to resolve string extentions
|
7
|
-
include ActivityNotification::PolymorphicHelpers
|
8
|
-
prepend_before_action :set_target
|
4
|
+
# Include CommonController to select target and define common methods
|
5
|
+
include CommonController
|
9
6
|
before_action :set_notification, except: [:index, :open_all]
|
10
|
-
|
11
|
-
|
12
|
-
DEFAULT_VIEW_DIRECTORY = "default"
|
13
|
-
|
7
|
+
|
14
8
|
# Shows notification index of the target.
|
15
9
|
#
|
16
|
-
# GET /:target_type/:target_id/
|
10
|
+
# GET /:target_type/:target_id/notifications
|
17
11
|
# @overload index(params)
|
18
12
|
# @param [Hash] params Request parameter options for notification index
|
19
13
|
# @option params [String] :filter (nil) Filter option to load notification index (Nothing as auto, 'opened' or 'unopened')
|
@@ -29,7 +23,7 @@ module ActivityNotification
|
|
29
23
|
# @return [Responce] HTML view as default or JSON of notification index with json format parameter
|
30
24
|
def index
|
31
25
|
set_index_options
|
32
|
-
|
26
|
+
load_index if params[:reload].to_s.to_boolean(true)
|
33
27
|
respond_to do |format|
|
34
28
|
format.html # index.html.erb
|
35
29
|
format.json { render json: @notifications.to_json(include: [:target, :notifiable, :group]) }
|
@@ -38,7 +32,7 @@ module ActivityNotification
|
|
38
32
|
|
39
33
|
# Opens all notifications of the target.
|
40
34
|
#
|
41
|
-
# POST /:target_type/:target_id/
|
35
|
+
# POST /:target_type/:target_id/notifications/open_all
|
42
36
|
# @overload open_all(params)
|
43
37
|
# @param [Hash] params Request parameters
|
44
38
|
# @option params [String] :filter (nil) Filter option to load notification index (Nothing as auto, 'opened' or 'unopened')
|
@@ -58,7 +52,7 @@ module ActivityNotification
|
|
58
52
|
|
59
53
|
# Shows a notification.
|
60
54
|
#
|
61
|
-
# GET /:target_type/:target_id/
|
55
|
+
# GET /:target_type/:target_id/notifications/:id
|
62
56
|
# @overload show(params)
|
63
57
|
# @param [Hash] params Request parameters
|
64
58
|
# @return [Responce] HTML view as default
|
@@ -67,7 +61,7 @@ module ActivityNotification
|
|
67
61
|
|
68
62
|
# Deletes a notification.
|
69
63
|
#
|
70
|
-
# DELETE /:target_type/:target_id/
|
64
|
+
# DELETE /:target_type/:target_id/notifications/:id
|
71
65
|
#
|
72
66
|
# @overload destroy(params)
|
73
67
|
# @param [Hash] params Request parameters
|
@@ -84,7 +78,7 @@ module ActivityNotification
|
|
84
78
|
|
85
79
|
# Opens a notification.
|
86
80
|
#
|
87
|
-
# POST /:target_type/:target_id/
|
81
|
+
# POST /:target_type/:target_id/notifications/:id/open
|
88
82
|
# @overload open(params)
|
89
83
|
# @param [Hash] params Request parameters
|
90
84
|
# @option params [String] :move ('false') Whether redirects to notifiable_path after the notification is opened
|
@@ -104,7 +98,7 @@ module ActivityNotification
|
|
104
98
|
|
105
99
|
# Moves to notifiable_path of the notification.
|
106
100
|
#
|
107
|
-
# GET /:target_type/:target_id/
|
101
|
+
# GET /:target_type/:target_id/notifications/:id/move
|
108
102
|
# @overload open(params)
|
109
103
|
# @param [Hash] params Request parameters
|
110
104
|
# @option params [String] :open ('false') Whether the notification will be opened
|
@@ -117,48 +111,19 @@ module ActivityNotification
|
|
117
111
|
redirect_to @notification.notifiable_path
|
118
112
|
end
|
119
113
|
|
120
|
-
# Returns controller path.
|
121
|
-
# This method has no action routing and is called from target_view_path method.
|
122
|
-
# This method can be overriden.
|
123
|
-
# @return [String] "activity_notification/notifications" as controller path
|
124
|
-
def controller_path
|
125
|
-
"activity_notification/notifications"
|
126
|
-
end
|
127
|
-
|
128
114
|
# Returns path of the target view templates.
|
129
115
|
# This method has no action routing and needs to be public since it is called from view helper.
|
130
116
|
def target_view_path
|
131
|
-
|
132
|
-
view_path = [controller_path, target_type].join('/')
|
133
|
-
lookup_context.exists?(action_name, view_path) ?
|
134
|
-
view_path :
|
135
|
-
[controller_path, DEFAULT_VIEW_DIRECTORY].join('/')
|
117
|
+
super
|
136
118
|
end
|
137
119
|
|
138
120
|
protected
|
139
121
|
|
140
|
-
# Sets @target instance variable from request parameters.
|
141
|
-
# @api protected
|
142
|
-
# @return [Object] Target instance (Returns HTTP 400 when request parameters are not enough)
|
143
|
-
def set_target
|
144
|
-
if (target_type = params[:target_type]).present?
|
145
|
-
target_class = target_type.to_model_class
|
146
|
-
@target = params[:target_id].present? ?
|
147
|
-
target_class.find_by_id!(params[:target_id]) :
|
148
|
-
target_class.find_by_id!(params["#{target_type.to_resource_name}_id"])
|
149
|
-
else
|
150
|
-
render plain: "400 Bad Request: Missing parameter", status: 400
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
122
|
# Sets @notification instance variable from request parameters.
|
155
123
|
# @api protected
|
156
124
|
# @return [Object] Notification instance (Returns HTTP 403 when the target of notification is different from specified target by request parameter)
|
157
125
|
def set_notification
|
158
|
-
@notification = Notification.find_by_id!(params[:id])
|
159
|
-
if @target.present? and @notification.target != @target
|
160
|
-
render plain: "403 Forbidden: Wrong target", status: 403
|
161
|
-
end
|
126
|
+
validate_target(@notification = Notification.includes(:target).find_by_id!(params[:id]))
|
162
127
|
end
|
163
128
|
|
164
129
|
# Sets options to load notification index from request parameters.
|
@@ -170,71 +135,32 @@ module ActivityNotification
|
|
170
135
|
params[:reverse].to_s.to_boolean(false) : nil
|
171
136
|
with_group_members = params[:with_group_members].present? || params[:without_grouping].present? ?
|
172
137
|
params[:with_group_members].to_s.to_boolean(false) || params[:without_grouping].to_s.to_boolean(false) : nil
|
173
|
-
@index_options
|
174
|
-
|
175
|
-
|
138
|
+
@index_options = params.permit(:filter, :filtered_by_type, :filtered_by_group_type, :filtered_by_group_id, :filtered_by_key)
|
139
|
+
.to_h.symbolize_keys
|
140
|
+
.merge(limit: limit, reverse: reverse, with_group_members: with_group_members)
|
176
141
|
end
|
177
142
|
|
178
143
|
# Loads notification index with request parameters.
|
179
144
|
# @api protected
|
180
|
-
# @param [Hash] params Request parameter options for notification index
|
181
|
-
# @option params [String] :filter (nil) Filter option to load notification index (Nothing as auto, 'opened' or 'unopened')
|
182
|
-
# @option params [Integer] :limit (nil) Limit to query for notifications
|
183
|
-
# @option params [Boolean] :reverse (false) If notification index will be ordered as earliest first
|
184
|
-
# @option params [Boolean] :without_grouping (false) If notification index will include group members
|
185
|
-
# @option params [String] :filtered_by_type (nil) Notifiable type for filter
|
186
|
-
# @option params [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
|
187
|
-
# @option params [String] :filtered_by_group_id (nil) Group instance id for filter, valid with :filtered_by_group_type
|
188
|
-
# @option params [String] :filtered_by_key (nil) Key of the notification for filter
|
189
145
|
# @return [Array] Array of notification index
|
190
|
-
def
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
146
|
+
def load_index
|
147
|
+
@notifications =
|
148
|
+
case @index_options[:filter]
|
149
|
+
when :opened, 'opened'
|
150
|
+
@target.opened_notification_index_with_attributes(@index_options)
|
151
|
+
when :unopened, 'unopened'
|
152
|
+
@target.unopened_notification_index_with_attributes(@index_options)
|
153
|
+
else
|
154
|
+
@target.notification_index_with_attributes(@index_options)
|
155
|
+
end
|
199
156
|
end
|
200
157
|
|
201
|
-
#
|
158
|
+
# Returns controller path.
|
159
|
+
# This method is called from target_view_path method and can be overriden.
|
202
160
|
# @api protected
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
# Returns JavaScript view for ajax request or redirects to back as default.
|
208
|
-
# @api protected
|
209
|
-
# @option params [String] :filter (nil) Filter option to load notification index (Nothing as auto, 'opened' or 'unopened')
|
210
|
-
# @option params [Integer] :limit (nil) Limit to query for notifications
|
211
|
-
# @option params [Boolean] :reverse (false) If notification index will be ordered as earliest first
|
212
|
-
# @option params [Boolean] :without_grouping (false) If notification index will include group members
|
213
|
-
# @option params [String] :filtered_by_type (nil) Notifiable type for filter
|
214
|
-
# @option params [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
|
215
|
-
# @option params [String] :filtered_by_group_id (nil) Group instance id for filter, valid with :filtered_by_group_type
|
216
|
-
# @option params [String] :filtered_by_key (nil) Key of the notification for filter
|
217
|
-
# @return [Responce] JavaScript view for ajax request or redirects to back as default
|
218
|
-
def return_back_or_ajax
|
219
|
-
set_index_options
|
220
|
-
if params[:reload].to_s.to_boolean(true)
|
221
|
-
@notifications = load_notification_index(@index_options)
|
222
|
-
end
|
223
|
-
respond_to do |format|
|
224
|
-
if request.xhr?
|
225
|
-
format.js
|
226
|
-
# :skip-rails4:
|
227
|
-
elsif Rails::VERSION::MAJOR >= 5
|
228
|
-
redirect_back fallback_location: { action: :index }, **@index_options and return
|
229
|
-
# :skip-rails4:
|
230
|
-
# :skip-rails5:
|
231
|
-
elsif request.referer
|
232
|
-
redirect_to :back, **@index_options and return
|
233
|
-
else
|
234
|
-
redirect_to action: :index, **@index_options and return
|
235
|
-
end
|
236
|
-
# :skip-rails5:
|
237
|
-
end
|
161
|
+
# @return [String] "activity_notification/notifications" as controller path
|
162
|
+
def controller_path
|
163
|
+
"activity_notification/notifications"
|
238
164
|
end
|
239
165
|
|
240
166
|
end
|
@@ -1,38 +1,6 @@
|
|
1
1
|
module ActivityNotification
|
2
2
|
# Controller to manage notifications with Devise authentication.
|
3
3
|
class NotificationsWithDeviseController < NotificationsController
|
4
|
-
|
5
|
-
before_action :authenticate_target!
|
6
|
-
|
7
|
-
protected
|
8
|
-
|
9
|
-
# Authenticate devise resource by Devise (e.g. calling authenticate_user! method).
|
10
|
-
# @api protected
|
11
|
-
# @todo Needs to call authenticate method by more secure way
|
12
|
-
# @return [Responce] Redirects for unsigned in target by Devise, returns HTTP 403 without neccesary target method or returns 400 when request parameters are not enough
|
13
|
-
def authenticate_devise_resource!
|
14
|
-
if params[:devise_type].present?
|
15
|
-
authenticate_method_name = "authenticate_#{params[:devise_type].to_resource_name}!"
|
16
|
-
if respond_to?(authenticate_method_name)
|
17
|
-
send(authenticate_method_name)
|
18
|
-
else
|
19
|
-
render plain: "403 Forbidden: Unauthenticated", status: 403
|
20
|
-
end
|
21
|
-
else
|
22
|
-
render plain: "400 Bad Request: Missing parameter", status: 400
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# Authenticate the target of requested notification with authenticated devise resource.
|
27
|
-
# @api protected
|
28
|
-
# @todo Needs to call authenticate method by more secure way
|
29
|
-
# @return [Responce] Returns HTTP 403 for unauthorized target
|
30
|
-
def authenticate_target!
|
31
|
-
current_resource_method_name = "current_#{params[:devise_type].to_resource_name}"
|
32
|
-
unless @target.authenticated_with_devise?(send(current_resource_method_name))
|
33
|
-
render plain: "403 Forbidden: Unauthorized target", status: 403
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
4
|
+
include DeviceAuthenticationController
|
37
5
|
end
|
38
6
|
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
module ActivityNotification
|
2
|
+
# Controller to manage subscriptions.
|
3
|
+
class SubscriptionsController < ActivityNotification.config.parent_controller.constantize
|
4
|
+
# Include CommonController to select target and define common methods
|
5
|
+
include CommonController
|
6
|
+
before_action :set_subscription, except: [:index, :create]
|
7
|
+
|
8
|
+
# Shows subscription index of the target.
|
9
|
+
#
|
10
|
+
# GET /:target_type/:target_id/subscriptions
|
11
|
+
# @overload index(params)
|
12
|
+
# @param [Hash] params Request parameter options for subscription index
|
13
|
+
# @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
|
14
|
+
# @option params [String] :limit (nil) Limit to query for subscriptions
|
15
|
+
# @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
|
16
|
+
# @option params [String] :filtered_by_key (nil) Key of the subscription for filter
|
17
|
+
# @return [Responce] HTML view as default or JSON of subscription index with json format parameter
|
18
|
+
def index
|
19
|
+
set_index_options
|
20
|
+
load_index if params[:reload].to_s.to_boolean(true)
|
21
|
+
respond_to do |format|
|
22
|
+
format.html # index.html.erb
|
23
|
+
format.json { render json: { subscriptions: @subscriptions, unconfigured_notification_keys: @notification_keys } }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Creates a subscription.
|
28
|
+
#
|
29
|
+
# POST /:target_type/:target_id/subscriptions
|
30
|
+
#
|
31
|
+
# @overload create(params)
|
32
|
+
# @param [Hash] params Request parameters
|
33
|
+
# @option params [String] :subscription Subscription parameters
|
34
|
+
# @option params [String] :subscription[:key] Key of the subscription
|
35
|
+
# @option params [String] :subscription[:subscribing] (nil) If the target will subscribe to the notification
|
36
|
+
# @option params [String] :subscription[:subscribing_to_email] (nil) If the target will subscribe to the notification email
|
37
|
+
# @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
|
38
|
+
# @option params [String] :limit (nil) Limit to query for subscriptions
|
39
|
+
# @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
|
40
|
+
# @option params [String] :filtered_by_key (nil) Key of the subscription for filter
|
41
|
+
# @return [Responce] JavaScript view for ajax request or redirects to back as default
|
42
|
+
def create
|
43
|
+
@target.create_subscription(subscription_params)
|
44
|
+
return_back_or_ajax
|
45
|
+
end
|
46
|
+
|
47
|
+
# Shows a subscription.
|
48
|
+
#
|
49
|
+
# GET /:target_type/:target_id/subscriptions/:id
|
50
|
+
# @overload show(params)
|
51
|
+
# @param [Hash] params Request parameters
|
52
|
+
# @return [Responce] HTML view as default
|
53
|
+
def show
|
54
|
+
end
|
55
|
+
|
56
|
+
# Deletes a subscription.
|
57
|
+
#
|
58
|
+
# DELETE /:target_type/:target_id/subscriptions/:id
|
59
|
+
#
|
60
|
+
# @overload destroy(params)
|
61
|
+
# @param [Hash] params Request parameters
|
62
|
+
# @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
|
63
|
+
# @option params [String] :limit (nil) Limit to query for subscriptions
|
64
|
+
# @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
|
65
|
+
# @option params [String] :filtered_by_key (nil) Key of the subscription for filter
|
66
|
+
# @return [Responce] JavaScript view for ajax request or redirects to back as default
|
67
|
+
def destroy
|
68
|
+
@subscription.destroy
|
69
|
+
return_back_or_ajax
|
70
|
+
end
|
71
|
+
|
72
|
+
# Subscribes to the notification.
|
73
|
+
#
|
74
|
+
# POST /:target_type/:target_id/subscriptions/:id/subscribe
|
75
|
+
# @overload open(params)
|
76
|
+
# @param [Hash] params Request parameters
|
77
|
+
# @option params [String] :with_email_subscription ('true') If the subscriber also subscribes notification email
|
78
|
+
# @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
|
79
|
+
# @option params [String] :limit (nil) Limit to query for subscriptions
|
80
|
+
# @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
|
81
|
+
# @option params [String] :filtered_by_key (nil) Key of the subscription for filter
|
82
|
+
# @return [Responce] JavaScript view for ajax request or redirects to back as default
|
83
|
+
def subscribe
|
84
|
+
@subscription.subscribe(with_email_subscription: params[:with_email_subscription].to_s.to_boolean(true))
|
85
|
+
return_back_or_ajax
|
86
|
+
end
|
87
|
+
|
88
|
+
# Unsubscribes to the notification.
|
89
|
+
#
|
90
|
+
# POST /:target_type/:target_id/subscriptions/:id/unsubscribe
|
91
|
+
# @overload open(params)
|
92
|
+
# @param [Hash] params Request parameters
|
93
|
+
# @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
|
94
|
+
# @option params [String] :limit (nil) Limit to query for subscriptions
|
95
|
+
# @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
|
96
|
+
# @option params [String] :filtered_by_key (nil) Key of the subscription for filter
|
97
|
+
# @return [Responce] JavaScript view for ajax request or redirects to back as default
|
98
|
+
def unsubscribe
|
99
|
+
@subscription.unsubscribe
|
100
|
+
return_back_or_ajax
|
101
|
+
end
|
102
|
+
|
103
|
+
# Subscribes to the notification email.
|
104
|
+
#
|
105
|
+
# POST /:target_type/:target_id/subscriptions/:id/subscribe_email
|
106
|
+
# @overload open(params)
|
107
|
+
# @param [Hash] params Request parameters
|
108
|
+
# @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
|
109
|
+
# @option params [String] :limit (nil) Limit to query for subscriptions
|
110
|
+
# @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
|
111
|
+
# @option params [String] :filtered_by_key (nil) Key of the subscription for filter
|
112
|
+
# @return [Responce] JavaScript view for ajax request or redirects to back as default
|
113
|
+
def subscribe_to_email
|
114
|
+
@subscription.subscribe_to_email
|
115
|
+
return_back_or_ajax
|
116
|
+
end
|
117
|
+
|
118
|
+
# Unsubscribes to the notification email.
|
119
|
+
#
|
120
|
+
# POST /:target_type/:target_id/subscriptions/:id/unsubscribe_email
|
121
|
+
# @overload open(params)
|
122
|
+
# @param [Hash] params Request parameters
|
123
|
+
# @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
|
124
|
+
# @option params [String] :limit (nil) Limit to query for subscriptions
|
125
|
+
# @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
|
126
|
+
# @option params [String] :filtered_by_key (nil) Key of the subscription for filter
|
127
|
+
# @return [Responce] JavaScript view for ajax request or redirects to back as default
|
128
|
+
def unsubscribe_to_email
|
129
|
+
@subscription.unsubscribe_to_email
|
130
|
+
return_back_or_ajax
|
131
|
+
end
|
132
|
+
|
133
|
+
protected
|
134
|
+
|
135
|
+
# Sets @subscription instance variable from request parameters.
|
136
|
+
# @api protected
|
137
|
+
# @return [Object] Subscription instance (Returns HTTP 403 when the target of subscription is different from specified target by request parameter)
|
138
|
+
def set_subscription
|
139
|
+
validate_target(@subscription = Subscription.includes(:target).find_by_id!(params[:id]))
|
140
|
+
end
|
141
|
+
|
142
|
+
# Only allow a trusted parameter "white list" through.
|
143
|
+
def subscription_params
|
144
|
+
params.require(:subscription).permit(:key, :subscribing, :subscribing_to_email)
|
145
|
+
end
|
146
|
+
|
147
|
+
# Sets options to load subscription index from request parameters.
|
148
|
+
# @api protected
|
149
|
+
# @return [Hash] options to load subscription index
|
150
|
+
def set_index_options
|
151
|
+
limit = params[:limit].to_i > 0 ? params[:limit].to_i : nil
|
152
|
+
reverse = params[:reverse].present? ?
|
153
|
+
params[:reverse].to_s.to_boolean(false) : nil
|
154
|
+
@index_options = params.permit(:filter, :filtered_by_key)
|
155
|
+
.to_h.symbolize_keys.merge(limit: limit, reverse: reverse)
|
156
|
+
end
|
157
|
+
|
158
|
+
# Loads subscription index with request parameters.
|
159
|
+
# @api protected
|
160
|
+
# @return [Array] Array of subscription index
|
161
|
+
def load_index
|
162
|
+
case @index_options[:filter]
|
163
|
+
when :configured, 'configured'
|
164
|
+
@subscriptions = @target.subscription_index(@index_options.merge(with_target: true))
|
165
|
+
@notification_keys = nil
|
166
|
+
when :unconfigured, 'unconfigured'
|
167
|
+
@subscriptions = nil
|
168
|
+
@notification_keys = @target.notification_keys(@index_options.merge(filter: :unconfigured))
|
169
|
+
else
|
170
|
+
@subscriptions = @target.subscription_index(@index_options.merge(with_target: true))
|
171
|
+
@notification_keys = @target.notification_keys(@index_options.merge(filter: :unconfigured))
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
# Returns controller path.
|
176
|
+
# This method is called from target_view_path method and can be overriden.
|
177
|
+
# @api protected
|
178
|
+
# @return [String] "activity_notification/subscriptions" as controller path
|
179
|
+
def controller_path
|
180
|
+
"activity_notification/subscriptions"
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
184
|
+
end
|