diff --git a/app/activity.rb b/app/activity.rb index 07872bc5..35896e0d 100644 --- a/app/activity.rb +++ b/app/activity.rb @@ -2,7 +2,15 @@ get '/activity' do #expires 7200, :public, :must_revalidate if self.class.production? # 2 hours @page = params[:page] || 1 - @pagination_dataset = Event.global_dataset.paginate(@page.to_i, Event::GLOBAL_PAGINATION_LENGTH) + + @pagination_dataset = Event.global_dataset + + if current_site + blocking_site_ids = current_site.blocking_site_ids + @pagination_dataset.exclude(events__site_id: blocking_site_ids).exclude(events__actioning_site_id: blocking_site_ids) + end + + @pagination_dataset = @pagination_dataset.paginate @page.to_i, Event::GLOBAL_PAGINATION_LENGTH @events = @pagination_dataset.all erb :'activity' diff --git a/app/event.rb b/app/event.rb index 72506c31..271b11f3 100644 --- a/app/event.rb +++ b/app/event.rb @@ -2,6 +2,8 @@ post '/event/:event_id/toggle_like' do |event_id| require_login content_type :json event = Event[id: event_id] + return 403 if event.site.is_blocking?(current_site) + return 403 if event.actioning_site.is_blocking?(current_site) liked_response = event.toggle_site_like(current_site) ? 'liked' : 'unliked' {result: liked_response, event_like_count: event.likes_dataset.count, liking_site_names: event.liking_site_usernames}.to_json end @@ -11,6 +13,8 @@ post '/event/:event_id/comment' do |event_id| content_type :json event = Event[id: event_id] + return 403 if event.actioning_site.is_blocking?(current_site) + site = event.site if(site.is_blocking?(current_site) || diff --git a/app/index.rb b/app/index.rb index ef3f2f59..10162c8c 100644 --- a/app/index.rb +++ b/app/index.rb @@ -8,14 +8,14 @@ get '/?' do @page = 1 if @page.not_an_integer? if params[:activity] == 'mine' - events_dataset = current_site.latest_events(@page, 10) + events_dataset = current_site.latest_events(@page) elsif params[:event_id] event = Event.select(:id).where(id: params[:event_id]).first not_found if event.nil? not_found if event.is_deleted events_dataset = Event.where(id: params[:event_id]).paginate(1, 1) else - events_dataset = current_site.news_feed(@page, 10) + events_dataset = current_site.news_feed(@page) end @pagination_dataset = events_dataset diff --git a/app/site.rb b/app/site.rb index 53d839fc..15477cc2 100644 --- a/app/site.rb +++ b/app/site.rb @@ -21,11 +21,15 @@ get '/site/:username/?' do |username| if params[:event_id] not_found if params[:event_id].not_an_integer? - event = Event.select(:id).where(id: params[:event_id]).exclude(is_deleted: true).first + event = Event.where(id: params[:event_id]).exclude(is_deleted: true).first not_found if event.nil? + event_site = event.site + event_actioning_site = event.actioning_site + not_found if current_site && event_site && event_site.is_blocking?(current_site) + not_found if current_site && event_actioning_site && event_actioning_site.is_blocking?(current_site) events_dataset = Event.where(id: params[:event_id]).paginate(1, 1) else - events_dataset = site.latest_events(@page, 10) + events_dataset = site.latest_events(@page, current_site) end @page_count = events_dataset.page_count || 1 diff --git a/models/event.rb b/models/event.rb index 2309e8fc..c53350d1 100644 --- a/models/event.rb +++ b/models/event.rb @@ -15,29 +15,38 @@ class Event < Sequel::Model PAGINATION_LENGTH = 10 GLOBAL_PAGINATION_LENGTH = 20 - GLOBAL_SCORE_LIMIT = 3 + GLOBAL_SCORE_LIMIT = 2 def undeleted_comments_count comments_dataset.exclude(is_deleted: true).count end - def undeleted_comments - comments_dataset.exclude(is_deleted: true).order(:created_at).all + def undeleted_comments(exclude_ids=nil) + ds = comments_dataset.exclude(is_deleted: true).order(:created_at) + if exclude_ids + ds = ds.exclude actioning_site_id: exclude_ids + end + ds.all end def self.news_feed_default_dataset select(:events.*). join(:sites, id: :site_id). - order(:created_at.desc). + left_join(Sequel[:sites].as(:actioning_sites), id: :events__actioning_site_id). + order(:events__created_at.desc). exclude(events__is_deleted: true). exclude(sites__is_deleted: true). - exclude(is_nsfw: true). - exclude(is_crashing: true). + exclude(sites__is_nsfw: true). + exclude(sites__is_crashing: true). + exclude(actioning_sites__is_deleted: true). where(follow_id: nil) end def self.global_dataset - news_feed_default_dataset.where{score > GLOBAL_SCORE_LIMIT} + news_feed_default_dataset.where( + Sequel.expr(Sequel[:sites][:score] > GLOBAL_SCORE_LIMIT) | + Sequel.expr(Sequel[:actioning_sites][:score] > GLOBAL_SCORE_LIMIT) + ) end def created_by?(site) diff --git a/models/site.rb b/models/site.rb index d4d4e20a..4a8de1b8 100644 --- a/models/site.rb +++ b/models/site.rb @@ -648,6 +648,10 @@ class Site < Sequel::Model @blocking_site_ids ||= blockings_dataset.select(:site_id).all.collect {|s| s.site_id} end + def block_site_ids + @block_site_ids ||= blocks_dataset.select(:actioning_site_id).all.collect {|s| s.actioning_site_id} + end + def unfollow_blocked_sites! blockings.each do |blocking| follows.each do |follow| @@ -1384,20 +1388,28 @@ class Site < Sequel::Model super val end - def latest_events(current_page=1, limit=10) + def latest_events(current_page=1, current_site=nil, limit=Event::PAGINATION_LENGTH) site_id = self.id - Event.news_feed_default_dataset.where{Sequel.|({site_id: site_id}, {actioning_site_id: site_id})}. - order(:created_at.desc). - paginate(current_page.to_i, limit.to_i) + ds = Event.news_feed_default_dataset.where{Sequel.|({site_id: site_id}, {actioning_site_id: site_id})}. + order(:created_at.desc) + + if current_site + ds = ds.where( + Sequel.|( + {events__actioning_site_id: nil}, + Sequel.~(events__actioning_site_id: current_site.block_site_ids) + ) + ) + end + + ds.paginate(current_page.to_i, limit.to_i) end - def news_feed(current_page=1, limit=10) + def news_feed(current_page=1, limit=Event::PAGINATION_LENGTH) following_ids = self.followings_dataset.select(:site_id).all.collect {|f| f.site_id} search_ids = following_ids+[self.id] - Event.news_feed_default_dataset.where{Sequel.|({site_id: search_ids}, {actioning_site_id: search_ids})}. - order(:created_at.desc). - paginate(current_page.to_i, limit.to_i) + Event.news_feed_default_dataset.where{Sequel.|({events__actioning_site_id: search_ids})}.paginate(current_page.to_i, limit.to_i) end def newest_follows diff --git a/views/_news.erb b/views/_news.erb index d05961e6..6e7fd36d 100644 --- a/views/_news.erb +++ b/views/_news.erb @@ -129,7 +129,7 @@ <% if event.undeleted_comments_count > 0 %>