docbrown/app/controllers/dashboards_controller.rb
Diogo Osório cc7d297371
Fixes unsafe reflection warning in dashboards_controller (#10094)
* Fixes unsafe relection warning @ dashboards_controller

This one is purely to make CodeClimate happy as the code that was
already there is equivalent (as the parameter being `constantize`'d was
validated before the reflection part kicked in).

I've switch things around and do a lookup on the
`UserSubscription::ALLOWED_TYPES` for the subscription `source_type`,
which makes brakeman understand that type comes from an allowed list of
types (instead the user input).

* Flips conditional statement when no source_type to unless

Co-authored-by: rhymes <rhymes@hey.com>

Co-authored-by: rhymes <rhymes@hey.com>
2020-09-01 10:22:00 +07:00

100 lines
3.2 KiB
Ruby

class DashboardsController < ApplicationController
before_action :set_no_cache_header
before_action :authenticate_user!
before_action :fetch_and_authorize_user, except: :pro
before_action :set_source, only: %i[subscriptions]
before_action -> { limit_per_page(default: 80, max: 1000) }, except: %i[show pro]
after_action :verify_authorized
def show
@current_user_pro = current_user.pro?
target = @user
not_authorized if params[:org_id] && !@user.org_admin?(params[:org_id] || @user.any_admin?)
@organizations = @user.admin_organizations
if params[:which] == "organization" && params[:org_id] && (@user.org_admin?(params[:org_id]) || @user.any_admin?)
target = @organizations.find_by(id: params[:org_id])
@organization = target
@articles = target.articles
else
# if the target is a user, we need to eager load the organization
@articles = target.articles.includes(:organization)
end
@reactions_count = @articles.sum(&:public_reactions_count)
@page_views_count = @articles.sum(&:page_views_count)
@articles = @articles.sorting(params[:sort]).decorate
@articles = Kaminari.paginate_array(@articles).page(params[:page]).per(50)
end
def following_tags
@followed_tags = @user.follows_by_type("ActsAsTaggableOn::Tag")
.order(points: :desc).includes(:followable).limit(@follows_limit)
end
def following_users
@follows = @user.follows_by_type("User")
.order(created_at: :desc).includes(:followable).limit(@follows_limit)
end
def following_organizations
@followed_organizations = @user.follows_by_type("Organization")
.order(created_at: :desc).includes(:followable).limit(@follows_limit)
end
def following_podcasts
@followed_podcasts = @user.follows_by_type("Podcast")
.order(created_at: :desc).includes(:followable).limit(@follows_limit)
end
def followers
@follows = Follow.followable_user(@user.id)
.includes(:follower).order(created_at: :desc).limit(@follows_limit)
end
def pro
@user_or_org = if params[:org_id]
org = Organization.find_by(id: params[:org_id])
authorize org, :pro_org_user?
org
else
authorize current_user, :pro_user?
current_user
end
@organizations = current_user.member_organizations
end
def subscriptions
authorize @source
@subscriptions = @source.user_subscriptions
.includes(:subscriber).order(created_at: :desc).page(params[:page]).per(100)
end
private
def set_source
source_type = UserSubscription::ALLOWED_TYPES.detect { |allowed_type| allowed_type == params[:source_type] }
not_found unless source_type
source = source_type.constantize.find_by(id: params[:source_id])
@source = source || not_found
end
def fetch_and_authorize_user
@user = if params[:username] && current_user.any_admin?
User.find_by(username: params[:username])
else
current_user
end
authorize (@user || User), :dashboard_show?
end
def limit_per_page(default:, max:)
per_page = (params[:per_page] || default).to_i
@follows_limit = [per_page, max].min
end
end