mirror of
https://github.com/discourse/discourse.git
synced 2025-02-16 18:24:52 -06:00
FIX: support for async uploads of emojis
This commit is contained in:
parent
566b267981
commit
c91634c09a
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -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'));
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user