about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-11-22 17:32:51 +0100
committerEugen Rochko <eugen@zeonfederated.com>2016-11-22 17:32:51 +0100
commit45c7ee39b3d45159de382e8596110af04ee1ed8c (patch)
tree161516b55c190c41c1c2421e0d885960957744f2
parent95db6cbe28acc193ff0c898790a6740c4ff3d473 (diff)
Remove unneeded indices, improve error handling in background workers, don't needlessly reload reblogged status, send Devise e-mails asynchronously
-rw-r--r--app/controllers/api/v1/statuses_controller.rb2
-rw-r--r--app/models/notification.rb2
-rw-r--r--app/models/user.rb4
-rw-r--r--app/services/notify_service.rb2
-rw-r--r--app/services/process_feed_service.rb2
-rw-r--r--app/workers/salmon_worker.rb2
-rw-r--r--db/migrate/20161122163057_remove_unneeded_indexes.rb7
-rw-r--r--db/schema.rb5
8 files changed, 20 insertions, 6 deletions
diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index 53578b2f7..604e2969d 100644
--- a/app/controllers/api/v1/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -54,7 +54,7 @@ class Api::V1::StatusesController < ApiController
   end
 
   def reblog
-    @status = ReblogService.new.call(current_user.account, Status.find(params[:id])).reload
+    @status = ReblogService.new.call(current_user.account, Status.find(params[:id]))
     render action: :show
   end
 
diff --git a/app/models/notification.rb b/app/models/notification.rb
index 419f31230..c0537397c 100644
--- a/app/models/notification.rb
+++ b/app/models/notification.rb
@@ -11,6 +11,8 @@ class Notification < ApplicationRecord
   belongs_to :follow,    foreign_type: 'Follow',    foreign_key: 'activity_id'
   belongs_to :favourite, foreign_type: 'Favourite', foreign_key: 'activity_id'
 
+  validates :account_id, uniqueness: { scope: [:activity_type, :activity_id] }
+
   STATUS_INCLUDES = [:account, :stream_entry, :media_attachments, :tags, mentions: :account, reblog: [:stream_entry, :account, :media_attachments, :tags, mentions: :account]].freeze
 
   scope :with_includes, -> { includes(status: STATUS_INCLUDES, mention: [status: STATUS_INCLUDES], favourite: [:account, status: STATUS_INCLUDES], follow: :account) }
diff --git a/app/models/user.rb b/app/models/user.rb
index 4eb1d20a5..7e3547dff 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -16,4 +16,8 @@ class User < ApplicationRecord
   has_settings do |s|
     s.key :notification_emails, defaults: { follow: true, reblog: true, favourite: true, mention: true }
   end
+
+  def send_devise_notification(notification, *args)
+    devise_mailer.send(notification, self, *args).deliver_later
+  end
 end
diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb
index c0f1d4c53..772adfb90 100644
--- a/app/services/notify_service.rb
+++ b/app/services/notify_service.rb
@@ -10,6 +10,8 @@ class NotifyService < BaseService
 
     create_notification
     send_email if email_enabled?
+  rescue ActiveRecord::RecordInvalid
+    return
   end
 
   private
diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb
index 8daafd444..1cd801b80 100644
--- a/app/services/process_feed_service.rb
+++ b/app/services/process_feed_service.rb
@@ -61,7 +61,7 @@ class ProcessFeedService < BaseService
 
       status.save!
 
-      NotifyService.new.call(status.reblog.account, status) if status.reblog?
+      NotifyService.new.call(status.reblog.account, status) if status.reblog? && status.reblog.account.local?
       Rails.logger.debug "Queuing remote status #{status.id} (#{id}) for distribution"
       DistributionWorker.perform_async(status.id)
       status
diff --git a/app/workers/salmon_worker.rb b/app/workers/salmon_worker.rb
index 12b46e92f..24fb94012 100644
--- a/app/workers/salmon_worker.rb
+++ b/app/workers/salmon_worker.rb
@@ -5,5 +5,7 @@ class SalmonWorker
 
   def perform(account_id, body)
     ProcessInteractionService.new.call(body, Account.find(account_id))
+  rescue ActiveRecord::RecordNotFound
+    true
   end
 end
diff --git a/db/migrate/20161122163057_remove_unneeded_indexes.rb b/db/migrate/20161122163057_remove_unneeded_indexes.rb
new file mode 100644
index 000000000..3832b878d
--- /dev/null
+++ b/db/migrate/20161122163057_remove_unneeded_indexes.rb
@@ -0,0 +1,7 @@
+class RemoveUnneededIndexes < ActiveRecord::Migration[5.0]
+  def change
+    remove_index :notifications, name: "index_notifications_on_account_id"
+    remove_index :settings, name: "index_settings_on_target_type_and_target_id"
+    remove_index :statuses_tags, name: "index_statuses_tags_on_tag_id"
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 20bfb36a8..42e4e081c 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: 20161119211120) do
+ActiveRecord::Schema.define(version: 20161122163057) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -103,7 +103,6 @@ ActiveRecord::Schema.define(version: 20161119211120) do
     t.datetime "created_at",    null: false
     t.datetime "updated_at",    null: false
     t.index ["account_id", "activity_id", "activity_type"], name: "account_activity", unique: true, using: :btree
-    t.index ["account_id"], name: "index_notifications_on_account_id", using: :btree
   end
 
   create_table "oauth_access_grants", force: :cascade do |t|
@@ -152,7 +151,6 @@ ActiveRecord::Schema.define(version: 20161119211120) do
     t.datetime "created_at"
     t.datetime "updated_at"
     t.index ["target_type", "target_id", "var"], name: "index_settings_on_target_type_and_target_id_and_var", unique: true, using: :btree
-    t.index ["target_type", "target_id"], name: "index_settings_on_target_type_and_target_id", using: :btree
   end
 
   create_table "statuses", force: :cascade do |t|
@@ -174,7 +172,6 @@ ActiveRecord::Schema.define(version: 20161119211120) do
     t.integer "status_id", null: false
     t.integer "tag_id",    null: false
     t.index ["tag_id", "status_id"], name: "index_statuses_tags_on_tag_id_and_status_id", unique: true, using: :btree
-    t.index ["tag_id"], name: "index_statuses_tags_on_tag_id", using: :btree
   end
 
   create_table "stream_entries", force: :cascade do |t|