mirror of
https://github.com/neocities/neocities.git
synced 2025-04-24 17:22:35 +02:00
111 lines
3.6 KiB
Ruby
111 lines
3.6 KiB
Ruby
get '/browse/?' do
|
|
@surfmode = false
|
|
@page = params[:page].to_i
|
|
@page = 1 if @page == 0
|
|
|
|
params.delete 'tag' if params[:tag].nil? || params[:tag].strip.empty?
|
|
|
|
if is_education?
|
|
site_dataset = education_sites_dataset
|
|
else
|
|
site_dataset = browse_sites_dataset
|
|
end
|
|
|
|
site_dataset = site_dataset.paginate @page, Site::BROWSE_PAGINATION_LENGTH
|
|
@pagination_dataset = site_dataset
|
|
@sites = site_dataset.all
|
|
|
|
site_ids = @sites.collect {|s| s[:id]}
|
|
tags = DB['select site_id,name from tags join sites_tags on tags.id=sites_tags.tag_id where site_id IN ?', site_ids].all
|
|
|
|
@site_tags = {}
|
|
site_ids.each do |site_id|
|
|
@site_tags[site_id] = tags.select {|t| t[:site_id] == site_id}.collect {|t| t[:name]}
|
|
end
|
|
|
|
if params[:tag]
|
|
@title = "Sites tagged #{params[:tag]}"
|
|
end
|
|
|
|
erb :browse
|
|
end
|
|
|
|
def education_sites_dataset
|
|
site_dataset = Site.filter is_deleted: false
|
|
site_dataset = site_dataset.association_join(:tags).select_all(:sites)
|
|
params[:tag] = current_site.tags.first.name
|
|
site_dataset.where! ['tags.name = ?', params[:tag]]
|
|
end
|
|
|
|
def browse_sites_dataset
|
|
|
|
site_dataset = Site.browse_dataset
|
|
|
|
if current_site
|
|
site_dataset.or! sites__id: current_site.id
|
|
|
|
if !current_site.blocking_site_ids.empty?
|
|
site_dataset.where!(Sequel.~(Sequel.qualify(:sites, :id) => current_site.blocking_site_ids))
|
|
end
|
|
|
|
if current_site.blocks_dataset.count
|
|
site_dataset.where!(
|
|
Sequel.~(Sequel.qualify(:sites, :id) => current_site.blocks_dataset.select(:actioning_site_id).all.collect {|s| s.actioning_site_id})
|
|
)
|
|
end
|
|
end
|
|
|
|
case params[:sort_by]
|
|
when 'special_sauce'
|
|
site_dataset.exclude! score: nil
|
|
site_dataset.order! :score.desc
|
|
when 'followers'
|
|
site_dataset.order! :follow_count.desc, :updated_at.desc
|
|
when 'supporters'
|
|
site_dataset.exclude! plan_type: nil
|
|
site_dataset.exclude! plan_type: 'free'
|
|
site_dataset.order! :views.desc, :site_updated_at.desc
|
|
when 'featured'
|
|
site_dataset.exclude! featured_at: nil
|
|
site_dataset.order! :featured_at.desc
|
|
when 'hits'
|
|
site_dataset.where!{views > 100}
|
|
site_dataset.order!(:hits.desc, :site_updated_at.desc)
|
|
when 'views'
|
|
site_dataset.where!{views > 100}
|
|
site_dataset.order!(:views.desc, :site_updated_at.desc)
|
|
when 'newest'
|
|
site_dataset.order!(:created_at.desc, :views.desc)
|
|
when 'oldest'
|
|
site_dataset.where!{views > 100}
|
|
site_dataset.order!(:created_at, :views.desc)
|
|
when 'random'
|
|
site_dataset.where!{views > 100}
|
|
site_dataset.where! 'random() < 0.01'
|
|
when 'last_updated'
|
|
site_dataset.where!{views > 100}
|
|
params[:sort_by] = 'last_updated'
|
|
site_dataset.exclude!(site_updated_at: nil)
|
|
site_dataset.order!(:site_updated_at.desc, :views.desc)
|
|
when 'tipping_enabled'
|
|
site_dataset.where! tipping_enabled: true
|
|
site_dataset.where!("(tipping_paypal is not null and tipping_paypal != '') or (tipping_bitcoin is not null and tipping_bitcoin != '')")
|
|
site_dataset.where!{views > 10_000}
|
|
site_dataset.group! :sites__id
|
|
site_dataset.order! :follow_count.desc, :views.desc, :updated_at.desc
|
|
else
|
|
params[:sort_by] = 'followers'
|
|
site_dataset.order! :follow_count.desc, :views.desc, :updated_at.desc
|
|
end
|
|
|
|
site_dataset.where! ['sites.is_nsfw = ?', (params[:is_nsfw] == 'true' ? true : false)]
|
|
|
|
if params[:tag]
|
|
site_dataset.inner_join! :sites_tags, :site_id => :id
|
|
site_dataset.inner_join! :tags, :id => :sites_tags__tag_id
|
|
site_dataset.where! ['tags.name = ?', params[:tag]]
|
|
site_dataset.where! ['tags.is_nsfw = ?', (params[:is_nsfw] == 'true' ? true : false)]
|
|
end
|
|
|
|
site_dataset
|
|
end
|