[Gekidou MM-39728] - Websocket Events - Preferences (#5865)

This commit is contained in:
Jason Frerich
2022-01-21 17:45:32 -06:00
committed by GitHub
parent 2013f39a61
commit 5fd8121cf9
4 changed files with 102 additions and 4 deletions

View File

@@ -20,6 +20,7 @@ import {queryCommonSystemValues, queryConfig, queryWebSocketLastDisconnected} fr
import {queryCurrentUser} from '@queries/servers/user';
import {handleChannelDeletedEvent, handleUserRemovedEvent} from './channel';
import {handlePreferenceChangedEvent, handlePreferencesChangedEvent, handlePreferencesDeletedEvent} from './preferences';
import {handleLeaveTeamEvent} from './teams';
import type {Model} from '@nozbe/watermelondb';
@@ -242,17 +243,17 @@ export async function handleEvent(serverUrl: string, msg: any) {
// return dispatch(handleDirectAddedEvent(msg));
case WebsocketEvents.PREFERENCE_CHANGED:
handlePreferenceChangedEvent(serverUrl, msg);
break;
// return dispatch(handlePreferenceChangedEvent(msg));
case WebsocketEvents.PREFERENCES_CHANGED:
handlePreferencesChangedEvent(serverUrl, msg);
break;
// return dispatch(handlePreferencesChangedEvent(msg));
case WebsocketEvents.PREFERENCES_DELETED:
handlePreferencesDeletedEvent(serverUrl, msg);
break;
// return dispatch(handlePreferencesDeletedEvent(msg));
case WebsocketEvents.STATUS_CHANGED:
break;

View File

@@ -0,0 +1,62 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {deletePreferences} from '@app/queries/servers/preference';
import DatabaseManager from '@database/manager';
import {WebSocketMessage} from '@typings/api/websocket';
export async function handlePreferenceChangedEvent(serverUrl: string, msg: WebSocketMessage): Promise<void> {
const database = DatabaseManager.serverDatabases[serverUrl];
if (!database) {
return;
}
try {
const preference = JSON.parse(msg.data.preference) as PreferenceType;
const operator = database?.operator;
if (operator) {
operator.handlePreferences({
prepareRecordsOnly: false,
preferences: [preference],
sync: true,
});
}
} catch (error) {
// Do nothing
}
}
export async function handlePreferencesChangedEvent(serverUrl: string, msg: WebSocketMessage): Promise<void> {
const database = DatabaseManager.serverDatabases[serverUrl];
if (!database) {
return;
}
try {
const preferences = JSON.parse(msg.data.preferences) as PreferenceType[];
const operator = database?.operator;
if (operator) {
operator.handlePreferences({
prepareRecordsOnly: false,
preferences,
sync: true,
});
}
} catch (error) {
// Do nothing
}
}
export async function handlePreferencesDeletedEvent(serverUrl: string, msg: WebSocketMessage): Promise<void> {
const database = DatabaseManager.serverDatabases[serverUrl];
if (!database) {
return;
}
try {
const preferences = JSON.parse(msg.data.preferences) as PreferenceType[];
deletePreferences(database, preferences);
} catch {
// Do nothing
}
}

View File

@@ -1,10 +1,11 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {Database, Q} from '@nozbe/watermelondb';
import {Database, Model, Q} from '@nozbe/watermelondb';
import {Preferences} from '@constants';
import {MM_TABLES} from '@constants/database';
import {ServerDatabase} from '@typings/database/database';
import {queryCurrentTeamId} from './system';
@@ -46,3 +47,21 @@ export const queryThemeForCurrentTeam = async (database: Database) => {
return undefined;
};
export const deletePreferences = async (database: ServerDatabase, preferences: PreferenceType[]): Promise<Boolean> => {
try {
const preparedModels: Model[] = [];
for await (const pref of preferences) {
const myPrefs = await queryPreferencesByCategoryAndName(database.database, pref.category, pref.name);
for (const p of myPrefs) {
preparedModels.push(p.prepareDestroyPermanently());
}
}
if (preparedModels.length) {
await database.operator.batchRecords(preparedModels);
}
return true;
} catch (error) {
return false;
}
};

16
types/api/websocket.ts Normal file
View File

@@ -0,0 +1,16 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
export type WebsocketBroadcast = {
omit_users: Dictionary<boolean>;
user_id: string;
channel_id: string;
team_id: string;
}
export type WebSocketMessage = {
event: string;
data: any;
broadcast: WebsocketBroadcast;
seq: number;
}