[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:
Shaz MJ
2022-08-05 22:06:19 +10:00
committed by GitHub
parent f61ea842af
commit ba5c49d9fc
5 changed files with 99 additions and 5 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 & {