Improve Service::Tumblr
- Fix rubocop styles - Improve specs coverage
This commit is contained in:
parent
92a096f03c
commit
b2b03d2679
2 changed files with 82 additions and 63 deletions
|
|
@ -1,69 +1,71 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Services::Tumblr < Service
|
||||
MAX_CHARACTERS = 1000
|
||||
module Services
|
||||
class Tumblr < Service
|
||||
MAX_CHARACTERS = 1000
|
||||
|
||||
def provider
|
||||
"tumblr"
|
||||
end
|
||||
|
||||
def consumer_key
|
||||
AppConfig.services.tumblr.key
|
||||
end
|
||||
|
||||
def consumer_secret
|
||||
AppConfig.services.tumblr.secret
|
||||
end
|
||||
|
||||
def post(post, url='')
|
||||
body = build_tumblr_post(post, url)
|
||||
user_info = JSON.parse(client.get("/v2/user/info").body)
|
||||
blogs = user_info["response"]["user"]["blogs"]
|
||||
primaryblog = blogs.find {|blog| blog["primary"] } || blogs[0]
|
||||
tumblr_ids = {}
|
||||
|
||||
blogurl = URI.parse(primaryblog["url"])
|
||||
resp = client.post("/v2/blog/#{blogurl.host}/post", body)
|
||||
if resp.code == "201"
|
||||
tumblr_ids[blogurl.host.to_s] = JSON.parse(resp.body)["response"]["id"]
|
||||
def provider
|
||||
"tumblr"
|
||||
end
|
||||
|
||||
post.tumblr_ids = tumblr_ids.to_json
|
||||
post.save
|
||||
end
|
||||
def post(post, url="")
|
||||
body = build_tumblr_post(post, url)
|
||||
user_info = JSON.parse(client.get("/v2/user/info").body)
|
||||
blogs = user_info["response"]["user"]["blogs"]
|
||||
primaryblog = blogs.find {|blog| blog["primary"] } || blogs[0]
|
||||
tumblr_ids = {}
|
||||
|
||||
def build_tumblr_post(post, url)
|
||||
{ :type => 'text', :format => "markdown", :body => tumblr_template(post, url) }
|
||||
end
|
||||
blogurl = URI.parse(primaryblog["url"])
|
||||
tumblr_ids[blogurl.host.to_s] = request_to_external_blog(blogurl, body)
|
||||
|
||||
def tumblr_template(post, url)
|
||||
photo_html = post.photos.map {|photo|
|
||||
"})\n\n"
|
||||
}.join
|
||||
|
||||
"#{photo_html}#{post.message.html(mentioned_people: [])}\n\n[original post](#{url})"
|
||||
end
|
||||
|
||||
def post_opts(post)
|
||||
{tumblr_ids: post.tumblr_ids} if post.tumblr_ids.present?
|
||||
end
|
||||
|
||||
def delete_from_service(opts)
|
||||
logger.debug "event=delete_from_service type=tumblr sender_id=#{user_id} tumblr_ids=#{opts[:tumblr_ids]}"
|
||||
tumblr_posts = JSON.parse(opts[:tumblr_ids])
|
||||
tumblr_posts.each do |blog_name, post_id|
|
||||
delete_from_tumblr(blog_name, post_id)
|
||||
post.tumblr_ids = tumblr_ids.to_json
|
||||
post.save
|
||||
end
|
||||
end
|
||||
|
||||
def delete_from_tumblr(blog_name, service_post_id)
|
||||
client.post("/v2/blog/#{blog_name}/post/delete", "id" => service_post_id)
|
||||
end
|
||||
def post_opts(post)
|
||||
{tumblr_ids: post.tumblr_ids} if post.tumblr_ids.present?
|
||||
end
|
||||
|
||||
private
|
||||
def client
|
||||
@consumer ||= OAuth::Consumer.new(consumer_key, consumer_secret, :site => 'http://api.tumblr.com')
|
||||
@client ||= OAuth::AccessToken.new(@consumer, self.access_token, self.access_secret)
|
||||
def delete_from_service(opts)
|
||||
logger.debug "event=delete_from_service type=tumblr sender_id=#{user_id} tumblr_ids=#{opts[:tumblr_ids]}"
|
||||
tumblr_posts = JSON.parse(opts[:tumblr_ids])
|
||||
tumblr_posts.each do |blog_name, post_id|
|
||||
delete_from_tumblr(blog_name, post_id)
|
||||
end
|
||||
end
|
||||
|
||||
def build_tumblr_post(post, url)
|
||||
{type: "text", format: "markdown", body: tumblr_template(post, url)}
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def client
|
||||
@consumer ||= OAuth::Consumer.new(consumer_key, consumer_secret, site: "http://api.tumblr.com")
|
||||
@client ||= OAuth::AccessToken.new(@consumer, access_token, access_secret)
|
||||
end
|
||||
|
||||
def tumblr_template(post, url)
|
||||
photo_html = post.photos.map {|photo| "})\n\n" }.join
|
||||
|
||||
"#{photo_html}#{post.message.html(mentioned_people: [])}\n\n[original post](#{url})"
|
||||
end
|
||||
|
||||
def delete_from_tumblr(blog_name, service_post_id)
|
||||
client.post("/v2/blog/#{blog_name}/post/delete", "id" => service_post_id)
|
||||
end
|
||||
|
||||
def request_to_external_blog(blogurl, body)
|
||||
resp = client.post("/v2/blog/#{blogurl.host}/post", body)
|
||||
JSON.parse(resp.body)["response"]["id"] if resp.code == "201"
|
||||
end
|
||||
|
||||
def consumer_key
|
||||
AppConfig.services.tumblr.key
|
||||
end
|
||||
|
||||
def consumer_secret
|
||||
AppConfig.services.tumblr.secret
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,16 @@ describe Services::Tumblr, type: :model do
|
|||
let(:service) { Services::Tumblr.new(access_token: "yeah", access_secret: "foobar") }
|
||||
let(:post_id) { "bla" }
|
||||
|
||||
describe "#provider" do
|
||||
subject(:provider) { service.provider }
|
||||
|
||||
let(:expected_provider) { "tumblr" }
|
||||
|
||||
it "returns service provider" do
|
||||
is_expected.to eq expected_provider
|
||||
end
|
||||
end
|
||||
|
||||
describe "#post" do
|
||||
let(:post_request) { {body: service.build_tumblr_post(post, "")} }
|
||||
let(:post_response) { {status: 201, body: {response: {id: post_id}}.to_json} }
|
||||
|
|
@ -16,12 +26,19 @@ describe Services::Tumblr, type: :model do
|
|||
end
|
||||
|
||||
context "with multiple blogs" do
|
||||
let(:user_info) {
|
||||
{response: {user: {blogs: [
|
||||
{primary: false, url: "http://foo.tumblr.com"},
|
||||
{primary: true, url: "http://bar.tumblr.com"}
|
||||
]}}}.to_json
|
||||
}
|
||||
let(:user_info) do
|
||||
{
|
||||
response:
|
||||
{
|
||||
user: {
|
||||
blogs: [
|
||||
{primary: false, url: "http://foo.tumblr.com"},
|
||||
{primary: true, url: "http://bar.tumblr.com"}
|
||||
]
|
||||
}
|
||||
}
|
||||
}.to_json
|
||||
end
|
||||
|
||||
it "posts a status message to the primary blog and stores the id" do
|
||||
stub = stub_request(:post, "http://api.tumblr.com/v2/blog/bar.tumblr.com/post")
|
||||
|
|
|
|||
Loading…
Reference in a new issue