summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/lib/entity_cache.rb4
-rw-r--r--app/models/announcement.rb9
-rw-r--r--app/models/status.rb2
-rw-r--r--app/workers/publish_scheduled_announcement_worker.rb15
-rw-r--r--db/migrate/20200312162302_add_status_ids_to_announcements.rb6
-rw-r--r--db/schema.rb1
6 files changed, 32 insertions, 5 deletions
diff --git a/app/lib/entity_cache.rb b/app/lib/entity_cache.rb
index 35a3773d2d8..afdbd70f264 100644
--- a/app/lib/entity_cache.rb
+++ b/app/lib/entity_cache.rb
@@ -7,6 +7,10 @@ class EntityCache
MAX_EXPIRATION = 7.days.freeze
+ def status(url)
+ Rails.cache.fetch(to_key(:status, url), expires_in: MAX_EXPIRATION) { FetchRemoteStatusService.new.call(url) }
+ end
+
def mention(username, domain)
Rails.cache.fetch(to_key(:mention, username, domain), expires_in: MAX_EXPIRATION) { Account.select(:id, :username, :domain, :url).find_remote(username, domain) }
end
diff --git a/app/models/announcement.rb b/app/models/announcement.rb
index f8ac4e09d14..a4e427b494d 100644
--- a/app/models/announcement.rb
+++ b/app/models/announcement.rb
@@ -14,6 +14,7 @@
# created_at :datetime not null
# updated_at :datetime not null
# published_at :datetime
+# status_ids :bigint is an Array
#
class Announcement < ApplicationRecord
@@ -49,7 +50,13 @@ class Announcement < ApplicationRecord
end
def statuses
- @statuses ||= Status.from_text(text)
+ @statuses ||= begin
+ if status_ids.nil?
+ []
+ else
+ Status.where(id: status_ids, visibility: [:public, :unlisted])
+ end
+ end
end
def tags
diff --git a/app/models/status.rb b/app/models/status.rb
index ff653100a97..fef4e259671 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -379,7 +379,7 @@ class Status < ApplicationRecord
if TagManager.instance.local_url?(url)
ActivityPub::TagManager.instance.uri_to_resource(url, Status)
else
- Status.find_by(uri: url) || Status.find_by(url: url)
+ EntityCache.instance.status(url)
end
end
status&.distributable? ? status : nil
diff --git a/app/workers/publish_scheduled_announcement_worker.rb b/app/workers/publish_scheduled_announcement_worker.rb
index efca39d3d78..1392efed06f 100644
--- a/app/workers/publish_scheduled_announcement_worker.rb
+++ b/app/workers/publish_scheduled_announcement_worker.rb
@@ -5,15 +5,24 @@ class PublishScheduledAnnouncementWorker
include Redisable
def perform(announcement_id)
- announcement = Announcement.find(announcement_id)
+ @announcement = Announcement.find(announcement_id)
- announcement.publish! unless announcement.published?
+ refresh_status_ids!
- payload = InlineRenderer.render(announcement, nil, :announcement)
+ @announcement.publish! unless @announcement.published?
+
+ payload = InlineRenderer.render(@announcement, nil, :announcement)
payload = Oj.dump(event: :announcement, payload: payload)
FeedManager.instance.with_active_accounts do |account|
redis.publish("timeline:#{account.id}", payload) if redis.exists("subscribed:timeline:#{account.id}")
end
end
+
+ private
+
+ def refresh_status_ids!
+ @announcement.status_ids = Status.from_text(@announcement.text).map(&:id)
+ @announcement.save
+ end
end
diff --git a/db/migrate/20200312162302_add_status_ids_to_announcements.rb b/db/migrate/20200312162302_add_status_ids_to_announcements.rb
new file mode 100644
index 00000000000..42aa6513de6
--- /dev/null
+++ b/db/migrate/20200312162302_add_status_ids_to_announcements.rb
@@ -0,0 +1,6 @@
+class AddStatusIdsToAnnouncements < ActiveRecord::Migration[5.2]
+ def change
+ add_column :announcements, :status_ids, :bigint, array: true
+ end
+end
+
diff --git a/db/schema.rb b/db/schema.rb
index 7f28f2ec419..021ddac897e 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -231,6 +231,7 @@ ActiveRecord::Schema.define(version: 2020_03_12_185443) do
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "published_at"
+ t.bigint "status_ids", array: true
end
create_table "backups", force: :cascade do |t|