activity_notification 2.0.0 → 2.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +22 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
  4. data/.github/pull_request_template.md +13 -0
  5. data/.gitignore +10 -3
  6. data/.travis.yml +6 -5
  7. data/CHANGELOG.md +60 -0
  8. data/Gemfile +8 -3
  9. data/Procfile +1 -1
  10. data/README.md +153 -1510
  11. data/activity_notification.gemspec +4 -1
  12. data/app/channels/activity_notification/notification_api_channel.rb +12 -0
  13. data/app/channels/activity_notification/notification_api_with_devise_channel.rb +46 -0
  14. data/app/channels/activity_notification/notification_channel.rb +2 -2
  15. data/app/channels/activity_notification/notification_with_devise_channel.rb +2 -2
  16. data/app/controllers/activity_notification/apidocs_controller.rb +75 -0
  17. data/app/controllers/activity_notification/notifications_api_controller.rb +143 -0
  18. data/app/controllers/activity_notification/notifications_api_with_devise_controller.rb +7 -0
  19. data/app/controllers/activity_notification/notifications_controller.rb +79 -53
  20. data/app/controllers/activity_notification/subscriptions_api_controller.rb +197 -0
  21. data/app/controllers/activity_notification/subscriptions_api_with_devise_controller.rb +7 -0
  22. data/app/controllers/activity_notification/subscriptions_controller.rb +78 -69
  23. data/app/views/activity_notification/notifications/default/_default.html.erb +18 -18
  24. data/app/views/activity_notification/notifications/default/_default_without_grouping.html.erb +14 -14
  25. data/app/views/activity_notification/notifications/default/index.html.erb +6 -6
  26. data/app/views/activity_notification/optional_targets/default/action_cable_channel/_default.html.erb +176 -0
  27. data/app/views/activity_notification/subscriptions/default/_form.html.erb +1 -1
  28. data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +3 -31
  29. data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +7 -7
  30. data/app/views/activity_notification/subscriptions/default/index.html.erb +11 -7
  31. data/bin/deploy_on_heroku.sh +3 -1
  32. data/docs/CODE_OF_CONDUCT.md +76 -0
  33. data/docs/CONTRIBUTING.md +36 -0
  34. data/docs/Functions.md +1130 -0
  35. data/docs/Setup.md +801 -0
  36. data/docs/Testing.md +148 -0
  37. data/gemfiles/Gemfile.rails-4.2 +5 -1
  38. data/gemfiles/Gemfile.rails-5.0 +6 -1
  39. data/gemfiles/Gemfile.rails-5.1 +6 -1
  40. data/gemfiles/Gemfile.rails-5.2 +6 -1
  41. data/gemfiles/{Gemfile.rails-6.0.rc → Gemfile.rails-6.0} +6 -5
  42. data/lib/activity_notification.rb +13 -0
  43. data/lib/activity_notification/apis/notification_api.rb +37 -93
  44. data/lib/activity_notification/apis/subscription_api.rb +20 -8
  45. data/lib/activity_notification/apis/swagger.rb +6 -0
  46. data/lib/activity_notification/common.rb +4 -1
  47. data/lib/activity_notification/config.rb +41 -21
  48. data/lib/activity_notification/controllers/common_api_controller.rb +30 -0
  49. data/lib/activity_notification/controllers/common_controller.rb +45 -21
  50. data/lib/activity_notification/controllers/concerns/swagger/error_responses.rb +55 -0
  51. data/lib/activity_notification/controllers/concerns/swagger/notifications_api.rb +273 -0
  52. data/lib/activity_notification/controllers/concerns/swagger/notifications_parameters.rb +92 -0
  53. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_api.rb +405 -0
  54. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_parameters.rb +50 -0
  55. data/lib/activity_notification/controllers/devise_authentication_controller.rb +7 -6
  56. data/lib/activity_notification/gem_version.rb +14 -0
  57. data/lib/activity_notification/helpers/errors.rb +2 -0
  58. data/lib/activity_notification/helpers/view_helpers.rb +4 -0
  59. data/lib/activity_notification/mailers/helpers.rb +17 -10
  60. data/lib/activity_notification/models/concerns/notifiable.rb +31 -15
  61. data/lib/activity_notification/models/concerns/subscriber.rb +12 -1
  62. data/lib/activity_notification/models/concerns/swagger/error_schema.rb +36 -0
  63. data/lib/activity_notification/models/concerns/swagger/notification_schema.rb +209 -0
  64. data/lib/activity_notification/models/concerns/swagger/subscription_schema.rb +162 -0
  65. data/lib/activity_notification/models/concerns/target.rb +36 -10
  66. data/lib/activity_notification/models/notification.rb +1 -0
  67. data/lib/activity_notification/models/subscription.rb +1 -0
  68. data/lib/activity_notification/optional_targets/action_cable_api_channel.rb +69 -0
  69. data/lib/activity_notification/optional_targets/action_cable_channel.rb +68 -0
  70. data/lib/activity_notification/optional_targets/base.rb +7 -13
  71. data/lib/activity_notification/orm/active_record/notification.rb +17 -1
  72. data/lib/activity_notification/orm/active_record/subscription.rb +1 -1
  73. data/lib/activity_notification/orm/dynamoid.rb +38 -3
  74. data/lib/activity_notification/orm/dynamoid/extension.rb +79 -1
  75. data/lib/activity_notification/orm/dynamoid/notification.rb +49 -14
  76. data/lib/activity_notification/orm/dynamoid/subscription.rb +2 -2
  77. data/lib/activity_notification/orm/mongoid.rb +32 -3
  78. data/lib/activity_notification/orm/mongoid/notification.rb +24 -6
  79. data/lib/activity_notification/orm/mongoid/subscription.rb +1 -1
  80. data/lib/activity_notification/rails/routes.rb +132 -48
  81. data/lib/activity_notification/renderable.rb +13 -2
  82. data/lib/activity_notification/roles/acts_as_notifiable.rb +39 -20
  83. data/lib/activity_notification/version.rb +1 -1
  84. data/lib/generators/activity_notification/controllers_generator.rb +2 -1
  85. data/lib/generators/templates/activity_notification.rb +8 -0
  86. data/lib/generators/templates/controllers/notifications_api_controller.rb +31 -0
  87. data/lib/generators/templates/controllers/notifications_api_with_devise_controller.rb +31 -0
  88. data/lib/generators/templates/controllers/notifications_controller.rb +1 -37
  89. data/lib/generators/templates/controllers/notifications_with_devise_controller.rb +1 -45
  90. data/lib/generators/templates/controllers/subscriptions_api_controller.rb +61 -0
  91. data/lib/generators/templates/controllers/subscriptions_api_with_devise_controller.rb +61 -0
  92. data/lib/generators/templates/controllers/subscriptions_controller.rb +14 -37
  93. data/lib/generators/templates/controllers/subscriptions_with_devise_controller.rb +14 -45
  94. data/lib/generators/templates/models/README +8 -4
  95. data/lib/generators/templates/models/notification.rb +1 -1
  96. data/lib/generators/templates/models/subscription.rb +1 -1
  97. data/package.json +8 -0
  98. data/spec/channels/notification_api_channel_shared_examples.rb +59 -0
  99. data/spec/channels/notification_api_channel_spec.rb +51 -0
  100. data/spec/channels/notification_api_with_devise_channel_spec.rb +78 -0
  101. data/spec/concerns/apis/notification_api_spec.rb +38 -3
  102. data/spec/concerns/models/notifiable_spec.rb +82 -18
  103. data/spec/concerns/models/subscriber_spec.rb +13 -16
  104. data/spec/concerns/models/target_spec.rb +32 -0
  105. data/spec/concerns/renderable_spec.rb +2 -2
  106. data/spec/config_spec.rb +26 -15
  107. data/spec/controllers/controller_spec_utility.rb +136 -0
  108. data/spec/controllers/notifications_api_controller_shared_examples.rb +506 -0
  109. data/spec/controllers/notifications_api_controller_spec.rb +19 -0
  110. data/spec/controllers/notifications_api_with_devise_controller_spec.rb +60 -0
  111. data/spec/controllers/notifications_controller_shared_examples.rb +54 -79
  112. data/spec/controllers/notifications_controller_spec.rb +1 -2
  113. data/spec/controllers/notifications_with_devise_controller_spec.rb +3 -12
  114. data/spec/controllers/subscriptions_api_controller_shared_examples.rb +750 -0
  115. data/spec/controllers/subscriptions_api_controller_spec.rb +19 -0
  116. data/spec/controllers/subscriptions_api_with_devise_controller_spec.rb +60 -0
  117. data/spec/controllers/subscriptions_controller_shared_examples.rb +94 -121
  118. data/spec/controllers/subscriptions_controller_spec.rb +1 -2
  119. data/spec/controllers/subscriptions_with_devise_controller_spec.rb +3 -12
  120. data/spec/helpers/view_helpers_spec.rb +4 -11
  121. data/spec/mailers/mailer_spec.rb +41 -0
  122. data/spec/models/notification_spec.rb +17 -0
  123. data/spec/models/subscription_spec.rb +8 -13
  124. data/spec/optional_targets/action_cable_api_channel_spec.rb +37 -0
  125. data/spec/optional_targets/action_cable_channel_spec.rb +44 -0
  126. data/spec/optional_targets/amazon_sns_spec.rb +0 -2
  127. data/spec/optional_targets/slack_spec.rb +0 -2
  128. data/spec/rails_app/Rakefile +9 -0
  129. data/spec/rails_app/app/assets/config/manifest.js +3 -0
  130. data/spec/rails_app/app/assets/images/.keep +0 -0
  131. data/spec/rails_app/app/controllers/admins_controller.rb +21 -0
  132. data/spec/rails_app/app/controllers/application_controller.rb +1 -1
  133. data/spec/rails_app/app/controllers/articles_controller.rb +6 -3
  134. data/spec/rails_app/app/controllers/spa_controller.rb +7 -0
  135. data/spec/rails_app/app/controllers/users/notifications_controller.rb +0 -65
  136. data/spec/rails_app/app/controllers/users/notifications_with_devise_controller.rb +0 -73
  137. data/spec/rails_app/app/controllers/users/subscriptions_controller.rb +0 -77
  138. data/spec/rails_app/app/controllers/users/subscriptions_with_devise_controller.rb +0 -85
  139. data/spec/rails_app/app/controllers/users_controller.rb +26 -0
  140. data/spec/rails_app/app/javascript/App.vue +40 -0
  141. data/spec/rails_app/app/javascript/components/DeviseTokenAuth.vue +82 -0
  142. data/spec/rails_app/app/javascript/components/Top.vue +98 -0
  143. data/spec/rails_app/app/javascript/components/notifications/Index.vue +200 -0
  144. data/spec/rails_app/app/javascript/components/notifications/Notification.vue +133 -0
  145. data/spec/rails_app/app/javascript/components/notifications/NotificationContent.vue +122 -0
  146. data/spec/rails_app/app/javascript/components/subscriptions/Index.vue +279 -0
  147. data/spec/rails_app/app/javascript/components/subscriptions/NewSubscription.vue +112 -0
  148. data/spec/rails_app/app/javascript/components/subscriptions/NotificationKey.vue +141 -0
  149. data/spec/rails_app/app/javascript/components/subscriptions/Subscription.vue +226 -0
  150. data/spec/rails_app/app/javascript/config/development.js +5 -0
  151. data/spec/rails_app/app/javascript/config/environment.js +7 -0
  152. data/spec/rails_app/app/javascript/config/production.js +5 -0
  153. data/spec/rails_app/app/javascript/config/test.js +5 -0
  154. data/spec/rails_app/app/javascript/packs/application.js +18 -0
  155. data/spec/rails_app/app/javascript/packs/spa.js +14 -0
  156. data/spec/rails_app/app/javascript/router/index.js +73 -0
  157. data/spec/rails_app/app/javascript/store/index.js +37 -0
  158. data/spec/rails_app/app/models/admin.rb +16 -15
  159. data/spec/rails_app/app/models/article.rb +26 -21
  160. data/spec/rails_app/app/models/comment.rb +24 -71
  161. data/spec/rails_app/app/models/dummy/dummy_group.rb +8 -0
  162. data/spec/rails_app/app/models/dummy/dummy_notifiable_target.rb +8 -0
  163. data/spec/rails_app/app/models/user.rb +44 -20
  164. data/spec/rails_app/app/views/activity_notification/notifications/default/article/_update.html.erb +146 -0
  165. data/spec/rails_app/app/views/articles/index.html.erb +51 -7
  166. data/spec/rails_app/app/views/articles/show.html.erb +1 -1
  167. data/spec/rails_app/app/views/layouts/_header.html.erb +8 -10
  168. data/spec/rails_app/app/views/spa/index.html.erb +2 -0
  169. data/spec/rails_app/babel.config.js +72 -0
  170. data/spec/rails_app/bin/webpack +18 -0
  171. data/spec/rails_app/bin/webpack-dev-server +18 -0
  172. data/spec/rails_app/config/application.rb +18 -2
  173. data/spec/rails_app/config/dynamoid.rb +11 -3
  174. data/spec/rails_app/config/environment.rb +2 -1
  175. data/spec/rails_app/config/environments/development.rb +5 -0
  176. data/spec/rails_app/config/environments/production.rb +6 -0
  177. data/spec/rails_app/config/environments/test.rb +5 -0
  178. data/spec/rails_app/config/initializers/activity_notification.rb +11 -3
  179. data/spec/rails_app/config/initializers/copy_it.aws.rb.template +6 -0
  180. data/spec/rails_app/config/initializers/devise_token_auth.rb +55 -0
  181. data/spec/rails_app/config/initializers/mysql.rb +9 -0
  182. data/spec/rails_app/config/locales/activity_notification.en.yml +2 -2
  183. data/spec/rails_app/config/routes.rb +37 -1
  184. data/spec/rails_app/config/webpack/development.js +5 -0
  185. data/spec/rails_app/config/webpack/environment.js +7 -0
  186. data/spec/rails_app/config/webpack/loaders/vue.js +6 -0
  187. data/spec/rails_app/config/webpack/production.js +5 -0
  188. data/spec/rails_app/config/webpack/test.js +5 -0
  189. data/spec/rails_app/config/webpacker.yml +97 -0
  190. data/spec/rails_app/db/migrate/20191201000000_add_tokens_to_users.rb +10 -0
  191. data/spec/rails_app/db/schema.rb +4 -1
  192. data/spec/rails_app/db/seeds.rb +10 -2
  193. data/spec/rails_app/lib/custom_optional_targets/raise_error.rb +14 -0
  194. data/spec/rails_app/package.json +23 -0
  195. data/spec/rails_app/postcss.config.js +12 -0
  196. data/spec/roles/acts_as_group_spec.rb +0 -2
  197. data/spec/roles/acts_as_notifiable_spec.rb +6 -8
  198. data/spec/roles/acts_as_notifier_spec.rb +0 -2
  199. data/spec/roles/acts_as_target_spec.rb +0 -4
  200. data/spec/spec_helper.rb +7 -15
  201. data/spec/version_spec.rb +31 -0
  202. metadata +191 -13
