recent_topics: Update topics post message deletion.

Delete stored topic data in `recent_senders` and `recent_topics`
about the message's topics and re-render them. The process is similar
to topic editing. See `recent_senders.process_topic_edit` for
logical details.
This commit is contained in:
Aman Agrawal
2020-07-15 13:06:03 +05:30
committed by Tim Abbott
parent 7c0fa3aefc
commit 5d5434ec2f
5 changed files with 103 additions and 0 deletions

View File

@@ -199,4 +199,19 @@ run_test('process_message_for_senders', () => {
assert.equal(
rs.get_topic_recent_senders(stream5, topic4).toString(), '2,3',
);
set_global('message_store', {
get: () => message1,
});
assert.equal(
rs.get_topic_recent_senders(stream1, topic1).toString(), '2,1',
);
// delete message1 and message5 sent by sender1
messages.splice(4, 1);
messages.splice(0, 1);
rs.update_topics_of_message_ids([message1.id, message5.id]);
assert.equal(
rs.get_topic_recent_senders(stream1, topic1).toString(), '2',
);
});

View File

@@ -620,7 +620,58 @@ run_test('test_reify_local_echo_message', () => {
}), false);
});
run_test('test_delete_messages', () => {
const rt = zrequire('recent_topics');
rt.set_filter('all');
rt.process_messages(messages);
set_global('message_list', {
all: {
all_messages: function () {
// messages[0] was removed.
const reduced_msgs = [...messages];
reduced_msgs.splice(0, 1);
return reduced_msgs;
},
},
});
let all_topics = rt.get();
assert.equal(Array.from(all_topics.keys()).toString(),
'4:topic-10,1:topic-7,1:topic-6,1:topic-5,1:topic-4,1:topic-3,1:topic-2,1:topic-1');
rt.update_topics_of_message_ids([messages[0].id]);
all_topics = rt.get();
assert.equal(Array.from(all_topics.keys()).toString(),
'4:topic-10,1:topic-7,1:topic-6,1:topic-5,1:topic-4,1:topic-3,1:topic-2');
set_global('message_list', {
all: {
all_messages: function () {
// messages[0], messages[1] and message[2] were removed.
const reduced_msgs = [...messages];
reduced_msgs.splice(0, 3);
return reduced_msgs;
},
},
});
rt.update_topics_of_message_ids([messages[1].id, messages[2].id]);
all_topics = rt.get();
assert.equal(Array.from(all_topics.keys()).toString(),
'4:topic-10,1:topic-7,1:topic-6,1:topic-5,1:topic-4,1:topic-3');
});
run_test('test_topic_edit', () => {
set_global('message_list', {
all: {
all_messages: function () {
return messages;
},
},
});
// NOTE: This test should always run in the end as it modified the messages data.
const rt = zrequire('recent_topics');
rt.set_filter('all');

View File

@@ -71,6 +71,26 @@ exports.process_topic_edit = function (old_stream_id, old_topic, new_topic, new_
// the messages were moved to another stream or deleted.
};
exports.update_topics_of_message_ids = function (message_ids) {
const topics_to_update = new Map();
for (const msg_id of message_ids) {
// Note: message_store retians data of msg post deletion.
const message = message_store.get(msg_id);
// Create unique keys for stream_id and topic.
const topic_key = message.stream_id + ":" + message.topic;
topics_to_update.set(topic_key, [message.stream_id, message.topic]);
}
for (const [stream_id, topic] of topics_to_update.values()) {
const topic_dict = topic_senders.get(stream_id);
topic_dict.delete(topic);
const topic_msgs = message_util.get_messages_in_topic(stream_id, topic);
for (const msg of topic_msgs) {
exports.process_message_for_senders(msg);
}
}
};
exports.compare_by_recency = function (user_a, user_b, stream_id, topic) {
let a_message_id;
let b_message_id;

View File

@@ -236,6 +236,21 @@ exports.topic_in_search_results = function (keyword, stream, topic) {
});
};
exports.update_topics_of_message_ids = function (message_ids) {
const topics_to_rerender = new Map();
for (const msg_id of message_ids) {
const message = message_store.get(msg_id);
const topic_key = get_topic_key(message.stream_id, message.topic);
topics_to_rerender.set(topic_key, [message.stream_id, message.topic]);
}
for (const [stream_id, topic] of topics_to_rerender.values()) {
topics.delete(get_topic_key(stream_id, topic));
const msgs = message_util.get_messages_in_topic(stream_id, topic);
exports.process_messages(msgs);
}
};
exports.filters_should_hide_topic = function (topic_data) {
const msg = message_store.get(topic_data.last_msg_id);

View File

@@ -131,6 +131,8 @@ exports.remove_messages = function (message_ids) {
}
list.remove_and_rerender(msg_ids_to_rerender);
}
recent_senders.update_topics_of_message_ids(message_ids);
recent_topics.update_topics_of_message_ids(message_ids);
};
exports.show_failed_message_success = function (message_id) {