2014-03-05 18:22:20 +05:30
class UserBadgesController < ApplicationController
def index
2016-01-18 17:59:07 +11:00
params . permit [ :granted_before , :offset , :username ]
2014-08-25 10:38:20 -07:00
badge = fetch_badge_from_params
2015-09-25 10:20:47 +10:00
user_badges = badge . user_badges . order ( 'granted_at DESC, id DESC' ) . limit ( 96 )
2014-08-25 10:38:20 -07:00
user_badges = user_badges . includes ( :user , :granted_by , badge : :badge_type , post : :topic )
2014-04-22 15:10:47 +05:30
2016-01-18 17:59:07 +11:00
grant_count = nil
if params [ :username ]
user_id = User . where ( username_lower : params [ :username ] . downcase ) . pluck ( :id ) . first
user_badges = user_badges . where ( user_id : user_id ) if user_id
2016-03-05 10:57:32 +11:00
grant_count = badge . user_badges . where ( user_id : user_id ) . count
2016-01-18 17:59:07 +11:00
end
2014-07-18 15:46:36 +10:00
if offset = params [ :offset ]
user_badges = user_badges . offset ( offset . to_i )
2014-04-16 20:26:11 +05:30
end
2014-04-22 15:10:47 +05:30
2016-01-18 17:59:07 +11:00
user_badges = UserBadges . new ( user_badges : user_badges ,
username : params [ :username ] ,
grant_count : grant_count )
render_serialized ( user_badges , UserBadgesSerializer , root : :user_badge_info , include_long_description : true )
2014-08-25 10:38:20 -07:00
end
def username
params . permit [ :grouped ]
user = fetch_user_from_params
2015-09-25 10:20:47 +10:00
user_badges = user . user_badges
2014-04-22 15:10:47 +05:30
2014-06-10 06:53:18 +05:30
if params [ :grouped ]
2014-07-14 17:40:01 +10:00
user_badges = user_badges . group ( :badge_id )
2016-03-30 23:11:00 +02:00
. select ( UserBadge . attribute_names . map { | x | " MAX( #{ x } ) AS #{ x } " } , 'COUNT(*) AS "count"' )
2014-05-21 12:52:42 +05:30
end
2015-09-25 10:20:47 +10:00
user_badges = user_badges . includes ( badge : [ :badge_grouping , :badge_type ] )
. includes ( post : :topic )
. includes ( :granted_by )
2016-01-18 17:59:07 +11:00
render_serialized ( user_badges , DetailedUserBadgeSerializer , root : :user_badges )
2014-03-05 18:22:20 +05:30
end
def create
params . require ( :username )
user = fetch_user_from_params
unless can_assign_badge_to_user? ( user )
render json : failed_json , status : 403
return
end
badge = fetch_badge_from_params
2015-02-25 12:52:43 +11:00
post_id = nil
2014-03-05 18:22:20 +05:30
2015-02-25 12:52:43 +11:00
if params [ :reason ] . present?
path = URI . parse ( params [ :reason ] ) . path rescue nil
route = Rails . application . routes . recognize_path ( path ) if path
if route
topic_id = route [ :topic_id ] . to_i
post_number = route [ :post_number ] || 1
post_id = Post . find_by ( topic_id : topic_id , post_number : post_number ) . try ( :id ) if topic_id > 0
end
end
user_badge = BadgeGranter . grant ( badge , user , granted_by : current_user , post_id : post_id )
render_serialized ( user_badge , DetailedUserBadgeSerializer , root : " user_badge " )
2014-03-05 18:22:20 +05:30
end
def destroy
params . require ( :id )
user_badge = UserBadge . find ( params [ :id ] )
unless can_assign_badge_to_user? ( user_badge . user )
render json : failed_json , status : 403
return
end
2014-03-20 01:00:12 +05:30
BadgeGranter . revoke ( user_badge , revoked_by : current_user )
2014-03-05 18:22:20 +05:30
render json : success_json
end
private
# Get the badge from either the badge name or id specified in the params.
def fetch_badge_from_params
badge = nil
params . permit ( :badge_name )
if params [ :badge_name ] . nil?
params . require ( :badge_id )
2014-07-14 17:40:01 +10:00
badge = Badge . find_by ( id : params [ :badge_id ] , enabled : true )
2014-03-05 18:22:20 +05:30
else
2014-07-14 17:40:01 +10:00
badge = Badge . find_by ( name : params [ :badge_name ] , enabled : true )
2014-03-05 18:22:20 +05:30
end
2015-05-07 11:00:51 +10:00
raise Discourse :: NotFound if badge . blank?
2014-03-05 18:22:20 +05:30
badge
end
def can_assign_badge_to_user? ( user )
master_api_call = current_user . nil? && is_api?
master_api_call or guardian . can_grant_badges? ( user )
end
end