50 lines
1.5 KiB
Ruby
50 lines
1.5 KiB
Ruby
class FollowingsController < ApplicationController
|
|
before_action :authenticate_user!
|
|
before_action -> { limit_per_page(default: 80, max: 1000) }
|
|
|
|
ATTRIBUTES_FOR_SERIALIZATION = %i[id followable_id followable_type].freeze
|
|
TAGS_ATTRIBUTES_FOR_SERIALIZATION = [*ATTRIBUTES_FOR_SERIALIZATION, :points].freeze
|
|
|
|
def users
|
|
relation = current_user.follows_by_type("User")
|
|
.select(ATTRIBUTES_FOR_SERIALIZATION)
|
|
.order(created_at: :desc)
|
|
@follows = load_follows_and_paginate(relation)
|
|
end
|
|
|
|
def tags
|
|
relation = current_user.follows_by_type("ActsAsTaggableOn::Tag")
|
|
.select(TAGS_ATTRIBUTES_FOR_SERIALIZATION)
|
|
.order(points: :desc)
|
|
@followed_tags = load_follows_and_paginate(relation)
|
|
end
|
|
|
|
def organizations
|
|
relation = current_user.follows_by_type("Organization")
|
|
.select(ATTRIBUTES_FOR_SERIALIZATION)
|
|
.order(created_at: :desc)
|
|
@followed_organizations = load_follows_and_paginate(relation)
|
|
end
|
|
|
|
def podcasts
|
|
relation = current_user.follows_by_type("Podcast")
|
|
.select(ATTRIBUTES_FOR_SERIALIZATION)
|
|
.order(created_at: :desc)
|
|
@followed_podcasts = load_follows_and_paginate(relation)
|
|
end
|
|
|
|
private_constant :ATTRIBUTES_FOR_SERIALIZATION
|
|
|
|
private_constant :TAGS_ATTRIBUTES_FOR_SERIALIZATION
|
|
|
|
private
|
|
|
|
def limit_per_page(default:, max:)
|
|
per_page = (params[:per_page] || default).to_i
|
|
@follows_limit = [per_page, max].min
|
|
end
|
|
|
|
def load_follows_and_paginate(relation)
|
|
relation.includes(:followable).page(params[:page]).per(@follows_limit)
|
|
end
|
|
end
|