Upload media to mastodon
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
require "digest"
|
require "digest"
|
||||||
require "dry/monads"
|
require "dry/monads"
|
||||||
require "httparty"
|
require "httparty"
|
||||||
|
require "tempfile"
|
||||||
|
require "open-uri"
|
||||||
|
|
||||||
module Adamantium
|
module Adamantium
|
||||||
module Syndication
|
module Syndication
|
||||||
@@ -20,19 +22,39 @@ module Adamantium
|
|||||||
post[:content]
|
post[:content]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
tags = post[:category].map { |tag| "##{tag}" }.join(" ")
|
||||||
text_with_tags = "#{content} #{tags}"
|
text_with_tags = "#{content} #{tags}"
|
||||||
|
|
||||||
key = Digest::MD5.hexdigest text_with_tags
|
key = Digest::MD5.hexdigest text_with_tags
|
||||||
mastodon_token = settings.mastodon_token
|
mastodon_token = settings.mastodon_token
|
||||||
mastodon_server = settings.mastodon_server.split("@").first
|
mastodon_server = settings.mastodon_server.split("@").first
|
||||||
|
|
||||||
|
media_ids = post[:photos]&.map do |photo|
|
||||||
|
file = Tempfile.new(SecureRandom.uuid)
|
||||||
|
file.write(URL.open(file[:value]).read)
|
||||||
|
file.rewind
|
||||||
|
response = HTTParty.post("#{mastodon_server}api/v2/media", {
|
||||||
|
headers: {
|
||||||
|
Authorization: "Bearer #{mastodon_token}"
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
file: file.read,
|
||||||
|
description: photo[:alt]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
file.close
|
||||||
|
file.unlink
|
||||||
|
JSON.parse(response.body).fetch(:id, nil)
|
||||||
|
end&.compact
|
||||||
|
|
||||||
response = HTTParty.post("#{mastodon_server}api/v1/statuses", {
|
response = HTTParty.post("#{mastodon_server}api/v1/statuses", {
|
||||||
headers: {
|
headers: {
|
||||||
"Idempotency-Key": key,
|
"Idempotency-Key": key,
|
||||||
Authorization: "Bearer #{mastodon_token}"
|
Authorization: "Bearer #{mastodon_token}"
|
||||||
},
|
},
|
||||||
body: {
|
body: {
|
||||||
status: text_with_tags
|
status: text_with_tags,
|
||||||
|
media_ids: media_ids
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@@ -12,11 +12,11 @@ RSpec.describe Adamantium::Commands::Media::Upload do
|
|||||||
}
|
}
|
||||||
|
|
||||||
result = subject.call(file: file)
|
result = subject.call(file: file)
|
||||||
expected_path = "media/#{Time.now.strftime("%m-%Y")}/foo.txt"
|
expected_path = /media\/#{Time.now.strftime("%m-%Y")}\/[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}.txt/
|
||||||
expect(result).to be_success
|
expect(result).to be_success
|
||||||
expect(result.value!).to eq "http://localhost/#{expected_path}"
|
expect(result.value!).to match expected_path
|
||||||
File.read("public/#{expected_path}")
|
File.read("public/#{result.value!.gsub("http://localhost/", "")}")
|
||||||
File.delete("public/#{expected_path}")
|
File.delete("public/#{result.value!.gsub("http://localhost/", "")}")
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns a Failure if the file couldn't be saved" do
|
it "returns a Failure if the file couldn't be saved" do
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
RSpec.describe "Post creation", type: [:request, :db] do
|
RSpec.describe "Post creation", :db, :requests do
|
||||||
let(:post_repo) { Adamantium::Repos::PostRepo.new }
|
let(:post_repo) { Adamantium::Repos::PostRepo.new }
|
||||||
|
|
||||||
context "posts" do
|
context "posts" do
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
RSpec.describe "Root", type: :request do
|
RSpec.describe "Root", :requests do
|
||||||
it "is successful" do
|
it "is successful" do
|
||||||
get "/"
|
get "/"
|
||||||
|
|
||||||
|
@@ -9,14 +9,14 @@ RSpec.configure do |config|
|
|||||||
DatabaseCleaner[:sequel].clean_with :truncation
|
DatabaseCleaner[:sequel].clean_with :truncation
|
||||||
end
|
end
|
||||||
|
|
||||||
config.prepend_before :each, type: :db do |example|
|
config.prepend_before :each, :db do |example|
|
||||||
strategy = example.metadata[:js] ? :truncation : :transaction
|
strategy = example.metadata[:js] ? :truncation : :transaction
|
||||||
DatabaseCleaner[:sequel].strategy = strategy
|
DatabaseCleaner[:sequel].strategy = strategy
|
||||||
|
|
||||||
DatabaseCleaner[:sequel].start
|
DatabaseCleaner[:sequel].start
|
||||||
end
|
end
|
||||||
|
|
||||||
config.append_after :each, type: :db do
|
config.append_after :each, :db do
|
||||||
DatabaseCleaner[:sequel].clean
|
DatabaseCleaner[:sequel].clean
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
# require_with_metadata: true
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "rack/test"
|
require "rack/test"
|
||||||
@@ -7,6 +8,6 @@ RSpec.shared_context "Hanami app" do
|
|||||||
end
|
end
|
||||||
|
|
||||||
RSpec.configure do |config|
|
RSpec.configure do |config|
|
||||||
config.include Rack::Test::Methods, type: :request
|
config.include Rack::Test::Methods, :requests
|
||||||
config.include_context "Hanami app", type: :request
|
config.include_context "Hanami app", :requests
|
||||||
end
|
end
|
||||||
|
@@ -13,7 +13,9 @@ RSpec.describe Adamantium::Syndication::Mastodon do
|
|||||||
slug: "my-post",
|
slug: "my-post",
|
||||||
category: ["ruby", "rspec"],
|
category: ["ruby", "rspec"],
|
||||||
published_at: Time.now,
|
published_at: Time.now,
|
||||||
post_type: "post"
|
post_type: "post",
|
||||||
|
syndicate_to: [],
|
||||||
|
photos: []
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user