proclaim 0.5.6 → 0.6.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.
Files changed (236) hide show
  1. checksums.yaml +5 -5
  2. data/Rakefile +5 -38
  3. data/app/assets/config/proclaim_manifest.js +2 -0
  4. data/app/assets/images/{ajax_loader.gif → proclaim/ajax_loader.gif} +0 -0
  5. data/app/assets/javascripts/proclaim.js +7 -7
  6. data/app/assets/javascripts/proclaim/{comments_handler.js.coffee → comments_handler.coffee} +16 -10
  7. data/app/assets/javascripts/proclaim/editor.coffee +55 -0
  8. data/app/assets/stylesheets/{proclaim.css.scss → proclaim.scss} +7 -8
  9. data/app/assets/stylesheets/proclaim/{comments.css.scss → comments.scss} +0 -0
  10. data/app/assets/stylesheets/proclaim/{posts.css.scss → posts.scss} +60 -25
  11. data/app/assets/stylesheets/proclaim/{subscriptions.css.scss → subscriptions.scss} +0 -0
  12. data/app/controllers/proclaim/application_controller.rb +60 -56
  13. data/app/controllers/proclaim/comments_controller.rb +13 -42
  14. data/app/controllers/proclaim/posts_controller.rb +25 -57
  15. data/app/controllers/proclaim/subscriptions_controller.rb +3 -3
  16. data/app/jobs/proclaim/application_job.rb +4 -0
  17. data/app/mailers/proclaim/application_mailer.rb +5 -0
  18. data/app/mailers/proclaim/subscription_mailer.rb +19 -17
  19. data/app/models/proclaim/application_record.rb +5 -0
  20. data/app/models/proclaim/comment.rb +6 -1
  21. data/app/models/proclaim/post.rb +20 -28
  22. data/app/models/proclaim/subscription.rb +33 -11
  23. data/app/views/layouts/proclaim/subscription_mailer.html.erb +15 -36
  24. data/app/views/proclaim/comments/_comment.html.erb +7 -7
  25. data/app/views/proclaim/comments/_form.html.erb +7 -5
  26. data/app/views/proclaim/posts/_form.html.erb +34 -21
  27. data/app/views/proclaim/posts/show.html.erb +16 -3
  28. data/app/views/proclaim/subscription_mailer/welcome_email.html.erb +2 -6
  29. data/config/initializers/friendly_id.rb +20 -1
  30. data/config/routes.rb +1 -5
  31. data/db/migrate/20141108222616_create_proclaim_posts.rb +8 -1
  32. data/db/migrate/20141114235359_create_proclaim_comments.rb +1 -1
  33. data/db/migrate/20141115022230_create_proclaim_comment_hierarchies.rb +1 -1
  34. data/db/migrate/20141210234057_create_proclaim_subscriptions.rb +5 -4
  35. data/db/migrate/20150213015321_create_friendly_id_slugs.rb +1 -1
  36. data/lib/generators/proclaim/install_generator.rb +1 -1
  37. data/lib/generators/proclaim/templates/initialize_proclaim.rb +31 -29
  38. data/lib/generators/proclaim/views_generator.rb +1 -1
  39. data/lib/proclaim.rb +15 -15
  40. data/lib/proclaim/engine.rb +21 -19
  41. data/lib/proclaim/version.rb +1 -1
  42. data/vendor/assets/fonts/KaTeX_AMS-Regular.ttf +0 -0
  43. data/vendor/assets/fonts/KaTeX_AMS-Regular.woff +0 -0
  44. data/vendor/assets/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  45. data/vendor/assets/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  46. data/vendor/assets/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  47. data/vendor/assets/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  48. data/vendor/assets/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  49. data/vendor/assets/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  50. data/vendor/assets/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  51. data/vendor/assets/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  52. data/vendor/assets/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  53. data/vendor/assets/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  54. data/vendor/assets/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  55. data/vendor/assets/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  56. data/vendor/assets/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  57. data/vendor/assets/fonts/KaTeX_Main-Bold.ttf +0 -0
  58. data/vendor/assets/fonts/KaTeX_Main-Bold.woff +0 -0
  59. data/vendor/assets/fonts/KaTeX_Main-Bold.woff2 +0 -0
  60. data/vendor/assets/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  61. data/vendor/assets/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  62. data/vendor/assets/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  63. data/vendor/assets/fonts/KaTeX_Main-Italic.ttf +0 -0
  64. data/vendor/assets/fonts/KaTeX_Main-Italic.woff +0 -0
  65. data/vendor/assets/fonts/KaTeX_Main-Italic.woff2 +0 -0
  66. data/vendor/assets/fonts/KaTeX_Main-Regular.ttf +0 -0
  67. data/vendor/assets/fonts/KaTeX_Main-Regular.woff +0 -0
  68. data/vendor/assets/fonts/KaTeX_Main-Regular.woff2 +0 -0
  69. data/vendor/assets/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  70. data/vendor/assets/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  71. data/vendor/assets/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  72. data/vendor/assets/fonts/KaTeX_Math-Italic.ttf +0 -0
  73. data/vendor/assets/fonts/KaTeX_Math-Italic.woff +0 -0
  74. data/vendor/assets/fonts/KaTeX_Math-Italic.woff2 +0 -0
  75. data/vendor/assets/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  76. data/vendor/assets/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  77. data/vendor/assets/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  78. data/vendor/assets/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  79. data/vendor/assets/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  80. data/vendor/assets/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  81. data/vendor/assets/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  82. data/vendor/assets/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  83. data/vendor/assets/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  84. data/vendor/assets/fonts/KaTeX_Script-Regular.ttf +0 -0
  85. data/vendor/assets/fonts/KaTeX_Script-Regular.woff +0 -0
  86. data/vendor/assets/fonts/KaTeX_Script-Regular.woff2 +0 -0
  87. data/vendor/assets/fonts/KaTeX_Size1-Regular.ttf +0 -0
  88. data/vendor/assets/fonts/KaTeX_Size1-Regular.woff +0 -0
  89. data/vendor/assets/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  90. data/vendor/assets/fonts/KaTeX_Size2-Regular.ttf +0 -0
  91. data/vendor/assets/fonts/KaTeX_Size2-Regular.woff +0 -0
  92. data/vendor/assets/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  93. data/vendor/assets/fonts/KaTeX_Size3-Regular.ttf +0 -0
  94. data/vendor/assets/fonts/KaTeX_Size3-Regular.woff +0 -0
  95. data/vendor/assets/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  96. data/vendor/assets/fonts/KaTeX_Size4-Regular.ttf +0 -0
  97. data/vendor/assets/fonts/KaTeX_Size4-Regular.woff +0 -0
  98. data/vendor/assets/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  99. data/vendor/assets/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  100. data/vendor/assets/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  101. data/vendor/assets/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  102. data/vendor/assets/javascripts/contrib/auto-render.js +339 -0
  103. data/vendor/assets/javascripts/contrib/auto-render.min.js +1 -0
  104. data/vendor/assets/javascripts/contrib/auto-render.mjs +215 -0
  105. data/vendor/assets/javascripts/contrib/copy-tex.css +14 -0
  106. data/vendor/assets/javascripts/contrib/copy-tex.js +213 -0
  107. data/vendor/assets/javascripts/contrib/copy-tex.min.css +1 -0
  108. data/vendor/assets/javascripts/contrib/copy-tex.min.js +1 -0
  109. data/vendor/assets/javascripts/contrib/copy-tex.mjs +85 -0
  110. data/vendor/assets/javascripts/contrib/mathtex-script-type.js +137 -0
  111. data/vendor/assets/javascripts/contrib/mathtex-script-type.min.js +1 -0
  112. data/vendor/assets/javascripts/contrib/mathtex-script-type.mjs +24 -0
  113. data/vendor/assets/javascripts/contrib/mhchem.js +3241 -0
  114. data/vendor/assets/javascripts/contrib/mhchem.min.js +1 -0
  115. data/vendor/assets/javascripts/contrib/mhchem.mjs +3109 -0
  116. data/vendor/assets/javascripts/katex.js +16517 -0
  117. data/vendor/assets/javascripts/katex.min.js +1 -0
  118. data/vendor/assets/javascripts/katex.mjs +16122 -0
  119. data/vendor/assets/javascripts/quill.core.js +8522 -0
  120. data/vendor/assets/javascripts/quill.js +11489 -0
  121. data/vendor/assets/javascripts/quill.min.js +8 -0
  122. data/vendor/assets/javascripts/quill.min.js.map +1 -0
  123. data/vendor/assets/stylesheets/katex.css +1011 -0
  124. data/vendor/assets/stylesheets/katex.min.css +1 -0
  125. data/vendor/assets/stylesheets/quill.bubble.css +952 -0
  126. data/vendor/assets/stylesheets/quill.core.css +397 -0
  127. data/vendor/assets/stylesheets/quill.snow.css +945 -0
  128. metadata +169 -278
  129. data/CHANGELOG +0 -77
  130. data/Gemfile +0 -14
  131. data/VERSION +0 -1
  132. data/app/assets/javascripts/proclaim/editor.js.coffee +0 -52
  133. data/app/assets/javascripts/proclaim/images.js.coffee +0 -3
  134. data/app/assets/javascripts/proclaim/subscriptions.js.coffee +0 -3
  135. data/app/assets/stylesheets/proclaim/images.scss +0 -3
  136. data/app/controllers/proclaim/images_controller.rb +0 -67
  137. data/app/helpers/proclaim/comments_helper.rb +0 -4
  138. data/app/helpers/proclaim/images_helper.rb +0 -4
  139. data/app/helpers/proclaim/subscriptions_helper.rb +0 -4
  140. data/app/models/proclaim/image.rb +0 -19
  141. data/app/policies/proclaim/image_policy.rb +0 -29
  142. data/app/uploaders/proclaim/image_uploader.rb +0 -82
  143. data/db/migrate/20141222224905_create_proclaim_images.rb +0 -12
  144. data/db/migrate/20150123115226_add_name_to_subscriptions.rb +0 -7
  145. data/db/migrate/20150213015850_add_slug_to_posts.rb +0 -20
  146. data/proclaim.gemspec +0 -51
  147. data/test/controllers/proclaim/comments_controller_test.rb +0 -228
  148. data/test/controllers/proclaim/images_controller_test.rb +0 -166
  149. data/test/controllers/proclaim/posts_controller_test.rb +0 -465
  150. data/test/controllers/proclaim/subscriptions_controller_test.rb +0 -154
  151. data/test/dummy/README.rdoc +0 -28
  152. data/test/dummy/Rakefile +0 -6
  153. data/test/dummy/app/assets/javascripts/application.js +0 -14
  154. data/test/dummy/app/assets/stylesheets/application.css +0 -16
  155. data/test/dummy/app/controllers/application_controller.rb +0 -15
  156. data/test/dummy/app/helpers/application_helper.rb +0 -28
  157. data/test/dummy/app/models/user.rb +0 -7
  158. data/test/dummy/app/views/layouts/application.html.erb +0 -16
  159. data/test/dummy/bin/bundle +0 -3
  160. data/test/dummy/bin/rails +0 -4
  161. data/test/dummy/bin/rake +0 -4
  162. data/test/dummy/config.ru +0 -4
  163. data/test/dummy/config/application.rb +0 -24
  164. data/test/dummy/config/boot.rb +0 -5
  165. data/test/dummy/config/database.yml +0 -25
  166. data/test/dummy/config/environment.rb +0 -5
  167. data/test/dummy/config/environments/development.rb +0 -45
  168. data/test/dummy/config/environments/production.rb +0 -80
  169. data/test/dummy/config/environments/test.rb +0 -49
  170. data/test/dummy/config/initializers/assets.rb +0 -8
  171. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  172. data/test/dummy/config/initializers/cookies_serializer.rb +0 -3
  173. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  174. data/test/dummy/config/initializers/inflections.rb +0 -16
  175. data/test/dummy/config/initializers/mime_types.rb +0 -4
  176. data/test/dummy/config/initializers/session_store.rb +0 -3
  177. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  178. data/test/dummy/config/locales/en.yml +0 -23
  179. data/test/dummy/config/routes.rb +0 -5
  180. data/test/dummy/config/secrets.yml +0 -22
  181. data/test/dummy/db/migrate/20141117214323_create_users.rb +0 -10
  182. data/test/dummy/db/schema.rb +0 -91
  183. data/test/dummy/public/404.html +0 -67
  184. data/test/dummy/public/422.html +0 -67
  185. data/test/dummy/public/500.html +0 -66
  186. data/test/dummy/public/favicon.ico +0 -0
  187. data/test/factories/proclaim/comment.rb +0 -11
  188. data/test/factories/proclaim/image.rb +0 -6
  189. data/test/factories/proclaim/post.rb +0 -14
  190. data/test/factories/proclaim/subscription.rb +0 -14
  191. data/test/factories/user.rb +0 -6
  192. data/test/helpers/proclaim/comments_helper_test.rb +0 -6
  193. data/test/helpers/proclaim/posts_helper_test.rb +0 -6
  194. data/test/helpers/proclaim/subscriptions_helper_test.rb +0 -6
  195. data/test/integration/with_javascript/comment_test.rb +0 -391
  196. data/test/integration/with_javascript/post_form_test.rb +0 -225
  197. data/test/integration/with_javascript/post_show_test.rb +0 -47
  198. data/test/integration/with_javascript/post_subscription_test.rb +0 -302
  199. data/test/integration/without_javascript/blog_subscription_test.rb +0 -114
  200. data/test/integration/without_javascript/manage_subscriptions_test.rb +0 -37
  201. data/test/integration/without_javascript/post_test.rb +0 -234
  202. data/test/integration/without_javascript/subscription_email_test.rb +0 -95
  203. data/test/integration/without_javascript/unsubscribe_test.rb +0 -32
  204. data/test/mailers/previews/proclaim/subscription_mailer_preview.rb +0 -22
  205. data/test/mailers/proclaim/subscription_mailer_test.rb +0 -91
  206. data/test/models/proclaim/comment_test.rb +0 -41
  207. data/test/models/proclaim/image_test.rb +0 -70
  208. data/test/models/proclaim/post_test.rb +0 -193
  209. data/test/models/proclaim/subscription_test.rb +0 -77
  210. data/test/policies/application_policy_test.rb +0 -87
  211. data/test/policies/proclaim/comment_policy_test.rb +0 -71
  212. data/test/policies/proclaim/image_policy_test.rb +0 -83
  213. data/test/policies/proclaim/post_policy_test.rb +0 -98
  214. data/test/policies/proclaim/subscription_policy_test.rb +0 -103
  215. data/test/proclaim_test.rb +0 -7
  216. data/test/support/images/test.jpg +0 -0
  217. data/test/support/pages/posts/edit_page.rb +0 -5
  218. data/test/support/pages/posts/show_page.rb +0 -47
  219. data/test/support/wait_for_ajax.rb +0 -11
  220. data/test/test_helper.rb +0 -71
  221. data/test/unit/proclaim/new_comment_callback_test.rb +0 -62
  222. data/test/unit/proclaim/new_subscription_callback_test.rb +0 -62
  223. data/test/unit/proclaim/post_published_callback_test.rb +0 -74
  224. data/vendor/assets/images/link.png +0 -0
  225. data/vendor/assets/images/remove.png +0 -0
  226. data/vendor/assets/images/resize-bigger.png +0 -0
  227. data/vendor/assets/images/resize-smaller.png +0 -0
  228. data/vendor/assets/images/unlink.png +0 -0
  229. data/vendor/assets/javascripts/addons/medium-editor-insert-embeds.js +0 -197
  230. data/vendor/assets/javascripts/addons/medium-editor-insert-images.js +0 -572
  231. data/vendor/assets/javascripts/addons/medium-editor-insert-maps.js +0 -50
  232. data/vendor/assets/javascripts/addons/medium-editor-insert-plugin.js +0 -496
  233. data/vendor/assets/javascripts/addons/medium-editor-insert-tables.js +0 -132
  234. data/vendor/assets/javascripts/medium-editor-insert-plugin.all.js +0 -1415
  235. data/vendor/assets/stylesheets/medium-editor-insert-plugin-frontend.css.scss +0 -55
  236. data/vendor/assets/stylesheets/medium-editor-insert-plugin.css.scss +0 -277
