PostStatusService can attach media to status, ProcessFeedService likewise

This commit is contained in:
Eugen Rochko 2016-09-05 18:39:53 +02:00
parent ae1fac0062
commit eec0dc46a6
12 changed files with 32 additions and 85 deletions

View File

@ -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/

View File

@ -7,7 +7,7 @@ class Api::StatusesController < ApiController
end end
def create 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 render action: :show
end end

View File

@ -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

View File

@ -1,2 +0,0 @@
module StatusesHelper
end

View File

@ -10,4 +10,12 @@ class MediaAttachment < ApplicationRecord
def local? def local?
self.remote_url.blank? self.remote_url.blank?
end 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 end

View File

@ -3,9 +3,11 @@ class PostStatusService < BaseService
# @param [Account] account Account from which to post # @param [Account] account Account from which to post
# @param [String] text Message # @param [String] text Message
# @param [Status] in_reply_to Optional status to reply to # @param [Status] in_reply_to Optional status to reply to
# @param [Enumerable] media_ids Optional array of media IDs to attach
# @return [Status] # @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) status = account.statuses.create!(text: text, thread: in_reply_to)
attach_media(status, media_ids)
process_mentions_service.(status) process_mentions_service.(status)
DistributionWorker.perform_async(status.id) DistributionWorker.perform_async(status.id)
account.ping!(account_url(account, format: 'atom'), [Rails.configuration.x.hub_url]) account.ping!(account_url(account, format: 'atom'), [Rails.configuration.x.hub_url])
@ -14,6 +16,13 @@ class PostStatusService < BaseService
private 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 def process_mentions_service
@process_mentions_service ||= ProcessMentionsService.new @process_mentions_service ||= ProcessMentionsService.new
end end

View File

@ -38,6 +38,7 @@ class ProcessFeedService < BaseService
# If we added a status, go through accounts it mentions and create respective relations # If we added a status, go through accounts it mentions and create respective relations
unless status.new_record? unless status.new_record?
record_remote_mentions(status, entry.xpath('./xmlns:link[@rel="mentioned"]')) record_remote_mentions(status, entry.xpath('./xmlns:link[@rel="mentioned"]'))
process_attachments(entry, status)
DistributionWorker.perform_async(status.id) DistributionWorker.perform_async(status.id)
end end
end end
@ -68,6 +69,16 @@ class ProcessFeedService < BaseService
end end
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) def add_post!(_entry, status)
status.save! status.save!
end end

View File

@ -30,7 +30,6 @@ Rails.application.routes.draw do
end end
resource :settings, only: [:show, :update] resource :settings, only: [:show, :update]
resources :statuses, only: [:create]
namespace :api do namespace :api do
# PubSubHubbub # PubSubHubbub

View File

@ -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

View File

@ -1,15 +1,5 @@
require 'rails_helper' 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 RSpec.describe Api::Accounts::LookupHelper, type: :helper do
pending "add some examples to (or delete) #{__FILE__}"
end end

View File

@ -1,15 +1,5 @@
require 'rails_helper' 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 RSpec.describe Api::MediaHelper, type: :helper do
pending "add some examples to (or delete) #{__FILE__}"
end end

View File

@ -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