92 lines
2.4 KiB
Ruby
92 lines
2.4 KiB
Ruby
# 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
|