From ae1fac006206ab28cd7cba63ab85c07a27f3d606 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 5 Sep 2016 17:46:36 +0200 Subject: [PATCH] Add API to upload media attachments --- app/assets/stylesheets/api/media.scss | 3 ++ app/controllers/api/media_controller.rb | 8 +++++ app/helpers/api/media_helper.rb | 2 ++ app/models/account.rb | 2 ++ app/models/media_attachment.rb | 13 +++++++ app/models/status.rb | 1 + app/views/api/media/create.rabl | 3 ++ config/environments/test.rb | 2 ++ config/routes.rb | 1 + ...20160905150353_create_media_attachments.rb | 14 ++++++++ db/schema.rb | 15 +++++++- spec/controllers/api/media_controller_spec.rb | 34 ++++++++++++++++++ .../api/statuses_controller_spec.rb | 4 +-- .../media_attachment_fabricator.rb | 6 ++++ spec/fixtures/files/attachment.jpg | Bin 0 -> 61022 bytes spec/helpers/api/media_helper_spec.rb | 15 ++++++++ spec/models/media_attachment_spec.rb | 5 +++ spec/rails_helper.rb | 2 ++ spec/spec_helper.rb | 12 +++++++ 19 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 app/assets/stylesheets/api/media.scss create mode 100644 app/controllers/api/media_controller.rb create mode 100644 app/helpers/api/media_helper.rb create mode 100644 app/models/media_attachment.rb create mode 100644 app/views/api/media/create.rabl create mode 100644 db/migrate/20160905150353_create_media_attachments.rb create mode 100644 spec/controllers/api/media_controller_spec.rb create mode 100644 spec/fabricators/media_attachment_fabricator.rb create mode 100644 spec/fixtures/files/attachment.jpg create mode 100644 spec/helpers/api/media_helper_spec.rb create mode 100644 spec/models/media_attachment_spec.rb diff --git a/app/assets/stylesheets/api/media.scss b/app/assets/stylesheets/api/media.scss new file mode 100644 index 0000000000..e3c4fac3c7 --- /dev/null +++ b/app/assets/stylesheets/api/media.scss @@ -0,0 +1,3 @@ +// 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/media_controller.rb b/app/controllers/api/media_controller.rb new file mode 100644 index 0000000000..d5a0a124a5 --- /dev/null +++ b/app/controllers/api/media_controller.rb @@ -0,0 +1,8 @@ +class Api::MediaController < ApiController + before_action :doorkeeper_authorize! + respond_to :json + + def create + @media = MediaAttachment.create!(account: current_user.account, file: params[:file]) + end +end diff --git a/app/helpers/api/media_helper.rb b/app/helpers/api/media_helper.rb new file mode 100644 index 0000000000..ecaa91e7b7 --- /dev/null +++ b/app/helpers/api/media_helper.rb @@ -0,0 +1,2 @@ +module Api::MediaHelper +end diff --git a/app/models/account.rb b/app/models/account.rb index bcd6c1eba6..8e0283ca16 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -31,6 +31,8 @@ class Account < ApplicationRecord has_many :following, through: :active_relationships, source: :target_account has_many :followers, through: :passive_relationships, source: :account + has_many :media_attachments, dependent: :destroy + MENTION_RE = /(?:^|\s|\.)@([a-z0-9_]+(?:@[a-z0-9\.\-]+)?)/i def follow!(other_account) diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb new file mode 100644 index 0000000000..af1a4b9af7 --- /dev/null +++ b/app/models/media_attachment.rb @@ -0,0 +1,13 @@ +class MediaAttachment < ApplicationRecord + belongs_to :account, inverse_of: :media_attachments + belongs_to :status, inverse_of: :media_attachments + + has_attached_file :file + validates_attachment_content_type :file, content_type: /\Aimage\/.*\z/ + + validates :account, presence: true + + def local? + self.remote_url.blank? + end +end diff --git a/app/models/status.rb b/app/models/status.rb index 14a698aae8..05ae1a06ed 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -11,6 +11,7 @@ class Status < ApplicationRecord has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread has_many :mentions, dependent: :destroy + has_many :media_attachments, dependent: :destroy validates :account, presence: true validates :uri, uniqueness: true, unless: 'local?' diff --git a/app/views/api/media/create.rabl b/app/views/api/media/create.rabl new file mode 100644 index 0000000000..23909066d3 --- /dev/null +++ b/app/views/api/media/create.rabl @@ -0,0 +1,3 @@ +object @media +attribute :id +node(:url) { |media| full_asset_url(media.file.url) } diff --git a/config/environments/test.rb b/config/environments/test.rb index fea1c51fdf..1855aadf25 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -41,3 +41,5 @@ Rails.application.configure do # Raises error for missing translations # config.action_view.raise_on_missing_translations = true end + +Paperclip::Attachment.default_options[:path] = "#{Rails.root}/spec/test_files/:class/:id_partition/:style.:extension" diff --git a/config/routes.rb b/config/routes.rb index 7b6b1ab3ad..918eb73474 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -54,6 +54,7 @@ Rails.application.routes.draw do end resources :follows, only: [:create] + resources :media, only: [:create] resources :accounts, only: [:show] do collection do diff --git a/db/migrate/20160905150353_create_media_attachments.rb b/db/migrate/20160905150353_create_media_attachments.rb new file mode 100644 index 0000000000..32d0897d86 --- /dev/null +++ b/db/migrate/20160905150353_create_media_attachments.rb @@ -0,0 +1,14 @@ +class CreateMediaAttachments < ActiveRecord::Migration[5.0] + def change + create_table :media_attachments do |t| + t.integer :status_id, null: true, default: nil + t.attachment :file + t.string :remote_url, null: false, default: '' + t.integer :account_id + + t.timestamps + end + + add_index :media_attachments, :status_id + end +end diff --git a/db/schema.rb b/db/schema.rb index b63df0fea4..4a3078e642 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160826155805) do +ActiveRecord::Schema.define(version: 20160905150353) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -59,6 +59,19 @@ ActiveRecord::Schema.define(version: 20160826155805) do t.index ["account_id", "target_account_id"], name: "index_follows_on_account_id_and_target_account_id", unique: true, using: :btree end + create_table "media_attachments", force: :cascade do |t| + t.integer "status_id" + t.string "file_file_name" + t.string "file_content_type" + t.integer "file_file_size" + t.datetime "file_updated_at" + t.string "remote_url", default: "", null: false + t.integer "account_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["status_id"], name: "index_media_attachments_on_status_id", using: :btree + end + create_table "mentions", force: :cascade do |t| t.integer "account_id" t.integer "status_id" diff --git a/spec/controllers/api/media_controller_spec.rb b/spec/controllers/api/media_controller_spec.rb new file mode 100644 index 0000000000..2f216c1d5a --- /dev/null +++ b/spec/controllers/api/media_controller_spec.rb @@ -0,0 +1,34 @@ +require 'rails_helper' + +RSpec.describe Api::MediaController, type: :controller do + render_views + + let(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let(:token) { double acceptable?: true, resource_owner_id: user.id } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + describe 'POST #create' do + before do + post :create, params: { file: fixture_file_upload('files/attachment.jpg', 'image/jpeg') } + end + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + + it 'creates a media attachment' do + expect(MediaAttachment.first).to_not be_nil + end + + it 'uploads a file' do + expect(MediaAttachment.first).to have_attached_file(:file) + end + + it 'returns media ID in JSON' do + expect(body_as_json[:id]).to eq MediaAttachment.first.id + end + end +end diff --git a/spec/controllers/api/statuses_controller_spec.rb b/spec/controllers/api/statuses_controller_spec.rb index 15fdbdaffc..64e201f3cc 100644 --- a/spec/controllers/api/statuses_controller_spec.rb +++ b/spec/controllers/api/statuses_controller_spec.rb @@ -64,7 +64,7 @@ RSpec.describe Api::StatusesController, type: :controller do end it 'return json with updated attributes' do - hash_body = JSON.parse(response.body).with_indifferent_access + hash_body = body_as_json expect(hash_body[:reblog][:id]).to eq status.id expect(hash_body[:reblog][:reblogs_count]).to eq 1 @@ -92,7 +92,7 @@ RSpec.describe Api::StatusesController, type: :controller do end it 'return json with updated attributes' do - hash_body = JSON.parse(response.body).with_indifferent_access + hash_body = body_as_json expect(hash_body[:id]).to eq status.id expect(hash_body[:favourites_count]).to eq 1 diff --git a/spec/fabricators/media_attachment_fabricator.rb b/spec/fabricators/media_attachment_fabricator.rb new file mode 100644 index 0000000000..42aa5ab023 --- /dev/null +++ b/spec/fabricators/media_attachment_fabricator.rb @@ -0,0 +1,6 @@ +Fabricator(:media_attachment) do + status_id 1 + file "" + remote_url "MyString" + account_id 1 +end diff --git a/spec/fixtures/files/attachment.jpg b/spec/fixtures/files/attachment.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1d40539ac0484516a4f72989d28d1bd33e46d41 GIT binary patch literal 61022 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 Bw1ofw literal 0 HcmV?d00001 diff --git a/spec/helpers/api/media_helper_spec.rb b/spec/helpers/api/media_helper_spec.rb new file mode 100644 index 0000000000..5813264ad3 --- /dev/null +++ b/spec/helpers/api/media_helper_spec.rb @@ -0,0 +1,15 @@ +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/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb new file mode 100644 index 0000000000..0a16276845 --- /dev/null +++ b/spec/models/media_attachment_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe MediaAttachment, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index e9c732f6f7..3c810eb9eb 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -6,6 +6,7 @@ abort("The Rails environment is running in production mode!") if Rails.env.produ require 'spec_helper' require 'rspec/rails' require 'webmock/rspec' +require 'paperclip/matchers' ActiveRecord::Migration.maintain_test_schema! WebMock.disable_net_connect! @@ -19,6 +20,7 @@ RSpec.configure do |config| config.include Devise::Test::ControllerHelpers, type: :controller config.include Devise::TestHelpers, type: :view + config.include Paperclip::Shoulda::Matchers end RSpec::Sidekiq.configure do |config| diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d6c1dc95b4..8d77b39f32 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -12,4 +12,16 @@ RSpec.configure do |config| config.mock_with :rspec do |mocks| mocks.verify_partial_doubles = true end + + config.after(:suite) do + FileUtils.rm_rf(Dir["#{Rails.root}/spec/test_files/"]) + end +end + +def body_as_json + json_str_to_hash(response.body) +end + +def json_str_to_hash(str) + JSON.parse(str).with_indifferent_access end