From ba5c49d9fc372c2dc67980caa01b3a8dc7719cc0 Mon Sep 17 00:00:00 2001 From: Shaz MJ Date: Fri, 5 Aug 2022 22:06:19 +1000 Subject: [PATCH] [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 --- app/actions/websocket/group.ts | 76 +++++++++++++++++++++++++++++++++- app/actions/websocket/index.ts | 12 +++++- app/constants/websocket.ts | 4 ++ app/queries/servers/group.ts | 8 ++++ types/database/database.d.ts | 4 +- 5 files changed, 99 insertions(+), 5 deletions(-) diff --git a/app/actions/websocket/group.ts b/app/actions/websocket/group.ts index 2709359194..252227370e 100644 --- a/app/actions/websocket/group.ts +++ b/app/actions/websocket/group.ts @@ -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); + } +} diff --git a/app/actions/websocket/index.ts b/app/actions/websocket/index.ts index 1739c451ee..fa9c6d1a2f 100644 --- a/app/actions/websocket/index.ts +++ b/app/actions/websocket/index.ts @@ -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; } } diff --git a/app/constants/websocket.ts b/app/constants/websocket.ts index 7c9a56d21b..57dc317a42 100644 --- a/app/constants/websocket.ts +++ b/app/constants/websocket.ts @@ -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; diff --git a/app/queries/servers/group.ts b/app/queries/servers/group.ts index d5bf61a554..151e61da69 100644 --- a/app/queries/servers/group.ts +++ b/app/queries/servers/group.ts @@ -59,3 +59,11 @@ export const queryGroupTeamForTeam = (database: Database, teamId: string) => { export const deleteGroupMembershipById = (database: Database, id: string) => { return database.collections.get(GROUP_MEMBERSHIP).find(id).then((model) => model.destroyPermanently()); }; + +export const deleteGroupTeamById = (database: Database, id: string) => { + return database.collections.get(GROUP_TEAM).find(id).then((model) => model.destroyPermanently()); +}; + +export const deleteGroupChannelById = (database: Database, id: string) => { + return database.collections.get(GROUP_CHANNEL).find(id).then((model) => model.destroyPermanently()); +}; diff --git a/types/database/database.d.ts b/types/database/database.d.ts index 6d339972fe..39f120dcb1 100644 --- a/types/database/database.d.ts +++ b/types/database/database.d.ts @@ -224,7 +224,7 @@ export type HandleGroupArgs = PrepareOnly & { export type HandleGroupChannelsForChannelArgs = PrepareOnly & { channelId: string; - groups?: Group[]; + groups?: Array>; } export type HandleGroupMembershipForMemberArgs = PrepareOnly & { @@ -234,7 +234,7 @@ export type HandleGroupMembershipForMemberArgs = PrepareOnly & { export type HandleGroupTeamsForTeamArgs = PrepareOnly & { teamId: string; - groups?: Group[]; + groups?: Array>; } export type HandleCategoryChannelArgs = PrepareOnly & {