Moving Salmon notifications to background processing, fixing mini-profiler
behaviour with Turbolinks enabled, optimizing Rabl for production
This commit is contained in:
parent
da4b675aca
commit
85b00d19b8
15 changed files with 49 additions and 35 deletions
3
Gemfile
3
Gemfile
|
@ -51,6 +51,7 @@ end
|
||||||
group :test do
|
group :test do
|
||||||
gem 'simplecov', require: false
|
gem 'simplecov', require: false
|
||||||
gem 'webmock'
|
gem 'webmock'
|
||||||
|
gem 'rspec-sidekiq'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
|
@ -59,6 +60,8 @@ group :development do
|
||||||
gem 'better_errors'
|
gem 'better_errors'
|
||||||
gem 'binding_of_caller'
|
gem 'binding_of_caller'
|
||||||
gem 'letter_opener'
|
gem 'letter_opener'
|
||||||
|
gem 'bullet'
|
||||||
|
gem 'memory_profiler'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :production do
|
group :production do
|
||||||
|
|
11
Gemfile.lock
11
Gemfile.lock
|
@ -47,6 +47,9 @@ GEM
|
||||||
binding_of_caller (0.7.2)
|
binding_of_caller (0.7.2)
|
||||||
debug_inspector (>= 0.0.1)
|
debug_inspector (>= 0.0.1)
|
||||||
builder (3.2.2)
|
builder (3.2.2)
|
||||||
|
bullet (5.0.0)
|
||||||
|
activesupport (>= 3.0.0)
|
||||||
|
uniform_notifier (~> 1.9.0)
|
||||||
climate_control (0.0.3)
|
climate_control (0.0.3)
|
||||||
activesupport (>= 3.0)
|
activesupport (>= 3.0)
|
||||||
cocaine (0.5.8)
|
cocaine (0.5.8)
|
||||||
|
@ -139,6 +142,7 @@ GEM
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.5.9)
|
||||||
mail (2.6.3)
|
mail (2.6.3)
|
||||||
mime-types (>= 1.16, < 3)
|
mime-types (>= 1.16, < 3)
|
||||||
|
memory_profiler (0.9.6)
|
||||||
method_source (0.8.2)
|
method_source (0.8.2)
|
||||||
mime-types (2.99.1)
|
mime-types (2.99.1)
|
||||||
mimemagic (0.3.0)
|
mimemagic (0.3.0)
|
||||||
|
@ -252,6 +256,9 @@ GEM
|
||||||
rspec-expectations (~> 3.4.0)
|
rspec-expectations (~> 3.4.0)
|
||||||
rspec-mocks (~> 3.4.0)
|
rspec-mocks (~> 3.4.0)
|
||||||
rspec-support (~> 3.4.0)
|
rspec-support (~> 3.4.0)
|
||||||
|
rspec-sidekiq (2.2.0)
|
||||||
|
rspec (~> 3.0, >= 3.0.0)
|
||||||
|
sidekiq (>= 2.4.0)
|
||||||
rspec-support (3.4.1)
|
rspec-support (3.4.1)
|
||||||
rubocop (0.38.0)
|
rubocop (0.38.0)
|
||||||
parser (>= 2.3.0.6, < 3.0)
|
parser (>= 2.3.0.6, < 3.0)
|
||||||
|
@ -316,6 +323,7 @@ GEM
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.7.2)
|
unf_ext (0.0.7.2)
|
||||||
unicode-display_width (1.0.2)
|
unicode-display_width (1.0.2)
|
||||||
|
uniform_notifier (1.9.0)
|
||||||
warden (1.2.6)
|
warden (1.2.6)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
web-console (2.3.0)
|
web-console (2.3.0)
|
||||||
|
@ -336,6 +344,7 @@ DEPENDENCIES
|
||||||
addressable
|
addressable
|
||||||
better_errors
|
better_errors
|
||||||
binding_of_caller
|
binding_of_caller
|
||||||
|
bullet
|
||||||
coffee-rails (~> 4.1.0)
|
coffee-rails (~> 4.1.0)
|
||||||
devise
|
devise
|
||||||
doorkeeper
|
doorkeeper
|
||||||
|
@ -352,6 +361,7 @@ DEPENDENCIES
|
||||||
jbuilder (~> 2.0)
|
jbuilder (~> 2.0)
|
||||||
jquery-rails
|
jquery-rails
|
||||||
letter_opener
|
letter_opener
|
||||||
|
memory_profiler
|
||||||
nokogiri
|
nokogiri
|
||||||
oj
|
oj
|
||||||
onebox
|
onebox
|
||||||
|
@ -370,6 +380,7 @@ DEPENDENCIES
|
||||||
rails_autolink
|
rails_autolink
|
||||||
redis (~> 3.2)
|
redis (~> 3.2)
|
||||||
rspec-rails
|
rspec-rails
|
||||||
|
rspec-sidekiq
|
||||||
rubocop
|
rubocop
|
||||||
sass-rails (~> 5.0)
|
sass-rails (~> 5.0)
|
||||||
sdoc (~> 0.4.0)
|
sdoc (~> 0.4.0)
|
||||||
|
|
|
@ -1,2 +1,5 @@
|
||||||
$(document).on 'turbolinks:load', ->
|
$ ->
|
||||||
window.MiniProfiler.pageTransition() unless typeof window.MiniProfiler == 'undefined'
|
$(document).on 'turbolinks:load', ->
|
||||||
|
unless typeof window.MiniProfiler == 'undefined'
|
||||||
|
window.MiniProfiler.init()
|
||||||
|
window.MiniProfiler.pageTransition()
|
||||||
|
|
|
@ -16,7 +16,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_sign_up_path_for(resource)
|
def after_sign_up_path_for(_resource)
|
||||||
root_path
|
root_path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,7 +17,7 @@ class Status < ActiveRecord::Base
|
||||||
validates :text, presence: true, if: Proc.new { |s| s.local? && !s.reblog? }
|
validates :text, presence: true, if: Proc.new { |s| s.local? && !s.reblog? }
|
||||||
|
|
||||||
scope :with_counters, -> { select('statuses.*, (select count(r.id) from statuses as r where r.reblog_of_id = statuses.id) as reblogs_count, (select count(f.id) from favourites as f where f.status_id = statuses.id) as favourites_count') }
|
scope :with_counters, -> { select('statuses.*, (select count(r.id) from statuses as r where r.reblog_of_id = statuses.id) as reblogs_count, (select count(f.id) from favourites as f where f.status_id = statuses.id) as favourites_count') }
|
||||||
scope :with_includes, -> { includes(:account, :mentions, :stream_entry, reblog: [:account, :mentions], thread: [:account, :mentions]) }
|
scope :with_includes, -> { includes(:account, :mentions, :stream_entry, reblog: [:account, :mentions], thread: :account) }
|
||||||
|
|
||||||
def local?
|
def local?
|
||||||
self.uri.nil?
|
self.uri.nil?
|
||||||
|
|
|
@ -10,15 +10,9 @@ class FavouriteService < BaseService
|
||||||
if status.local?
|
if status.local?
|
||||||
NotificationMailer.favourite(status, account).deliver_later
|
NotificationMailer.favourite(status, account).deliver_later
|
||||||
else
|
else
|
||||||
send_interaction_service.(favourite.stream_entry, status.account)
|
NotificationWorker.perform_async(favourite.stream_entry.id, status.account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
favourite
|
favourite
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def send_interaction_service
|
|
||||||
@send_interaction_service ||= SendInteractionService.new
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,7 +8,7 @@ class FollowService < BaseService
|
||||||
return nil if target_account.nil?
|
return nil if target_account.nil?
|
||||||
|
|
||||||
follow = source_account.follow!(target_account)
|
follow = source_account.follow!(target_account)
|
||||||
send_interaction_service.(follow.stream_entry, target_account)
|
NotificationWorker.perform_async(follow.stream_entry.id, target_account.id)
|
||||||
source_account.ping!(account_url(source_account, format: 'atom'), [Rails.configuration.x.hub_url])
|
source_account.ping!(account_url(source_account, format: 'atom'), [Rails.configuration.x.hub_url])
|
||||||
follow
|
follow
|
||||||
end
|
end
|
||||||
|
@ -18,8 +18,4 @@ class FollowService < BaseService
|
||||||
def follow_remote_account_service
|
def follow_remote_account_service
|
||||||
@follow_remote_account_service ||= FollowRemoteAccountService.new
|
@follow_remote_account_service ||= FollowRemoteAccountService.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_interaction_service
|
|
||||||
@send_interaction_service ||= SendInteractionService.new
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -24,7 +24,7 @@ class ProcessMentionsService < BaseService
|
||||||
if mentioned_account.local?
|
if mentioned_account.local?
|
||||||
NotificationMailer.mention(mentioned_account, status).deliver_later
|
NotificationMailer.mention(mentioned_account, status).deliver_later
|
||||||
else
|
else
|
||||||
send_interaction_service.(status.stream_entry, mentioned_account)
|
NotificationWorker.perform_async(status.stream_entry.id, mentioned_account.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -34,8 +34,4 @@ class ProcessMentionsService < BaseService
|
||||||
def follow_remote_account_service
|
def follow_remote_account_service
|
||||||
@follow_remote_account_service ||= FollowRemoteAccountService.new
|
@follow_remote_account_service ||= FollowRemoteAccountService.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_interaction_service
|
|
||||||
@send_interaction_service ||= SendInteractionService.new
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,13 +5,13 @@ class ReblogService < BaseService
|
||||||
# @return [Status]
|
# @return [Status]
|
||||||
def call(account, reblogged_status)
|
def call(account, reblogged_status)
|
||||||
reblog = account.statuses.create!(reblog: reblogged_status, text: '')
|
reblog = account.statuses.create!(reblog: reblogged_status, text: '')
|
||||||
fan_out_on_write_service.(reblog)
|
DistributionWorker.perform_async(reblog.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])
|
||||||
|
|
||||||
if reblogged_status.local?
|
if reblogged_status.local?
|
||||||
NotificationMailer.reblog(reblogged_status, account).deliver_later
|
NotificationMailer.reblog(reblogged_status, account).deliver_later
|
||||||
else
|
else
|
||||||
send_interaction_service.(reblog.stream_entry, reblogged_status.account)
|
NotificationWorker.perform_async(reblog.stream_entry.id, reblogged_status.account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
reblog
|
reblog
|
||||||
|
@ -22,8 +22,4 @@ class ReblogService < BaseService
|
||||||
def send_interaction_service
|
def send_interaction_service
|
||||||
@send_interaction_service ||= SendInteractionService.new
|
@send_interaction_service ||= SendInteractionService.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def fan_out_on_write_service
|
|
||||||
@fan_out_on_write_service ||= FanOutOnWriteService.new
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,12 +4,6 @@ class UnfollowService < BaseService
|
||||||
# @param [Account] target_account Which to unfollow
|
# @param [Account] target_account Which to unfollow
|
||||||
def call(source_account, target_account)
|
def call(source_account, target_account)
|
||||||
follow = source_account.unfollow!(target_account)
|
follow = source_account.unfollow!(target_account)
|
||||||
send_interaction_service.(follow.stream_entry, target_account) unless target_account.local?
|
NotificationWorker.perform_async(follow.stream_entry.id, target_account.id) unless target_account.local?
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def send_interaction_service
|
|
||||||
@send_interaction_service ||= SendInteractionService.new
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
7
app/workers/notification_worker.rb
Normal file
7
app/workers/notification_worker.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
class NotificationWorker
|
||||||
|
include Sidekiq::Worker
|
||||||
|
|
||||||
|
def perform(stream_entry_id, target_account_id)
|
||||||
|
SendInteractionService.new.(StreamEntry.find(stream_entry_id), Account.find(target_account_id))
|
||||||
|
end
|
||||||
|
end
|
|
@ -40,4 +40,10 @@ Rails.application.configure do
|
||||||
# config.action_view.raise_on_missing_translations = true
|
# config.action_view.raise_on_missing_translations = true
|
||||||
|
|
||||||
config.action_mailer.delivery_method = :letter_opener
|
config.action_mailer.delivery_method = :letter_opener
|
||||||
|
|
||||||
|
config.after_initialize do
|
||||||
|
Bullet.enable = true
|
||||||
|
Bullet.bullet_logger = true
|
||||||
|
Bullet.rails_logger = true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -55,7 +55,7 @@ Rails.application.configure do
|
||||||
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
|
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
|
||||||
|
|
||||||
# Use a different cache store in production.
|
# Use a different cache store in production.
|
||||||
# config.cache_store = :mem_cache_store
|
config.cache_store = :memory_store, size: 128.megabytes
|
||||||
|
|
||||||
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
|
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
|
||||||
# config.action_controller.asset_host = 'http://assets.example.com'
|
# config.action_controller.asset_host = 'http://assets.example.com'
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
Rabl.configure do |config|
|
Rabl.configure do |config|
|
||||||
|
config.cache_all_output = true
|
||||||
|
config.cache_sources = !!Rails.env.production?
|
||||||
config.include_json_root = false
|
config.include_json_root = false
|
||||||
|
config.view_paths = [Rails.root.join('app/views')]
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,6 +9,7 @@ require 'webmock/rspec'
|
||||||
|
|
||||||
ActiveRecord::Migration.maintain_test_schema!
|
ActiveRecord::Migration.maintain_test_schema!
|
||||||
WebMock.disable_net_connect!
|
WebMock.disable_net_connect!
|
||||||
|
Sidekiq::Testing.inline!
|
||||||
|
|
||||||
RSpec.configure do |config|
|
RSpec.configure do |config|
|
||||||
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
||||||
|
@ -20,6 +21,10 @@ RSpec.configure do |config|
|
||||||
config.include Devise::TestHelpers, type: :view
|
config.include Devise::TestHelpers, type: :view
|
||||||
end
|
end
|
||||||
|
|
||||||
|
RSpec::Sidekiq.configure do |config|
|
||||||
|
config.warn_when_jobs_not_processed_by_sidekiq = false
|
||||||
|
end
|
||||||
|
|
||||||
def request_fixture(name)
|
def request_fixture(name)
|
||||||
File.read(File.join(Rails.root, 'spec', 'fixtures', 'requests', name))
|
File.read(File.join(Rails.root, 'spec', 'fixtures', 'requests', name))
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue