mirror of
https://github.com/discourse/discourse.git
synced 2025-02-20 11:48:26 -06:00
DEV: moves channel-archive-status to channels subscriptions (#19567)
It was quite an oddball because its a global subscription created on each channel. channels manager now allows us to elegantly solve this case.
This commit is contained in:
parent
584a6e3552
commit
908add79de
@ -111,7 +111,6 @@ class ChatChannelSerializer < ApplicationSerializer
|
|||||||
new_mentions:
|
new_mentions:
|
||||||
@opts[:new_mentions_message_bus_last_id] ||
|
@opts[:new_mentions_message_bus_last_id] ||
|
||||||
MessageBus.last_id(ChatPublisher.new_mentions_message_bus_channel(object.id)),
|
MessageBus.last_id(ChatPublisher.new_mentions_message_bus_channel(object.id)),
|
||||||
archive_status: MessageBus.last_id("/chat/channel-archive-status"),
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -45,6 +45,8 @@ class StructuredChannelSerializer < ApplicationSerializer
|
|||||||
channel_edits: chat_message_bus_last_ids[ChatPublisher::CHANNEL_EDITS_MESSAGE_BUS_CHANNEL],
|
channel_edits: chat_message_bus_last_ids[ChatPublisher::CHANNEL_EDITS_MESSAGE_BUS_CHANNEL],
|
||||||
channel_status: chat_message_bus_last_ids[ChatPublisher::CHANNEL_STATUS_MESSAGE_BUS_CHANNEL],
|
channel_status: chat_message_bus_last_ids[ChatPublisher::CHANNEL_STATUS_MESSAGE_BUS_CHANNEL],
|
||||||
new_channel: chat_message_bus_last_ids[ChatPublisher::NEW_CHANNEL_MESSAGE_BUS_CHANNEL],
|
new_channel: chat_message_bus_last_ids[ChatPublisher::NEW_CHANNEL_MESSAGE_BUS_CHANNEL],
|
||||||
|
archive_status:
|
||||||
|
chat_message_bus_last_ids[ChatPublisher::CHANNEL_ARCHIVE_STATUS_MESSAGE_BUS_CHANNEL],
|
||||||
}
|
}
|
||||||
|
|
||||||
if id =
|
if id =
|
||||||
@ -67,6 +69,7 @@ class StructuredChannelSerializer < ApplicationSerializer
|
|||||||
ChatPublisher::CHANNEL_EDITS_MESSAGE_BUS_CHANNEL,
|
ChatPublisher::CHANNEL_EDITS_MESSAGE_BUS_CHANNEL,
|
||||||
ChatPublisher::CHANNEL_STATUS_MESSAGE_BUS_CHANNEL,
|
ChatPublisher::CHANNEL_STATUS_MESSAGE_BUS_CHANNEL,
|
||||||
ChatPublisher::NEW_CHANNEL_MESSAGE_BUS_CHANNEL,
|
ChatPublisher::NEW_CHANNEL_MESSAGE_BUS_CHANNEL,
|
||||||
|
ChatPublisher::CHANNEL_ARCHIVE_STATUS_MESSAGE_BUS_CHANNEL,
|
||||||
]
|
]
|
||||||
|
|
||||||
if !scope.anonymous?
|
if !scope.anonymous?
|
||||||
|
@ -230,6 +230,8 @@ module ChatPublisher
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
CHANNEL_ARCHIVE_STATUS_MESSAGE_BUS_CHANNEL = "/chat/channel-archive-status"
|
||||||
|
|
||||||
def self.publish_archive_status(
|
def self.publish_archive_status(
|
||||||
chat_channel,
|
chat_channel,
|
||||||
archive_status:,
|
archive_status:,
|
||||||
@ -238,7 +240,7 @@ module ChatPublisher
|
|||||||
total_messages:
|
total_messages:
|
||||||
)
|
)
|
||||||
MessageBus.publish(
|
MessageBus.publish(
|
||||||
"/chat/channel-archive-status",
|
CHANNEL_ARCHIVE_STATUS_MESSAGE_BUS_CHANNEL,
|
||||||
{
|
{
|
||||||
chat_channel_id: chat_channel.id,
|
chat_channel_id: chat_channel.id,
|
||||||
archive_failed: archive_status == :failed,
|
archive_failed: archive_status == :failed,
|
||||||
|
@ -4,7 +4,7 @@ import I18n from "I18n";
|
|||||||
import { popupAjaxError } from "discourse/lib/ajax-error";
|
import { popupAjaxError } from "discourse/lib/ajax-error";
|
||||||
import getURL from "discourse-common/lib/get-url";
|
import getURL from "discourse-common/lib/get-url";
|
||||||
import { action } from "@ember/object";
|
import { action } from "@ember/object";
|
||||||
import discourseComputed, { bind } from "discourse-common/utils/decorators";
|
import discourseComputed from "discourse-common/utils/decorators";
|
||||||
import { inject as service } from "@ember/service";
|
import { inject as service } from "@ember/service";
|
||||||
|
|
||||||
export default Component.extend({
|
export default Component.extend({
|
||||||
@ -49,43 +49,7 @@ export default Component.extend({
|
|||||||
.catch(popupAjaxError);
|
.catch(popupAjaxError);
|
||||||
},
|
},
|
||||||
|
|
||||||
didInsertElement() {
|
|
||||||
this._super(...arguments);
|
|
||||||
|
|
||||||
if (this.currentUser.admin) {
|
|
||||||
this.messageBus.subscribe(
|
|
||||||
"/chat/channel-archive-status",
|
|
||||||
this.onMessage,
|
|
||||||
this.channel.meta.message_bus_last_ids.archive_status
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
willDestroyElement() {
|
|
||||||
this._super(...arguments);
|
|
||||||
|
|
||||||
if (this.currentUser.admin) {
|
|
||||||
this.messageBus.unsubscribe(
|
|
||||||
"/chat/channel-archive-status",
|
|
||||||
this.onMessage
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_getTopicUrl() {
|
_getTopicUrl() {
|
||||||
return getURL(`/t/-/${this.channel.archive_topic_id}`);
|
return getURL(`/t/-/${this.channel.archive_topic_id}`);
|
||||||
},
|
},
|
||||||
|
|
||||||
@bind
|
|
||||||
onMessage(busData) {
|
|
||||||
if (busData.chat_channel_id === this.channel.id) {
|
|
||||||
this.channel.setProperties({
|
|
||||||
archive_failed: busData.archive_failed,
|
|
||||||
archive_completed: busData.archive_completed,
|
|
||||||
archived_messages: busData.archived_messages,
|
|
||||||
archive_topic_id: busData.archive_topic_id,
|
|
||||||
total_messages: busData.total_messages,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
@ -7,25 +7,33 @@ import { popupAjaxError } from "discourse/lib/ajax-error";
|
|||||||
|
|
||||||
const DIRECT_MESSAGE_CHANNELS_LIMIT = 20;
|
const DIRECT_MESSAGE_CHANNELS_LIMIT = 20;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The ChatChannelsManager service is responsible for managing the loaded chat channels.
|
||||||
|
It provides helpers to facilitate using and managing laoded channels instead of constantly
|
||||||
|
fetching them from the server.
|
||||||
|
*/
|
||||||
|
|
||||||
export default class ChatChannelsManager extends Service {
|
export default class ChatChannelsManager extends Service {
|
||||||
@service chatSubscriptionsManager;
|
@service chatSubscriptionsManager;
|
||||||
@service chatApi;
|
@service chatApi;
|
||||||
@service currentUser;
|
@service currentUser;
|
||||||
@tracked _cached = new TrackedObject();
|
@tracked _cached = new TrackedObject();
|
||||||
|
|
||||||
get channels() {
|
async find(id, options = { fetchIfNotFound: true }) {
|
||||||
return Object.values(this._cached);
|
|
||||||
}
|
|
||||||
|
|
||||||
async find(id) {
|
|
||||||
const existingChannel = this.#findStale(id);
|
const existingChannel = this.#findStale(id);
|
||||||
if (existingChannel) {
|
if (existingChannel) {
|
||||||
return Promise.resolve(existingChannel);
|
return Promise.resolve(existingChannel);
|
||||||
} else {
|
} else if (options.fetchIfNotFound) {
|
||||||
return this.#find(id);
|
return this.#find(id);
|
||||||
|
} else {
|
||||||
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get channels() {
|
||||||
|
return Object.values(this._cached);
|
||||||
|
}
|
||||||
|
|
||||||
store(channelObject) {
|
store(channelObject) {
|
||||||
let model = this.#findStale(channelObject.id);
|
let model = this.#findStale(channelObject.id);
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ export default class ChatSubscriptionsManager extends Service {
|
|||||||
|
|
||||||
startChannelsSubscriptions(messageBusIds) {
|
startChannelsSubscriptions(messageBusIds) {
|
||||||
this._startNewChannelSubscription(messageBusIds.new_channel);
|
this._startNewChannelSubscription(messageBusIds.new_channel);
|
||||||
|
this._startChannelArchiveStatusSubscription(messageBusIds.archive_status);
|
||||||
this._startUserTrackingStateSubscription(messageBusIds.user_tracking_state);
|
this._startUserTrackingStateSubscription(messageBusIds.user_tracking_state);
|
||||||
this._startChannelsEditsSubscription(messageBusIds.channel_edits);
|
this._startChannelsEditsSubscription(messageBusIds.channel_edits);
|
||||||
this._startChannelsStatusChangesSubscription(messageBusIds.channel_status);
|
this._startChannelsStatusChangesSubscription(messageBusIds.channel_status);
|
||||||
@ -54,6 +55,7 @@ export default class ChatSubscriptionsManager extends Service {
|
|||||||
|
|
||||||
stopChannelsSubscriptions() {
|
stopChannelsSubscriptions() {
|
||||||
this._stopNewChannelSubscription();
|
this._stopNewChannelSubscription();
|
||||||
|
this._stopChannelArchiveStatusSubscription();
|
||||||
this._stopUserTrackingStateSubscription();
|
this._stopUserTrackingStateSubscription();
|
||||||
this._stopChannelsEditsSubscription();
|
this._stopChannelsEditsSubscription();
|
||||||
this._stopChannelsStatusChangesSubscription();
|
this._stopChannelsStatusChangesSubscription();
|
||||||
@ -64,6 +66,25 @@ export default class ChatSubscriptionsManager extends Service {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_startChannelArchiveStatusSubscription(lastId) {
|
||||||
|
if (this.currentUser.admin) {
|
||||||
|
this.messageBus.subscribe(
|
||||||
|
"/chat/channel-archive-status",
|
||||||
|
this._onChannelArchiveStatusUpdate,
|
||||||
|
lastId
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_stopChannelArchiveStatusSubscription() {
|
||||||
|
if (this.currentUser.admin) {
|
||||||
|
this.messageBus.unsubscribe(
|
||||||
|
"/chat/channel-archive-status",
|
||||||
|
this._onChannelArchiveStatusUpdate
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_startChannelMentionsSubscription(channel) {
|
_startChannelMentionsSubscription(channel) {
|
||||||
this.messageBus.subscribe(
|
this.messageBus.subscribe(
|
||||||
`/chat/${channel.id}/new-mentions`,
|
`/chat/${channel.id}/new-mentions`,
|
||||||
@ -72,6 +93,26 @@ export default class ChatSubscriptionsManager extends Service {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bind
|
||||||
|
_onChannelArchiveStatusUpdate(busData) {
|
||||||
|
// we don't want to fetch a channel we don't have locally because archive status changed
|
||||||
|
this.chatChannelsManager
|
||||||
|
.find(busData.chat_channel_id, { fetchIfNotFound: false })
|
||||||
|
.then((channel) => {
|
||||||
|
if (!channel) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
channel.setProperties({
|
||||||
|
archive_failed: busData.archive_failed,
|
||||||
|
archive_completed: busData.archive_completed,
|
||||||
|
archived_messages: busData.archived_messages,
|
||||||
|
archive_topic_id: busData.archive_topic_id,
|
||||||
|
total_messages: busData.total_messages,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@bind
|
@bind
|
||||||
_onNewMentions(busData) {
|
_onNewMentions(busData) {
|
||||||
this.chatChannelsManager.find(busData.channel_id).then((channel) => {
|
this.chatChannelsManager.find(busData.channel_id).then((channel) => {
|
||||||
|
@ -90,6 +90,7 @@ describe Chat::Api::ChatCurrentUserChannelsController do
|
|||||||
expect(ids["channel_edits"]).not_to eq(nil)
|
expect(ids["channel_edits"]).not_to eq(nil)
|
||||||
expect(ids["channel_status"]).not_to eq(nil)
|
expect(ids["channel_status"]).not_to eq(nil)
|
||||||
expect(ids["new_channel"]).not_to eq(nil)
|
expect(ids["new_channel"]).not_to eq(nil)
|
||||||
|
expect(ids["archive_status"]).not_to eq(nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
response.parsed_body["public_channels"][0]["meta"]["message_bus_last_ids"].tap do |ids|
|
response.parsed_body["public_channels"][0]["meta"]["message_bus_last_ids"].tap do |ids|
|
||||||
|
Loading…
Reference in New Issue
Block a user