From a5b3510cb3440c2db1d1a9e5895352a488ecf4d1 Mon Sep 17 00:00:00 2001 From: Sahil Batra Date: Mon, 2 May 2022 20:11:51 +0530 Subject: [PATCH] user_groups: Add functions to update subgroups data on receiving events. --- frontend_tests/node_tests/dispatch.js | 22 ++++++++++++++++++++++ frontend_tests/node_tests/lib/events.js | 14 ++++++++++++++ frontend_tests/node_tests/user_groups.js | 13 ++++++++++++- static/js/server_events_dispatch.js | 6 ++++++ static/js/user_groups.ts | 24 ++++++++++++++++++++++++ 5 files changed, 78 insertions(+), 1 deletion(-) diff --git a/frontend_tests/node_tests/dispatch.js b/frontend_tests/node_tests/dispatch.js index 1be02e65cb..0e602208fe 100644 --- a/frontend_tests/node_tests/dispatch.js +++ b/frontend_tests/node_tests/dispatch.js @@ -178,6 +178,17 @@ run_test("user groups", ({override}) => { assert_same(args.user_ids, event.user_ids); } + event = event_fixtures.user_group__add_subgroups; + { + const stub = make_stub(); + override(user_groups, "add_subgroups", stub.f); + dispatch(event); + assert.equal(stub.num_calls, 1); + const args = stub.get_args("group_id", "subgroup_ids"); + assert_same(args.group_id, event.group_id); + assert_same(args.subgroup_ids, event.subgroup_ids); + } + event = event_fixtures.user_group__remove_members; { const stub = make_stub(); @@ -189,6 +200,17 @@ run_test("user groups", ({override}) => { assert_same(args.user_ids, event.user_ids); } + event = event_fixtures.user_group__remove_subgroups; + { + const stub = make_stub(); + override(user_groups, "remove_subgroups", stub.f); + dispatch(event); + assert.equal(stub.num_calls, 1); + const args = stub.get_args("group_id", "subgroup_ids"); + assert_same(args.group_id, event.group_id); + assert_same(args.subgroup_ids, event.subgroup_ids); + } + event = event_fixtures.user_group__update; { const stub = make_stub(); diff --git a/frontend_tests/node_tests/lib/events.js b/frontend_tests/node_tests/lib/events.js index f552baae93..083cb6a554 100644 --- a/frontend_tests/node_tests/lib/events.js +++ b/frontend_tests/node_tests/lib/events.js @@ -746,6 +746,13 @@ exports.fixtures = { user_ids: [2], }, + user_group__add_subgroups: { + type: "user_group", + op: "add_subgroups", + group_id: 1, + subgroup_ids: [3], + }, + user_group__remove: { type: "user_group", op: "remove", @@ -759,6 +766,13 @@ exports.fixtures = { user_ids: [99, 100], }, + user_group__remove_subgroups: { + type: "user_group", + op: "remove_subgroups", + group_id: 1, + subgroup_ids: [3], + }, + user_group__update: { type: "user_group", op: "update", diff --git a/frontend_tests/node_tests/user_groups.js b/frontend_tests/node_tests/user_groups.js index 661f1648f7..7223c12e1e 100644 --- a/frontend_tests/node_tests/user_groups.js +++ b/frontend_tests/node_tests/user_groups.js @@ -99,6 +99,15 @@ run_test("user_groups", () => { user_groups.remove_members(all.id, [1, 4]); assert.deepEqual(user_groups.get_user_group_from_id(all.id).members, new Set([2, 3, 5])); + user_groups.add_subgroups(all.id, [2, 3]); + assert.deepEqual( + user_groups.get_user_group_from_id(all.id).subgroups, + new Set([2, 3, 5, 4, 6]), + ); + + user_groups.remove_subgroups(all.id, [2, 4]); + assert.deepEqual(user_groups.get_user_group_from_id(all.id).subgroups, new Set([3, 5, 6])); + assert.ok(user_groups.is_user_group(admins)); const object = { name: "core", @@ -112,7 +121,9 @@ run_test("user_groups", () => { blueslip.expect("error", "Could not find user group with ID -1"); assert.equal(user_groups.is_member_of(-1, 15), false); - blueslip.expect("error", "Could not find user group with ID -9999", 2); + blueslip.expect("error", "Could not find user group with ID -9999", 4); user_groups.add_members(-9999); user_groups.remove_members(-9999); + user_groups.add_subgroups(-9999); + user_groups.remove_subgroups(-9999); }); diff --git a/static/js/server_events_dispatch.js b/static/js/server_events_dispatch.js index 707d158ef6..4acb6a255e 100644 --- a/static/js/server_events_dispatch.js +++ b/static/js/server_events_dispatch.js @@ -754,6 +754,12 @@ export function dispatch_normal_event(event) { case "remove_members": user_groups.remove_members(event.group_id, event.user_ids); break; + case "add_subgroups": + user_groups.add_subgroups(event.group_id, event.subgroup_ids); + break; + case "remove_subgroups": + user_groups.remove_subgroups(event.group_id, event.subgroup_ids); + break; case "update": user_groups.update(event); break; diff --git a/static/js/user_groups.ts b/static/js/user_groups.ts index e1cdd3f959..e37e4acc4b 100644 --- a/static/js/user_groups.ts +++ b/static/js/user_groups.ts @@ -112,6 +112,30 @@ export function remove_members(user_group_id: number, user_ids: number[]): void } } +export function add_subgroups(user_group_id: number, subgroup_ids: number[]): void { + const user_group = user_group_by_id_dict.get(user_group_id); + if (user_group === undefined) { + blueslip.error(`Could not find user group with ID ${user_group_id}`); + return; + } + + for (const subgroup_id of subgroup_ids) { + user_group.subgroups.add(subgroup_id); + } +} + +export function remove_subgroups(user_group_id: number, subgroup_ids: number[]): void { + const user_group = user_group_by_id_dict.get(user_group_id); + if (user_group === undefined) { + blueslip.error(`Could not find user group with ID ${user_group_id}`); + return; + } + + for (const subgroup_id of subgroup_ids) { + user_group.subgroups.delete(subgroup_id); + } +} + export function initialize(params: {realm_user_groups: UserGroupRaw[]}): void { for (const user_group of params.realm_user_groups) { add(user_group);