snapshot of https://github.com/RocketChat/Rocket.Chat.git (develop, 2026-09-16; blobs > 131072B omitted)
Some checks failed
Create issues from TODOs / todos (push) Failing after 3s
Close inactive issues / close-issues (push) Has been cancelled
Deploy GitHub Pages / deploy-preview (push) Has been cancelled
CI / ⚙️ Variables Setup (push) Has been cancelled
CI / ⚙️ Test Guard (push) Has been cancelled
CI / 🚀 Notify external services - draft (push) Has been cancelled
CI / 📦 Build Packages (push) Has been cancelled
CI / 📦 Meteor Build (coverage) (push) Has been cancelled
CI / 📦 Meteor Build (production) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [account-service presence-service omnichannel-transcript-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [account-service presence-service omnichannel-transcript-service], fips) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [authorization-service queue-worker-service ddp-streamer-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [authorization-service queue-worker-service ddp-streamer-service], fips) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], coverage) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], fips) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [account-service presence-service omnichannel-transcript-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [authorization-service queue-worker-service ddp-streamer-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [rocketchat], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [rocketchat], coverage) (push) Has been cancelled
CI / 🚢 Publish Docker Images (ghcr.io) (push) Has been cancelled
CI / 📦 Track Image Sizes (push) Has been cancelled
CI / 🔎 Code Check - Action Lint (push) Has been cancelled
CI / 🔎 Code Check (push) Has been cancelled
CI / 🔨 Test Storybook (push) Has been cancelled
CI / 🔨 Test Unit (push) Has been cancelled
CI / 🔨 Test API (CE) (push) Has been cancelled
CI / 🔨 Test API Livechat (CE) (push) Has been cancelled
CI / 🔨 Test UI (CE) (push) Has been cancelled
CI / 🔨 Test API (EE) (push) Has been cancelled
CI / 🔨 Test API Livechat (EE) (push) Has been cancelled
CI / 🔨 Test API Apps (deno-runtime - EE) (push) Has been cancelled
CI / 🔨 Test UI (EE) (push) Has been cancelled
CI / 🔨 Test API (FIPS) (push) Has been cancelled
CI / 🔨 Test API Livechat (FIPS) (push) Has been cancelled
CI / 🔨 Test UI (FIPS) (push) Has been cancelled
CI / 🔨 Test Federation Matrix (push) Has been cancelled
CI / 📊 Report Coverage (push) Has been cancelled
CI / ✅ Tests Done (push) Has been cancelled
CI / 🚀 Publish build assets (push) Has been cancelled
CI / 🚀 Publish Docker Images (DockerHub) (push) Has been cancelled
CI / 🚀 Notify external services (push) Has been cancelled
CI / Update Version Durability (push) Has been cancelled
Release / Release (push) Has been cancelled
Auto-close duplicate issues / auto-close-duplicates (push) Failing after 1s
Code scanning - action / CodeQL-Build (push) Failing after 1s
Some checks failed
Create issues from TODOs / todos (push) Failing after 3s
Close inactive issues / close-issues (push) Has been cancelled
Deploy GitHub Pages / deploy-preview (push) Has been cancelled
CI / ⚙️ Variables Setup (push) Has been cancelled
CI / ⚙️ Test Guard (push) Has been cancelled
CI / 🚀 Notify external services - draft (push) Has been cancelled
CI / 📦 Build Packages (push) Has been cancelled
CI / 📦 Meteor Build (coverage) (push) Has been cancelled
CI / 📦 Meteor Build (production) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [account-service presence-service omnichannel-transcript-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [account-service presence-service omnichannel-transcript-service], fips) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [authorization-service queue-worker-service ddp-streamer-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [authorization-service queue-worker-service ddp-streamer-service], fips) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], coverage) (push) Has been cancelled
CI / 🚢 Build Docker (amd64, [rocketchat], fips) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [account-service presence-service omnichannel-transcript-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [authorization-service queue-worker-service ddp-streamer-service], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [rocketchat], ${{ (github.event_name != 'release' && github.ref != 'refs/heads/develop') && 'coverage' || 'production' }}) (push) Has been cancelled
CI / 🚢 Build Docker (arm64, [rocketchat], coverage) (push) Has been cancelled
CI / 🚢 Publish Docker Images (ghcr.io) (push) Has been cancelled
CI / 📦 Track Image Sizes (push) Has been cancelled
CI / 🔎 Code Check - Action Lint (push) Has been cancelled
CI / 🔎 Code Check (push) Has been cancelled
CI / 🔨 Test Storybook (push) Has been cancelled
CI / 🔨 Test Unit (push) Has been cancelled
CI / 🔨 Test API (CE) (push) Has been cancelled
CI / 🔨 Test API Livechat (CE) (push) Has been cancelled
CI / 🔨 Test UI (CE) (push) Has been cancelled
CI / 🔨 Test API (EE) (push) Has been cancelled
CI / 🔨 Test API Livechat (EE) (push) Has been cancelled
CI / 🔨 Test API Apps (deno-runtime - EE) (push) Has been cancelled
CI / 🔨 Test UI (EE) (push) Has been cancelled
CI / 🔨 Test API (FIPS) (push) Has been cancelled
CI / 🔨 Test API Livechat (FIPS) (push) Has been cancelled
CI / 🔨 Test UI (FIPS) (push) Has been cancelled
CI / 🔨 Test Federation Matrix (push) Has been cancelled
CI / 📊 Report Coverage (push) Has been cancelled
CI / ✅ Tests Done (push) Has been cancelled
CI / 🚀 Publish build assets (push) Has been cancelled
CI / 🚀 Publish Docker Images (DockerHub) (push) Has been cancelled
CI / 🚀 Notify external services (push) Has been cancelled
CI / Update Version Durability (push) Has been cancelled
Release / Release (push) Has been cancelled
Auto-close duplicate issues / auto-close-duplicates (push) Failing after 1s
Code scanning - action / CodeQL-Build (push) Failing after 1s
This commit is contained in:
198
apps/meteor/server/api/v1/omnichannel/lib/livechat.ts
Normal file
198
apps/meteor/server/api/v1/omnichannel/lib/livechat.ts
Normal file
@@ -0,0 +1,198 @@
|
||||
import type { ILivechatAgent, ILivechatDepartment, ILivechatTrigger, ILivechatVisitor, IOmnichannelRoom } from '@rocket.chat/core-typings';
|
||||
import { License } from '@rocket.chat/license';
|
||||
import { EmojiCustom, LivechatTrigger, LivechatVisitors, LivechatRooms, LivechatDepartment } from '@rocket.chat/models';
|
||||
import { makeFunction } from '@rocket.chat/patch-injection';
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
|
||||
import { callbacks } from '../../../../lib/callbacks';
|
||||
import { normalizeAgent } from '../../../../lib/omnichannel/Helper';
|
||||
import { getInitSettings } from '../../../../lib/omnichannel/settings';
|
||||
|
||||
async function findTriggers(): Promise<Pick<ILivechatTrigger, '_id' | 'actions' | 'conditions' | 'runOnce'>[]> {
|
||||
const triggers = await LivechatTrigger.findEnabled().toArray();
|
||||
const hasLicense = License.hasModule('livechat-enterprise');
|
||||
const premiumActions = ['use-external-service'];
|
||||
|
||||
return triggers
|
||||
.filter(({ actions }) => hasLicense || actions.some((c) => !premiumActions.includes(c.name)))
|
||||
.map(({ _id, actions, conditions, runOnce }) => ({
|
||||
_id,
|
||||
actions,
|
||||
conditions,
|
||||
runOnce,
|
||||
}));
|
||||
}
|
||||
|
||||
export type CheckUnitsFromUser = {
|
||||
userId?: string;
|
||||
businessUnit?: string;
|
||||
};
|
||||
|
||||
export const checkUnitsFromUser = makeFunction(async (_params: CheckUnitsFromUser): Promise<void> => undefined);
|
||||
|
||||
async function findDepartments(
|
||||
businessUnit?: string,
|
||||
userId?: string,
|
||||
): Promise<Pick<ILivechatDepartment, '_id' | 'name' | 'showOnRegistration' | 'showOnOfflineForm' | 'departmentsAllowedToForward'>[]> {
|
||||
// TODO: check this function usage
|
||||
await checkUnitsFromUser({ userId, businessUnit });
|
||||
|
||||
return LivechatDepartment.findEnabledWithAgentsAndBusinessUnit<
|
||||
Pick<ILivechatDepartment, '_id' | 'name' | 'showOnRegistration' | 'showOnOfflineForm' | 'departmentsAllowedToForward'>
|
||||
>(businessUnit, {
|
||||
_id: 1,
|
||||
name: 1,
|
||||
showOnRegistration: 1,
|
||||
showOnOfflineForm: 1,
|
||||
departmentsAllowedToForward: 1,
|
||||
}).toArray();
|
||||
}
|
||||
|
||||
export function findGuest(token: string): Promise<ILivechatVisitor | null> {
|
||||
return LivechatVisitors.getVisitorByToken(token);
|
||||
}
|
||||
|
||||
export function findGuestWithoutActivity(
|
||||
token: string,
|
||||
): Promise<Pick<ILivechatVisitor, '_id' | 'name' | 'username' | 'token' | 'visitorEmails' | 'department'> | null> {
|
||||
return LivechatVisitors.getVisitorByToken(token, { projection: { name: 1, username: 1, token: 1, visitorEmails: 1, department: 1 } });
|
||||
}
|
||||
|
||||
export async function findRoom(token: string, rid?: string): Promise<IOmnichannelRoom | null> {
|
||||
const fields = {
|
||||
t: 1,
|
||||
departmentId: 1,
|
||||
servedBy: 1,
|
||||
open: 1,
|
||||
v: 1,
|
||||
ts: 1,
|
||||
};
|
||||
|
||||
if (!rid) {
|
||||
return LivechatRooms.findOneByVisitorToken(token, fields);
|
||||
}
|
||||
|
||||
return LivechatRooms.findOneByIdAndVisitorToken(rid, token, fields);
|
||||
}
|
||||
|
||||
export async function findOpenRoom(token: string, departmentId?: string, callerId?: string): Promise<IOmnichannelRoom | undefined> {
|
||||
const options = {
|
||||
projection: {
|
||||
departmentId: 1,
|
||||
servedBy: 1,
|
||||
open: 1,
|
||||
},
|
||||
};
|
||||
|
||||
const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {}, { userId: callerId });
|
||||
const rooms = departmentId
|
||||
? await LivechatRooms.findOpenByVisitorTokenAndDepartmentId(token, departmentId, options, extraQuery).toArray()
|
||||
: await LivechatRooms.findOpenByVisitorToken(token, options, extraQuery).toArray();
|
||||
if (rooms && rooms.length > 0) {
|
||||
return rooms[0];
|
||||
}
|
||||
}
|
||||
|
||||
export async function findAgent(agentId?: string): Promise<void | { hiddenInfo: boolean } | ILivechatAgent> {
|
||||
return normalizeAgent(agentId);
|
||||
}
|
||||
|
||||
export function normalizeHttpHeaderData(headers: Headers = new Headers()): {
|
||||
httpHeaders: Record<string, string | string[] | undefined>;
|
||||
} {
|
||||
const httpHeaders = Object.fromEntries(headers.entries());
|
||||
return { httpHeaders };
|
||||
}
|
||||
|
||||
export async function settings({ businessUnit = '', userId }: { businessUnit?: string; userId?: string } = {}): Promise<
|
||||
Record<string, string | number | any>
|
||||
> {
|
||||
const [initSettings, triggers, departments, emojis] = await Promise.all([
|
||||
getInitSettings(),
|
||||
findTriggers(),
|
||||
findDepartments(businessUnit, userId),
|
||||
EmojiCustom.find().toArray(),
|
||||
]);
|
||||
const sound = `${Meteor.absoluteUrl()}sounds/chime.mp3`;
|
||||
return {
|
||||
enabled: initSettings.Livechat_enabled,
|
||||
settings: {
|
||||
registrationForm: initSettings.Livechat_registration_form,
|
||||
allowSwitchingDepartments: initSettings.Livechat_allow_switching_departments,
|
||||
nameFieldRegistrationForm: initSettings.Livechat_name_field_registration_form,
|
||||
emailFieldRegistrationForm: initSettings.Livechat_email_field_registration_form,
|
||||
displayOfflineForm: initSettings.Livechat_display_offline_form,
|
||||
videoCall: initSettings.Omnichannel_call_provider === 'default-provider',
|
||||
fileUpload: initSettings.Livechat_fileupload_enabled && initSettings.FileUpload_Enabled,
|
||||
language: initSettings.Language,
|
||||
transcript: initSettings.Livechat_enable_transcript,
|
||||
historyMonitorType: initSettings.Livechat_history_monitor_type,
|
||||
forceAcceptDataProcessingConsent: initSettings.Livechat_force_accept_data_processing_consent,
|
||||
showConnecting: initSettings.Livechat_Show_Connecting,
|
||||
agentHiddenInfo: initSettings.Livechat_show_agent_info === false,
|
||||
clearLocalStorageWhenChatEnded: initSettings.Livechat_clear_local_storage_when_chat_ended,
|
||||
limitTextLength:
|
||||
initSettings.Livechat_enable_message_character_limit &&
|
||||
(initSettings.Livechat_message_character_limit || initSettings.Message_MaxAllowedSize),
|
||||
hiddenSystemMessages: initSettings.Livechat_hide_system_messages,
|
||||
livechatLogo: initSettings.Assets_livechat_widget_logo,
|
||||
hideWatermark: initSettings.Livechat_hide_watermark || false,
|
||||
visitorsCanCloseChat: initSettings.Omnichannel_allow_visitors_to_close_conversation,
|
||||
},
|
||||
theme: {
|
||||
title: initSettings.Livechat_title,
|
||||
color: initSettings.Livechat_title_color,
|
||||
offlineTitle: initSettings.Livechat_offline_title,
|
||||
offlineColor: initSettings.Livechat_offline_title_color,
|
||||
position: initSettings.Livechat_widget_position || 'right',
|
||||
background: initSettings.Livechat_background,
|
||||
hideExpandChat: initSettings.Livechat_hide_expand_chat,
|
||||
actionLinks: {
|
||||
jitsi: [
|
||||
{ icon: 'icon-videocam', i18nLabel: 'Accept' },
|
||||
{ icon: 'icon-cancel', i18nLabel: 'Decline' },
|
||||
],
|
||||
},
|
||||
},
|
||||
messages: {
|
||||
offlineMessage: initSettings.Livechat_offline_message,
|
||||
offlineSuccessMessage: initSettings.Livechat_offline_success_message,
|
||||
offlineUnavailableMessage: initSettings.Livechat_offline_form_unavailable,
|
||||
conversationFinishedMessage: initSettings.Livechat_conversation_finished_message,
|
||||
conversationFinishedText: initSettings.Livechat_conversation_finished_text,
|
||||
transcriptMessage: initSettings.Livechat_transcript_message,
|
||||
registrationFormMessage: initSettings.Livechat_registration_form_message,
|
||||
dataProcessingConsentText: initSettings.Livechat_data_processing_consent_text,
|
||||
},
|
||||
survey: {
|
||||
items: ['satisfaction', 'agentKnowledge', 'agentResposiveness', 'agentFriendliness'],
|
||||
values: ['1', '2', '3', '4', '5'],
|
||||
},
|
||||
triggers,
|
||||
departments,
|
||||
resources: {
|
||||
sound,
|
||||
emojis,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export const getExtraConfigInfo = makeFunction(
|
||||
async (options: {
|
||||
room?: IOmnichannelRoom;
|
||||
}): Promise<{
|
||||
queueInfo?: unknown;
|
||||
customFields?: {
|
||||
options?: string[] | undefined;
|
||||
_id: string;
|
||||
label: string;
|
||||
regexp: string | undefined;
|
||||
required: boolean;
|
||||
type: string | undefined;
|
||||
defaultValue: string | null;
|
||||
}[];
|
||||
room?: IOmnichannelRoom;
|
||||
}> => options,
|
||||
);
|
||||
|
||||
export const onCheckRoomParams = makeFunction((params: any) => params);
|
||||
Reference in New Issue
Block a user