@@ -1,7 +1,7 @@
1
- require_dependency "proclaim/application_controller"
1
+ #require_dependency "proclaim/application_controller"
2
2
 
3
3
  module Proclaim
4
- class CommentsController < ApplicationController
4
+ class CommentsController < Proclaim::ApplicationController
5
5
  before_action :authenticate_author, only: [:destroy]
6
6
  after_action :verify_authorized
7
7
  before_action :set_comment, only: [:update, :destroy]
@@ -9,41 +9,16 @@ module Proclaim
9
9
  def create
10
10
  @comment = Comment.new(comment_params)
11
11
 
12
- subscription = nil
13
- if subscription_params and subscription_params[:subscribe]
14
- subscription = Subscription.new(name: @comment.author,
15
- email: subscription_params[:email],
16
- post: @comment.post)
17
- end
18
-
19
12
  errors = Array.new
20
13
  options = Hash.new
21
14
  options[:success_json] = lambda {comment_json(@comment)}
22
15
  options[:failure_json] = lambda {errors}
23
16
  options[:operation] = lambda do
24
- respond_to do |format|
25
- begin
26
- # Wrap saving the comment in a transaction, so if the
27
- # subscription fails to save, the comment doesn't save either
28
- # (and vice-versa).
29
- Comment.transaction do
30
- @comment.save!
31
-
32
- if subscription
33
- subscription.save!
34
- end
35
-
36
- return true
37
- end
38
- rescue ActiveRecord::RecordInvalid
39
- errors += @comment.errors.full_messages
40
-
41
- if subscription
42
- errors += subscription.errors.full_messages
43
- end
44
-
45
- return false
46
- end
17
+ if @comment.save
18
+ return true
19
+ else
20
+ errors += @comment.errors.full_messages
21
+ return false
47
22
  end
