forked from Ivasoft/mattermost-mobile
[Gekidou] GroupTeams WebSocket Handling (#6529)
* Handles group websocket event * Fetches data on error * Handles GroupMember Add/Delete WS Event * PR Feedback * Handles GroupTeam add/delete event * Handles Group Channel associated websocket (#6530) Co-authored-by: Avinash Lingaloo <avinashlng1080@gmail.com>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
import {fetchGroupsForChannel, fetchGroupsForMember, fetchGroupsForTeam} from '@actions/remote/groups';
|
||||
import {deleteGroupMembershipById} from '@app/queries/servers/group';
|
||||
import {deleteGroupChannelById, deleteGroupMembershipById, deleteGroupTeamById} from '@app/queries/servers/group';
|
||||
import {generateGroupAssociationId} from '@app/utils/groups';
|
||||
import DatabaseManager from '@database/manager';
|
||||
import {logError} from '@utils/log';
|
||||
@@ -15,7 +15,17 @@ type WebsocketGroupMemberMessage = WebSocketMessage<{
|
||||
group_member?: string; // type GroupMember
|
||||
}>
|
||||
|
||||
const handleError = (serverUrl: string, e: unknown, msg: WebsocketGroupMessage | WebsocketGroupMemberMessage) => {
|
||||
type WebsocketGroupTeamMessage = WebSocketMessage<{
|
||||
group_team?: string; // type GroupMember
|
||||
}>
|
||||
|
||||
type WebsocketGroupChannelMessage = WebSocketMessage<{
|
||||
group_channel?: string; // type GroupMember
|
||||
}>
|
||||
|
||||
type WSMessage = WebsocketGroupMessage | WebsocketGroupMemberMessage | WebsocketGroupTeamMessage | WebsocketGroupChannelMessage
|
||||
|
||||
const handleError = (serverUrl: string, e: unknown, msg: WSMessage) => {
|
||||
logError(`Group WS: ${msg.event}`, e, msg);
|
||||
|
||||
const {team_id, channel_id, user_id} = msg.broadcast;
|
||||
@@ -75,3 +85,65 @@ export async function handleGroupMemberDeleteEvent(serverUrl: string, msg: Webso
|
||||
handleError(serverUrl, e, msg);
|
||||
}
|
||||
}
|
||||
|
||||
export async function handleGroupTeamAssociatedEvent(serverUrl: string, msg: WebsocketGroupTeamMessage) {
|
||||
let groupTeam: GroupTeam;
|
||||
|
||||
try {
|
||||
if (msg?.data?.group_team) {
|
||||
const {operator} = DatabaseManager.getServerDatabaseAndOperator(serverUrl);
|
||||
groupTeam = JSON.parse(msg.data.group_team);
|
||||
const group = {id: groupTeam.group_id};
|
||||
|
||||
operator.handleGroupTeamsForTeam({teamId: groupTeam.team_id, groups: [group], prepareRecordsOnly: false});
|
||||
}
|
||||
} catch (e) {
|
||||
handleError(serverUrl, e, msg);
|
||||
}
|
||||
}
|
||||
|
||||
export async function handleGroupTeamDissociateEvent(serverUrl: string, msg: WebsocketGroupTeamMessage) {
|
||||
let groupTeam: GroupTeam;
|
||||
|
||||
try {
|
||||
if (msg?.data?.group_team) {
|
||||
const {database} = DatabaseManager.getServerDatabaseAndOperator(serverUrl);
|
||||
groupTeam = JSON.parse(msg.data.group_team);
|
||||
|
||||
await deleteGroupTeamById(database, generateGroupAssociationId(groupTeam.group_id, groupTeam.team_id));
|
||||
}
|
||||
} catch (e) {
|
||||
handleError(serverUrl, e, msg);
|
||||
}
|
||||
}
|
||||
|
||||
export async function handleGroupChannelAssociatedEvent(serverUrl: string, msg: WebsocketGroupChannelMessage) {
|
||||
let groupChannel: GroupChannel;
|
||||
|
||||
try {
|
||||
if (msg?.data?.group_channel) {
|
||||
const {operator} = DatabaseManager.getServerDatabaseAndOperator(serverUrl);
|
||||
groupChannel = JSON.parse(msg.data.group_channel);
|
||||
const group = {id: groupChannel.group_id};
|
||||
|
||||
operator.handleGroupChannelsForChannel({channelId: groupChannel.channel_id, groups: [group], prepareRecordsOnly: false});
|
||||
}
|
||||
} catch (e) {
|
||||
handleError(serverUrl, e, msg);
|
||||
}
|
||||
}
|
||||
|
||||
export async function handleGroupChannelDissociateEvent(serverUrl: string, msg: WebsocketGroupChannelMessage) {
|
||||
let groupChannel: GroupChannel;
|
||||
|
||||
try {
|
||||
if (msg?.data?.group_channel) {
|
||||
const {database} = DatabaseManager.getServerDatabaseAndOperator(serverUrl);
|
||||
groupChannel = JSON.parse(msg.data.group_channel);
|
||||
|
||||
await deleteGroupChannelById(database, generateGroupAssociationId(groupChannel.group_id, groupChannel.channel_id));
|
||||
}
|
||||
} catch (e) {
|
||||
handleError(serverUrl, e, msg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ import {handleChannelConvertedEvent, handleChannelCreatedEvent,
|
||||
handleDirectAddedEvent,
|
||||
handleUserAddedToChannelEvent,
|
||||
handleUserRemovedFromChannelEvent} from './channel';
|
||||
import {handleGroupMemberAddEvent, handleGroupMemberDeleteEvent, handleGroupReceivedEvent} from './group';
|
||||
import {handleGroupMemberAddEvent, handleGroupMemberDeleteEvent, handleGroupReceivedEvent, handleGroupTeamAssociatedEvent, handleGroupTeamDissociateEvent} from './group';
|
||||
import {handleOpenDialogEvent} from './integrations';
|
||||
import {handleNewPostEvent, handlePostDeleted, handlePostEdited, handlePostUnread} from './posts';
|
||||
import {handlePreferenceChangedEvent, handlePreferencesChangedEvent, handlePreferencesDeletedEvent} from './preferences';
|
||||
@@ -422,5 +422,15 @@ export async function handleEvent(serverUrl: string, msg: WebSocketMessage) {
|
||||
case WebsocketEvents.GROUP_MEMBER_DELETE:
|
||||
handleGroupMemberDeleteEvent(serverUrl, msg);
|
||||
break;
|
||||
case WebsocketEvents.GROUP_ASSOCIATED_TO_TEAM:
|
||||
handleGroupTeamAssociatedEvent(serverUrl, msg);
|
||||
break;
|
||||
case WebsocketEvents.GROUP_DISSOCIATED_TO_TEAM:
|
||||
handleGroupTeamDissociateEvent(serverUrl, msg);
|
||||
break;
|
||||
case WebsocketEvents.GROUP_ASSOCIATED_TO_CHANNEL:
|
||||
break;
|
||||
case WebsocketEvents.GROUP_DISSOCIATED_TO_CHANNEL:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,5 +69,9 @@ const WebsocketEvents = {
|
||||
GROUP_RECEIVED: 'received_group',
|
||||
GROUP_MEMBER_ADD: 'group_member_add',
|
||||
GROUP_MEMBER_DELETE: 'group_member_delete',
|
||||
GROUP_ASSOCIATED_TO_TEAM: 'received_group_associated_to_team',
|
||||
GROUP_DISSOCIATED_TO_TEAM: 'received_group_not_associated_to_team',
|
||||
GROUP_ASSOCIATED_TO_CHANNEL: 'received_group_associated_to_channel',
|
||||
GROUP_DISSOCIATED_TO_CHANNEL: 'received_group_not_associated_to_channel',
|
||||
};
|
||||
export default WebsocketEvents;
|
||||
|
||||
@@ -59,3 +59,11 @@ export const queryGroupTeamForTeam = (database: Database, teamId: string) => {
|
||||
export const deleteGroupMembershipById = (database: Database, id: string) => {
|
||||
return database.collections.get<GroupMembershipModel>(GROUP_MEMBERSHIP).find(id).then((model) => model.destroyPermanently());
|
||||
};
|
||||
|
||||
export const deleteGroupTeamById = (database: Database, id: string) => {
|
||||
return database.collections.get<GroupTeamModel>(GROUP_TEAM).find(id).then((model) => model.destroyPermanently());
|
||||
};
|
||||
|
||||
export const deleteGroupChannelById = (database: Database, id: string) => {
|
||||
return database.collections.get<GroupChannelModel>(GROUP_CHANNEL).find(id).then((model) => model.destroyPermanently());
|
||||
};
|
||||
|
||||
4
types/database/database.d.ts
vendored
4
types/database/database.d.ts
vendored
@@ -224,7 +224,7 @@ export type HandleGroupArgs = PrepareOnly & {
|
||||
|
||||
export type HandleGroupChannelsForChannelArgs = PrepareOnly & {
|
||||
channelId: string;
|
||||
groups?: Group[];
|
||||
groups?: Array<Pick<Group, 'id'>>;
|
||||
}
|
||||
|
||||
export type HandleGroupMembershipForMemberArgs = PrepareOnly & {
|
||||
@@ -234,7 +234,7 @@ export type HandleGroupMembershipForMemberArgs = PrepareOnly & {
|
||||
|
||||
export type HandleGroupTeamsForTeamArgs = PrepareOnly & {
|
||||
teamId: string;
|
||||
groups?: Group[];
|
||||
groups?: Array<Pick<Group, 'id'>>;
|
||||
}
|
||||
|
||||
export type HandleCategoryChannelArgs = PrepareOnly & {
|
||||
|
||||
Reference in New Issue
Block a user