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
# created_at :datetime not null
# updated_at :datetime not null
# published_at :datetime
+# status_ids :bigint is an Array
#
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
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
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
--- /dev/null
+class AddStatusIdsToAnnouncements < ActiveRecord::Migration[5.2]
+ def change
+ add_column :announcements, :status_ids, :bigint, array: true
+ end
+end
+
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|