48
23
  end
49
24
 
@@ -91,17 +66,13 @@ module Proclaim
91
66
 
92
67
  # Only allow a trusted parameter "white list" through.
93
68
  def comment_params
94
- params.require(:comment).permit(:body,
95
- :author,
96
- :post_id,
97
- :parent_id)
98
- end
99
-
100
- def subscription_params
101
- if params[:subscription]
102
- params.require(:subscription).permit(:subscribe,
103
- :email)
69
+ p = params.require(:comment).permit(
70
+ :body, :author, :post_id, :parent_id,
71
+ subscription_attributes: [:email])
72
+ if params[:subscribe] && p.include?('subscription_attributes')
73
+ p[:subscription_attributes].merge!({name: p[:author]})
104
74
  end
75
+ p
105
76
  end
106
77
 
107
78
  def antispam_params
@@ -1,7 +1,7 @@
1
- require_dependency "proclaim/application_controller"
1
+ #require_dependency "proclaim/application_controller"
2
2
 
3
3
  module Proclaim
4
- class PostsController < ApplicationController
4
+ class PostsController < Proclaim::ApplicationController
5
5
  before_action :authenticate_author, except: [:index, :show]
6
6
  after_action :verify_authorized
7
7
  after_action :verify_policy_scoped, only: :index
