mattermost-mobile/app/actions/websocket/roles.ts
Jason Frerich 137ba9d191
[Gekidou MM-39728] - Websocket Events - Channels (#6038)
* wip checkin

* wip checkin because my system is messed up again

* correct the add user and remove user from channel functions. THe user and channel ids sometimes come from the broudcast field, not the data object

* remove old comments

* remove old comments

* remove old comments

* add back in unarchive handler. handleChannelUpdateEvent will also update the deleteAt value for a channel, but does not get called when unarchive from the channel view, only through the system console.

* nit remove empty line

* wip

* wip

* remove handleChannelConvertedEvent

* remove handleChannelDirectAddedEvent

* wip

* wip

* wip

* Fix websockets events

* Address feedback

* Ensure categories and some refactoring

* Self review fixes

* Fix category creation bug

* Address feedback and minor improvements

* Address feedback

* Fix lint

Co-authored-by: Daniel Espino García <larkox@gmail.com>
2022-04-04 14:25:42 -04:00

126 lines
3.7 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {fetchRolesIfNeeded} from '@actions/remote/role';
import DatabaseManager from '@database/manager';
import {getRoleById} from '@queries/servers/role';
import {getCurrentUserId} from '@queries/servers/system';
import {getCurrentUser} from '@queries/servers/user';
import type {Model} from '@nozbe/watermelondb';
export async function handleRoleUpdatedEvent(serverUrl: string, msg: WebSocketMessage): Promise<void> {
const operator = DatabaseManager.serverDatabases[serverUrl]?.operator;
if (!operator) {
return;
}
// only update Role records that exist in the Role Table
try {
const role = JSON.parse(msg.data.role) as Role;
const dbRole = await getRoleById(operator.database, role.id);
if (!dbRole) {
return;
}
operator.handleRole({
roles: [role],
prepareRecordsOnly: false,
});
} catch {
// do nothing
}
}
export async function handleUserRoleUpdatedEvent(serverUrl: string, msg: WebSocketMessage): Promise<void> {
const operator = DatabaseManager.serverDatabases[serverUrl]?.operator;
if (!operator) {
return;
}
const currentUserId = await getCurrentUserId(operator.database);
if (currentUserId !== msg.data.user_id) {
return;
}
const models: Model[] = [];
// update Role Table if needed
const rolesArray = msg.data.roles.split(' ');
const newRoles = await fetchRolesIfNeeded(serverUrl, rolesArray, true);
if (newRoles?.roles?.length) {
const preparedRoleModels = await operator.handleRole({
roles: newRoles.roles!,
prepareRecordsOnly: true,
});
if (preparedRoleModels.length) {
models.push(...preparedRoleModels);
}
}
// update User Table record
const user = await getCurrentUser(operator.database);
if (user) {
user!.prepareUpdate((u) => {
u.roles = msg.data.roles;
});
models.push(user);
}
if (models?.length) {
await operator.batchRecords(models);
}
}
export async function handleTeamMemberRoleUpdatedEvent(serverUrl: string, msg: WebSocketMessage): Promise<void> {
const operator = DatabaseManager.serverDatabases[serverUrl]?.operator;
if (!operator) {
return;
}
try {
const member: TeamMembership = JSON.parse(msg.data.member);
if (member.delete_at > 0) {
return;
}
const currentUserId = await getCurrentUserId(operator.database);
if (currentUserId !== member.user_id) {
return;
}
const models: Model[] = [];
// update Role Table if needed
const rolesArray = member.roles.split(' ');
const newRoles = await fetchRolesIfNeeded(serverUrl, rolesArray, true);
if (newRoles?.roles?.length) {
const preparedRoleModels = await operator.handleRole({
roles: newRoles.roles!,
prepareRecordsOnly: true,
});
if (preparedRoleModels.length) {
models.push(...preparedRoleModels);
}
}
// update MyTeam Table
const myTeams: MyTeam[] = [{id: member.team_id, roles: member.roles}];
const myTeamRecords = await operator.handleMyTeam({
prepareRecordsOnly: true,
myTeams,
});
if (myTeamRecords.length) {
models.push(...myTeamRecords);
}
if (models?.length) {
await operator.batchRecords(models);
}
} catch {
// do nothing
}
}