PostStatusService can attach media to status, ProcessFeedService likewise
This commit is contained in:
parent
ae1fac0062
commit
eec0dc46a6
|
@ -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/
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
|
@ -1,2 +0,0 @@
|
||||||
module StatusesHelper
|
|
||||||
end
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
Loading…
Reference in New Issue