forked from Ivasoft/mattermost-mobile
[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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
};
|
||||
|
||||
2
types/database/database.d.ts
vendored
2
types/database/database.d.ts
vendored
@@ -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 & {
|
||||
|
||||
Reference in New Issue
Block a user