mirror of
https://github.com/discourse/discourse.git
synced 2025-06-06 03:06:53 +08:00
FEATURE: lets users favorite 2 badges to show on user-card (#13151)
This commit is contained in:
@ -1,13 +1,16 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class UserBadgesController < ApplicationController
|
||||
MAX_FAVORITES = 2
|
||||
MAX_BADGES = 96 # This was limited in PR#2360 to make it divisible by 8
|
||||
|
||||
before_action :ensure_badges_enabled
|
||||
|
||||
def index
|
||||
params.permit [:granted_before, :offset, :username]
|
||||
|
||||
badge = fetch_badge_from_params
|
||||
user_badges = badge.user_badges.order('granted_at DESC, id DESC').limit(96)
|
||||
user_badges = badge.user_badges.order('granted_at DESC, id DESC').limit(MAX_BADGES)
|
||||
user_badges = user_badges.includes(:user, :granted_by, badge: :badge_type, post: :topic, user: :primary_group)
|
||||
|
||||
grant_count = nil
|
||||
@ -37,15 +40,19 @@ class UserBadgesController < ApplicationController
|
||||
user_badges = user.user_badges
|
||||
|
||||
if params[:grouped]
|
||||
user_badges = user_badges.group(:badge_id)
|
||||
.select(UserBadge.attribute_names.map { |x| "MAX(#{x}) AS #{x}" }, 'COUNT(*) AS "count"')
|
||||
user_badges = user_badges.group(:badge_id).select_for_grouping
|
||||
end
|
||||
|
||||
user_badges = user_badges.includes(badge: [:badge_grouping, :badge_type, :image_upload])
|
||||
.includes(post: :topic)
|
||||
.includes(:granted_by)
|
||||
|
||||
render_serialized(user_badges, DetailedUserBadgeSerializer, root: :user_badges)
|
||||
render_serialized(
|
||||
user_badges,
|
||||
DetailedUserBadgeSerializer,
|
||||
root: :user_badges,
|
||||
meta: { max_favorites: MAX_FAVORITES },
|
||||
)
|
||||
end
|
||||
|
||||
def create
|
||||
@ -91,6 +98,24 @@ class UserBadgesController < ApplicationController
|
||||
render json: success_json
|
||||
end
|
||||
|
||||
def toggle_favorite
|
||||
params.require(:user_badge_id)
|
||||
user_badge = UserBadge.find(params[:user_badge_id])
|
||||
user_badges = user_badge.user.user_badges
|
||||
|
||||
unless can_favorite_badge?(user_badge)
|
||||
return render json: failed_json, status: 403
|
||||
end
|
||||
|
||||
if !user_badge.is_favorite && user_badges.where(is_favorite: true).count >= MAX_FAVORITES
|
||||
return render json: failed_json, status: 400
|
||||
end
|
||||
|
||||
user_badge.toggle!(:is_favorite)
|
||||
UserBadge.update_featured_ranks!(user_badge.user_id)
|
||||
render_serialized(user_badge, DetailedUserBadgeSerializer, root: :user_badge)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Get the badge from either the badge name or id specified in the params.
|
||||
@ -114,6 +139,10 @@ class UserBadgesController < ApplicationController
|
||||
master_api_call || guardian.can_grant_badges?(user)
|
||||
end
|
||||
|
||||
def can_favorite_badge?(user_badge)
|
||||
current_user == user_badge.user && !(1..4).include?(user_badge.badge_id)
|
||||
end
|
||||
|
||||
def ensure_badges_enabled
|
||||
raise Discourse::NotFound unless SiteSetting.enable_badges?
|
||||
end
|
||||
|
Reference in New Issue
Block a user