Skip to content
Snippets Groups Projects
Unverified Commit df2b9898 authored by Murtaza Patrawala's avatar Murtaza Patrawala Committed by GitHub
Browse files

chore: cache legacy omnichannel analytics (#30493)

parent e3db0855
No related branches found
No related tags found
No related merge requests found
......@@ -3,15 +3,15 @@ import { isGETDashboardTotalizerParams, isGETDashboardsAgentStatusParams } from
import { API } from '../../../../api/server';
import {
findAllChatsStatusAsync,
getProductivityMetricsAsync,
getConversationsMetricsAsync,
findAllChatMetricsByAgentAsync,
findAllAgentsStatusAsync,
findAllChatMetricsByDepartmentAsync,
findAllResponseTimeMetricsAsync,
getAgentsProductivityMetricsAsync,
getChatsMetricsAsync,
getProductivityMetricsAsyncCached,
getConversationsMetricsAsyncCached,
getAgentsProductivityMetricsAsyncCached,
getChatsMetricsAsyncCached,
findAllChatsStatusAsyncCached,
findAllChatMetricsByAgentAsyncCached,
findAllAgentsStatusAsyncCached,
findAllChatMetricsByDepartmentAsyncCached,
findAllResponseTimeMetricsAsyncCached,
} from '../../../server/lib/analytics/dashboards';
API.v1.addRoute(
......@@ -41,7 +41,7 @@ API.v1.addRoute(
return API.v1.failure('User not found');
}
const totalizers = await getConversationsMetricsAsync({ start: startDate, end: endDate, departmentId, user });
const totalizers = await getConversationsMetricsAsyncCached({ start: startDate, end: endDate, departmentId, user });
return API.v1.success(totalizers);
},
},
......@@ -70,7 +70,7 @@ API.v1.addRoute(
return API.v1.failure('User not found');
}
const totalizers = await getAgentsProductivityMetricsAsync({ start: startDate, end: endDate, departmentId, user });
const totalizers = await getAgentsProductivityMetricsAsyncCached({ start: startDate, end: endDate, departmentId, user });
return API.v1.success(totalizers);
},
},
......@@ -94,7 +94,7 @@ API.v1.addRoute(
}
const endDate = new Date(end);
const totalizers = await getChatsMetricsAsync({ start: startDate, end: endDate, departmentId });
const totalizers = await getChatsMetricsAsyncCached({ start: startDate, end: endDate, departmentId });
return API.v1.success(totalizers);
},
},
......@@ -123,7 +123,7 @@ API.v1.addRoute(
return API.v1.failure('User not found');
}
const totalizers = await getProductivityMetricsAsync({ start: startDate, end: endDate, departmentId, user });
const totalizers = await getProductivityMetricsAsyncCached({ start: startDate, end: endDate, departmentId, user });
return API.v1.success(totalizers);
},
......@@ -148,7 +148,7 @@ API.v1.addRoute(
}
const endDate = new Date(end);
const result = await findAllChatsStatusAsync({ start: startDate, end: endDate, departmentId });
const result = await findAllChatsStatusAsyncCached({ start: startDate, end: endDate, departmentId });
return API.v1.success(result);
},
......@@ -172,7 +172,7 @@ API.v1.addRoute(
return API.v1.failure('The "end" query parameter must be a valid date.');
}
const endDate = new Date(end);
const result = (await findAllChatMetricsByAgentAsync({ start: startDate, end: endDate, departmentId })) as {
const result = (await findAllChatMetricsByAgentAsyncCached({ start: startDate, end: endDate, departmentId })) as {
[k: string]: { open: number; closed: number; onhold: number };
};
......@@ -188,7 +188,7 @@ API.v1.addRoute(
async get() {
const { departmentId } = this.queryParams;
const result = await findAllAgentsStatusAsync({ departmentId });
const result = await findAllAgentsStatusAsyncCached({ departmentId });
return API.v1.success(result);
},
......@@ -213,7 +213,7 @@ API.v1.addRoute(
}
const endDate = new Date(end);
const result = (await findAllChatMetricsByDepartmentAsync({ start: startDate, end: endDate, departmentId })) as {
const result = (await findAllChatMetricsByDepartmentAsyncCached({ start: startDate, end: endDate, departmentId })) as {
[k: string]: { open: number; closed: number };
};
......@@ -240,7 +240,7 @@ API.v1.addRoute(
}
const endDate = new Date(end);
const result = await findAllResponseTimeMetricsAsync({ start: startDate, end: endDate, departmentId });
const result = await findAllResponseTimeMetricsAsyncCached({ start: startDate, end: endDate, departmentId });
return API.v1.success(result);
},
......
......@@ -3,7 +3,7 @@ import { isLivechatAnalyticsAgentOverviewProps, isLivechatAnalyticsOverviewProps
import { API } from '../../../../api/server';
import { settings } from '../../../../settings/server';
import { Livechat } from '../../lib/Livechat';
import { getAgentOverviewDataCached, getAnalyticsOverviewDataCached } from '../../lib/AnalyticsTyped';
API.v1.addRoute(
'livechat/analytics/agent-overview',
......@@ -22,7 +22,7 @@ API.v1.addRoute(
const user = await Users.findOneById(this.userId, { projection: { _id: 1, utcOffset: 1 } });
return API.v1.success(
await Livechat.Analytics.getAgentOverviewData({
await getAgentOverviewDataCached({
departmentId,
utcOffset: user?.utcOffset || 0,
daterange: { from, to },
......@@ -52,7 +52,7 @@ API.v1.addRoute(
const language = user?.language || settings.get('Language') || 'en';
return API.v1.success(
await Livechat.Analytics.getAnalyticsOverviewData({
await getAnalyticsOverviewDataCached({
departmentId,
utcOffset: user?.utcOffset || 0,
daterange: { from, to },
......
This diff is collapsed.
import mem from 'mem';
import { Analytics } from './Analytics';
export const getAgentOverviewDataCached = mem(Analytics.getAgentOverviewData, { maxAge: 60000, cacheKey: JSON.stringify });
// Agent overview data on realtime is cached for 5 seconds
// while the data on the overview page is cached for 1 minute
export const getAnalyticsOverviewDataCached = mem(Analytics.getAnalyticsOverviewData, { maxAge: 60000, cacheKey: JSON.stringify });
export const getAnalyticsOverviewDataCachedForRealtime = mem(Analytics.getAnalyticsOverviewData, {
maxAge: 5000,
cacheKey: JSON.stringify,
});
import type { IUser } from '@rocket.chat/core-typings';
import { LivechatRooms, Users, LivechatVisitors, LivechatAgentActivity } from '@rocket.chat/models';
import mem from 'mem';
import moment from 'moment';
import { secondsToHHMMSS } from '../../../../../lib/utils/secondsToHHMMSS';
import { settings } from '../../../../settings/server';
import { getAnalyticsOverviewDataCachedForRealtime } from '../AnalyticsTyped';
import { Livechat } from '../Livechat';
import {
findPercentageOfAbandonedRoomsAsync,
......@@ -13,15 +15,7 @@ import {
findAllAverageServiceTimeAsync,
} from './departments';
export const findAllChatsStatusAsync = async ({
start,
end,
departmentId = undefined,
}: {
start: Date;
end: Date;
departmentId?: string;
}) => {
const findAllChatsStatusAsync = async ({ start, end, departmentId = undefined }: { start: Date; end: Date; departmentId?: string }) => {
if (!start || !end) {
throw new Error('"start" and "end" must be provided');
}
......@@ -33,7 +27,7 @@ export const findAllChatsStatusAsync = async ({
};
};
export const getProductivityMetricsAsync = async ({
const getProductivityMetricsAsync = async ({
start,
end,
departmentId = undefined,
......@@ -78,7 +72,7 @@ export const getProductivityMetricsAsync = async ({
};
};
export const getAgentsProductivityMetricsAsync = async ({
const getAgentsProductivityMetricsAsync = async ({
start,
end,
departmentId = undefined,
......@@ -148,7 +142,7 @@ export const getAgentsProductivityMetricsAsync = async ({
};
};
export const getChatsMetricsAsync = async ({ start, end, departmentId = undefined }: { start: Date; end: Date; departmentId?: string }) => {
const getChatsMetricsAsync = async ({ start, end, departmentId = undefined }: { start: Date; end: Date; departmentId?: string }) => {
if (!start || !end) {
throw new Error('"start" and "end" must be provided');
}
......@@ -223,7 +217,7 @@ export const getChatsMetricsAsync = async ({ start, end, departmentId = undefine
};
};
export const getConversationsMetricsAsync = async ({
const getConversationsMetricsAsync = async ({
start,
end,
departmentId,
......@@ -237,7 +231,7 @@ export const getConversationsMetricsAsync = async ({
if (!start || !end) {
throw new Error('"start" and "end" must be provided');
}
const totalizers = await Livechat.Analytics.getAnalyticsOverviewData({
const totalizers = await getAnalyticsOverviewDataCachedForRealtime({
daterange: {
from: start,
to: end,
......@@ -263,7 +257,7 @@ export const getConversationsMetricsAsync = async ({
};
};
export const findAllChatMetricsByAgentAsync = async ({
const findAllChatMetricsByAgentAsync = async ({
start,
end,
departmentId = undefined,
......@@ -311,10 +305,10 @@ export const findAllChatMetricsByAgentAsync = async ({
return result;
};
export const findAllAgentsStatusAsync = async ({ departmentId = undefined }: { departmentId?: string }) =>
const findAllAgentsStatusAsync = async ({ departmentId = undefined }: { departmentId?: string }) =>
(await Users.countAllAgentsStatus({ departmentId }))[0];
export const findAllChatMetricsByDepartmentAsync = async ({
const findAllChatMetricsByDepartmentAsync = async ({
start,
end,
departmentId = undefined,
......@@ -349,7 +343,7 @@ export const findAllChatMetricsByDepartmentAsync = async ({
return result;
};
export const findAllResponseTimeMetricsAsync = async ({
const findAllResponseTimeMetricsAsync = async ({
start,
end,
departmentId = undefined,
......@@ -380,3 +374,16 @@ export const findAllResponseTimeMetricsAsync = async ({
},
};
};
export const getConversationsMetricsAsyncCached = mem(getConversationsMetricsAsync, { maxAge: 5000, cacheKey: JSON.stringify });
export const getAgentsProductivityMetricsAsyncCached = mem(getAgentsProductivityMetricsAsync, { maxAge: 5000, cacheKey: JSON.stringify });
export const getChatsMetricsAsyncCached = mem(getChatsMetricsAsync, { maxAge: 5000, cacheKey: JSON.stringify });
export const getProductivityMetricsAsyncCached = mem(getProductivityMetricsAsync, { maxAge: 5000, cacheKey: JSON.stringify });
export const findAllChatsStatusAsyncCached = mem(findAllChatsStatusAsync, { maxAge: 5000, cacheKey: JSON.stringify });
export const findAllChatMetricsByAgentAsyncCached = mem(findAllChatMetricsByAgentAsync, { maxAge: 5000, cacheKey: JSON.stringify });
export const findAllAgentsStatusAsyncCached = mem(findAllAgentsStatusAsync, { maxAge: 5000, cacheKey: JSON.stringify });
export const findAllChatMetricsByDepartmentAsyncCached = mem(findAllChatMetricsByDepartmentAsync, {
maxAge: 5000,
cacheKey: JSON.stringify,
});
export const findAllResponseTimeMetricsAsyncCached = mem(findAllResponseTimeMetricsAsync, { maxAge: 5000, cacheKey: JSON.stringify });
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