From fe053d96e7f5c8da83a3148f834f3b3c8258e0f4 Mon Sep 17 00:00:00 2001 From: Shaz MJ Date: Tue, 2 Aug 2022 19:13:35 +1000 Subject: [PATCH] [Gekidou] Handles GroupMember Add/Delete WS Event (#6525) * Handles group websocket event * Fetches data on error * Handles GroupMember Add/Delete WS Event * PR Feedback --- app/actions/websocket/group.ts | 46 ++++++++++++++++++++++++++++------ app/actions/websocket/index.ts | 8 +++++- app/queries/servers/group.ts | 4 +++ types/database/database.d.ts | 2 +- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/app/actions/websocket/group.ts b/app/actions/websocket/group.ts index 9ebddae88b..2709359194 100644 --- a/app/actions/websocket/group.ts +++ b/app/actions/websocket/group.ts @@ -1,7 +1,9 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {fetchGroup, fetchGroupsForChannel, fetchGroupsForMember, fetchGroupsForTeam} from '@actions/remote/groups'; +import {fetchGroupsForChannel, fetchGroupsForMember, fetchGroupsForTeam} from '@actions/remote/groups'; +import {deleteGroupMembershipById} from '@app/queries/servers/group'; +import {generateGroupAssociationId} from '@app/utils/groups'; import DatabaseManager from '@database/manager'; import {logError} from '@utils/log'; @@ -9,7 +11,11 @@ type WebsocketGroupMessage = WebSocketMessage<{ group?: string; // type Group }> -const handleError = (serverUrl: string, e: unknown, msg: WebsocketGroupMessage) => { +type WebsocketGroupMemberMessage = WebSocketMessage<{ + group_member?: string; // type GroupMember +}> + +const handleError = (serverUrl: string, e: unknown, msg: WebsocketGroupMessage | WebsocketGroupMemberMessage) => { logError(`Group WS: ${msg.event}`, e, msg); const {team_id, channel_id, user_id} = msg.broadcast; @@ -23,11 +29,6 @@ const handleError = (serverUrl: string, e: unknown, msg: WebsocketGroupMessage) if (user_id) { fetchGroupsForMember(serverUrl, msg.broadcast.user_id); } - - const group = JSON.parse(msg.data.group || '') as Partial; - if (!team_id && !channel_id && !user_id && group.id) { - fetchGroup(serverUrl, group.id); - } }; export async function handleGroupReceivedEvent(serverUrl: string, msg: WebsocketGroupMessage) { @@ -43,3 +44,34 @@ export async function handleGroupReceivedEvent(serverUrl: string, msg: Websocket handleError(serverUrl, e, msg); } } + +export async function handleGroupMemberAddEvent(serverUrl: string, msg: WebsocketGroupMemberMessage) { + let groupMember: GroupMembership; + + try { + if (msg?.data?.group_member) { + const {operator} = DatabaseManager.getServerDatabaseAndOperator(serverUrl); + groupMember = JSON.parse(msg.data.group_member); + const group = {id: groupMember.group_id}; + + operator.handleGroupMembershipsForMember({userId: groupMember.user_id, groups: [group], prepareRecordsOnly: false}); + } + } catch (e) { + handleError(serverUrl, e, msg); + } +} + +export async function handleGroupMemberDeleteEvent(serverUrl: string, msg: WebsocketGroupMemberMessage) { + let groupMember: GroupMembership; + + try { + if (msg?.data?.group_member) { + const {database} = DatabaseManager.getServerDatabaseAndOperator(serverUrl); + groupMember = JSON.parse(msg.data.group_member); + + await deleteGroupMembershipById(database, generateGroupAssociationId(groupMember.group_id, groupMember.user_id)); + } + } catch (e) { + handleError(serverUrl, e, msg); + } +} diff --git a/app/actions/websocket/index.ts b/app/actions/websocket/index.ts index 64e6c353cb..27e648e91f 100644 --- a/app/actions/websocket/index.ts +++ b/app/actions/websocket/index.ts @@ -49,7 +49,7 @@ import {handleChannelConvertedEvent, handleChannelCreatedEvent, handleDirectAddedEvent, handleUserAddedToChannelEvent, handleUserRemovedFromChannelEvent} from './channel'; -import {handleGroupReceivedEvent} from './group'; +import {handleGroupMemberAddEvent, handleGroupMemberDeleteEvent, handleGroupReceivedEvent} from './group'; import {handleOpenDialogEvent} from './integrations'; import {handleNewPostEvent, handlePostDeleted, handlePostEdited, handlePostUnread} from './posts'; import {handlePreferenceChangedEvent, handlePreferencesChangedEvent, handlePreferencesDeletedEvent} from './preferences'; @@ -406,5 +406,11 @@ export async function handleEvent(serverUrl: string, msg: WebSocketMessage) { case WebsocketEvents.GROUP_RECEIVED: handleGroupReceivedEvent(serverUrl, msg); break; + case WebsocketEvents.GROUP_MEMBER_ADD: + handleGroupMemberAddEvent(serverUrl, msg); + break; + case WebsocketEvents.GROUP_MEMBER_DELETE: + handleGroupMemberDeleteEvent(serverUrl, msg); + break; } } diff --git a/app/queries/servers/group.ts b/app/queries/servers/group.ts index e6a162afcf..d5bf61a554 100644 --- a/app/queries/servers/group.ts +++ b/app/queries/servers/group.ts @@ -55,3 +55,7 @@ export const queryGroupTeamForTeam = (database: Database, teamId: string) => { Q.where('team_id', teamId), ); }; + +export const deleteGroupMembershipById = (database: Database, id: string) => { + return database.collections.get(GROUP_MEMBERSHIP).find(id).then((model) => model.destroyPermanently()); +}; diff --git a/types/database/database.d.ts b/types/database/database.d.ts index 599e606c74..6d339972fe 100644 --- a/types/database/database.d.ts +++ b/types/database/database.d.ts @@ -229,7 +229,7 @@ export type HandleGroupChannelsForChannelArgs = PrepareOnly & { export type HandleGroupMembershipForMemberArgs = PrepareOnly & { userId: string; - groups?: Group[]; + groups?: Array>; } export type HandleGroupTeamsForTeamArgs = PrepareOnly & {