Skip to content
Snippets Groups Projects
Unverified Commit fb6d9eba authored by Ricardo Garim's avatar Ricardo Garim Committed by GitHub
Browse files

refactor: LivechatPriority out of DB Watcher (#32362)

parent 3ed5bda6
No related branches found
No related tags found
No related merge requests found
...@@ -9,11 +9,25 @@ import type { ...@@ -9,11 +9,25 @@ import type {
IIntegration, IIntegration,
IPbxEvent, IPbxEvent,
LoginServiceConfiguration as LoginServiceConfigurationData, LoginServiceConfiguration as LoginServiceConfigurationData,
ILivechatPriority,
} from '@rocket.chat/core-typings'; } from '@rocket.chat/core-typings';
import { Rooms, Permissions, Settings, PbxEvents, Roles, Integrations, LoginServiceConfiguration } from '@rocket.chat/models'; import { Rooms, Permissions, Settings, PbxEvents, Roles, Integrations, LoginServiceConfiguration } from '@rocket.chat/models';
type ClientAction = 'inserted' | 'updated' | 'removed'; type ClientAction = 'inserted' | 'updated' | 'removed';
export async function notifyOnLivechatPriorityChanged(
data: Pick<ILivechatPriority, 'name' | '_id'>,
clientAction: ClientAction = 'updated',
): Promise<void> {
if (!dbWatchersDisabled) {
return;
}
const { _id, ...rest } = data;
void api.broadcast('watch.priorities', { clientAction, id: _id, diff: { ...rest } });
}
export async function notifyOnRoomChanged<T extends IRocketChatRecord>( export async function notifyOnRoomChanged<T extends IRocketChatRecord>(
data: T | T[], data: T | T[],
clientAction: ClientAction = 'updated', clientAction: ClientAction = 'updated',
......
...@@ -3,6 +3,7 @@ import { isGETLivechatPrioritiesParams, isPUTLivechatPriority } from '@rocket.ch ...@@ -3,6 +3,7 @@ import { isGETLivechatPrioritiesParams, isPUTLivechatPriority } from '@rocket.ch
import { API } from '../../../../../app/api/server'; import { API } from '../../../../../app/api/server';
import { getPaginationItems } from '../../../../../app/api/server/helpers/getPaginationItems'; import { getPaginationItems } from '../../../../../app/api/server/helpers/getPaginationItems';
import { notifyOnLivechatPriorityChanged } from '../../../../../app/lib/server/lib/notifyListener';
import { findPriority, updatePriority } from './lib/priorities'; import { findPriority, updatePriority } from './lib/priorities';
API.v1.addRoute( API.v1.addRoute(
...@@ -55,7 +56,11 @@ API.v1.addRoute( ...@@ -55,7 +56,11 @@ API.v1.addRoute(
}, },
async put() { async put() {
const { priorityId } = this.urlParams; const { priorityId } = this.urlParams;
await updatePriority(priorityId, this.bodyParams); await updatePriority(priorityId, this.bodyParams);
void notifyOnLivechatPriorityChanged({ _id: priorityId, ...this.bodyParams });
return API.v1.success(); return API.v1.success();
}, },
}, },
...@@ -75,7 +80,13 @@ API.v1.addRoute( ...@@ -75,7 +80,13 @@ API.v1.addRoute(
if (!(await LivechatPriority.canResetPriorities())) { if (!(await LivechatPriority.canResetPriorities())) {
return API.v1.failure(); return API.v1.failure();
} }
await LivechatPriority.resetPriorities();
const eligiblePriorities = (await LivechatPriority.findByDirty().toArray()).map(({ _id }) => _id);
await LivechatPriority.resetPriorities(eligiblePriorities);
eligiblePriorities.forEach((_id) => notifyOnLivechatPriorityChanged({ _id, name: undefined }));
return API.v1.success(); return API.v1.success();
}, },
async get() { async get() {
......
import type { ILivechatPriority } from '@rocket.chat/core-typings'; import type { ILivechatPriority } from '@rocket.chat/core-typings';
import type { ILivechatPriorityModel } from '@rocket.chat/model-typings'; import type { ILivechatPriorityModel } from '@rocket.chat/model-typings';
import { escapeRegExp } from '@rocket.chat/string-helpers'; import { escapeRegExp } from '@rocket.chat/string-helpers';
import type { Db, UpdateFilter, ModifyResult, IndexDescription } from 'mongodb'; import type { Db, UpdateFilter, ModifyResult, IndexDescription, FindCursor } from 'mongodb';
import { BaseRaw } from '../../../../server/models/raw/BaseRaw'; import { BaseRaw } from '../../../../server/models/raw/BaseRaw';
...@@ -48,12 +48,16 @@ export class LivechatPriorityRaw extends BaseRaw<ILivechatPriority> implements I ...@@ -48,12 +48,16 @@ export class LivechatPriorityRaw extends BaseRaw<ILivechatPriority> implements I
return this.findOne(query, options); return this.findOne(query, options);
} }
findByDirty(): FindCursor<Pick<ILivechatPriority, '_id'>> {
return this.find({ dirty: true }, { projection: { _id: 1 } });
}
async canResetPriorities(): Promise<boolean> { async canResetPriorities(): Promise<boolean> {
return Boolean(await this.findOne({ dirty: true }, { projection: { _id: 1 } })); return Boolean(await this.findOne({ dirty: true }, { projection: { _id: 1 } }));
} }
async resetPriorities(): Promise<void> { async resetPriorities(ids: ILivechatPriority['_id'][]): Promise<void> {
await this.updateMany({ dirty: true }, [{ $set: { dirty: false } }, { $unset: 'name' }]); await this.updateMany({ _id: { $in: ids } }, [{ $set: { dirty: false } }, { $unset: 'name' }]);
} }
async updatePriority(_id: string, reset: boolean, name?: string): Promise<ModifyResult<ILivechatPriority>> { async updatePriority(_id: string, reset: boolean, name?: string): Promise<ModifyResult<ILivechatPriority>> {
......
...@@ -37,7 +37,6 @@ export function getWatchCollections(): string[] { ...@@ -37,7 +37,6 @@ export function getWatchCollections(): string[] {
IntegrationHistory.getCollectionName(), IntegrationHistory.getCollectionName(),
EmailInbox.getCollectionName(), EmailInbox.getCollectionName(),
Settings.getCollectionName(), Settings.getCollectionName(),
LivechatPriority.getCollectionName(),
Subscriptions.getCollectionName(), Subscriptions.getCollectionName(),
]; ];
...@@ -49,6 +48,7 @@ export function getWatchCollections(): string[] { ...@@ -49,6 +48,7 @@ export function getWatchCollections(): string[] {
collections.push(PbxEvents.getCollectionName()); collections.push(PbxEvents.getCollectionName());
collections.push(Integrations.getCollectionName()); collections.push(Integrations.getCollectionName());
collections.push(Permissions.getCollectionName()); collections.push(Permissions.getCollectionName());
collections.push(LivechatPriority.getCollectionName());
collections.push(LoginServiceConfiguration.getCollectionName()); collections.push(LoginServiceConfiguration.getCollectionName());
} }
......
...@@ -422,20 +422,15 @@ export function initWatchers(watcher: DatabaseWatcher, broadcast: BroadcastCallb ...@@ -422,20 +422,15 @@ export function initWatchers(watcher: DatabaseWatcher, broadcast: BroadcastCallb
} }
}); });
watcher.on<ILivechatPriority>(LivechatPriority.getCollectionName(), async ({ clientAction, id, data: eventData, diff }) => { watcher.on<ILivechatPriority>(LivechatPriority.getCollectionName(), async ({ clientAction, id, diff }) => {
if (clientAction !== 'updated' || !diff || !('name' in diff)) { if (clientAction !== 'updated' || !diff || !('name' in diff)) {
// For now, we don't support this actions from happening // For now, we don't support this actions from happening
return; return;
} }
const data = eventData ?? (await LivechatPriority.findOne({ _id: id }));
if (!data) {
return;
}
// This solves the problem of broadcasting, since now, watcher is the one in charge of doing it. // This solves the problem of broadcasting, since now, watcher is the one in charge of doing it.
// What i don't like is the idea of giving more responsibilities to watcher, even when this works // What i don't like is the idea of giving more responsibilities to watcher, even when this works
void broadcast('watch.priorities', { clientAction, data, id, diff }); void broadcast('watch.priorities', { clientAction, id, diff });
}); });
watcherStarted = true; watcherStarted = true;
......
...@@ -287,12 +287,7 @@ export type EventSignatures = { ...@@ -287,12 +287,7 @@ export type EventSignatures = {
'watch.pbxevents'(data: { clientAction: ClientAction; data: Partial<IPbxEvent>; id: string }): void; 'watch.pbxevents'(data: { clientAction: ClientAction; data: Partial<IPbxEvent>; id: string }): void;
'connector.statuschanged'(enabled: boolean): void; 'connector.statuschanged'(enabled: boolean): void;
'federation.userRoleChanged'(update: Record<string, any>): void; 'federation.userRoleChanged'(update: Record<string, any>): void;
'watch.priorities'(data: { 'watch.priorities'(data: { clientAction: ClientAction; id: ILivechatPriority['_id']; diff?: Record<string, string> }): void;
clientAction: ClientAction;
data: Partial<ILivechatPriority>;
id: string;
diff?: Record<string, string>;
}): void;
'apps.added'(appId: string): void; 'apps.added'(appId: string): void;
'apps.removed'(appId: string): void; 'apps.removed'(appId: string): void;
'apps.updated'(appId: string): void; 'apps.updated'(appId: string): void;
......
import type { ILivechatPriority } from '@rocket.chat/core-typings'; import type { ILivechatPriority } from '@rocket.chat/core-typings';
import type { ModifyResult } from 'mongodb'; import type { FindCursor, ModifyResult } from 'mongodb';
import type { IBaseModel } from './IBaseModel'; import type { IBaseModel } from './IBaseModel';
export interface ILivechatPriorityModel extends IBaseModel<ILivechatPriority> { export interface ILivechatPriorityModel extends IBaseModel<ILivechatPriority> {
findOneByIdOrName(_idOrName: string, options?: any): Promise<ILivechatPriority | null>; findOneByIdOrName(_idOrName: string, options?: any): Promise<ILivechatPriority | null>;
findOneNameUsingRegex(_idOrName: string, options?: any): Promise<ILivechatPriority | null>; findOneNameUsingRegex(_idOrName: string, options?: any): Promise<ILivechatPriority | null>;
findByDirty(): FindCursor<Pick<ILivechatPriority, '_id'>>;
canResetPriorities(): Promise<boolean>; canResetPriorities(): Promise<boolean>;
resetPriorities(): Promise<void>; resetPriorities(ids: ILivechatPriority['_id'][]): Promise<void>;
updatePriority(_id: string, reset: boolean, name?: string): Promise<ModifyResult<ILivechatPriority>>; updatePriority(_id: string, reset: boolean, name?: string): Promise<ModifyResult<ILivechatPriority>>;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment