Skip to content
Snippets Groups Projects
Commit eec0dc46 authored by Eugen Rochko's avatar Eugen Rochko
Browse files

PostStatusService can attach media to status, ProcessFeedService likewise

parent ae1fac00
No related branches found
No related tags found
No related merge requests found
// 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
......
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
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
......
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
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
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
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment