# frozen_string_literal: true class Api::V1::ReactionDeckController < Api::BaseController include RoutingHelper before_action -> { doorkeeper_authorize! :read, :'read:lists' }, only: [:index] before_action -> { doorkeeper_authorize! :write, :'write:lists' }, only: [:create] before_action :require_user! before_action :set_deck, only: [:index, :create] rescue_from ArgumentError do |e| render json: { error: e.to_s }, status: 422 end def index render json: remove_metas(@deck) end def create deck = [] shortcodes = [] (deck_params['emojis'] || []).each do |shortcode| shortcodes << shortcode.delete(':') break if shortcodes.length >= User::REACTION_DECK_MAX end custom_emojis = CustomEmoji.where(shortcode: shortcodes, domain: nil) shortcodes.each do |shortcode| custom_emoji = custom_emojis.find { |em| em.shortcode == shortcode } emoji_data = {} if custom_emoji emoji_data['name'] = custom_emoji.shortcode emoji_data['url'] = full_asset_url(custom_emoji.image.url) emoji_data['static_url'] = full_asset_url(custom_emoji.image.url(:static)) emoji_data['width'] = custom_emoji.image_width emoji_data['height'] = custom_emoji.image_height emoji_data['custom_emoji_id'] = custom_emoji.id else emoji_data['name'] = shortcode end deck << emoji_data end current_user.settings['reaction_deck'] = deck.to_json current_user.save! render json: remove_metas(deck) end private def set_deck deck = current_user.setting_reaction_deck ? JSON.parse(current_user.setting_reaction_deck) : [] @deck = remove_unused_custom_emojis(deck) end def remove_unused_custom_emojis(deck) custom_ids = [] deck.each do |item| custom_ids << item['custom_emoji_id'].to_i if item.key?('custom_emoji_id') end custom_emojis = CustomEmoji.where(id: custom_ids) deck.each do |item| next if item['custom_emoji_id'].nil? custom_emoji = custom_emojis.find { |em| em.id == item['custom_emoji_id'].to_i } remove = custom_emoji.nil? || custom_emoji.disabled item['remove'] = remove if remove end deck.filter { |item| !item.key?('remove') } end def remove_metas(deck) deck.tap do |d| d.each do |item| item.delete('custom_emoji_id') # item.delete('id') if item.key?('id') end end end def deck_params params end end