discourse/app/controllers/admin/emojis_controller.rb
锦心 199f980e6a
FEATURE: Add creator and logging for CustomEmoji (#28004)
* FEATURE: Add logging for CustomEmoji

We didn't provide any logs for CustomEmoji before, nor did we record the
person who added any emoji in the database. As a result, the staff had
no way to trace back who added a certain emoji.

This commit adds a new column `user_id` to `custom_emojis` to record the
creator of an emoji. At the same time, a log is added for staff logs to
record who added or deleted a custom emoji.
2024-07-22 14:44:49 +08:00

70 lines
2.0 KiB
Ruby

# frozen_string_literal: true
class Admin::EmojisController < Admin::AdminController
def index
render_serialized(Emoji.custom, EmojiSerializer, root: false)
end
# NOTE: This kind of custom logic also needs to be implemented to
# be run in the ExternalUploadManager when a direct S3 upload is completed,
# related to preventDirectS3Uploads in the UppyUploadMixin.
#
# Until then, preventDirectS3Uploads is set to true in the UppyUploadMixin.
def create
file = params[:file] || params[:files].first
name = params[:name] || File.basename(file.original_filename, ".*")
group = params[:group] ? params[:group].downcase : nil
hijack do
# fix the name
name = File.basename(name, ".*")
name = Emoji.sanitize_emoji_name(name)
upload =
UploadCreator.new(file.tempfile, file.original_filename, type: "custom_emoji").create_for(
current_user.id,
)
good = true
data =
if upload.persisted?
custom_emoji =
CustomEmoji.new(name: name, upload: upload, group: group, user: current_user)
if custom_emoji.save
StaffActionLogger.new(current_user).log_custom_emoji_create(name, group: group)
Emoji.clear_cache
{ name: custom_emoji.name, url: custom_emoji.upload.url, group: group }
else
good = false
failed_json.merge(errors: custom_emoji.errors.full_messages)
end
else
good = false
failed_json.merge(errors: upload.errors.full_messages)
end
render json: data.as_json, status: good ? 200 : 422
end
end
def destroy
name = params.require(:id)
# NOTE: the upload will automatically be removed by the 'clean_up_uploads' job
emoji = CustomEmoji.find_by(name: name)
if emoji.present?
StaffActionLogger.new(current_user).log_custom_emoji_destroy(name)
emoji.destroy!
end
Emoji.clear_cache
Jobs.enqueue(:rebake_custom_emoji_posts, name: name)
render json: success_json
end
end