0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-07 13:19:19 +08:00
discourse/app/services/custom_emoji/confirm_import.rb
Martin Brennan b736e72b1c
DEV: Retroactive review and refactor of custom emoji bulk import/export (#41860)
Followup bd3906ce64

Converts the new endpoints made in the original PR into
service classes, using AI to drive implementation based
on the service authoring skill:

* CustomEmoji::Export
* CustomEmoji::PreviewImport
* CustomEmoji::ConfirmImport

In addition, some supporting action, lib, and serializer
classes have been added. This fixed a couple of
bugs as well:

* Import names now go through `Emoji.sanitize_emoji_name` like
single-emoji create
* No-group imports no longer persist a literal "default" string
* Two 500s (suspicious zip entries, malformed CSV) became proper 422s
* Duplicate CSV names are flagged at preview instead of exploding the
confirm transaction
*` Emoji.clear_cache `moved outside the transaction
2026-07-22 10:06:54 +10:00

40 lines
900 B
Ruby
Vendored

# frozen_string_literal: true
class CustomEmoji::ConfirmImport
include Service::Base
params do
attribute :token, :string
attribute :resolutions, default: -> { {} }
validates :token, presence: true
end
model :rows, :fetch_preview
try(ActiveRecord::RecordInvalid) { transaction { step :apply_rows } }
step :clear_preview
step :refresh_emoji_cache
private
def fetch_preview(params:, guardian:)
CustomEmoji::ImportPreviewCache.new(guardian.user).fetch(params.token)
end
def apply_rows(rows:, params:, guardian:)
context[:report] = CustomEmoji::Action::ApplyImportRows.call(
rows:,
resolutions: params.resolutions,
acting_user: guardian.user,
)
end
def clear_preview(params:, guardian:)
CustomEmoji::ImportPreviewCache.new(guardian.user).delete(params.token)
end
def refresh_emoji_cache
Emoji.clear_cache
end
end