forked from fedi/mastodon
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
|
||||
|
||||
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
|
||||
|
||||
|
|
|
@ -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?
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -30,7 +30,6 @@ Rails.application.routes.draw do
|
|||
end
|
||||
|
||||
resource :settings, only: [:show, :update]
|
||||
resources :statuses, only: [:create]
|
||||
|
||||
namespace :api do
|
||||
# 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'
|
||||
|
||||
# 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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 a new issue