user_topics: Always store stream name in UserTopic.

This commit is contained in:
evykassirer 2024-03-30 15:39:51 -07:00 committed by Tim Abbott
parent b0a4b8e439
commit 741b8c308a
6 changed files with 123 additions and 24 deletions

View File

@ -19,7 +19,7 @@ type ServerUserTopic = z.infer<typeof user_topic_schema>;
export type UserTopic = {
stream_id: number;
stream: string | undefined;
stream: string;
topic: string;
date_updated: number;
date_updated_str: string;
@ -37,6 +37,7 @@ const user_topic_schema = z.object({
const all_user_topics = new Map<
number,
FoldDict<{
stream_name: string;
date_updated: number;
visibility_policy: number;
}>
@ -51,6 +52,7 @@ export const all_visibility_policies = {
export function update_user_topics(
stream_id: number,
stream_name: string,
topic: string,
visibility_policy: number,
date_updated: number,
@ -64,7 +66,7 @@ export function update_user_topics(
all_user_topics.set(stream_id, sub_dict);
}
const time = get_time_from_date_muted(date_updated);
sub_dict.set(topic, {date_updated: time, visibility_policy});
sub_dict.set(topic, {date_updated: time, visibility_policy, stream_name});
}
}
@ -95,14 +97,14 @@ export function is_topic_unmuted_or_followed(stream_id: number, topic: string):
export function get_user_topics_for_visibility_policy(visibility_policy: number): UserTopic[] {
const topics: UserTopic[] = [];
for (const [stream_id, sub_dict] of all_user_topics) {
const stream = sub_store.maybe_get_stream_name(stream_id);
for (const topic of sub_dict.keys()) {
if (sub_dict.get(topic)!.visibility_policy === visibility_policy) {
const date_updated = sub_dict.get(topic)!.date_updated;
const topic_dict = sub_dict.get(topic)!;
const date_updated = topic_dict.date_updated;
const date_updated_str = timerender.render_now(new Date(date_updated)).time_str;
topics.push({
stream_id,
stream,
stream: topic_dict.stream_name,
topic,
date_updated,
date_updated_str,
@ -210,7 +212,7 @@ export function set_user_topic(user_topic: ServerUserTopic): void {
return;
}
update_user_topics(stream_id, topic, user_topic.visibility_policy, date_updated);
update_user_topics(stream_id, stream_name, topic, user_topic.visibility_policy, date_updated);
}
export function set_user_topics(user_topics: ServerUserTopic[]): void {

View File

@ -151,7 +151,12 @@ run_test("muting", () => {
{id: 9, type: "private", to_user_ids: "9", sender_id: 11},
];
user_topics.update_user_topics(1, "muted", user_topics.all_visibility_policies.MUTED);
user_topics.update_user_topics(
1,
"random stream name",
"muted",
user_topics.all_visibility_policies.MUTED,
);
muted_users.add_muted_user(10);
// `messages_filtered_for_topic_mutes` should skip filtering

View File

@ -38,12 +38,14 @@ stream_data.add_sub(muted);
user_topics.update_user_topics(
general.stream_id,
general.name,
"muted topic",
user_topics.all_visibility_policies.MUTED,
);
user_topics.update_user_topics(
general.stream_id,
general.name,
"followed topic",
user_topics.all_visibility_policies.FOLLOWED,
);

View File

@ -23,6 +23,7 @@ stream_data.add_sub(frontend);
run_test("settings", ({override, override_rewire}) => {
user_topics.update_user_topics(
frontend.stream_id,
frontend.name,
"js",
user_topics.all_visibility_policies.MUTED,
1577836800,

View File

@ -245,6 +245,7 @@ test("muting", () => {
user_topics.update_user_topics(
social.stream_id,
social.stream_name,
"test_muting",
user_topics.all_visibility_policies.MUTED,
);
@ -481,11 +482,12 @@ test("mentions", () => {
test_notifiable_count(counts.home_unread_messages, 0);
const muted_stream_id = 900;
const muted_stream_name = "muted stream for testing unread mentions";
const unmuted_stream_id = 901;
sub_store.add_hydrated_sub(muted_stream_id, {
muted_stream_id,
name: "muted stream for testing unread mentions",
name: muted_stream_name,
subscribed: true,
is_muted: true,
});
@ -498,6 +500,7 @@ test("mentions", () => {
user_topics.update_user_topics(
muted_stream_id,
muted_stream_name,
"lunch",
user_topics.all_visibility_policies.MUTED,
);
@ -638,7 +641,12 @@ test("mention updates", () => {
test("stream_has_any_unread_mentions", () => {
const muted_stream_id = 401;
user_topics.update_user_topics(401, "lunch", user_topics.all_visibility_policies.MUTED);
user_topics.update_user_topics(
401,
"random_stream_name",
"lunch",
user_topics.all_visibility_policies.MUTED,
);
const mention_me_message = {
id: 15,

View File

@ -55,64 +55,139 @@ test("edge_cases", () => {
test("add_and_remove_mutes", () => {
assert.ok(!user_topics.is_topic_muted(devel.stream_id, "java"));
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.MUTED);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.MUTED,
);
assert.ok(user_topics.is_topic_muted(devel.stream_id, "java"));
// test idempotency
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.MUTED);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.MUTED,
);
assert.ok(user_topics.is_topic_muted(devel.stream_id, "java"));
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.INHERIT);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.INHERIT,
);
assert.ok(!user_topics.is_topic_muted(devel.stream_id, "java"));
// test idempotency
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.INHERIT);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.INHERIT,
);
assert.ok(!user_topics.is_topic_muted(devel.stream_id, "java"));
// test unknown stream is harmless too
user_topics.update_user_topics(unknown.stream_id, "java", all_visibility_policies.INHERIT);
user_topics.update_user_topics(
unknown.stream_id,
unknown.name,
"java",
all_visibility_policies.INHERIT,
);
assert.ok(!user_topics.is_topic_muted(unknown.stream_id, "java"));
});
test("add_and_remove_unmutes", () => {
assert.ok(!user_topics.is_topic_unmuted(devel.stream_id, "java"));
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.UNMUTED);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.UNMUTED,
);
assert.ok(user_topics.is_topic_unmuted(devel.stream_id, "java"));
// test idempotency
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.UNMUTED);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.UNMUTED,
);
assert.ok(user_topics.is_topic_unmuted(devel.stream_id, "java"));
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.INHERIT);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.INHERIT,
);
assert.ok(!user_topics.is_topic_unmuted(devel.stream_id, "java"));
// test idempotency
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.INHERIT);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.INHERIT,
);
assert.ok(!user_topics.is_topic_unmuted(devel.stream_id, "java"));
// test unknown stream is harmless too
user_topics.update_user_topics(unknown.stream_id, "java", all_visibility_policies.INHERIT);
user_topics.update_user_topics(
unknown.stream_id,
unknown.name,
"java",
all_visibility_policies.INHERIT,
);
assert.ok(!user_topics.is_topic_unmuted(unknown.stream_id, "java"));
});
test("add_and_remove_follows", () => {
assert.ok(!user_topics.is_topic_followed(devel.stream_id, "java"));
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.FOLLOWED);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.FOLLOWED,
);
assert.ok(user_topics.is_topic_followed(devel.stream_id, "java"));
// test idempotency
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.FOLLOWED);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.FOLLOWED,
);
assert.ok(user_topics.is_topic_followed(devel.stream_id, "java"));
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.INHERIT);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.INHERIT,
);
assert.ok(!user_topics.is_topic_followed(devel.stream_id, "java"));
// test idempotency
user_topics.update_user_topics(devel.stream_id, "java", all_visibility_policies.INHERIT);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.INHERIT,
);
assert.ok(!user_topics.is_topic_followed(devel.stream_id, "java"));
// test unknown stream is harmless too
user_topics.update_user_topics(unknown.stream_id, "java", all_visibility_policies.INHERIT);
user_topics.update_user_topics(
unknown.stream_id,
unknown.name,
"java",
all_visibility_policies.INHERIT,
);
assert.ok(!user_topics.is_topic_followed(unknown.stream_id, "java"));
});
@ -125,12 +200,14 @@ test("get_mutes", () => {
);
user_topics.update_user_topics(
office.stream_id,
office.name,
"gossip",
all_visibility_policies.MUTED,
1577836800,
);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.MUTED,
1577836700,
@ -168,12 +245,14 @@ test("get_unmutes", () => {
);
user_topics.update_user_topics(
office.stream_id,
office.name,
"gossip",
all_visibility_policies.UNMUTED,
1577836800,
);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.UNMUTED,
1577836700,
@ -211,12 +290,14 @@ test("get_follows", () => {
);
user_topics.update_user_topics(
office.stream_id,
office.name,
"gossip",
all_visibility_policies.FOLLOWED,
1577836800,
);
user_topics.update_user_topics(
devel.stream_id,
devel.name,
"java",
all_visibility_policies.FOLLOWED,
1577836700,