# frozen_string_literal: true class BadgesController < ApplicationController skip_before_action :check_xhr, only: %i[index show] after_action :add_noindex_header def index raise Discourse::NotFound unless SiteSetting.enable_badges badges = Badge.all if search = params[:search] search = search.to_s badges = badges.where("name ILIKE ?", "%#{search}%") end if (params[:only_listable] == "true") || !request.xhr? # NOTE: this is sorted client side if needed badges = badges .includes(:badge_grouping) .includes(:badge_type, :image_upload) .where(enabled: true, listable: true) end badges = badges.to_a user_badges = nil if current_user user_badges = Set.new(current_user.user_badges.select("distinct badge_id").pluck(:badge_id)) end serialized = MultiJson.dump( serialize_data( badges, BadgeIndexSerializer, root: "badges", user_badges: user_badges, include_long_description: true, ), ) respond_to do |format| format.html do store_preloaded "badges", serialized render "default/empty" end format.json { render json: serialized } end end def show raise Discourse::NotFound unless SiteSetting.enable_badges params.require(:id) @badge = Badge.enabled.find(params[:id]) @rss_title = I18n.t( "rss_description.badge", display_name: @badge.display_name, site_title: SiteSetting.title, ) @rss_link = "#{Discourse.base_url}/badges/#{@badge.id}/#{@badge.slug}" if current_user user_badge = UserBadge.find_by(user_id: current_user.id, badge_id: @badge.id) user_badge.notification.update read: true if user_badge && user_badge.notification @badge.has_badge = true if user_badge end serialized = MultiJson.dump( serialize_data(@badge, BadgeSerializer, root: "badge", include_long_description: true), ) respond_to do |format| format.rss { @rss_description = @badge.long_description } format.html { store_preloaded "badge", serialized } format.json { render json: serialized } end end end