@@ -0,0 +1,226 @@
1
+ <template>
2
+ <div class="fields_wrapper configured">
3
+ <div class="fields_title_wrapper">
4
+ <h3 class="fields_title">
5
+ {{ subscription.key }}
6
+ </h3>
7
+
8
+ <p>
9
+ <router-link v-bind:to="{ path : $route.path.replace('subscriptions', 'notifications') + '?filtered_by_key=' + subscription.key }">Notifications</router-link>
10
+ </p>
11
+ </div>
12
+
13
+ <div class="field_wrapper subscribing">
14
+ <div class="field_label">
15
+ <label>
16
+ Notification
17
+ </label>
18
+ </div>
19
+ <div class="field">
20
+ <div class="ui checkbox">
21
+ <div v-if="subscription.subscribing">
22
+ <a href="#" v-on:click="unsubscribe(subscription)" data-remote="true">
23
+ <input type="checkbox" checked="checked" />
24
+ <div class="slider" />
25
+ </a>
26
+ </div>
27
+ <div v-else>
28
+ <a href="#" v-on:click="subscribe(subscription)" data-remote="true">
29
+ <input type="checkbox" />
30
+ <div class="slider" />
31
+ </a>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
36
+
37
+ <div v-bind:class="[subscription.subscribing ? '' : 'hidden', 'field_wrapper subscribing_to_email']">
38
+ <div class="field_label">
39
+ <label>
40
+ Email notification
41
+ </label>
42
+ </div>
43
+ <div class="field">
44
+ <div class="ui checkbox">
45
+ <div v-if="subscription.subscribing_to_email">
46
+ <a href="#" v-on:click="unsubscribe_to_email(subscription)" data-remote="true">
47
+ <label>
48
+ <input type="checkbox" checked="checked" />
49
+ <div class="slider" />
50
+ </label>
51
+ </a>
52
+ </div>
53
+ <div v-else>
54
+ <a href="#" v-on:click="subscribe_to_email(subscription)" data-remote="true">
55
+ <label>
56
+ <input type="checkbox" />
57
+ <div class="slider" />
58
+ </label>
59
+ </a>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </div>
64
+
65
+ <div v-bind:class="[subscription.subscribing ? '' : 'hidden', 'field_wrapper subscribing_to_optional_targets']">
66
+ <div v-for="(optionalTargetSubscription, optionalTargetName) in subscription.optional_targets" :key="optionalTargetName">
67
+ <div class="field_label">
68
+ <label>
69
+ Optional tagret ({{ optionalTargetName }})
70
+ </label>
71
+ </div>
72
+ <div class="field">
73
+ <div class="ui checkbox">
74
+ <div v-if="optionalTargetSubscription.subscribing">
75
+ <a href="#" v-on:click="unsubscribe_to_optional_target(subscription, optionalTargetName)" data-remote="true">
76
+ <label>
77
+ <input type="checkbox" checked="checked" />
78
+ <div class="slider" />
79
+ </label>
80
+ </a>
81
+ </div>
82
+ <div v-else>
83
+ <a href="#" v-on:click="subscribe_to_optional_target(subscription, optionalTargetName)" data-remote="true">
84
+ <label>
85
+ <input type="checkbox" />
86
+ <div class="slider" />
87
+ </label>
88
+ </a>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>
94
+
95
+ <div class="ui button">
96
+ <a href="#" v-on:click="destroy(subscription)" data-confirm="Are you sure?" class="button" data-remote="true">Destroy</a>
97
+ </div>
98
+ </div>
99
+ </template>
100
+
101
+ <script>
102
+ import axios from 'axios'
103
+
104
+ export default {
105
+ name: 'Subscription',
106
+ props: {
107
+ targetSubscription: {
108
+ type: Object,
109
+ required: true
110
+ },
111
+ targetApiPath: {
112
+ type: String,
113
+ required: true
114
+ }
115
+ },
116
+ data () {
117
+ return {
118
+ subscription: this.targetSubscription,
119
+ baseURL: axios.defaults.baseURL + this.targetApiPath
120
+ }
121
+ },
122
+ methods: {
123
+ subscribe (subscription) {
124
+ axios
125
+ .put(this.targetApiPath + '/subscriptions/' + subscription.id + '/subscribe')
126
+ .then(response => {
127
+ if (response.status == 200) {
128
+ this.subscription = response.data
129
+ }
130
+ })
131
+ .catch (error => {
132
+ if (error.response.status == 401) {
133
+ this.$router.push('/logout');
134
+ }
135
+ })
136
+ },
137
+ unsubscribe (subscription) {
138
+ axios
139
+ .put(this.targetApiPath + '/subscriptions/' + subscription.id + '/unsubscribe')
140
+ .then(response => {
141
+ if (response.status == 200) {
142
+ this.subscription = response.data
143
+ }
144
+ })
145
+ .catch (error => {
146
+ if (error.response.status == 401) {
147
+ this.$router.push('/logout');
148
+ }
149
+ })
150
+ },
151
+ subscribe_to_email (subscription) {
152
+ axios
153
+ .put(this.targetApiPath + '/subscriptions/' + subscription.id + '/subscribe_to_email')
154
+ .then(response => {
155
+ if (response.status == 200) {
156
+ this.subscription = response.data
157
+ }
158
+ })
159
+ .catch (error => {
160
+ if (error.response.status == 401) {
161
+ this.$router.push('/logout');
162
+ }
163
+ })
164
+ },
165
+ unsubscribe_to_email (subscription) {
166
+ axios
167
+ .put(this.targetApiPath + '/subscriptions/' + subscription.id + '/unsubscribe_to_email')
168
+ .then(response => {
169
+ if (response.status == 200) {
170
+ this.subscription = response.data
171
+ }
172
+ })
173
+ .catch (error => {
174
+ if (error.response.status == 401) {
175
+ this.$router.push('/logout');
176
+ }
177
+ })
178
+ },
179
+ subscribe_to_optional_target (subscription, optionalTargetName) {
180
+ axios
181
+ .put(this.targetApiPath + '/subscriptions/' + subscription.id + '/subscribe_to_optional_target?optional_target_name=' + optionalTargetName)
182
+ .then(response => {
183
+ if (response.status == 200) {
184
+ this.subscription = response.data
185
+ }
186
+ })
187
+ .catch (error => {
188
+ if (error.response.status == 401) {
189
+ this.$router.push('/logout');
190
+ }
191
+ })
192
+ },
193
+ unsubscribe_to_optional_target (subscription, optionalTargetName) {
194
+ axios
195
+ .put(this.targetApiPath + '/subscriptions/' + subscription.id + '/unsubscribe_to_optional_target?optional_target_name=' + optionalTargetName)
196
+ .then(response => {
197
+ if (response.status == 200) {
198
+ this.subscription = response.data
199
+ }
200
+ })
201
+ .catch (error => {
202
+ if (error.response.status == 401) {
203
+ this.$router.push('/logout');
204
+ }
205
+ })
206
+ },
207
+ destroy (subscription) {
208
+ axios
209
+ .delete(this.targetApiPath + '/subscriptions/' + subscription.id)
210
+ .then(response => {
211
+ if (response.status == 204) {
212
+ this.$emit('getSubscriptions');
213
+ }
214
+ })
215
+ .catch (error => {
216
+ if (error.response.status == 401) {
217
+ this.$router.push('/logout');
218
+ }
219
+ })
220
+ }
221
+ }
222
+ }
223
+ </script>
224
+
225
+ <style scoped>
226
+ </style>
@@ -0,0 +1,5 @@
1
+ const config = {
2
+ ACTION_CABLE_CONNECTION_URL: 'ws://localhost:3000/cable'
3
+ }
4
+
5
+ module.exports = config;
@@ -0,0 +1,7 @@
1
+ const config = require('./' + process.env.NODE_ENV);
2
+
3
+ export default class Environment {
4
+ static get ACTION_CABLE_CONNECTION_URL() {
5
+ return config.ACTION_CABLE_CONNECTION_URL;
6
+ }
7
+ }
@@ -0,0 +1,5 @@
1
+ const config = {
2
+ ACTION_CABLE_CONNECTION_URL: 'wss://activity-notification-example.herokuapp.com/cable'
3
+ }
4
+
5
+ module.exports = config;
@@ -0,0 +1,5 @@
1
+ const config = {
2
+ ACTION_CABLE_CONNECTION_URL: 'ws://localhost:3000/cable'
3
+ }
4
+
5
+ module.exports = config;
@@ -0,0 +1,18 @@
1
+ /* eslint no-console:0 */
2
+ // This file is automatically compiled by Webpack, along with any other files
3
+ // present in this directory. You're encouraged to place your actual application logic in
4
+ // a relevant structure within app/javascript and only use these pack files to reference
5
+ // that code so it'll be compiled.
6
+ //
7
+ // To reference this file, add <%= javascript_pack_tag 'application' %> to the appropriate
8
+ // layout file, like app/views/layouts/application.html.erb
9
+
10
+
11
+ // Uncomment to copy all static images under ../images to the output folder and reference
12
+ // them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>)
13
+ // or the `imagePath` JavaScript helper below.
14
+ //
15
+ // const images = require.context('../images', true)
16
+ // const imagePath = (name) => images(name, true)
17
+
18
+ console.log('Hello World from Webpacker')
@@ -0,0 +1,14 @@
1
+ import Vue from 'vue'
2
+ import App from '../App.vue'
3
+ import router from '../router'
4
+ import store from '../store'
5
+
6
+ Vue.config.productionTip = false
7
+
8
+ document.addEventListener('DOMContentLoaded', () => {
9
+ new Vue({
10
+ router,
11
+ store,
12
+ render: h => h(App)
13
+ }).$mount('#spa')
14
+ })
@@ -0,0 +1,73 @@
1
+ import Vue from 'vue'
2
+ import VueRouter from 'vue-router'
3
+ import store from '../store'
4
+ import DeviseTokenAuth from '../components/DeviseTokenAuth.vue'
5
+ import Top from '../components/Top.vue'
6
+ import NotificationsIndex from '../components/notifications/Index.vue'
7
+ import SubscriptionsIndex from '../components/subscriptions/Index.vue'
8
+
9
+ Vue.use(VueRouter)
10
+
11
+ const routes = [
12
+ // Routes for common components
13
+ { path: '/', component: Top },
14
+ { path: '/login', component: DeviseTokenAuth },
15
+ { path: '/logout', component: DeviseTokenAuth, props: { isLogout: true } },
16
+ // Routes for single page application working with activity_notification REST API backend for users
17
+ {
18
+ path: '/notifications',
19
+ name: 'AuthenticatedUserNotificationsIndex',
20
+ component: NotificationsIndex,
21
+ props: () => ({ target_type: 'users', target: store.getters.currentUser }),
22
+ meta: { requiresAuth: true }
23
+ },
24
+ {
25
+ path: '/subscriptions',
26
+ name: 'AuthenticatedUserSubscriptionsIndex',
27
+ component: SubscriptionsIndex,
28
+ props: () => ({ target_type: 'users', target: store.getters.currentUser }),
29
+ meta: { requiresAuth: true }
30
+ },
31
+ // Routes for single page application working with activity_notification REST API backend for admins
32
+ {
33
+ path: '/admins/notifications',
34
+ name: 'AuthenticatedAdminNotificationsIndex',
35
+ component: NotificationsIndex,
36
+ props: () => ({ target_type: 'admins', targetApiPath: 'admins', target: store.getters.currentUser.admin }),
37
+ meta: { requiresAuth: true }
38
+ },
39
+ {
40
+ path: '/admins/subscriptions',
41
+ name: 'AuthenticatedAdminSubscriptionsIndex',
42
+ component: SubscriptionsIndex,
43
+ props: () => ({ target_type: 'admins', targetApiPath: 'admins', target: store.getters.currentUser.admin }),
44
+ meta: { requiresAuth: true }
45
+ },
46
+ // Routes for single page application working with activity_notification REST API backend for unauthenticated targets
47
+ {
48
+ path: '/:target_type/:target_id/notifications',
49
+ name: 'UnauthenticatedTargetNotificationsIndex',
50
+ component: NotificationsIndex,
51
+ props : true
52
+ },
53
+ {
54
+ path: '/:target_type/:target_id/subscriptions',
55
+ name: 'UnauthenticatedTargetSubscriptionsIndex',
56
+ component: SubscriptionsIndex,
57
+ props : true
58
+ }
59
+ ]
60
+
61
+ const router = new VueRouter({
62
+ routes
63
+ })
64
+
65
+ router.beforeEach((to, from, next) => {
66
+ if (to.matched.some(record => record.meta.requiresAuth) && !store.getters.userSignedIn) {
67
+ next({ path: '/login', query: { redirect: to.fullPath }});
68
+ } else {
69
+ next();
70
+ }
71
+ })
72
+
73
+ export default router
@@ -0,0 +1,37 @@
1
+ import Vue from 'vue'
2
+ import Vuex from 'vuex'
3
+ import createPersistedState from "vuex-persistedstate"
4
+
5
+ Vue.use(Vuex)
6
+
7
+ export default new Vuex.Store({
8
+ state: {
9
+ signedInStatus: false,
10
+ currentUser: null,
11
+ authHeaders: {}
12
+ },
13
+ mutations: {
14
+ signIn(state, { user, authHeaders }) {
15
+ state.currentUser = user;
16
+ state.authHeaders = authHeaders;
17
+ state.signedInStatus = true;
18
+ },
19
+ signOut(state) {
20
+ state.signedInStatus = false;
21
+ state.currentUser = null;
22
+ state.authHeaders = {};
23
+ }
24
+ },
25
+ getters: {
26
+ userSignedIn(state) {
27
+ return state.signedInStatus;
28
+ },
29
+ currentUser(state) {
30
+ return state.currentUser;
31
+ },
32
+ authHeaders(state) {
33
+ return state.authHeaders;
34
+ }
35
+ },
36
+ plugins: [createPersistedState({storage: window.sessionStorage})]
37
+ });
@@ -1,15 +1,24 @@
1
- unless ENV['AN_TEST_DB'] == 'mongodb'
2
- class Admin < ActiveRecord::Base
1
+ module AdminModel
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
3
5
  belongs_to :user
