diff --git a/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 b/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 index 5921c4f21dc..619d08c36f7 100644 --- a/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 @@ -2,19 +2,24 @@ export default Ember.ArrayController.extend({ sortProperties: ["name"], actions: { - emojiUploaded: function (emoji) { - this.pushObject(emoji); + emojiUploaded(emoji) { + this.pushObject(Em.Object.create(emoji)); }, - destroy: function(emoji) { - var self = this; - return bootbox.confirm(I18n.t("admin.emoji.delete_confirm", { name: emoji.name }), I18n.t("no_value"), I18n.t("yes_value"), function (destroy) { - if (destroy) { - return Discourse.ajax("/admin/customize/emojis/" + emoji.name, { type: "DELETE" }).then(function() { - self.removeObject(emoji); - }); + destroy(emoji) { + const self = this; + return bootbox.confirm( + I18n.t("admin.emoji.delete_confirm", { name: emoji.get("name") }), + I18n.t("no_value"), + I18n.t("yes_value"), + function(destroy) { + if (destroy) { + return Discourse.ajax("/admin/customize/emojis/" + emoji.get("name"), { type: "DELETE" }).then(function() { + self.removeObject(emoji); + }); + } } - }); + ); } } }); diff --git a/app/assets/javascripts/discourse/lib/utilities.js b/app/assets/javascripts/discourse/lib/utilities.js index 76b24f5007f..70256c67f92 100644 --- a/app/assets/javascripts/discourse/lib/utilities.js +++ b/app/assets/javascripts/discourse/lib/utilities.js @@ -296,8 +296,9 @@ Discourse.Utilities = { } return; } - } else if (data.errors) { + } else if (data.errors && data.errors.length > 0) { bootbox.alert(data.errors.join("\n")); + return; } // otherwise, display a generic error message bootbox.alert(I18n.t('post.errors.upload')); diff --git a/app/controllers/admin/emojis_controller.rb b/app/controllers/admin/emojis_controller.rb index 7af02c211d1..37d12df4dd6 100644 --- a/app/controllers/admin/emojis_controller.rb +++ b/app/controllers/admin/emojis_controller.rb @@ -8,21 +8,25 @@ class Admin::EmojisController < Admin::AdminController file = params[:file] || params[:files].first name = params[:name] || File.basename(file.original_filename, ".*") - # fix the name - name = name.gsub(/[^a-z0-9]+/i, '_') - .gsub(/_{2,}/, '_') - .downcase + Scheduler::Defer.later("Upload Emoji") do + # fix the name + name = name.gsub(/[^a-z0-9]+/i, '_') + .gsub(/_{2,}/, '_') + .downcase - if Emoji.exists?(name) - render json: failed_json.merge(message: I18n.t("emoji.errors.name_already_exists", name: name)), status: 422 - else - if emoji = Emoji.create_for(file, name) - render_serialized(emoji, EmojiSerializer, root: false) + data = if Emoji.exists?(name) + failed_json.merge(errors: [I18n.t("emoji.errors.name_already_exists", name: name)]) + elsif emoji = Emoji.create_for(file, name) + emoji else - render json: failed_json.merge(message: I18n.t("emoji.errors.error_while_storing_emoji")), status: 422 + failed_json.merge(errors: [I18n.t("emoji.errors.error_while_storing_emoji")]) end + + MessageBus.publish("/uploads/emoji", data.as_json, user_ids: [current_user.id]) end + + render json: success_json end def destroy diff --git a/spec/controllers/admin/emojis_controller_spec.rb b/spec/controllers/admin/emojis_controller_spec.rb index dd0e68b853e..23a0256f5ed 100644 --- a/spec/controllers/admin/emojis_controller_spec.rb +++ b/spec/controllers/admin/emojis_controller_spec.rb @@ -1,4 +1,4 @@ -require 'spec_helper' +require "spec_helper" describe Admin::EmojisController do @@ -9,6 +9,13 @@ describe Admin::EmojisController do end end + let(:custom_emoji2) do + Emoji.new("/path/to/hello2").tap do |e| + e.name = "hello2" + e.url = "/url/to/hello2.png" + end + end + it "is a subclass of AdminController" do expect(Admin::EmojisController < Admin::AdminController).to eq(true) end @@ -16,57 +23,59 @@ describe Admin::EmojisController do context "when logged in" do let!(:user) { log_in(:admin) } - context '.index' do + context ".index" do it "returns a list of custom emojis" do Emoji.expects(:custom).returns([custom_emoji]) xhr :get, :index expect(response).to be_success json = ::JSON.parse(response.body) - expect(json[0]['name']).to eq(custom_emoji.name) - expect(json[0]['url']).to eq(custom_emoji.url) + expect(json[0]["name"]).to eq(custom_emoji.name) + expect(json[0]["url"]).to eq(custom_emoji.url) end end - context '.create' do + context ".create" do before { Emoji.expects(:custom).returns([custom_emoji]) } - context 'name already exist' do + context "name already exist" do it "throws an error" do - xhr :post, :create, { name: "hello", file: "" } - expect(response).not_to be_success + message = MessageBus.track_publish do + xhr :post, :create, { name: "hello", file: "" } + end.first + + expect(response).to be_success + expect(message.data["errors"]).to be end end - context 'error while saving emoji' do + context "error while saving emoji" do it "throws an error" do Emoji.expects(:create_for).returns(nil) - xhr :post, :create, { name: "garbage", file: "" } - expect(response).not_to be_success + message = MessageBus.track_publish do + xhr :post, :create, { name: "garbage", file: "" } + end.first + + expect(response).to be_success + expect(message.data["errors"]).to be end end - context 'it works' do - let(:custom_emoji2) do - Emoji.new("/path/to/hello2").tap do |e| - e.name = "hello2" - e.url = "/url/to/hello2.png" - end - end + it "works" do + Emoji.expects(:create_for).returns(custom_emoji2) - it "creates a custom emoji" do - Emoji.expects(:create_for).returns(custom_emoji2) + message = MessageBus.track_publish do xhr :post, :create, { name: "hello2", file: ""} - expect(response).to be_success - json = ::JSON.parse(response.body) - expect(json['name']).to eq(custom_emoji2.name) - expect(json['url']).to eq(custom_emoji2.url) - end + end.first + expect(response).to be_success + + expect(message.data["name"]).to eq(custom_emoji2.name) + expect(message.data["url"]).to eq(custom_emoji2.url) end end - context '.destroy' do + context ".destroy" do it "deletes the custom emoji" do custom_emoji.expects(:remove) Emoji.expects(:custom).returns([custom_emoji]) @@ -77,4 +86,3 @@ describe Admin::EmojisController do end end -