diff --git a/app/controllers/api/v1/groups/accounts_controller.rb b/app/controllers/api/v1/groups/accounts_controller.rb index 61759000..d0a89f5e 100644 --- a/app/controllers/api/v1/groups/accounts_controller.rb +++ b/app/controllers/api/v1/groups/accounts_controller.rb @@ -20,6 +20,11 @@ class Api::V1::Groups::AccountsController < Api::BaseController authorize @group, :join? @group.accounts << current_account + + if current_user.allows_group_in_home_feed? + current_user.force_regeneration! + end + render json: @group, serializer: REST::GroupRelationshipSerializer, relationships: relationships end @@ -35,6 +40,11 @@ class Api::V1::Groups::AccountsController < Api::BaseController authorize @group, :leave? GroupAccount.where(group: @group, account_id: current_account.id).destroy_all + + if current_user.allows_group_in_home_feed? + current_user.force_regeneration! + end + render json: @group, serializer: REST::GroupRelationshipSerializer, relationships: relationships end diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 36d86a81..8b7dbac8 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -9,6 +9,7 @@ class Settings::PreferencesController < Settings::BaseController def update user_settings.update(user_settings_params.to_h) + current_user.force_regeneration! if current_user.update(user_params) I18n.locale = current_user.locale diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index ad2909d9..395c2079 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -71,6 +71,9 @@ module AccountInteractions has_many :following, -> { order('follows.id desc') }, through: :active_relationships, source: :target_account has_many :followers, -> { order('follows.id desc') }, through: :passive_relationships, source: :account + has_many :group_accounts, inverse_of: :account, dependent: :destroy, source: :account + has_many :groups, through: :group_accounts + # Block relationships has_many :block_relationships, class_name: 'Block', foreign_key: 'account_id', dependent: :destroy has_many :blocking, -> { order('blocks.id desc') }, through: :block_relationships, source: :target_account diff --git a/app/models/concerns/group_interactions.rb b/app/models/concerns/group_interactions.rb index 79b4470f..e15e1836 100644 --- a/app/models/concerns/group_interactions.rb +++ b/app/models/concerns/group_interactions.rb @@ -28,4 +28,12 @@ module GroupInteractions end end + def accounts_for_local_distribution + accounts.local + .joins(:user) + .where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago) + .where('users.id NOT IN (SELECT thing_id FROM settings WHERE thing_type = \'User\' AND var = \'group_in_home_feed\' AND value = \'--- false +\')') + end + end diff --git a/app/models/status.rb b/app/models/status.rb index c88daf7d..90bd20c9 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -287,7 +287,13 @@ class Status < ApplicationRecord end def as_home_timeline(account) - where(account: [account] + account.following).where(visibility: [:public, :unlisted, :private]) + query = where(account: [account] + account.following) + + if account.user.allows_group_in_home_feed? + query = query.or(where(group: account.groups)) + end + + query.where(visibility: [:public, :unlisted, :private]) end def as_group_timeline(group) diff --git a/app/models/user.rb b/app/models/user.rb index d35372f5..67841fcd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -213,6 +213,10 @@ class User < ApplicationRecord @shows_application ||= settings.show_application end + def allows_group_in_home_feed? + settings.group_in_home_feed + end + def token_for_app(a) return nil if a.nil? || a.owner != self Doorkeeper::AccessToken @@ -270,6 +274,10 @@ class User < ApplicationRecord setting_display_media == 'hide_all' end + def force_regeneration! + Redis.current.set("account:#{account_id}:regeneration", true) + end + protected def send_devise_notification(notification, *args) diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index f62fa66d..1e561e62 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -46,6 +46,16 @@ class FanOutOnWriteService < BaseService end end + def deliver_to_group_members(status) + Rails.logger.debug "Delivering status #{status.id} to group members #{status.group.id}" + + status.group.accounts_for_local_distribution.select(:id).reorder(nil).find_in_batches do |members| + FeedInsertWorker.push_bulk(members) do |member| + [status.id, member.id, :home] + end + end + end + def deliver_to_lists(status) Rails.logger.debug "Delivering status #{status.id} to lists" @@ -62,6 +72,8 @@ class FanOutOnWriteService < BaseService Rails.logger.debug "Delivering status #{status.id} to group" Redis.current.publish("timeline:group:#{status.group_id}", @payload) + + deliver_to_group_members(status) end def deliver_to_mentioned_followers(status)