@@ -15,19 +15,13 @@ module Proclaim
15
15
 
16
16
  # GET /posts/1
17
17
  def show
18
- begin
19
- authorize @post
20
-
21
- # If an old id or a numeric id was used to find the record, then
22
- # the request path will not match the post_path, and we should do
23
- # a 301 redirect that uses the current friendly id.
24
- if request.path != post_path(@post)
25
- return redirect_to @post, status: :moved_permanently
26
- end
27
- rescue Pundit::NotAuthorizedError
28
- # Don't leak that this resource actually exists. Turn the
29
- # "permission denied" into a "not found"
30
- raise ActiveRecord::RecordNotFound
18
+ authorize @post
19
+
20
+ # If an old id or a numeric id was used to find the record, then
21
+ # the request path will not match the post_path, and we should do
22
+ # a 301 redirect that uses the current friendly id.
23
+ if request.path != post_path(@post)
24
+ return redirect_to @post, status: :moved_permanently
31
25
  end
32
26
  end
33
27
 
@@ -47,22 +41,13 @@ module Proclaim
47
41
  @post = Post.new(post_params)
48
42
  @post.author = current_author
49
43
 
44
+ if params[:publish] == "true"
45
+ @post.publish
46
+ end
47
+
50
48
  authorize @post
51
49
 
