about summary refs log tree commit diff stats
path: root/app/controllers/blogs_controller.rb
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2024-12-07 15:54:39 -0500
committerStar Rauchenberger <fefferburbia@gmail.com>2024-12-07 15:54:39 -0500
commita996f3bd05fc480247fd112f23fa3e67f7d5d7b5 (patch)
tree2df0a56e8cc42ccd632db5b2c022b7dbf8d74444 /app/controllers/blogs_controller.rb
parent59f5508d5bc0cee856105a5bd52e1deaee44b842 (diff)
downloadthoughts-a996f3bd05fc480247fd112f23fa3e67f7d5d7b5.tar.gz
thoughts-a996f3bd05fc480247fd112f23fa3e67f7d5d7b5.tar.bz2
thoughts-a996f3bd05fc480247fd112f23fa3e67f7d5d7b5.zip
Added support for liking blog posts via webmention
Diffstat (limited to 'app/controllers/blogs_controller.rb')
-rw-r--r--app/controllers/blogs_controller.rb34
1 files changed, 34 insertions, 0 deletions
diff --git a/app/controllers/blogs_controller.rb b/app/controllers/blogs_controller.rb index 033d6bb..4bbbc28 100644 --- a/app/controllers/blogs_controller.rb +++ b/app/controllers/blogs_controller.rb
@@ -1,6 +1,9 @@
1require 'microformats'
1require 'redcarpet/render_strip' 2require 'redcarpet/render_strip'
3require 'webmention'
2 4
3class BlogsController < ApplicationController 5class BlogsController < ApplicationController
6 skip_before_action :verify_authenticity_token, only: [:webmention]
4 7
5 def summary 8 def summary
6 @blogs = Blog.where(published: true).order(published_at: :desc).paginate(page: params[:page], per_page: 10) 9 @blogs = Blog.where(published: true).order(published_at: :desc).paginate(page: params[:page], per_page: 10)
@@ -89,4 +92,35 @@ class BlogsController < ApplicationController
89 end 92 end
90 end 93 end
91 94
95 def webmention
96 @blog = Blog.find_by_slug(params[:slug])
97
98 raise ActiveRecord::RecordNotFound unless @blog
99 raise ActiveRecord::RecordNotFound unless @blog.published
100
101 permalink = url_for(@blog)
102
103 target = params[:target]
104 unless target == permalink
105 render json: { error: "Incorrect target for webmention endpoint (#{target} != #{permalink})." }
106 return
107 end
108
109 source = params[:source]
110 verification = Webmention.verify_webmention(source, target)
111 unless verification.verified?
112 render json: { error: "Webmention could not be verified." }
113 return
114 end
115
116 response = Webmention::Request.get(source)
117 parsed = Microformats.parse(response.body.to_s)
118
119 if parsed.entry.properties.to_hash.include?("like-of") and parsed.entry.like_of(:all).map(&:to_s).include? permalink
120 @blog.like!(parsed.entry.author.url, parsed.entry.author.name)
121 end
122
123 head :ok
124 end
125
92end 126end