Last active
September 25, 2019 09:08
-
-
Save DmytroVasin/9a2f57c6f45656c61cd672941a986777 to your computer and use it in GitHub Desktop.
posts_controller.rb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class PostsController < ApplicationController | |
def index | |
render cell: :index, model: posts | |
end | |
def show | |
post_view_registrar.commit_view | |
show_post_page | |
end | |
private | |
def posts | |
Posts::Filter.new(params) | |
.filtered_posts | |
.includes(:related_posts, :categories) | |
.include_voted_by_user(current_user) | |
end | |
def post_view_registrar | |
@_post_view_registrar ||= | |
PostViewRegistrar.new(post: post, user: current_user, user_ip: request.remote_ip) | |
end | |
def show_post_page | |
if post.show_internally? | |
render cell: :show, model: post, layout: "post_layout" | |
else | |
redirect_to post.link | |
end | |
end | |
def post | |
@_post ||= Post.include_voted_by_user(current_user).find(params[:id]) | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Posts::Filter | |
def initialize(params) | |
@params = Params.new(params) | |
end | |
def filtered_posts | |
filters.reduce(all_posts) do |posts, filter| | |
filter.call(posts) | |
end | |
end | |
private | |
attr_reader :params | |
def all_posts | |
::Post.all | |
end | |
def filters | |
[page_filter, time_filter, sorting_filter, source_filter, search_filter, category_filter] | |
end | |
def page_filter | |
->(posts) { posts.paginate(page: params.page) } | |
end | |
def time_filter | |
if params.all_time? | |
->(posts) { posts } | |
else | |
->(posts) { posts.published_later_than(beginning_time_from_params) } | |
end | |
end | |
def beginning_time_from_params | |
case params.time.to_sym | |
when :hourly | |
1.hour.ago | |
when :daily | |
1.day.ago | |
when :weekly | |
7.days.ago | |
when :monthly | |
1.month.ago | |
when :annually | |
1.year.ago | |
end | |
end | |
def sorting_filter | |
case params.set.to_sym | |
when :new | |
->(posts) { posts.ordered_by_date } | |
when :most_read | |
->(posts) { posts.ordered_by_views_count.ordered_by_date } | |
when :highly_voted | |
->(posts) { posts.ordered_by_voting_result.ordered_by_date } | |
when :most_reviewed | |
->(posts) { posts.order_by_review_rating.ordered_by_date } | |
when :most_covered | |
->(posts) { posts.ordered_by_coverage.ordered_by_voting_result.ordered_by_date } | |
end | |
end | |
def source_filter | |
if params.sources.present? | |
->(posts) { posts.source_posts(params.sources) } | |
else | |
->(posts) { posts } | |
end | |
end | |
def search_filter | |
if params.q.present? | |
->(posts) { posts.for_search_query(params.q) } | |
else | |
->(posts) { posts } | |
end | |
end | |
def category_filter | |
if params.categories.present? | |
->(posts) { posts.for_categories(params.categories) } | |
else | |
->(posts) { posts } | |
end | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Posts::Filter::Params | |
extend ActiveModel::Naming | |
extend Enumerize | |
def initialize(raw_params) | |
@page = raw_params[:page] | |
@q = raw_params[:q] | |
@set = raw_params[:set] || :highly_voted | |
@time = raw_params[:time] || :daily | |
@sources = raw_params[:sources] | |
@categories = raw_params[:categories] | |
end | |
attr_reader :page, :q, :sources, :categories | |
enumerize :set, in: [:new, :most_read, :highly_voted, :most_reviewed, :most_covered], default: :highly_voted | |
enumerize :time, in: [:hourly, :daily, :weekly, :monthly, :annually, :all_time], default: :daily, predicates: true | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment