commit: eec0dc46a6d6782f6aebdc759d4822ef17fd57a2
parent: ae1fac006206ab28cd7cba63ab85c07a27f3d606
Author: Eugen Rochko <eugen@zeonfederated.com>
Date: Mon, 5 Sep 2016 18:39:53 +0200
PostStatusService can attach media to status, ProcessFeedService likewise
Diffstat:
12 files changed, 32 insertions(+), 85 deletions(-)
diff --git a/app/assets/stylesheets/api/media.scss b/app/assets/stylesheets/api/media.scss
@@ -1,3 +0,0 @@
-// Place all the styles related to the Api::Media controller here.
-// They will automatically be included in application.css.
-// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/controllers/api/statuses_controller.rb b/app/controllers/api/statuses_controller.rb
@@ -7,7 +7,7 @@ class Api::StatusesController < ApiController
end
def create
- @status = PostStatusService.new.(current_user.account, params[:status], params[:in_reply_to_id].blank? ? nil : Status.find(params[:in_reply_to_id]))
+ @status = PostStatusService.new.(current_user.account, params[:status], params[:in_reply_to_id].blank? ? nil : Status.find(params[:in_reply_to_id]), params[:media_ids])
render action: :show
end
diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb
@@ -1,16 +0,0 @@
-class StatusesController < ApplicationController
- before_action :authenticate_user!
-
- def create
- PostStatusService.new.(current_user.account, status_params[:text])
- redirect_to root_path
- rescue ActiveRecord::RecordInvalid
- redirect_to root_path
- end
-
- private
-
- def status_params
- params.require(:status).permit(:text)
- end
-end
diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb
@@ -1,2 +0,0 @@
-module StatusesHelper
-end
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
@@ -10,4 +10,12 @@ class MediaAttachment < ApplicationRecord
def local?
self.remote_url.blank?
end
+
+ def file_remote_url=(url)
+ unless self[:file_remote_url] == url
+ self.file = URI.parse(url)
+ end
+
+ self[:file_remote_url] = url
+ end
end
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
@@ -3,9 +3,11 @@ class PostStatusService < BaseService
# @param [Account] account Account from which to post
# @param [String] text Message
# @param [Status] in_reply_to Optional status to reply to
+ # @param [Enumerable] media_ids Optional array of media IDs to attach
# @return [Status]
- def call(account, text, in_reply_to = nil)
+ def call(account, text, in_reply_to = nil, media_ids = nil)
status = account.statuses.create!(text: text, thread: in_reply_to)
+ attach_media(status, media_ids)
process_mentions_service.(status)
DistributionWorker.perform_async(status.id)
account.ping!(account_url(account, format: 'atom'), [Rails.configuration.x.hub_url])
@@ -14,6 +16,13 @@ class PostStatusService < BaseService
private
+ def attach_media(status, media_ids)
+ return if media_ids.nil? || !media_ids.is_a?(Enumerable)
+
+ media = MediaAttachment.where(status_id: nil).where(id: media_ids.take(2).map { |id| id.to_i })
+ media.update(status_id: status.id)
+ end
+
def process_mentions_service
@process_mentions_service ||= ProcessMentionsService.new
end
diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb
@@ -38,6 +38,7 @@ class ProcessFeedService < BaseService
# If we added a status, go through accounts it mentions and create respective relations
unless status.new_record?
record_remote_mentions(status, entry.xpath('./xmlns:link[@rel="mentioned"]'))
+ process_attachments(entry, status)
DistributionWorker.perform_async(status.id)
end
end
@@ -68,6 +69,16 @@ class ProcessFeedService < BaseService
end
end
+ def process_attachments(entry, status)
+ entry.xpath('./xmlns:link[@rel="enclosure"]').each do |enclosure_link|
+ next if enclosure_link.attribute('href').nil?
+
+ media = MediaAttachment.new(account: status.account, status: status, remote_url: enclosure_link.attribute('href').value)
+ media.file_remote_url = enclosure_link.attribute('href').value
+ media.save
+ end
+ end
+
def add_post!(_entry, status)
status.save!
end
diff --git a/config/routes.rb b/config/routes.rb
@@ -30,7 +30,6 @@ Rails.application.routes.draw do
end
resource :settings, only: [:show, :update]
- resources :statuses, only: [:create]
namespace :api do
# PubSubHubbub
diff --git a/spec/controllers/statuses_controller_spec.rb b/spec/controllers/statuses_controller_spec.rb
@@ -1,24 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe StatusesController, type: :controller do
- let(:user) { Fabricate(:user) }
-
- before do
- sign_in user, scope: :user
- end
-
- describe 'POST #create' do
- before do
- stub_request(:post, "https://pubsubhubbub.superfeedr.com/").to_return(:status => 200, :body => "", :headers => {})
- post :create, params: { status: { text: 'Hello world' } }
- end
-
- it 'redirects back to homepage' do
- expect(response).to redirect_to(root_path)
- end
-
- it 'creates a new status' do
- expect(user.account.statuses.count).to eq 1
- end
- end
-end
diff --git a/spec/helpers/api/accounts/lookup_helper_spec.rb b/spec/helpers/api/accounts/lookup_helper_spec.rb
@@ -1,15 +1,5 @@
require 'rails_helper'
-# Specs in this file have access to a helper object that includes
-# the Api::Accounts::LookupHelper. For example:
-#
-# describe Api::Accounts::LookupHelper do
-# describe "string concat" do
-# it "concats two strings with spaces" do
-# expect(helper.concat_strings("this","that")).to eq("this that")
-# end
-# end
-# end
RSpec.describe Api::Accounts::LookupHelper, type: :helper do
- pending "add some examples to (or delete) #{__FILE__}"
+
end
diff --git a/spec/helpers/api/media_helper_spec.rb b/spec/helpers/api/media_helper_spec.rb
@@ -1,15 +1,5 @@
require 'rails_helper'
-# Specs in this file have access to a helper object that includes
-# the Api::MediaHelper. For example:
-#
-# describe Api::MediaHelper do
-# describe "string concat" do
-# it "concats two strings with spaces" do
-# expect(helper.concat_strings("this","that")).to eq("this that")
-# end
-# end
-# end
RSpec.describe Api::MediaHelper, type: :helper do
- pending "add some examples to (or delete) #{__FILE__}"
+
end
diff --git a/spec/helpers/statuses_helper_spec.rb b/spec/helpers/statuses_helper_spec.rb
@@ -1,15 +0,0 @@
-require 'rails_helper'
-
-# Specs in this file have access to a helper object that includes
-# the StatusesHelper. For example:
-#
-# describe StatusesHelper do
-# describe "string concat" do
-# it "concats two strings with spaces" do
-# expect(helper.concat_strings("this","that")).to eq("this that")
-# end
-# end
-# end
-RSpec.describe StatusesHelper, type: :helper do
- pending "add some examples to (or delete) #{__FILE__}"
-end