[Gekidou] Handles GroupMember Add/Delete WS Event (#6525)

* Handles group websocket event

* Fetches data on error

* Handles GroupMember Add/Delete WS Event

* PR Feedback
This commit is contained in:
Shaz MJ
2022-08-02 19:13:35 +10:00
committed by GitHub
parent 793b504b87
commit fe053d96e7
4 changed files with 51 additions and 9 deletions

View File

@@ -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<Group>;
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);
}
}

View File

@@ -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;
}
}

View File

@@ -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<GroupMembershipModel>(GROUP_MEMBERSHIP).find(id).then((model) => model.destroyPermanently());
};

View File

@@ -229,7 +229,7 @@ export type HandleGroupChannelsForChannelArgs = PrepareOnly & {
export type HandleGroupMembershipForMemberArgs = PrepareOnly & {
userId: string;
groups?: Group[];
groups?: Array<Pick<Group, 'id'>>;
}
export type HandleGroupTeamsForTeamArgs = PrepareOnly & {