52
- # Save here before potentially publishing, so we can save images
53
50
  if @post.save
54
-
55
- if params[:publish] == "true"
56
- @post.publish
57
- authorize @post # Re-authorize now that it's to be published
58
- end
59
-
60
- # Save and rewrite each image in Carrierwave's cache
61
- @post.body = saved_and_rewrite_cached_images(@post.body)
62
-
63
- # Save again, in case the body changed or it was published
64
- @post.save
65
-
66
51
  redirect_to @post, notice: 'Post was successfully created.'
67
52
  else
68
53
  render :new
@@ -80,12 +65,7 @@ module Proclaim
80
65
 
81
66
  authorize @post
82
67
 
83
- if @post.valid?
84
- # Save and rewrite each image in Carrierwave's cache
85
- @post.body = saved_and_rewrite_cached_images(@post.body)
86
-
87
- @post.save
88
-
68
+ if @post.save
89
69
  redirect_to @post, notice: 'Post was successfully updated.'
90
70
  else
91
71
  render :edit
@@ -102,6 +82,16 @@ module Proclaim
102
82
 
103
83
  private
104
84
 
85
+ def user_not_authorized(exception)
86
+ if exception.policy.is_a? PostPolicy and exception.query == "show?"
87
+ # Don't leak that this resource actually exists. Turn the
88
+ # "permission denied" into a "not found"
89
+ raise ActiveRecord::RecordNotFound
90
+ else
91
+ super()
92
+ end
93
+ end
94
+
105
95
  # Use callbacks to share common setup or constraints between actions.
