diff --git a/app/logical/post_sets/base.rb b/app/logical/post_sets/base.rb index 518ffbb56..53d292aaa 100644 --- a/app/logical/post_sets/base.rb +++ b/app/logical/post_sets/base.rb @@ -1,13 +1,20 @@ module PostSets class Base def has_wiki? - false + is_single_tag? end def wiki_page nil end + def has_artist? + is_single_tag? + end + + def artist + end + def presenter @presenter ||= PostSetPresenter.new(self) end @@ -16,10 +23,6 @@ module PostSets false end - def tag - tag_string - end - def arbitrary_sql_order_clause(ids, table_name) if ids.empty? return "#{table_name}.id desc" diff --git a/app/logical/post_sets/favorite.rb b/app/logical/post_sets/favorite.rb index c37d9b909..8981f29b4 100644 --- a/app/logical/post_sets/favorite.rb +++ b/app/logical/post_sets/favorite.rb @@ -2,11 +2,11 @@ module PostSets class Favorite < Base attr_reader :user, :page, :favorites, :posts - def initialize(params) - @user = ::User.find(params[:id]) - @page = [params[:page].to_i, 1].max - @favorites = ::Favorite.model_for(@user.id).for_user(@user.id).paginate(page) - @posts = ::Post.where("id in (?)", post_ids).order(arbitrary_sql_order_clause(post_ids, "posts")).paginate("a0") + def initialize(user_id, page) + @user = ::User.find(user_id) + @page = [page.to_i, 1].max + @favorites = ::Favorite.model_for(user.id).for_user(user.id).page(page) + @posts = ::Post.where("id in (?)", post_ids).order(arbitrary_sql_order_clause(post_ids, "posts")).page("b0") end def post_ids @@ -17,8 +17,12 @@ module PostSets (page - 1) * records_per_page end + def tag_array + @tag_array ||= ["fav:#{user.name}"] + end + def tag_string - @tag_string ||= "fav:#{user.name}" + tag_array.join(" ") end end end diff --git a/app/logical/post_sets/post.rb b/app/logical/post_sets/post.rb index 947da44a9..021e699e5 100644 --- a/app/logical/post_sets/post.rb +++ b/app/logical/post_sets/post.rb @@ -1,15 +1,15 @@ module PostSets class Post < Base - attr_reader :tags, :page, :posts + attr_reader :tag_array, :page, :posts def initialize(params) - @tags = Tag.scan_query(params[:tags]) + @tag_array = Tag.scan_query(params[:tags]) @page = [params[:page].to_i, 1].max @posts = ::Post.tag_match(tag_string).paginate(page) end def tag_string - @tag_string ||= tags.join(" ") + @tag_string ||= tag_array.join(" ") end def has_wiki? @@ -29,7 +29,7 @@ module PostSets end def is_single_tag? - tags.size == 1 + tag_array.size == 1 end end end diff --git a/lib/danbooru/paginator/active_record_extension.rb b/lib/danbooru/paginator/active_record_extension.rb index 6302ef253..bd946f292 100644 --- a/lib/danbooru/paginator/active_record_extension.rb +++ b/lib/danbooru/paginator/active_record_extension.rb @@ -6,30 +6,36 @@ module Danbooru extend ActiveSupport::Concern module ClassMethods - def paginate(page) - if use_sequential_paginator?(page) - paginate_sequential(page) + def page(p) + if use_sequential_paginator?(p) + paginate_sequential(p) else - paginate_numbered(page) + paginate_numbered(p) end end - def use_sequential_paginator?(page) - page =~ /[ab]\d+/i + def use_sequential_paginator?(p) + p =~ /[ab]\d+/i end - def paginate_sequential(page) - if page =~ /b(\d+)/ + def paginate_sequential(p) + if p =~ /b(\d+)/ paginate_sequential_before($1) - elsif page =~ /a(\d+)/ + elsif p =~ /a(\d+)/ paginate_sequential_after($1) else - paginate_numbered(page) + paginate_numbered(p) end end def paginate_sequential_before(before_id) - limit(records_per_page).where("id < ?", before_id.to_i).reorder("id desc").tap do |obj| + c = limit(records_per_page) + + if before_id.to_i > 0 + c = c.where("id < ?", before_id.to_i) + end + + c.reorder("id desc").tap do |obj| obj.extend(SequentialCollectionExtension) obj.sequential_paginator_mode = :before end @@ -42,17 +48,17 @@ module Danbooru end end - def paginate_numbered(page) - page = [page.to_i, 1].max - limit(records_per_page).offset((page - 1) * records_per_page).tap do |obj| + def paginate_numbered(p) + p = [p.to_i, 1].max + limit(records_per_page).offset((p - 1) * records_per_page).tap do |obj| obj.extend(NumberedCollectionExtension) obj.total_pages = (obj.total_count / records_per_page.to_f).ceil - obj.current_page = page + obj.current_page = p end end def records_per_page - Danbooru.config.posts_per_page + Danbooru.config.posts_per_p end # taken from kaminari (https://github.com/amatsuda/kaminari)