mirror of
https://github.com/zulip/zulip.git
synced 2025-11-01 20:44:04 +00:00
ts: Convert user_groups module to TypeScript.
This commit is contained in:
committed by
Tim Abbott
parent
3e6141d03f
commit
9de3b2f4fd
@@ -256,21 +256,21 @@ const hamletcharacters = {
|
|||||||
name: "hamletcharacters",
|
name: "hamletcharacters",
|
||||||
id: 1,
|
id: 1,
|
||||||
description: "Characters of Hamlet",
|
description: "Characters of Hamlet",
|
||||||
members: [100, 104],
|
members: new Set([100, 104]),
|
||||||
};
|
};
|
||||||
|
|
||||||
const backend = {
|
const backend = {
|
||||||
name: "Backend",
|
name: "Backend",
|
||||||
id: 2,
|
id: 2,
|
||||||
description: "Backend team",
|
description: "Backend team",
|
||||||
members: [],
|
members: new Set([]),
|
||||||
};
|
};
|
||||||
|
|
||||||
const call_center = {
|
const call_center = {
|
||||||
name: "Call Center",
|
name: "Call Center",
|
||||||
id: 3,
|
id: 3,
|
||||||
description: "folks working in support",
|
description: "folks working in support",
|
||||||
members: [],
|
members: new Set([]),
|
||||||
};
|
};
|
||||||
|
|
||||||
const make_emoji = (emoji_dict) => ({
|
const make_emoji = (emoji_dict) => ({
|
||||||
|
|||||||
@@ -10,9 +10,10 @@ const user_groups = zrequire("user_groups");
|
|||||||
|
|
||||||
run_test("user_groups", () => {
|
run_test("user_groups", () => {
|
||||||
const students = {
|
const students = {
|
||||||
|
description: "Students group",
|
||||||
name: "Students",
|
name: "Students",
|
||||||
id: 0,
|
id: 0,
|
||||||
members: [1, 2],
|
members: new Set([1, 2]),
|
||||||
};
|
};
|
||||||
|
|
||||||
const params = {};
|
const params = {};
|
||||||
@@ -21,22 +22,22 @@ run_test("user_groups", () => {
|
|||||||
const user_id_part_of_a_group = 2;
|
const user_id_part_of_a_group = 2;
|
||||||
|
|
||||||
user_groups.initialize(params);
|
user_groups.initialize(params);
|
||||||
assert.equal(user_groups.get_user_group_from_id(students.id), students);
|
assert.deepEqual(user_groups.get_user_group_from_id(students.id), students);
|
||||||
|
|
||||||
const admins = {
|
const admins = {
|
||||||
name: "Admins",
|
name: "Admins",
|
||||||
description: "foo",
|
description: "foo",
|
||||||
id: 1,
|
id: 1,
|
||||||
members: [3],
|
members: new Set([3]),
|
||||||
};
|
};
|
||||||
const all = {
|
const all = {
|
||||||
name: "Everyone",
|
name: "Everyone",
|
||||||
id: 2,
|
id: 2,
|
||||||
members: [1, 2, 3],
|
members: new Set([1, 2, 3]),
|
||||||
};
|
};
|
||||||
|
|
||||||
user_groups.add(admins);
|
user_groups.add(admins);
|
||||||
assert.equal(user_groups.get_user_group_from_id(admins.id), admins);
|
assert.deepEqual(user_groups.get_user_group_from_id(admins.id), admins);
|
||||||
|
|
||||||
const update_name_event = {
|
const update_name_event = {
|
||||||
group_id: admins.id,
|
group_id: admins.id,
|
||||||
@@ -104,4 +105,8 @@ run_test("user_groups", () => {
|
|||||||
|
|
||||||
blueslip.expect("error", "Could not find user group with ID -1");
|
blueslip.expect("error", "Could not find user group with ID -1");
|
||||||
assert.equal(user_groups.is_member_of(-1, 15), false);
|
assert.equal(user_groups.is_member_of(-1, 15), false);
|
||||||
|
|
||||||
|
blueslip.expect("error", "Could not find user group with ID -9999", 2);
|
||||||
|
user_groups.add_members(-9999);
|
||||||
|
user_groups.remove_members(-9999);
|
||||||
});
|
});
|
||||||
|
|||||||
14
static/js/types.ts
Normal file
14
static/js/types.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// TODO/typescript: Move this to server_events_dispatch
|
||||||
|
export type UserGroupUpdateEvent = {
|
||||||
|
id: number;
|
||||||
|
type: string;
|
||||||
|
group_id: number;
|
||||||
|
data: {
|
||||||
|
name?: string;
|
||||||
|
description?: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO/typescript: Move the User and Stream placeholder
|
||||||
|
// types to their approriate modules.
|
||||||
|
export type User = Record<string, never>;
|
||||||
@@ -1,32 +1,50 @@
|
|||||||
import * as blueslip from "./blueslip";
|
import * as blueslip from "./blueslip";
|
||||||
import {FoldDict} from "./fold_dict";
|
import {FoldDict} from "./fold_dict";
|
||||||
|
import type {User, UserGroupUpdateEvent} from "./types";
|
||||||
|
|
||||||
let user_group_name_dict;
|
type UserGroup = {
|
||||||
let user_group_by_id_dict;
|
description: string;
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
members: Set<number>;
|
||||||
|
};
|
||||||
|
|
||||||
|
// The members field is a number array which we convert
|
||||||
|
// to a Set in the initialize function.
|
||||||
|
type UserGroupRaw = Omit<UserGroup, "members"> & {members: number[]};
|
||||||
|
|
||||||
|
let user_group_name_dict: FoldDict<UserGroup>;
|
||||||
|
let user_group_by_id_dict: Map<number, UserGroup>;
|
||||||
|
|
||||||
// We have an init() function so that our automated tests
|
// We have an init() function so that our automated tests
|
||||||
// can easily clear data.
|
// can easily clear data.
|
||||||
export function init() {
|
export function init(): void {
|
||||||
user_group_name_dict = new FoldDict();
|
user_group_name_dict = new FoldDict();
|
||||||
user_group_by_id_dict = new Map();
|
user_group_by_id_dict = new Map<number, UserGroup>();
|
||||||
}
|
}
|
||||||
|
|
||||||
// WE INITIALIZE DATA STRUCTURES HERE!
|
// WE INITIALIZE DATA STRUCTURES HERE!
|
||||||
init();
|
init();
|
||||||
|
|
||||||
export function add(user_group) {
|
export function add(user_group_raw: UserGroupRaw): void {
|
||||||
// Reformat the user group members structure to be a set.
|
// Reformat the user group members structure to be a set.
|
||||||
user_group.members = new Set(user_group.members);
|
const user_group = {
|
||||||
|
description: user_group_raw.description,
|
||||||
|
id: user_group_raw.id,
|
||||||
|
name: user_group_raw.name,
|
||||||
|
members: new Set(user_group_raw.members),
|
||||||
|
};
|
||||||
|
|
||||||
user_group_name_dict.set(user_group.name, user_group);
|
user_group_name_dict.set(user_group.name, user_group);
|
||||||
user_group_by_id_dict.set(user_group.id, user_group);
|
user_group_by_id_dict.set(user_group.id, user_group);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function remove(user_group) {
|
export function remove(user_group: UserGroup): void {
|
||||||
user_group_name_dict.delete(user_group.name);
|
user_group_name_dict.delete(user_group.name);
|
||||||
user_group_by_id_dict.delete(user_group.id);
|
user_group_by_id_dict.delete(user_group.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function get_user_group_from_id(group_id) {
|
export function get_user_group_from_id(group_id: number): UserGroup {
|
||||||
const user_group = user_group_by_id_dict.get(group_id);
|
const user_group = user_group_by_id_dict.get(group_id);
|
||||||
if (!user_group) {
|
if (!user_group) {
|
||||||
throw new Error("Unknown group_id in get_user_group_from_id: " + group_id);
|
throw new Error("Unknown group_id in get_user_group_from_id: " + group_id);
|
||||||
@@ -34,7 +52,7 @@ export function get_user_group_from_id(group_id) {
|
|||||||
return user_group;
|
return user_group;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function update(event) {
|
export function update(event: UserGroupUpdateEvent): void {
|
||||||
const group = get_user_group_from_id(event.group_id);
|
const group = get_user_group_from_id(event.group_id);
|
||||||
if (event.data.name !== undefined) {
|
if (event.data.name !== undefined) {
|
||||||
group.name = event.data.name;
|
group.name = event.data.name;
|
||||||
@@ -48,16 +66,16 @@ export function update(event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function get_user_group_from_name(name) {
|
export function get_user_group_from_name(name: string): UserGroup | undefined {
|
||||||
return user_group_name_dict.get(name);
|
return user_group_name_dict.get(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function get_realm_user_groups() {
|
export function get_realm_user_groups(): UserGroup[] {
|
||||||
const user_groups = Array.from(user_group_by_id_dict.values()).sort((a, b) => a.id - b.id);
|
const user_groups = Array.from(user_group_by_id_dict.values()).sort((a, b) => a.id - b.id);
|
||||||
return user_groups.filter((group) => !group.is_system_group);
|
return user_groups.filter((group) => !group.is_system_group);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function is_member_of(user_group_id, user_id) {
|
export function is_member_of(user_group_id: number, user_id: number): boolean {
|
||||||
const user_group = user_group_by_id_dict.get(user_group_id);
|
const user_group = user_group_by_id_dict.get(user_group_id);
|
||||||
if (user_group === undefined) {
|
if (user_group === undefined) {
|
||||||
blueslip.error("Could not find user group with ID " + user_group_id);
|
blueslip.error("Could not find user group with ID " + user_group_id);
|
||||||
@@ -66,33 +84,41 @@ export function is_member_of(user_group_id, user_id) {
|
|||||||
return user_group.members.has(user_id);
|
return user_group.members.has(user_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function add_members(user_group_id, user_ids) {
|
export function add_members(user_group_id: number, user_ids: number[]): void {
|
||||||
const user_group = user_group_by_id_dict.get(user_group_id);
|
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 user_id of user_ids) {
|
for (const user_id of user_ids) {
|
||||||
user_group.members.add(user_id);
|
user_group.members.add(user_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function remove_members(user_group_id, user_ids) {
|
export function remove_members(user_group_id: number, user_ids: number[]): void {
|
||||||
const user_group = user_group_by_id_dict.get(user_group_id);
|
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 user_id of user_ids) {
|
for (const user_id of user_ids) {
|
||||||
user_group.members.delete(user_id);
|
user_group.members.delete(user_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function initialize(params) {
|
export function initialize(params: {realm_user_groups: UserGroupRaw[]}): void {
|
||||||
for (const user_group of params.realm_user_groups) {
|
for (const user_group of params.realm_user_groups) {
|
||||||
add(user_group);
|
add(user_group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function is_user_group(item) {
|
export function is_user_group(item: User | UserGroup): item is UserGroup {
|
||||||
return item.members !== undefined;
|
return item.members !== undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function get_user_groups_of_user(user_id) {
|
export function get_user_groups_of_user(user_id: number): UserGroup[] {
|
||||||
const user_groups_realm = get_realm_user_groups();
|
const user_groups_realm = get_realm_user_groups();
|
||||||
const groups_of_user = user_groups_realm.filter((group) => is_member_of(group.id, user_id));
|
const groups_of_user = user_groups_realm.filter((group) => is_member_of(group.id, user_id));
|
||||||
return groups_of_user;
|
return groups_of_user;
|
||||||
@@ -168,6 +168,7 @@ EXEMPT_FILES = {
|
|||||||
"static/js/topic_list.js",
|
"static/js/topic_list.js",
|
||||||
"static/js/topic_zoom.js",
|
"static/js/topic_zoom.js",
|
||||||
"static/js/tutorial.js",
|
"static/js/tutorial.js",
|
||||||
|
"static/js/types.ts",
|
||||||
"static/js/typing_events.js",
|
"static/js/typing_events.js",
|
||||||
"static/js/typing.js",
|
"static/js/typing.js",
|
||||||
"static/js/ui_init.js",
|
"static/js/ui_init.js",
|
||||||
|
|||||||
Reference in New Issue
Block a user