106
96
  def set_post
107
97
  @post = Post.friendly.find(params[:id])
@@ -114,29 +104,7 @@ module Proclaim
114
104
  params[:post][:title] = HTMLEntities.new.decode(Rails::Html::FullSanitizer.new.sanitize(params[:post][:title]))
115
105
  end
116
106
 
117
- params.require(:post).permit(:title,
118
- :body,
119
- images_attributes: [:id, :image, :_destroy])
120
- end
121
-
122
- def saved_and_rewrite_cached_images(body)
123
- document = Nokogiri::HTML.fragment(body)
124
- cache_path = ImageUploader.cache_dir
125
- document.css("img").each do |image_tag|
126
- url = image_tag.attributes["src"].value
127
- if url.include? cache_path
128
- cache_name = cache_name_from_url(url)
129
- if cache_name
130
- image = @post.images.build
131
- image.image.retrieve_from_cache!(cache_name)
132
- image.save
133
-
134
- image_tag.attributes["src"].value = image.image.url
135
- end
136
- end
137
- end
138
-
139
- document.inner_html
107
+ params.require(:post).permit(:title, :body, :quill_body)
140
108
  end
141
109
  end
142
110
  end
@@ -1,13 +1,13 @@
1
- require_dependency "proclaim/application_controller"
1
+ #require_dependency "proclaim/application_controller"
2
2
 
3
3
  module Proclaim
4
- class SubscriptionsController < ApplicationController
4
+ class SubscriptionsController < Proclaim::ApplicationController
5
5
  after_action :verify_authorized
6
6
  after_action :verify_policy_scoped, only: :index
7
7
  before_action :set_subscription, only: [:show, :edit, :update, :destroy]
8
8
 
9
9
  def index
10
- @subscriptions = policy_scope(Subscription).order(:post_id, :name)
10
+ @subscriptions = policy_scope(Subscription).order(:comment_id, :name)
11
11
  authorize Subscription
12
12
  end
13
13
 
@@ -0,0 +1,4 @@
1
+ module Proclaim
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module Proclaim
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: Proclaim.mailer_sender || default_params[:from] || "from@example.com"
4
+ end
5
+ end
@@ -1,10 +1,8 @@
1
1
  module Proclaim
2
- class SubscriptionMailer < ActionMailer::Base
3
- default from: Proclaim.mailer_sender || default_params[:from] || "from@example.com"
4
-
5
- def welcome_email(subscription)
6
- @subscription = subscription
2
+ class SubscriptionMailer < ApplicationMailer
3
+ before_action :set_subscription
7
4
 
5
+ def welcome_email
8
6
  message = Premailer.new(render_to_string, with_html_string: true, base_url: root_url)
