proclaim 0.5.6 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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