From 8b1fca4662d823931055af2f7c302fe09c7fe2c2 Mon Sep 17 00:00:00 2001 From: r888888888 Date: Fri, 10 Nov 2017 16:21:01 -0800 Subject: [PATCH] add most viewed posts page --- app/controllers/explore/posts_controller.rb | 6 +++ app/logical/post_sets/most_viewed.rb | 17 ++++++ app/logical/post_view_count_service.rb | 7 ++- .../post_set_presenters/most_viewed.rb | 54 +++++++++++++++++++ app/views/explore/posts/viewed.html.erb | 21 ++++++++ app/views/static/site_map.html.erb | 2 + config/routes.rb | 1 + test/unit/post_view_count_service_test.rb | 2 + 8 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 app/logical/post_sets/most_viewed.rb create mode 100644 app/presenters/post_set_presenters/most_viewed.rb create mode 100644 app/views/explore/posts/viewed.html.erb create mode 100644 test/unit/post_view_count_service_test.rb diff --git a/app/controllers/explore/posts_controller.rb b/app/controllers/explore/posts_controller.rb index e274fac03..eadbb4533 100644 --- a/app/controllers/explore/posts_controller.rb +++ b/app/controllers/explore/posts_controller.rb @@ -8,6 +8,12 @@ module Explore respond_with(@posts) end + def viewed + @post_set = PostSets::MostViewed.new(params[:date]) + @posts = @post_set.posts + respond_with(@posts) + end + def searches @date = params[:date] ? Date.parse(params[:date]) : Date.today @search_service = PopularSearchService.new(@date) diff --git a/app/logical/post_sets/most_viewed.rb b/app/logical/post_sets/most_viewed.rb new file mode 100644 index 000000000..c63811f90 --- /dev/null +++ b/app/logical/post_sets/most_viewed.rb @@ -0,0 +1,17 @@ +module PostSets + class MostViewed < PostSets::Base + attr_reader :date + + def initialize(date) + @date = date.blank? ? Time.zone.now : Time.zone.parse(date) + end + + def posts + @posts ||= PostViewCountService.new.popular_posts(date) + end + + def presenter + ::PostSetPresenters::MostViewed.new(self) + end + end +end diff --git a/app/logical/post_view_count_service.rb b/app/logical/post_view_count_service.rb index 7f5902202..14a173bd8 100644 --- a/app/logical/post_view_count_service.rb +++ b/app/logical/post_view_count_service.rb @@ -4,7 +4,7 @@ class PostViewCountService end def initialize - if !MissedSearchService.enabled? + if !PostViewCountService.enabled? raise NotImplementedError.new("the Reportbooru service isn't configured. Missed searches are not available.") end end @@ -30,4 +30,9 @@ class PostViewCountService rescue JSON::ParserError nil end + + def popular_posts(date = Date.today) + ranking = fetch_rank(date) + ranking.map {|x| Post.find(x[0])} + end end diff --git a/app/presenters/post_set_presenters/most_viewed.rb b/app/presenters/post_set_presenters/most_viewed.rb new file mode 100644 index 000000000..ac83f7b37 --- /dev/null +++ b/app/presenters/post_set_presenters/most_viewed.rb @@ -0,0 +1,54 @@ +module PostSetPresenters + class MostViewed < Base + attr_accessor :post_set, :tag_set_presenter + delegate :posts, :date, :to => :post_set + + def initialize(post_set) + @post_set = post_set + end + + def prev_day + date - 1.day + end + + def next_day + date + 1.day + end + + def nav_links_for_scale(template) + html = [] + html << '' + html << template.link_to( + "< Back".html_safe, + template.viewed_explore_posts_path( + :date => prev_day + ), + :rel => "prev" + ) + html << template.link_to( + date.to_s, + template.viewed_explore_posts_path( + :date => date + ), + :class => "desc" + ) + html << template.link_to( + "Next >".html_safe, + template.viewed_explore_posts_path( + :date => next_day + ), + :rel => "next" + ) + html << '' + html.join("\n").html_safe + end + + def nav_links(template) + html = [] + html << '' + html.join("\n").html_safe + end + end +end diff --git a/app/views/explore/posts/viewed.html.erb b/app/views/explore/posts/viewed.html.erb new file mode 100644 index 000000000..b2d412b3f --- /dev/null +++ b/app/views/explore/posts/viewed.html.erb @@ -0,0 +1,21 @@ +
+ +
+ +<%= render "posts/partials/common/secondary_links" %> + +<% content_for(:page_title) do %> + Most Viewed - <%= Danbooru.config.app_name %> +<% end %> + +<% content_for(:html_header) do %> + +<% end %> diff --git a/app/views/static/site_map.html.erb b/app/views/static/site_map.html.erb index b2706ff63..58a377154 100644 --- a/app/views/static/site_map.html.erb +++ b/app/views/static/site_map.html.erb @@ -12,6 +12,8 @@
  • <%= link_to("Appeals", post_appeals_path) %>
  • <%= link_to("Flags", post_flags_path) %>
  • <%= link_to("Replacements", post_replacements_path) %>
  • +
  • <%= link_to("Popular", popular_explore_posts_path) %>
  • +
  • <%= link_to("Most Viewed", viewed_explore_posts_path) %>
  • <% if CurrentUser.can_approve_posts? %>
  • <%= link_to("Moderate", moderator_post_queue_path) %>
  • <% end %> diff --git a/config/routes.rb b/config/routes.rb index 318d8a57c..de7143f76 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -51,6 +51,7 @@ Rails.application.routes.draw do resources :posts do collection do get :popular + get :viewed get :searches get :missed_searches get :intro diff --git a/test/unit/post_view_count_service_test.rb b/test/unit/post_view_count_service_test.rb new file mode 100644 index 000000000..c33d6ebce --- /dev/null +++ b/test/unit/post_view_count_service_test.rb @@ -0,0 +1,2 @@ +class PostViewCountServiceTest < ActiveSupport::TestCase +end