9
7
  base_url = root_url.gsub(/\A.*:\/\//, '').gsub(/\A(.*?)\/*\z/, '\1')
10
8
 
@@ -14,30 +12,34 @@ module Proclaim
14
12
  end
15
13
  end
16
14
 
17
- def new_comment_notification_email(subscription, comment)
18
- @subscription = subscription
19
- @comment = comment
15
+ def new_comment_notification_email
16
+ @comment = Comment.find(params[:comment_id])
20
17
 
21
18
  message = Premailer.new(render_to_string, with_html_string: true, base_url: root_url)
22
19
 
23
20
  mail to: @subscription.email,
24
- subject: "New Comment On \"#{@comment.post.title}\"" do |format|
25
- format.html { message.to_inline_css }
26
- format.text { message.to_plain_text }
21
+ subject: "New Comment On \"#{@comment.post.title}\"" do |format|
22
+ format.html { message.to_inline_css }
23
+ format.text { message.to_plain_text }
27
24
  end
28
25
  end
29
26
 
30
- def new_post_notification_email(subscription, post)
31
- @subscription = subscription
32
- @post = post
27
+ def new_post_notification_email
28
+ @post = Post.find(params[:post_id])
33
29
 
34
30
  message = Premailer.new(render_to_string, with_html_string: true, base_url: root_url)
35
31
 
36
32
  mail to: @subscription.email,
37
- subject: "New Post: #{@post.title}" do |format|
38
- format.html { message.to_inline_css }
39
- format.text { message.to_plain_text }
33
+ subject: "New Post: #{@post.title}" do |format|
34
+ format.html { message.to_inline_css }
35
+ format.text { message.to_plain_text }
40
36
  end
41
37
  end
38
+
39
+ private
40
+
41
+ def set_subscription
42
+ @subscription = Subscription.find(params[:subscription_id])
43
+ end
42
44
  end
43
45
  end
@@ -0,0 +1,5 @@
1
+ module Proclaim
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -15,12 +15,17 @@ module Proclaim
15
15
  class Comment < ActiveRecord::Base
16
16
  acts_as_tree order: 'created_at ASC', dependent: :destroy
17
17
  belongs_to :post, inverse_of: :comments
18
+ has_one :subscription, inverse_of: :comment, dependent: :destroy
18
19
  after_initialize :maintainPost
19
- after_create :notifyPostSubscribers
20
+
21
+ # Using after_commit since we use deliver_later and re-load them from the database
22
+ after_create_commit :notifyPostSubscribers
20
23
  after_create { Proclaim.notify_new_comment(self) }
21
24
 
22
25
  validates_presence_of :body, :author, :post
23
26
 
27
+ accepts_nested_attributes_for :subscription, reject_if: :all_blank
28
+
24
29
  private
25
30
 
26
31
  def maintainPost
@@ -2,23 +2,23 @@
2
2
  #
3
3
  # Table name: proclaim_posts
4
4
  #
5
- # id :integer not null, primary key
6
- # author_id :integer
7
- # title :string default(""), not null
8
- # body :text default(""), not null
9
- # published :boolean default("f"), not null
10
- # publication_date :datetime
11
- # created_at :datetime not null
12
- # updated_at :datetime not null
5
+ # id :integer not null, primary key
6
+ # author_id :integer
7
+ # title :string default(""), not null
8
+ # body :text default(""), not null
9
+ # quill_body :text default(""), not null
10
+ # state :string default("draft"), not null
11
+ # slug :string
12
+ # published_at :datetime
13
+ # created_at :datetime not null
14
+ # updated_at :datetime not null
13
15
  #
14
16
 
15
17
  module Proclaim
16
18
  class Post < ActiveRecord::Base
17
19
  belongs_to :author, class_name: Proclaim.author_class
18
20
  has_many :comments, inverse_of: :post, dependent: :destroy
19
- has_many :subscriptions, inverse_of: :post, dependent: :destroy
20
- has_many :images, inverse_of: :post, dependent: :destroy
21
- accepts_nested_attributes_for :images, allow_destroy: true
21
+ has_many :subscriptions, through: :comments
22
22
 
23
23
  extend FriendlyId
24
24
  friendly_id :slug_candidates, use: :history
@@ -40,13 +40,13 @@ module Proclaim
40
40
  validates_presence_of :published_at, if: :published?
41
41
  validates :published_at, absence: true, unless: :published?
42
42
 
43
- validates_presence_of :title, :body, :author
43
+ validates_presence_of :title, :body, :quill_body, :author
44
44
  validate :verifyBodyHtml
45
45
 
46
46
  after_validation :move_friendly_id_error_to_title
47
47
 
48
- before_save :sanitizeBody
49
- after_save :notifyBlogSubscribersIfPublished
48
+ # Using after_commit since we use deliver_later and re-load them from the database
49
+ after_commit :notifyBlogSubscribersIfPublished, on: [:create, :update]
50
50
 
51
51
  # Only save the slug history if the post is published
52
52
  def create_slug
@@ -60,7 +60,7 @@ module Proclaim
60
60
 
61
61
  attr_writer :excerpt_length
62
62
  def excerpt_length
63
- @excerpt_length || Proclaim.excerpt_length
63
+ @excerpt_length ||= Proclaim.excerpt_length
64
64
  end
65
65
 
66
66
  def body_plaintext
@@ -79,7 +79,10 @@ module Proclaim
79
79
 
80
80
  def notifyPostSubscribers(newComment)
81
81
  subscriptions.each do | subscription |
82
- subscription.deliver_new_comment_notification_email(newComment)
82
+ # Don't notify the commenter of own comment
83
+ if subscription.comment_id != newComment.id
84
+ subscription.deliver_new_comment_notification_email(newComment)
85
+ end
83
86
  end
84
87
  end
85
88
 
@@ -110,17 +113,6 @@ module Proclaim
110
113
  end
111
114
  end
112
115
 
113
- def sanitizeBody
114
- unless Proclaim.editor_whitelist_tags.blank? and
115
- Proclaim.editor_whitelist_attributes.blank?
116
- sanitizer = Rails::Html::WhiteListSanitizer.new
117
- self.body = sanitizer.sanitize(
118
- body,
119
- tags: Proclaim.editor_whitelist_tags,
120
- attributes: Proclaim.editor_whitelist_attributes)
121
- end
122
- end
123
-
124
116
  def takeExcerptOf(text)
125
117
  if excerpt_length >= text.length
126
118
  return text
@@ -168,7 +160,7 @@ module Proclaim
168
160
 
169
161
  def notifyBlogSubscribersIfPublished
170
162
  # If we just published this post, notify the subscribers
171
- if published? and state_changed?
163
+ if published? and saved_change_to_state?
172
164
  Proclaim.notify_post_published(self)
173
165
 
174
166
  Subscription.blog_subscriptions.each do | subscription |
@@ -3,7 +3,8 @@
3
3
  # Table name: proclaim_subscriptions
4
4
  #
5
5
  # id :integer not null, primary key
6
- # post_id :integer
6
+ # comment_id :integer
7
+ # name :string default(""), not null
7
8
  # email :string
8
9
  # created_at :datetime not null
9
10
  # updated_at :datetime not null
@@ -11,33 +12,39 @@
11
12
 
12
13
  module Proclaim
13
14
  class Subscription < ActiveRecord::Base
14
- scope :blog_subscriptions, -> { where(post_id: nil) }
15
- belongs_to :post, inverse_of: :subscriptions
15
+ scope :blog_subscriptions, -> { where(comment_id: nil) }
16
+ belongs_to :comment, inverse_of: :subscription, optional: true
16
17
 
17
- after_create :deliver_welcome_email
18
+ # Get the comment's post as our own
19
+ delegate :post, to: :comment, allow_nil: true
20
+
21
+ # Using after_commit since we use deliver_later and re-load them from the database
22
+ after_create_commit :deliver_welcome_email
18
23
  after_create { Proclaim.notify_new_subscription(self) }
19
24
 
20
25
  # RFC-compliant email addresses are way nasty to match with regex, so why
21
26
  # try? We'll be sending them an email anyway-- if they don't get it, they
22
27
  # can re-subscribe. We'll just do an easy validation match here.
23
- validates :email, uniqueness: { scope: :post_id, case_sensitive: false }, format: { with: /@/ }
28
+ validates :email, format: { with: /@/ }
24
29
 
25
30
  validates_presence_of :name
26
31
 
27
- # Subscriptions aren't required to belong to a post, but if we're given
28
- # one it had better be valid
29
- validates_presence_of :post, if: :post_id
32
+ # Subscriptions aren't required to belong to a comment, but if we're
33
+ # given one it had better be valid
34
+ validates_presence_of :comment, if: :comment_id
35
+
36
+ validate :email_is_unique
30
37
 
31
38
  def deliver_welcome_email
32
- SubscriptionMailer.welcome_email(self).deliver_later
39
+ SubscriptionMailer.with(subscription_id: id).welcome_email.deliver_later
33
40
  end
34
41
 
35
42
  def deliver_new_post_notification_email(post)
36
- SubscriptionMailer.new_post_notification_email(self, post).deliver_later
43
+ SubscriptionMailer.with(subscription_id: id, post_id: post.id).new_post_notification_email.deliver_later
37
44
  end
38
45
 
39
46
  def deliver_new_comment_notification_email(comment)
40
- SubscriptionMailer.new_comment_notification_email(self, comment).deliver_later
47
+ SubscriptionMailer.with(subscription_id: id, comment_id: comment.id).new_comment_notification_email.deliver_later
41
48
  end
42
49
 
43
50
  def token
@@ -60,5 +67,20 @@ module Proclaim
60
67
  def self.create_token(subscription)
61
68
  verifier.generate(subscription.id)
62
69
  end
70
+
71
+ private
72
+
73
+ def email_is_unique
74
+ other_subscriptions = Subscription.where(email: email)
75
+ unless other_subscriptions.empty?
76
+ other_subscriptions.each do | other_subscription |
77
+ if comment.nil? && other_subscription.comment.nil?
78
+ errors.add(:email, "is already subscribed")
79
+ elsif comment.post == other_subscription.post
80
+ errors.add(:email, "is already subscribed to comments on this post")
81
+ end
82
+ end
83
+ end
84
+ end
63
85
  end
64
86
  end