4
6
  validates :user, presence: true
5
7
 
6
8
  acts_as_notification_target email_allowed: false,
7
9
  subscription_allowed: true,
10
+ action_cable_allowed: true, action_cable_with_devise: true,
8
11
  devise_resource: :user,
9
12
  current_devise_target: ->(current_user) { current_user.admin },
10
- printable_name: ->(admin) { "admin (#{admin.user.name})" },
11
- action_cable_allowed: true, action_cable_with_devise: true
12
- end
13
+ printable_name: ->(admin) { "#{admin.user.name} (admin)" }
14
+ end
15
+ end
16
+
17
+ unless ENV['AN_TEST_DB'] == 'mongodb'
18
+ class Admin < ActiveRecord::Base
19
+ include AdminModel
20
+ default_scope { order(:id) }
21
+ end
13
22
  else
14
23
  require 'mongoid'
15
24
  class Admin
@@ -17,18 +26,10 @@ else
17
26
  include Mongoid::Timestamps
18
27
  include GlobalID::Identification
19
28
 
20
- belongs_to :user
21
- validates :user, presence: true
22
-
23
29
  field :phone_number, type: String
24
30
  field :slack_username, type: String
25
31
 
26
32
  include ActivityNotification::Models
27
- acts_as_notification_target email_allowed: false,
28
- subscription_allowed: true,
29
- devise_resource: :user,
30
- current_devise_target: ->(current_user) { current_user.admin },
31
- printable_name: ->(admin) { "admin (#{admin.user.name})" },
32
- action_cable_allowed: true, action_cable_with_devise: true
33
- end
33
+ include AdminModel
34
+ end
34
35
  end