コミットを比較
23 コミット
| 作成者 | SHA1 | 日付 | |
|---|---|---|---|
| c9b22d346b | |||
| 283c20b9da | |||
| ec98c6b756 | |||
| d721a64e33 | |||
| 0eb45372c3 | |||
| 27aa5321a1 | |||
| 4c0a4f5d9b | |||
| 41a98ff725 | |||
| c836369dfc | |||
| 363146c219 | |||
| ce28661271 | |||
| d7b136c198 | |||
| 4da3f0afba | |||
| daf9e7e6fa | |||
| 8304909c8c | |||
| 377a09ed70 | |||
| c10ba7a698 | |||
| fa6c547cc9 | |||
| dbc654f346 | |||
| c2102c8f96 | |||
| 510cbb0d78 | |||
| a820ce4c3e | |||
| 507ce1680e |
@@ -140,11 +140,10 @@ class PostsController < ApplicationController
|
|||||||
original_created_from = params[:original_created_from]
|
original_created_from = params[:original_created_from]
|
||||||
original_created_before = params[:original_created_before]
|
original_created_before = params[:original_created_before]
|
||||||
parent_post_ids = parse_parent_post_ids
|
parent_post_ids = parse_parent_post_ids
|
||||||
resized_thumbnail = thumbnail.present? ? Post.resized_thumbnail_attachment(thumbnail) : nil
|
|
||||||
|
|
||||||
post = Post.new(title:, url:, thumbnail_base: nil, uploaded_user: current_user,
|
post = Post.new(title:, url:, thumbnail_base: nil, uploaded_user: current_user,
|
||||||
original_created_from:, original_created_before:)
|
original_created_from:, original_created_before:)
|
||||||
post.thumbnail.attach(resized_thumbnail) if resized_thumbnail
|
post.thumbnail.attach(thumbnail) if thumbnail.present?
|
||||||
|
|
||||||
ApplicationRecord.transaction do
|
ApplicationRecord.transaction do
|
||||||
post.save!
|
post.save!
|
||||||
@@ -157,6 +156,8 @@ class PostsController < ApplicationController
|
|||||||
|
|
||||||
sync_parent_posts!(post, parent_post_ids)
|
sync_parent_posts!(post, parent_post_ids)
|
||||||
|
|
||||||
|
post.resized_thumbnail!
|
||||||
|
|
||||||
PostVersionRecorder.record!(post:, event_type: :create, created_by_user: current_user)
|
PostVersionRecorder.record!(post:, event_type: :create, created_by_user: current_user)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -166,8 +167,6 @@ class PostsController < ApplicationController
|
|||||||
render_validation_error fields: { tags: 'ニコニコ・タグは直接指定できません.' }
|
render_validation_error fields: { tags: 'ニコニコ・タグは直接指定できません.' }
|
||||||
rescue Tag::DeprecatedTagNormalisationError
|
rescue Tag::DeprecatedTagNormalisationError
|
||||||
render_unprocessable_entity '廃止済みタグは付与できません.', field: :tags
|
render_unprocessable_entity '廃止済みタグは付与できません.', field: :tags
|
||||||
rescue MiniMagick::Error
|
|
||||||
render_validation_error fields: { thumbnail: ['サムネイル画像の変換に失敗しました.'] }
|
|
||||||
rescue ArgumentError => e
|
rescue ArgumentError => e
|
||||||
render_validation_error fields: { parent_post_ids: [e.message] }
|
render_validation_error fields: { parent_post_ids: [e.message] }
|
||||||
rescue ActiveRecord::RecordInvalid => e
|
rescue ActiveRecord::RecordInvalid => e
|
||||||
|
|||||||
@@ -1,19 +1,5 @@
|
|||||||
class Post < ApplicationRecord
|
class Post < ApplicationRecord
|
||||||
require 'mini_magick'
|
require 'mini_magick'
|
||||||
require 'stringio'
|
|
||||||
|
|
||||||
def self.resized_thumbnail_attachment(upload)
|
|
||||||
upload.rewind
|
|
||||||
image = MiniMagick::Image.read(upload.read)
|
|
||||||
image.resize '180x180'
|
|
||||||
image.format 'jpg'
|
|
||||||
|
|
||||||
{ io: StringIO.new(image.to_blob),
|
|
||||||
filename: 'resized_thumbnail.jpg',
|
|
||||||
content_type: 'image/jpeg' }
|
|
||||||
ensure
|
|
||||||
upload.rewind
|
|
||||||
end
|
|
||||||
|
|
||||||
belongs_to :uploaded_user, class_name: 'User', optional: true
|
belongs_to :uploaded_user, class_name: 'User', optional: true
|
||||||
|
|
||||||
@@ -101,7 +87,12 @@ class Post < ApplicationRecord
|
|||||||
def resized_thumbnail!
|
def resized_thumbnail!
|
||||||
return unless thumbnail.attached?
|
return unless thumbnail.attached?
|
||||||
|
|
||||||
thumbnail.attach(self.class.resized_thumbnail_attachment(StringIO.new(thumbnail.download)))
|
image = MiniMagick::Image.read(thumbnail.download)
|
||||||
|
image.resize '180x180'
|
||||||
|
thumbnail.purge
|
||||||
|
thumbnail.attach(io: File.open(image.path),
|
||||||
|
filename: 'resized_thumbnail.jpg',
|
||||||
|
content_type: 'image/jpeg')
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
require 'base64'
|
|
||||||
require 'set'
|
require 'set'
|
||||||
|
|
||||||
include ActiveSupport::Testing::TimeHelpers
|
include ActiveSupport::Testing::TimeHelpers
|
||||||
@@ -9,11 +8,6 @@ RSpec.describe 'Posts API', type: :request do
|
|||||||
# resized_thumbnail! が MiniMagick 依存でコケやすいので request spec ではスタブしとくのが無難。
|
# resized_thumbnail! が MiniMagick 依存でコケやすいので request spec ではスタブしとくのが無難。
|
||||||
before do
|
before do
|
||||||
allow_any_instance_of(Post).to receive(:resized_thumbnail!).and_return(true)
|
allow_any_instance_of(Post).to receive(:resized_thumbnail!).and_return(true)
|
||||||
allow(Post).to receive(:resized_thumbnail_attachment).and_return(
|
|
||||||
io: StringIO.new('dummy'),
|
|
||||||
filename: 'resized_thumbnail.jpg',
|
|
||||||
content_type: 'image/jpeg'
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_nico_tag!(name)
|
def create_nico_tag!(name)
|
||||||
@@ -25,18 +19,6 @@ RSpec.describe 'Posts API', type: :request do
|
|||||||
Rack::Test::UploadedFile.new(StringIO.new('dummy'), 'image/jpeg', original_filename: 'dummy.jpg')
|
Rack::Test::UploadedFile.new(StringIO.new('dummy'), 'image/jpeg', original_filename: 'dummy.jpg')
|
||||||
end
|
end
|
||||||
|
|
||||||
def real_thumbnail_upload
|
|
||||||
gif =
|
|
||||||
Base64.decode64(
|
|
||||||
'R0lGODdhAQABAIABAP///wAAACwAAAAAAQABAAACAkQBADs=')
|
|
||||||
|
|
||||||
Rack::Test::UploadedFile.new(
|
|
||||||
StringIO.new(gif),
|
|
||||||
'image/gif',
|
|
||||||
original_filename: 'thumbnail.gif'
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def post_write_params params = { }
|
def post_write_params params = { }
|
||||||
{ parent_post_ids: '' }.merge(params)
|
{ parent_post_ids: '' }.merge(params)
|
||||||
end
|
end
|
||||||
@@ -714,66 +696,6 @@ RSpec.describe 'Posts API', type: :request do
|
|||||||
expect(json['tags'][0]).to have_key('name')
|
expect(json['tags'][0]).to have_key('name')
|
||||||
end
|
end
|
||||||
|
|
||||||
it '201 when posting manually with a thumbnail' do
|
|
||||||
sign_in_as(member)
|
|
||||||
allow(Post).to receive(:resized_thumbnail_attachment).and_call_original
|
|
||||||
|
|
||||||
post '/posts', params: post_write_params(
|
|
||||||
title: 'thumbnail post',
|
|
||||||
url: 'https://example.com/thumbnail-post',
|
|
||||||
tags: 'spec_tag',
|
|
||||||
thumbnail: real_thumbnail_upload
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(response).to have_http_status(:created)
|
|
||||||
post_record = Post.find(json.fetch('id'))
|
|
||||||
expect(post_record.thumbnail).to be_attached
|
|
||||||
expect(post_record.thumbnail.blob.content_type).to eq('image/jpeg')
|
|
||||||
expect { post_record.thumbnail.download }.not_to raise_error
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'resizes the thumbnail before the create transaction begins' do
|
|
||||||
sign_in_as(member)
|
|
||||||
|
|
||||||
open_transactions = []
|
|
||||||
baseline_open_transactions = Post.connection.open_transactions
|
|
||||||
allow(Post).to receive(:resized_thumbnail_attachment) do |_upload|
|
|
||||||
open_transactions << Post.connection.open_transactions
|
|
||||||
{ io: StringIO.new('dummy'),
|
|
||||||
filename: 'resized_thumbnail.jpg',
|
|
||||||
content_type: 'image/jpeg' }
|
|
||||||
end
|
|
||||||
|
|
||||||
post '/posts', params: post_write_params(
|
|
||||||
title: 'transaction post',
|
|
||||||
url: 'https://example.com/transaction-post',
|
|
||||||
tags: 'spec_tag',
|
|
||||||
thumbnail: dummy_upload
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(response).to have_http_status(:created)
|
|
||||||
expect(open_transactions).to eq([baseline_open_transactions])
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns 422 and does not create a post when thumbnail resize fails' do
|
|
||||||
sign_in_as(member)
|
|
||||||
allow(Post).to receive(:resized_thumbnail_attachment).and_raise(MiniMagick::Error)
|
|
||||||
|
|
||||||
expect {
|
|
||||||
post '/posts', params: post_write_params(
|
|
||||||
title: 'broken thumbnail post',
|
|
||||||
url: 'https://example.com/broken-thumbnail-post',
|
|
||||||
tags: 'spec_tag',
|
|
||||||
thumbnail: dummy_upload
|
|
||||||
)
|
|
||||||
}.not_to change(Post, :count)
|
|
||||||
|
|
||||||
expect(response).to have_http_status(:unprocessable_entity)
|
|
||||||
expect(json.fetch('errors')).to include(
|
|
||||||
'thumbnail' => ['サムネイル画像の変換に失敗しました.']
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
it '201 and creates post + tags when member and tags have aliases' do
|
it '201 and creates post + tags when member and tags have aliases' do
|
||||||
sign_in_as(member)
|
sign_in_as(member)
|
||||||
|
|
||||||
|
|||||||
新しい課題から参照
ユーザをブロックする