From 4c2e444216efd514ab406fe8e9cd127ef971d566 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:46:50 -0300 Subject: [PATCH] chore: Update coerceTypes to false and modify mocharc settings (#39559) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Guilherme Gazzo Co-authored-by: Guilherme Gazzo Co-authored-by: Claude Opus 4.6 --- .changeset/strict-ajv-coercion.md | 16 ++ apps/meteor/.mocharc.api.js | 2 +- apps/meteor/app/api/server/ajv.ts | 6 +- apps/meteor/app/api/server/v1/call-history.ts | 5 +- apps/meteor/app/api/server/v1/commands.ts | 4 +- .../app/api/server/v1/custom-user-status.ts | 4 +- apps/meteor/app/api/server/v1/e2e.ts | 6 +- apps/meteor/app/api/server/v1/misc.ts | 2 +- apps/meteor/app/api/server/v1/oauthapps.ts | 5 +- apps/meteor/app/api/server/v1/permissions.ts | 3 +- apps/meteor/app/api/server/v1/roles.ts | 3 +- apps/meteor/app/api/server/v1/rooms.ts | 5 +- .../server/functions/upsertPermissions.ts | 5 +- .../app/livechat/server/api/v1/integration.ts | 15 +- .../client/providers/AvatarUrlProvider.tsx | 6 +- .../client/views/banners/UiKitBanner.tsx | 4 + .../OutlookCalendarEventModal.tsx | 2 +- .../hooks/useOutlookOpenCall.ts | 2 +- .../VideoConfList/VideoConfListItem.tsx | 2 +- apps/meteor/ee/server/api/abac/schemas.ts | 8 +- apps/meteor/ee/server/api/audit.ts | 12 +- apps/meteor/ee/server/api/federation.ts | 4 +- apps/meteor/ee/server/api/sessions.ts | 6 +- .../server/services/calendar/service.ts | 2 +- .../api/livechat/06-integrations.ts | 5 +- .../end-to-end/api/livechat/12-priorites.ts | 11 -- .../tests/end-to-end/api/subscriptions.ts | 2 +- docs/ajv-instances.md | 137 ++++++++++++++ .../videoConferences/IVideoConference.ts | 2 +- packages/core-typings/src/ICalendarEvent.ts | 4 +- packages/core-typings/src/IPermission.ts | 5 +- packages/core-typings/src/ISetting.ts | 3 +- packages/core-typings/src/IVideoConference.ts | 6 +- .../src/apps/appLogsExportProps.ts | 4 +- .../rest-typings/src/apps/appLogsProps.ts | 4 +- packages/rest-typings/src/v1/Ajv.ts | 21 ++- ...translateGetSupportedLanguagesParamsGET.ts | 4 +- packages/rest-typings/src/v1/banners.ts | 4 +- .../src/v1/calendar/CalendarEventInfoProps.ts | 4 +- .../src/v1/calendar/CalendarEventListProps.ts | 4 +- .../src/v1/channels/ChannelsFilesListProps.ts | 4 +- ...hannelsGetAllUserMentionsByChannelProps.ts | 4 +- .../src/v1/channels/ChannelsHistoryProps.ts | 4 +- .../src/v1/channels/ChannelsListProps.ts | 4 +- .../src/v1/channels/ChannelsMessagesProps.ts | 4 +- .../v1/channels/ChannelsModeratorsProps.ts | 4 +- .../src/v1/channels/ChannelsOnlineProps.ts | 4 +- .../src/v1/channels/ChannelsRolesProps.ts | 4 +- packages/rest-typings/src/v1/chat.ts | 22 +-- packages/rest-typings/src/v1/cloud.ts | 4 +- packages/rest-typings/src/v1/customSounds.ts | 6 +- .../rest-typings/src/v1/dm/DmFileProps.ts | 4 +- .../rest-typings/src/v1/dm/DmHistoryProps.ts | 4 +- .../rest-typings/src/v1/dm/DmMembersProps.ts | 4 +- .../rest-typings/src/v1/dm/DmMessagesProps.ts | 4 +- packages/rest-typings/src/v1/email-inbox.ts | 6 +- packages/rest-typings/src/v1/emojiCustom.ts | 4 +- .../src/v1/groups/GroupsFilesProps.ts | 4 +- .../src/v1/groups/GroupsMessagesProps.ts | 4 +- .../src/v1/groups/GroupsOnlineProps.ts | 4 +- .../GetCurrentImportOperationParamsGET.ts | 4 +- .../v1/import/GetImportFileDataParamsGET.ts | 4 +- .../v1/import/GetImportProgressParamsGET.ts | 4 +- .../GetLatestImportOperationsParamsGET.ts | 4 +- .../src/v1/import/ImportersListParamsGET.ts | 4 +- .../v1/integrations/IntegrationsGetProps.ts | 4 +- .../integrations/IntegrationsHistoryProps.ts | 4 +- .../v1/integrations/IntegrationsListProps.ts | 4 +- packages/rest-typings/src/v1/licenses.ts | 4 +- packages/rest-typings/src/v1/misc.ts | 8 +- .../src/v1/moderation/GetUserReportsParams.ts | 4 +- .../src/v1/moderation/ReportHistoryProps.ts | 4 +- .../src/v1/moderation/ReportInfoParams.ts | 4 +- .../src/v1/moderation/ReportsByMsgIdParams.ts | 4 +- packages/rest-typings/src/v1/omnichannel.ts | 170 +++++++++--------- packages/rest-typings/src/v1/roles.ts | 4 +- packages/rest-typings/src/v1/rooms.ts | 10 +- .../ServerEventsAuditSettingsParamsGET.ts | 6 +- packages/rest-typings/src/v1/settings.ts | 6 +- .../src/v1/subscriptionsEndpoints.ts | 8 +- .../src/v1/teams/TeamsListChildren.ts | 4 +- .../src/v1/users/UsersInfoParamsGet.ts | 4 +- .../src/v1/users/UsersListStatusParamsGET.ts | 4 +- .../v1/videoConference/VideoConfInfoProps.ts | 4 +- .../v1/videoConference/VideoConfListProps.ts | 4 +- .../ui-avatar/src/components/UserAvatar.tsx | 2 +- packages/ui-contexts/src/AvatarUrlContext.ts | 6 +- .../ui-kit/src/surfaces/banner/BannerView.ts | 4 +- 88 files changed, 466 insertions(+), 281 deletions(-) create mode 100644 .changeset/strict-ajv-coercion.md create mode 100644 docs/ajv-instances.md diff --git a/.changeset/strict-ajv-coercion.md b/.changeset/strict-ajv-coercion.md new file mode 100644 index 0000000000000..f34405032264b --- /dev/null +++ b/.changeset/strict-ajv-coercion.md @@ -0,0 +1,16 @@ +--- +"@rocket.chat/rest-typings": minor +"@rocket.chat/meteor": patch +--- + +Splits the single AJV validator instance into two: `ajv` (coerceTypes: false) for request **body** validation and `ajvQuery` (coerceTypes: true) for **query parameter** validation. + +**Why this matters:** Previously, a single AJV instance with `coerceTypes: true` was used everywhere. This silently accepted values with wrong types — for example, sending `{ "rid": 12345 }` (number) where a string was expected would pass validation because `12345` was coerced to `"12345"`. With this change, body validation is now strict: the server will reject payloads with incorrect types instead of silently coercing them. + +**What may break for API consumers:** + +- **Numeric values sent as strings in POST/PUT/PATCH bodies** (e.g., `{ "count": "10" }` instead of `{ "count": 10 }`) will now be rejected. Ensure JSON bodies use proper types. +- **Boolean values sent as strings in bodies** (e.g., `{ "readThreads": "true" }` instead of `{ "readThreads": true }`) will now be rejected. +- **`null` values where a string is expected** (e.g., `{ "name": null }` for a `type: 'string'` field without `nullable: true`) will no longer be coerced to `""`. + +**No change for query parameters:** GET query params (e.g., `?count=10&offset=0`) continue to be coerced via `ajvQuery`, since HTTP query strings are always strings. diff --git a/apps/meteor/.mocharc.api.js b/apps/meteor/.mocharc.api.js index 6bccb8c9a06df..ca2657fa8a9a2 100644 --- a/apps/meteor/.mocharc.api.js +++ b/apps/meteor/.mocharc.api.js @@ -7,7 +7,7 @@ module.exports = /** @satisfies {import('mocha').MochaOptions} */ ({ ...require('./.mocharc.base.json'), // see https://github.com/mochajs/mocha/issues/3916 timeout: 10000, - bail: true, + bail: false, retries: 0, file: 'tests/end-to-end/teardown.ts', spec: ['tests/end-to-end/api/*.ts', 'tests/end-to-end/api/helpers/**/*', 'tests/end-to-end/api/methods/**/*', 'tests/end-to-end/apps/*'], diff --git a/apps/meteor/app/api/server/ajv.ts b/apps/meteor/app/api/server/ajv.ts index a56642f8613cd..00944159988ee 100644 --- a/apps/meteor/app/api/server/ajv.ts +++ b/apps/meteor/app/api/server/ajv.ts @@ -1,11 +1,13 @@ import { schemas } from '@rocket.chat/core-typings'; -import { ajv } from '@rocket.chat/rest-typings'; +import { ajv, ajvQuery } from '@rocket.chat/rest-typings'; const components = schemas.components?.schemas; if (components) { for (const key in components) { if (Object.prototype.hasOwnProperty.call(components, key)) { - ajv.addSchema(components[key], `#/components/schemas/${key}`); + const uri = `#/components/schemas/${key}`; + ajv.addSchema(components[key], uri); + ajvQuery.addSchema(components[key], uri); } } } diff --git a/apps/meteor/app/api/server/v1/call-history.ts b/apps/meteor/app/api/server/v1/call-history.ts index 606632571ac91..33412c6ae58c7 100644 --- a/apps/meteor/app/api/server/v1/call-history.ts +++ b/apps/meteor/app/api/server/v1/call-history.ts @@ -3,6 +3,7 @@ import { CallHistory, MediaCalls } from '@rocket.chat/models'; import type { PaginatedRequest, PaginatedResult } from '@rocket.chat/rest-typings'; import { ajv, + ajvQuery, validateNotFoundErrorResponse, validateBadRequestErrorResponse, validateUnauthorizedErrorResponse, @@ -61,7 +62,7 @@ const CallHistoryListSchema = { additionalProperties: false, }; -export const isCallHistoryListProps = ajv.compile(CallHistoryListSchema); +export const isCallHistoryListProps = ajvQuery.compile(CallHistoryListSchema); const callHistoryListEndpoints = API.v1.get( 'call-history.list', @@ -185,7 +186,7 @@ const CallHistoryInfoSchema = { ], }; -export const isCallHistoryInfoProps = ajv.compile(CallHistoryInfoSchema); +export const isCallHistoryInfoProps = ajvQuery.compile(CallHistoryInfoSchema); const callHistoryInfoEndpoints = API.v1.get( 'call-history.info', diff --git a/apps/meteor/app/api/server/v1/commands.ts b/apps/meteor/app/api/server/v1/commands.ts index bf96a983c3ae5..408222052b7d9 100644 --- a/apps/meteor/app/api/server/v1/commands.ts +++ b/apps/meteor/app/api/server/v1/commands.ts @@ -2,7 +2,7 @@ import { Apps } from '@rocket.chat/apps'; import type { SlashCommand } from '@rocket.chat/core-typings'; import { Messages } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; -import { ajv, validateUnauthorizedErrorResponse, validateBadRequestErrorResponse } from '@rocket.chat/rest-typings'; +import { ajv, ajvQuery, validateUnauthorizedErrorResponse, validateBadRequestErrorResponse } from '@rocket.chat/rest-typings'; import objectPath from 'object-path'; import { canAccessRoomIdAsync } from '../../../authorization/server/functions/canAccessRoom'; @@ -24,7 +24,7 @@ const CommandsGetParamsSchema = { additionalProperties: false, }; -const isCommandsGetParams = ajv.compile(CommandsGetParamsSchema); +const isCommandsGetParams = ajvQuery.compile(CommandsGetParamsSchema); const commandsEndpoints = API.v1.get( 'commands.get', diff --git a/apps/meteor/app/api/server/v1/custom-user-status.ts b/apps/meteor/app/api/server/v1/custom-user-status.ts index 4d4297cfe001c..573a8a1a123b0 100644 --- a/apps/meteor/app/api/server/v1/custom-user-status.ts +++ b/apps/meteor/app/api/server/v1/custom-user-status.ts @@ -1,6 +1,6 @@ import type { ICustomUserStatus } from '@rocket.chat/core-typings'; import { CustomUserStatus } from '@rocket.chat/models'; -import { ajv, validateUnauthorizedErrorResponse, validateBadRequestErrorResponse } from '@rocket.chat/rest-typings'; +import { ajv, ajvQuery, validateUnauthorizedErrorResponse, validateBadRequestErrorResponse } from '@rocket.chat/rest-typings'; import type { PaginatedRequest, PaginatedResult } from '@rocket.chat/rest-typings'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import { Match, check } from 'meteor/check'; @@ -46,7 +46,7 @@ const CustomUserStatusListSchema = { additionalProperties: false, }; -const isCustomUserStatusListProps = ajv.compile(CustomUserStatusListSchema); +const isCustomUserStatusListProps = ajvQuery.compile(CustomUserStatusListSchema); const customUserStatusEndpoints = API.v1.get( 'custom-user-status.list', diff --git a/apps/meteor/app/api/server/v1/e2e.ts b/apps/meteor/app/api/server/v1/e2e.ts index 71dcceb8b10d4..489a9e27a5953 100644 --- a/apps/meteor/app/api/server/v1/e2e.ts +++ b/apps/meteor/app/api/server/v1/e2e.ts @@ -2,6 +2,7 @@ import type { IRoom, ISubscription, IUser } from '@rocket.chat/core-typings'; import { Subscriptions, Users } from '@rocket.chat/models'; import { ajv, + ajvQuery, validateUnauthorizedErrorResponse, validateBadRequestErrorResponse, validateForbiddenErrorResponse, @@ -164,7 +165,9 @@ const ise2eGetUsersOfRoomWithoutKeyParamsGET = ajv.compile(e2eUpdateGroupKeyParamsPOSTSchema); -const isE2EFetchUsersWaitingForGroupKeyProps = ajv.compile(E2EFetchUsersWaitingForGroupKeySchema); +const isE2EFetchUsersWaitingForGroupKeyProps = ajvQuery.compile( + E2EFetchUsersWaitingForGroupKeySchema, +); const isE2EProvideUsersGroupKeyProps = ajv.compile(E2EProvideUsersGroupKeySchema); @@ -457,7 +460,6 @@ const e2eEndpoints = API.v1 }, }, async function action() { - // eslint-disable-next-line @typescript-eslint/naming-convention const { public_key, private_key, force } = this.bodyParams; await setUserPublicAndPrivateKeysMethod(this.userId, { diff --git a/apps/meteor/app/api/server/v1/misc.ts b/apps/meteor/app/api/server/v1/misc.ts index 54a24ba3e6fbe..1b24c8cde425f 100644 --- a/apps/meteor/app/api/server/v1/misc.ts +++ b/apps/meteor/app/api/server/v1/misc.ts @@ -348,7 +348,7 @@ const spotlightResponseSchema = ajv.compile<{ statusText: { type: 'string' }, avatarETag: { type: 'string' }, }, - required: ['_id', 'name', 'username', 'status', 'statusText'], + required: ['_id', 'name', 'username', 'status'], additionalProperties: true, }, }, diff --git a/apps/meteor/app/api/server/v1/oauthapps.ts b/apps/meteor/app/api/server/v1/oauthapps.ts index 26a5bd0cfd482..593947da77528 100644 --- a/apps/meteor/app/api/server/v1/oauthapps.ts +++ b/apps/meteor/app/api/server/v1/oauthapps.ts @@ -2,6 +2,7 @@ import type { IOAuthApps } from '@rocket.chat/core-typings'; import { OAuthApps } from '@rocket.chat/models'; import { ajv, + ajvQuery, validateUnauthorizedErrorResponse, validateBadRequestErrorResponse, validateForbiddenErrorResponse, @@ -114,14 +115,14 @@ const oauthAppsGetParamsSchema = { ], }; -const isOauthAppsGetParams = ajv.compile(oauthAppsGetParamsSchema); +const isOauthAppsGetParams = ajvQuery.compile(oauthAppsGetParamsSchema); const oauthAppsEndpoints = API.v1 .get( 'oauth-apps.list', { authRequired: true, - query: ajv.compile<{ uid?: string }>({ + query: ajvQuery.compile<{ uid?: string }>({ type: 'object', properties: { uid: { diff --git a/apps/meteor/app/api/server/v1/permissions.ts b/apps/meteor/app/api/server/v1/permissions.ts index 1659c3656a797..38c63b1f22a4c 100644 --- a/apps/meteor/app/api/server/v1/permissions.ts +++ b/apps/meteor/app/api/server/v1/permissions.ts @@ -2,6 +2,7 @@ import type { IPermission } from '@rocket.chat/core-typings'; import { Permissions, Roles } from '@rocket.chat/models'; import { ajv, + ajvQuery, validateUnauthorizedErrorResponse, validateBadRequestErrorResponse, validateForbiddenErrorResponse, @@ -57,7 +58,7 @@ const permissionUpdatePropsSchema = { additionalProperties: false, }; -const isPermissionsListAll = ajv.compile(permissionListAllSchema); +const isPermissionsListAll = ajvQuery.compile(permissionListAllSchema); const isBodyParamsValidPermissionUpdate = ajv.compile(permissionUpdatePropsSchema); diff --git a/apps/meteor/app/api/server/v1/roles.ts b/apps/meteor/app/api/server/v1/roles.ts index de0e23dfd46de..3972a97ee906a 100644 --- a/apps/meteor/app/api/server/v1/roles.ts +++ b/apps/meteor/app/api/server/v1/roles.ts @@ -3,6 +3,7 @@ import type { IRole, IUserInRole } from '@rocket.chat/core-typings'; import { Roles, Users } from '@rocket.chat/models'; import { ajv, + ajvQuery, isRoleAddUserToRoleProps, isRoleDeleteProps, isRoleRemoveUserFromRoleProps, @@ -25,7 +26,7 @@ import { API } from '../api'; import { getPaginationItems } from '../helpers/getPaginationItems'; import { getUserFromParams } from '../helpers/getUserFromParams'; -const rolesSyncQuerySchema = ajv.compile<{ updatedSince?: string }>({ +const rolesSyncQuerySchema = ajvQuery.compile<{ updatedSince?: string }>({ type: 'object', properties: { updatedSince: { type: 'string' } }, additionalProperties: false, diff --git a/apps/meteor/app/api/server/v1/rooms.ts b/apps/meteor/app/api/server/v1/rooms.ts index fe1593cc3e7c7..f4ed50a0a0c9e 100644 --- a/apps/meteor/app/api/server/v1/rooms.ts +++ b/apps/meteor/app/api/server/v1/rooms.ts @@ -5,6 +5,7 @@ import { Messages, Rooms, Users, Uploads, Subscriptions } from '@rocket.chat/mod import type { Notifications } from '@rocket.chat/rest-typings'; import { ajv, + ajvQuery, isGETRoomsNameExists, isRoomsImagesProps, isRoomsMuteUnmuteUserProps, @@ -1042,7 +1043,7 @@ export const roomEndpoints = API.v1 'rooms.roles', { authRequired: true, - query: ajv.compile<{ + query: ajvQuery.compile<{ rid: string; }>(isRoomGetRolesPropsSchema), response: { @@ -1089,7 +1090,7 @@ export const roomEndpoints = API.v1 { authRequired: true, permissionsRequired: ['view-room-administration'], - query: ajv.compile<{ + query: ajvQuery.compile<{ filter?: string; offset?: number; count?: number; diff --git a/apps/meteor/app/authorization/server/functions/upsertPermissions.ts b/apps/meteor/app/authorization/server/functions/upsertPermissions.ts index 21dac7808f00d..2b6d93f60d3cd 100644 --- a/apps/meteor/app/authorization/server/functions/upsertPermissions.ts +++ b/apps/meteor/app/authorization/server/functions/upsertPermissions.ts @@ -53,8 +53,9 @@ export const upsertPermissions = async (): Promise => { level: CONSTANTS.SETTINGS_LEVEL as 'settings' | undefined, // copy those setting-properties which are needed to properly publish the setting-based permissions settingId: setting._id, - group: setting.group, - section: setting.section ?? undefined, + // TODO: migrate settings with group and section with null to undefined + ...(setting.group && { group: setting.group }), + ...(setting.section && { section: setting.section }), sorter: setting.sorter, roles: [], }; diff --git a/apps/meteor/app/livechat/server/api/v1/integration.ts b/apps/meteor/app/livechat/server/api/v1/integration.ts index 5e91e19ae741b..3a9821a7a5b3d 100644 --- a/apps/meteor/app/livechat/server/api/v1/integration.ts +++ b/apps/meteor/app/livechat/server/api/v1/integration.ts @@ -26,9 +26,18 @@ API.v1.addRoute( } = this.bodyParams; const settingsIds = [ - typeof LivechatWebhookUrl !== 'undefined' && { _id: 'Livechat_webhookUrl', value: trim(LivechatWebhookUrl) }, - typeof LivechatSecretToken !== 'undefined' && { _id: 'Livechat_secret_token', value: trim(LivechatSecretToken) }, - typeof LivechatHttpTimeout !== 'undefined' && { _id: 'Livechat_http_timeout', value: LivechatHttpTimeout }, + typeof LivechatWebhookUrl !== 'undefined' && { + _id: 'Livechat_webhookUrl', + value: trim(String(LivechatWebhookUrl ?? '')), + }, + typeof LivechatSecretToken !== 'undefined' && { + _id: 'Livechat_secret_token', + value: trim(String(LivechatSecretToken ?? '')), + }, + typeof LivechatHttpTimeout !== 'undefined' && { + _id: 'Livechat_http_timeout', + value: Number(LivechatHttpTimeout ?? 0), + }, typeof LivechatWebhookOnStart !== 'undefined' && { _id: 'Livechat_webhook_on_start', value: !!LivechatWebhookOnStart }, typeof LivechatWebhookOnClose !== 'undefined' && { _id: 'Livechat_webhook_on_close', value: !!LivechatWebhookOnClose }, typeof LivechatWebhookOnChatTaken !== 'undefined' && { _id: 'Livechat_webhook_on_chat_taken', value: !!LivechatWebhookOnChatTaken }, diff --git a/apps/meteor/client/providers/AvatarUrlProvider.tsx b/apps/meteor/client/providers/AvatarUrlProvider.tsx index 85538a36b9ca0..1db5019afa242 100644 --- a/apps/meteor/client/providers/AvatarUrlProvider.tsx +++ b/apps/meteor/client/providers/AvatarUrlProvider.tsx @@ -11,9 +11,9 @@ type AvatarUrlProviderProps = { const AvatarUrlProvider = ({ children }: AvatarUrlProviderProps) => { const contextValue = useMemo(() => { - function getUserPathAvatar(username: string, etag?: string): string; - function getUserPathAvatar({ userId, etag }: { userId: string; etag?: string }): string; - function getUserPathAvatar({ username, etag }: { username: string; etag?: string }): string; + function getUserPathAvatar(username: string, etag?: string | null): string; + function getUserPathAvatar({ userId, etag }: { userId: string; etag?: string | null }): string; + function getUserPathAvatar({ username, etag }: { username: string; etag?: string | null }): string; function getUserPathAvatar(...args: any): string { if (typeof args[0] === 'string') { const [username, etag] = args; diff --git a/apps/meteor/client/views/banners/UiKitBanner.tsx b/apps/meteor/client/views/banners/UiKitBanner.tsx index 5fe6e951373f3..6a4ec0977f488 100644 --- a/apps/meteor/client/views/banners/UiKitBanner.tsx +++ b/apps/meteor/client/views/banners/UiKitBanner.tsx @@ -52,6 +52,10 @@ const UiKitBanner = ({ initialView }: UiKitBannerProps) => { }); }); + // TODO: check why we are not considering TextObject as title + if (view.title && typeof view.title !== 'string') { + return null; + } return ( diff --git a/apps/meteor/client/views/outlookCalendar/OutlookCalendarEventModal.tsx b/apps/meteor/client/views/outlookCalendar/OutlookCalendarEventModal.tsx index 350c6b595230c..bb6a5758deaa5 100644 --- a/apps/meteor/client/views/outlookCalendar/OutlookCalendarEventModal.tsx +++ b/apps/meteor/client/views/outlookCalendar/OutlookCalendarEventModal.tsx @@ -9,7 +9,7 @@ import { useOutlookOpenCall } from './hooks/useOutlookOpenCall'; type OutlookCalendarEventModalProps = ComponentProps & { id?: string; subject?: string; - meetingUrl?: string; + meetingUrl?: string | null; description?: string; }; diff --git a/apps/meteor/client/views/outlookCalendar/hooks/useOutlookOpenCall.ts b/apps/meteor/client/views/outlookCalendar/hooks/useOutlookOpenCall.ts index acde6ebfe63bc..85afe2ff55dd5 100644 --- a/apps/meteor/client/views/outlookCalendar/hooks/useOutlookOpenCall.ts +++ b/apps/meteor/client/views/outlookCalendar/hooks/useOutlookOpenCall.ts @@ -3,7 +3,7 @@ import { useUser } from '@rocket.chat/ui-contexts'; import { useVideoConfOpenCall } from '../../room/contextualBar/VideoConference/hooks/useVideoConfOpenCall'; -export const useOutlookOpenCall = (meetingUrl?: string) => { +export const useOutlookOpenCall = (meetingUrl?: string | null) => { const user = useUser(); const handleOpenCall = useVideoConfOpenCall(); const userDisplayName = useUserDisplayName({ name: user?.name, username: user?.username }); diff --git a/apps/meteor/client/views/room/contextualBar/VideoConference/VideoConfList/VideoConfListItem.tsx b/apps/meteor/client/views/room/contextualBar/VideoConference/VideoConfList/VideoConfListItem.tsx index a152755947684..ae5cfaaa40124 100644 --- a/apps/meteor/client/views/room/contextualBar/VideoConference/VideoConfList/VideoConfListItem.tsx +++ b/apps/meteor/client/views/room/contextualBar/VideoConference/VideoConfList/VideoConfListItem.tsx @@ -114,7 +114,7 @@ const VideoConfListItem = ({ data-tooltip={user.username} key={user.username} username={user.username} - etag={user.avatarETag} + etag={user.avatarETag ?? undefined} size='x28' /> ), diff --git a/apps/meteor/ee/server/api/abac/schemas.ts b/apps/meteor/ee/server/api/abac/schemas.ts index 0d679293fcc81..4d81610452a8e 100644 --- a/apps/meteor/ee/server/api/abac/schemas.ts +++ b/apps/meteor/ee/server/api/abac/schemas.ts @@ -1,6 +1,6 @@ import type { IAbacAttribute, IAbacAttributeDefinition, IAuditServerActor, IRoom, IServerEvents } from '@rocket.chat/core-typings'; import type { PaginatedResult, PaginatedRequest } from '@rocket.chat/rest-typings'; -import { ajv } from '@rocket.chat/rest-typings'; +import { ajv, ajvQuery } from '@rocket.chat/rest-typings'; const ATTRIBUTE_KEY_PATTERN = '^[A-Za-z0-9_-]+$'; const MAX_ROOM_ATTRIBUTE_VALUES = 10; @@ -64,7 +64,7 @@ const GetAbacAttributesQuery = { additionalProperties: false, }; -export const GETAbacAttributesQuerySchema = ajv.compile<{ key?: string; values?: string; offset: number; count?: number }>( +export const GETAbacAttributesQuerySchema = ajvQuery.compile<{ key?: string; values?: string; offset: number; count?: number }>( GetAbacAttributesQuery, ); @@ -182,7 +182,7 @@ const GetAbacAuditEventsQuerySchemaObject = { additionalProperties: false, }; -export const GETAbacAuditEventsQuerySchema = ajv.compile< +export const GETAbacAuditEventsQuerySchema = ajvQuery.compile< PaginatedRequest<{ start?: string; end?: string; @@ -355,7 +355,7 @@ const GETAbacRoomsListQuerySchema = { type GETAbacRoomsListQuery = PaginatedRequest<{ filter?: string; filterType?: 'all' | 'roomName' | 'attribute' | 'value' }>; -export const GETAbacRoomsListQueryValidator = ajv.compile(GETAbacRoomsListQuerySchema); +export const GETAbacRoomsListQueryValidator = ajvQuery.compile(GETAbacRoomsListQuerySchema); export const GETAbacRoomsResponseSchema = { type: 'object', diff --git a/apps/meteor/ee/server/api/audit.ts b/apps/meteor/ee/server/api/audit.ts index fbbbde91fff30..77d4ebf10cf7c 100644 --- a/apps/meteor/ee/server/api/audit.ts +++ b/apps/meteor/ee/server/api/audit.ts @@ -1,6 +1,6 @@ import type { IUser, IRoom } from '@rocket.chat/core-typings'; import { Rooms, AuditLog, ServerEvents } from '@rocket.chat/models'; -import { isServerEventsAuditSettingsProps, ajv } from '@rocket.chat/rest-typings'; +import { isServerEventsAuditSettingsProps, ajv, ajvQuery } from '@rocket.chat/rest-typings'; import type { PaginatedRequest, PaginatedResult } from '@rocket.chat/rest-typings'; import { convertSubObjectsIntoPaths } from '@rocket.chat/tools'; @@ -26,7 +26,7 @@ const auditRoomMembersSchema = { additionalProperties: false, }; -export const isAuditRoomMembersProps = ajv.compile(auditRoomMembersSchema); +export const isAuditRoomMembersProps = ajvQuery.compile(auditRoomMembersSchema); declare module '@rocket.chat/rest-typings' { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -154,11 +154,11 @@ API.v1.get( async function action() { const { start, end, settingId, actor } = this.queryParams; - if (start && isNaN(Date.parse(start as string))) { + if (start && isNaN(Date.parse(start))) { return API.v1.failure('The "start" query parameter must be a valid date.'); } - if (end && isNaN(Date.parse(end as string))) { + if (end && isNaN(Date.parse(end))) { return API.v1.failure('The "end" query parameter must be a valid date.'); } @@ -171,8 +171,8 @@ API.v1.get( ...(settingId && { 'data.key': 'id', 'data.value': settingId }), ...(actor && convertSubObjectsIntoPaths({ actor })), ts: { - $gte: start ? new Date(start as string) : new Date(0), - $lte: end ? new Date(end as string) : new Date(), + $gte: start ? new Date(start) : new Date(0), + $lte: end ? new Date(end) : new Date(), }, t: 'settings.changed', }, diff --git a/apps/meteor/ee/server/api/federation.ts b/apps/meteor/ee/server/api/federation.ts index 5a4939d428bbf..03b4d4c490432 100644 --- a/apps/meteor/ee/server/api/federation.ts +++ b/apps/meteor/ee/server/api/federation.ts @@ -1,7 +1,7 @@ import { FederationMatrix } from '@rocket.chat/core-services'; import { getFederationRoutes } from '@rocket.chat/federation-matrix'; import { Logger } from '@rocket.chat/logger'; -import { ajv } from '@rocket.chat/rest-typings'; +import { ajv, ajvQuery } from '@rocket.chat/rest-typings'; import type express from 'express'; import { WebApp } from 'meteor/webapp'; @@ -14,7 +14,7 @@ API.v1.get( '/federation/matrixIds.verify', { authRequired: true, - query: ajv.compile<{ + query: ajvQuery.compile<{ matrixIds: string[]; }>({ type: 'object', diff --git a/apps/meteor/ee/server/api/sessions.ts b/apps/meteor/ee/server/api/sessions.ts index 64e9531024255..5c091864f3d5d 100644 --- a/apps/meteor/ee/server/api/sessions.ts +++ b/apps/meteor/ee/server/api/sessions.ts @@ -3,7 +3,7 @@ import type { IUser, ISession, DeviceManagementSession, DeviceManagementPopulate import { License } from '@rocket.chat/license'; import { Users, Sessions } from '@rocket.chat/models'; import type { PaginatedResult, PaginatedRequest } from '@rocket.chat/rest-typings'; -import { ajv } from '@rocket.chat/rest-typings'; +import { ajv, ajvQuery } from '@rocket.chat/rest-typings'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import { API } from '../../../app/api/server/api'; @@ -28,7 +28,7 @@ type SessionsPaginateProps = PaginatedRequest<{ filter?: string; }>; -const isSessionsPaginateProps = ajv.compile({ +const isSessionsPaginateProps = ajvQuery.compile({ type: 'object', properties: { offset: { @@ -209,7 +209,7 @@ API.v1.addRoute( return API.v1.forbidden(); } - const sessionId = this.queryParams?.sessionId as string; + const sessionId = this.queryParams?.sessionId; const { sessions } = await Sessions.aggregateSessionsAndPopulate({ search: sessionId, count: 1 }); if (!sessions?.length) { return API.v1.notFound('Session not found'); diff --git a/apps/meteor/server/services/calendar/service.ts b/apps/meteor/server/services/calendar/service.ts index 58900e9187462..853ecab6c95a2 100644 --- a/apps/meteor/server/services/calendar/service.ts +++ b/apps/meteor/server/services/calendar/service.ts @@ -177,7 +177,7 @@ export class CalendarService extends ServiceClassInternal implements ICalendarSe private async getMeetingUrl(eventData: Partial): Promise { if (eventData.meetingUrl !== undefined) { - return eventData.meetingUrl; + return eventData.meetingUrl || undefined; } if (eventData.description !== undefined) { diff --git a/apps/meteor/tests/end-to-end/api/livechat/06-integrations.ts b/apps/meteor/tests/end-to-end/api/livechat/06-integrations.ts index 8fa932ff6c8a9..a036eb23046cc 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/06-integrations.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/06-integrations.ts @@ -281,8 +281,9 @@ describe('LIVECHAT - Integrations', () => { .send({ LivechatWebhookUrl: 8000, }) - .expect(200); - expect(response.body).to.have.property('success', true); + .expect('Content-Type', 'application/json') + .expect(400); + expect(response.body).to.have.property('success', false); }); it('should fail if a wrong setting is provided', async () => { const response = await request diff --git a/apps/meteor/tests/end-to-end/api/livechat/12-priorites.ts b/apps/meteor/tests/end-to-end/api/livechat/12-priorites.ts index 7d5a57da0f4af..1d0c42394ad6d 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/12-priorites.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/12-priorites.ts @@ -568,17 +568,6 @@ import { generateRandomSLAData } from '../../../e2e/utils/omnichannel/sla'; expect(response.body).to.have.property('error'); expect(response.body?.error).to.contain('invalid-params'); }); - it('should not fail to edit a priority with a PUT if using a boolean as name (it becomes a string)', async () => { - const response = await request - .put(api(`livechat/priorities/${priority._id}`)) - .set(credentials) - .send({ - name: false, - }) - .expect('Content-Type', 'application/json') - .expect(200); - expect(response.body).to.have.property('success', true); - }); it('should fail to update a non-existing priority', async () => { const response = await request .put(api('livechat/priorities/123')) diff --git a/apps/meteor/tests/end-to-end/api/subscriptions.ts b/apps/meteor/tests/end-to-end/api/subscriptions.ts index 7379e59606aab..76f6c86645da5 100644 --- a/apps/meteor/tests/end-to-end/api/subscriptions.ts +++ b/apps/meteor/tests/end-to-end/api/subscriptions.ts @@ -277,7 +277,7 @@ describe('[Subscriptions]', () => { .expect(400) .expect((res) => { expect(res.body).to.have.property('success', false); - expect(res.body).to.have.property('error', 'error-invalid-subscription'); + expect(res.body).to.have.property('errorType', 'invalid-params'); }) .end(done); }); diff --git a/docs/ajv-instances.md b/docs/ajv-instances.md new file mode 100644 index 0000000000000..b7c9bf0de95e8 --- /dev/null +++ b/docs/ajv-instances.md @@ -0,0 +1,137 @@ +# AJV instances: `ajv` and `ajvQuery` + +The `@rocket.chat/rest-typings` package uses two [AJV](https://ajv.js.org/) instances for JSON schema validation: **`ajv`** and **`ajvQuery`**. The choice between them depends on the **source of the data** being validated (request body vs query string). + +--- + +## Instance definitions + +Both are created in `packages/rest-typings/src/v1/Ajv.ts` with the same configuration except for one option: + +| Option | `ajv` | `ajvQuery` | +|-------------------|---------|------------| +| `coerceTypes` | `false` | `true` | +| `allowUnionTypes` | `true` | `true` | +| `code.source` | `true` | `true` | +| `discriminator` | `true` | `true` | + +In short: + +- **`ajv`**: does not change data types; values must already match the types expected by the schema. +- **`ajvQuery`**: attempts to **coerce** types when the schema expects `number`, `integer`, or `boolean` (e.g. the string `"50"` becomes the number `50`). + +Custom formats (`addFormats`) and keywords (e.g. `isNotEmpty`) are registered on both instances. + +--- + +## Why two instances? + +### Query params are always strings + +In HTTP requests, **query parameters** (everything after `?` in the URL) reach the server as **strings**. HTTP does not carry type information; the server receives, for example: + +- `?count=25` → `count` is the string `"25"` +- `?open=true` → `open` is the string `"true"` + +If the schema expects `count` as `number` or `open` as `boolean`, a validator that does **not** coerce will reject: + +- `"25"` is not of type `number` → error like "must be number" / "invalid-params". +- `"true"` is not of type `boolean` → validation error. + +### Body can already be typed + +For the **body** (JSON in POST/PUT/PATCH etc.), the client sends JSON. Parsing (e.g. `JSON.parse`) already yields numbers and booleans. In that case we do not want the validator to mutate values; we use the instance **without** coercion (`ajv`). + +--- + +## When to use each + +### Use `ajvQuery.compile` when: + +- The validator is used for **query parameters** (query string). +- **GET** routes (or any method that only reads query params). +- The schema has properties of type `number`, `integer`, or `boolean` that come from the URL. + +Examples of validators that should use `ajvQuery`: + +- Pagination: `count`, `offset` (typically numbers). +- Flags: `open`, `readThreads` (booleans). +- Any numeric or boolean parameter the client sends in the query string. + +```ts +// GET /v1/livechat/rooms?count=25&offset=0 +export const isGETLivechatRoomsParams = ajvQuery.compile(GETLivechatRoomsParamsSchema); +``` + +### Use `ajv.compile` when: + +- The validator is used for the request **body** (POST, PUT, PATCH, etc.). +- Data is already parsed JSON (numbers and booleans are already typed). + +Examples: + +- Create/update resources (JSON body). +- Response validators or internal structures that do not come from the query string. + +```ts +// POST /v1/livechat/room/close — JSON body +export const isPOSTLivechatRoomCloseParams = ajv.compile(...); +``` + +--- + +## Quick reference + +| Data source | Instance | Reason | +|--------------------------------|------------|--------| +| **Query string** (GET, query params) | `ajvQuery` | Query values are strings; `coerceTypes: true` converts to number/boolean when the schema expects it. | +| **Body** (JSON in POST/PUT/PATCH) | `ajv` | JSON already has types; strict validation without mutating values. | + +--- + +## Response schemas and `nullable` + +Response schemas also use `ajv` (coerceTypes: false). In **test mode**, the Router validates every response against its declared schema (`options.response[statusCode]`). If validation fails, the Router returns a **400** with `errorType: "error-invalid-body"` instead of the original response. + +With `coerceTypes: true` (old behavior), `null` values were silently coerced (e.g. `null` → `""` for strings). With `coerceTypes: false`, any field that can be `null` **must** declare `nullable: true` in the schema — otherwise the response validator rejects it. + +### Example + +A video conference user object may have `avatarETag: null`. The response schema must account for this: + +```ts +// WRONG — fails when avatarETag is null +{ type: 'string' } + +// CORRECT +{ type: 'string', nullable: true } +``` + +### `oneOf` / discriminator schemas + +Schemas using `oneOf` with strict enum discriminators (e.g. `type: { enum: ['direct'] }`) also become stricter without coercion. If the actual data has a `type` value not listed in any branch, the `oneOf` fails. Ensure all possible discriminator values are covered, or relax the items schema (e.g. `{ type: 'object' }`) when full type-level validation is not needed at runtime. + +--- + +## Common mistakes + +1. **Using `ajv` for query params** when the schema expects `number` or `boolean`: + - Client sends `?count=25`. + - Validator expects `number` but receives the string `"25"`. + - Result: "must be number" / "invalid-params" error. + +2. **Using `ajvQuery` for body**: + - Usually works, but coercion can hide incorrect types (e.g. string where a number was expected). For body, the standard is to use `ajv` and require the client to send the correct types in the JSON. + +3. **Response schemas with `null` fields** (test mode only): + - With `coerceTypes: false`, `null` is no longer coerced to `""` or `0`. + - Fields that can be `null` must use `nullable: true`. + - Symptom: tests get 400 with `errorType: "error-invalid-body"` even though the endpoint logic succeeds. + +--- + +## Where the instances are defined + +- **File:** `packages/rest-typings/src/v1/Ajv.ts` +- **Export:** `export { ajv, ajvQuery };` +- **Usage:** In each rest-typings module, import the appropriate instance and call `.compile(schema)` to obtain the validator used by the API routes. diff --git a/packages/apps-engine/src/definition/videoConferences/IVideoConference.ts b/packages/apps-engine/src/definition/videoConferences/IVideoConference.ts index c1c8d49708f68..f7278a838943e 100644 --- a/packages/apps-engine/src/definition/videoConferences/IVideoConference.ts +++ b/packages/apps-engine/src/definition/videoConferences/IVideoConference.ts @@ -2,7 +2,7 @@ import type { IVideoConferenceUser } from './IVideoConferenceUser'; export type VideoConferenceMember = IVideoConferenceUser & { ts: Date; - avatarETag?: string; + avatarETag?: string | null; }; export enum VideoConferenceStatus { diff --git a/packages/core-typings/src/ICalendarEvent.ts b/packages/core-typings/src/ICalendarEvent.ts index 5088f99cebfca..6d9e0fd08908d 100644 --- a/packages/core-typings/src/ICalendarEvent.ts +++ b/packages/core-typings/src/ICalendarEvent.ts @@ -11,8 +11,8 @@ export interface ICalendarEvent extends IRocketChatRecord { description: string; notificationSent: boolean; - externalId?: string; - meetingUrl?: string; + externalId?: string | null; + meetingUrl?: string | null; reminderMinutesBeforeStart?: number; reminderTime?: Date; diff --git a/packages/core-typings/src/IPermission.ts b/packages/core-typings/src/IPermission.ts index b53ef0c12b332..d2be3d75b60ea 100644 --- a/packages/core-typings/src/IPermission.ts +++ b/packages/core-typings/src/IPermission.ts @@ -2,10 +2,11 @@ export interface IPermission { _id: string; _updatedAt: Date; roles: string[]; - group?: string; + // TODO: migrate settings with group and section with null to undefined + group?: string | null; + section?: string | null; groupPermissionId?: string; level?: 'settings'; - section?: string; sectionPermissionId?: string; settingId?: string; sorter?: number; diff --git a/packages/core-typings/src/ISetting.ts b/packages/core-typings/src/ISetting.ts index fbc1b031bce66..495fd54ff625d 100644 --- a/packages/core-typings/src/ISetting.ts +++ b/packages/core-typings/src/ISetting.ts @@ -52,7 +52,8 @@ export interface ISettingBase extends IRocketChatRecord { | 'timespan'; public: boolean; env: boolean; - group?: string; + // TODO: migrate settings with group and section with null to undefined + group?: string | null; section?: string; tab?: string; i18nLabel: string; diff --git a/packages/core-typings/src/IVideoConference.ts b/packages/core-typings/src/IVideoConference.ts index 834d7196a65c6..34c68c0742046 100644 --- a/packages/core-typings/src/IVideoConference.ts +++ b/packages/core-typings/src/IVideoConference.ts @@ -52,7 +52,11 @@ export type LivechatInstructions = { export type VideoConferenceType = DirectCallInstructions['type'] | ConferenceInstructions['type'] | LivechatInstructions['type'] | 'voip'; -export interface IVideoConferenceUser extends Pick, '_id' | 'username' | 'name' | 'avatarETag'> { +type Nullable = { + [P in K]: T[P] | null; +} & Omit; + +export interface IVideoConferenceUser extends Nullable, '_id' | 'username' | 'name' | 'avatarETag'>, 'avatarETag'> { ts: Date; } diff --git a/packages/rest-typings/src/apps/appLogsExportProps.ts b/packages/rest-typings/src/apps/appLogsExportProps.ts index ff66255e4992b..f9388b384486c 100644 --- a/packages/rest-typings/src/apps/appLogsExportProps.ts +++ b/packages/rest-typings/src/apps/appLogsExportProps.ts @@ -1,5 +1,5 @@ import type { AppLogsProps } from './appLogsProps'; -import { ajv } from '../v1/Ajv'; +import { ajvQuery } from '../v1/Ajv'; export type AppLogsExportProps = Omit & { type: 'json' | 'csv'; @@ -21,4 +21,4 @@ const AppLogsExportPropsSchema = { additionalProperties: false, }; -export const isAppLogsExportProps = ajv.compile(AppLogsExportPropsSchema); +export const isAppLogsExportProps = ajvQuery.compile(AppLogsExportPropsSchema); diff --git a/packages/rest-typings/src/apps/appLogsProps.ts b/packages/rest-typings/src/apps/appLogsProps.ts index 83518f448a6c3..252474c81ff63 100644 --- a/packages/rest-typings/src/apps/appLogsProps.ts +++ b/packages/rest-typings/src/apps/appLogsProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../helpers/PaginatedRequest'; -import { ajv } from '../v1/Ajv'; +import { ajvQuery } from '../v1/Ajv'; export type AppLogsProps = PaginatedRequest<{ appId?: string; @@ -26,4 +26,4 @@ const AppLogsPropsSchema = { additionalProperties: false, }; -export const isAppLogsProps = ajv.compile(AppLogsPropsSchema); +export const isAppLogsProps = ajvQuery.compile(AppLogsPropsSchema); diff --git a/packages/rest-typings/src/v1/Ajv.ts b/packages/rest-typings/src/v1/Ajv.ts index 0c2def3db310f..4691f936fcbc2 100644 --- a/packages/rest-typings/src/v1/Ajv.ts +++ b/packages/rest-typings/src/v1/Ajv.ts @@ -2,6 +2,14 @@ import Ajv from 'ajv'; import addFormats from 'ajv-formats'; const ajv = new Ajv({ + coerceTypes: false, + allowUnionTypes: true, + code: { source: true }, + discriminator: true, +}); + +/** AJV instance for query param validation; coerces types (e.g. string "50" → number) for URL query strings. */ +const ajvQuery = new Ajv({ coerceTypes: true, allowUnionTypes: true, code: { source: true }, @@ -10,18 +18,29 @@ const ajv = new Ajv({ // TODO: keep ajv extension here addFormats(ajv); +addFormats(ajvQuery); ajv.addFormat('basic_email', /^[^@]+@[^@]+$/); ajv.addFormat( 'rfc_email', /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/, ); +ajvQuery.addFormat('basic_email', /^[^@]+@[^@]+$/); +ajvQuery.addFormat( + 'rfc_email', + /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/, +); ajv.addKeyword({ keyword: 'isNotEmpty', type: 'string', validate: (_schema: unknown, data: unknown): boolean => typeof data === 'string' && !!data.trim(), }); -export { ajv }; +ajvQuery.addKeyword({ + keyword: 'isNotEmpty', + type: 'string', + validate: (_schema: unknown, data: unknown): boolean => typeof data === 'string' && !!data.trim(), +}); +export { ajv, ajvQuery }; type BadRequestErrorResponse = { success: false; diff --git a/packages/rest-typings/src/v1/autotranslate/AutotranslateGetSupportedLanguagesParamsGET.ts b/packages/rest-typings/src/v1/autotranslate/AutotranslateGetSupportedLanguagesParamsGET.ts index 61fdd8c8a014d..f45700dd5923c 100644 --- a/packages/rest-typings/src/v1/autotranslate/AutotranslateGetSupportedLanguagesParamsGET.ts +++ b/packages/rest-typings/src/v1/autotranslate/AutotranslateGetSupportedLanguagesParamsGET.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type AutotranslateGetSupportedLanguagesParamsGET = { targetLanguage: string; @@ -15,6 +15,6 @@ const AutotranslateGetSupportedLanguagesParamsGETSchema = { additionalProperties: false, }; -export const isAutotranslateGetSupportedLanguagesParamsGET = ajv.compile( +export const isAutotranslateGetSupportedLanguagesParamsGET = ajvQuery.compile( AutotranslateGetSupportedLanguagesParamsGETSchema, ); diff --git a/packages/rest-typings/src/v1/banners.ts b/packages/rest-typings/src/v1/banners.ts index 5478ec5a14eb5..1adc64fe350f1 100644 --- a/packages/rest-typings/src/v1/banners.ts +++ b/packages/rest-typings/src/v1/banners.ts @@ -1,6 +1,6 @@ import type { BannerPlatform, IBanner } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; type BannersId = { platform: BannerPlatform; @@ -22,7 +22,7 @@ const BannersSchema = { additionalProperties: false, }; -export const isBannersProps = ajv.compile(BannersSchema); +export const isBannersProps = ajvQuery.compile(BannersSchema); type BannersDismiss = { bannerId: string; diff --git a/packages/rest-typings/src/v1/calendar/CalendarEventInfoProps.ts b/packages/rest-typings/src/v1/calendar/CalendarEventInfoProps.ts index cd19a29cf7cff..f8504d0b6ff69 100644 --- a/packages/rest-typings/src/v1/calendar/CalendarEventInfoProps.ts +++ b/packages/rest-typings/src/v1/calendar/CalendarEventInfoProps.ts @@ -1,6 +1,6 @@ import type { JSONSchemaType } from 'ajv'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type CalendarEventInfoProps = { id: string }; @@ -16,4 +16,4 @@ const calendarEventInfoPropsSchema: JSONSchemaType = { additionalProperties: false, }; -export const isCalendarEventInfoProps = ajv.compile(calendarEventInfoPropsSchema); +export const isCalendarEventInfoProps = ajvQuery.compile(calendarEventInfoPropsSchema); diff --git a/packages/rest-typings/src/v1/calendar/CalendarEventListProps.ts b/packages/rest-typings/src/v1/calendar/CalendarEventListProps.ts index f24cebe39f348..84de958b278e3 100644 --- a/packages/rest-typings/src/v1/calendar/CalendarEventListProps.ts +++ b/packages/rest-typings/src/v1/calendar/CalendarEventListProps.ts @@ -1,6 +1,6 @@ import type { JSONSchemaType } from 'ajv'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type CalendarEventListProps = { date: string }; @@ -16,4 +16,4 @@ const calendarEventListPropsSchema: JSONSchemaType = { additionalProperties: false, }; -export const isCalendarEventListProps = ajv.compile(calendarEventListPropsSchema); +export const isCalendarEventListProps = ajvQuery.compile(calendarEventListPropsSchema); diff --git a/packages/rest-typings/src/v1/channels/ChannelsFilesListProps.ts b/packages/rest-typings/src/v1/channels/ChannelsFilesListProps.ts index 62cd047d154ed..d1be50c661cf3 100644 --- a/packages/rest-typings/src/v1/channels/ChannelsFilesListProps.ts +++ b/packages/rest-typings/src/v1/channels/ChannelsFilesListProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ChannelsFilesListProps = PaginatedRequest< ({ roomId: string; roomName?: string } | { roomId?: string; roomName: string }) & { @@ -54,4 +54,4 @@ const channelsFilesListPropsSchema = { additionalProperties: false, }; -export const isChannelsFilesListProps = ajv.compile(channelsFilesListPropsSchema); +export const isChannelsFilesListProps = ajvQuery.compile(channelsFilesListPropsSchema); diff --git a/packages/rest-typings/src/v1/channels/ChannelsGetAllUserMentionsByChannelProps.ts b/packages/rest-typings/src/v1/channels/ChannelsGetAllUserMentionsByChannelProps.ts index 23413bd7786dc..0ea3b6d8a0b56 100644 --- a/packages/rest-typings/src/v1/channels/ChannelsGetAllUserMentionsByChannelProps.ts +++ b/packages/rest-typings/src/v1/channels/ChannelsGetAllUserMentionsByChannelProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ChannelsGetAllUserMentionsByChannelProps = PaginatedRequest<{ roomId: string }>; @@ -31,6 +31,6 @@ const channelsGetAllUserMentionsByChannelPropsSchema = { additionalProperties: false, }; -export const isChannelsGetAllUserMentionsByChannelProps = ajv.compile( +export const isChannelsGetAllUserMentionsByChannelProps = ajvQuery.compile( channelsGetAllUserMentionsByChannelPropsSchema, ); diff --git a/packages/rest-typings/src/v1/channels/ChannelsHistoryProps.ts b/packages/rest-typings/src/v1/channels/ChannelsHistoryProps.ts index c15d575d8c0e0..75d451125fb00 100644 --- a/packages/rest-typings/src/v1/channels/ChannelsHistoryProps.ts +++ b/packages/rest-typings/src/v1/channels/ChannelsHistoryProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ChannelsHistoryProps = PaginatedRequest< ({ roomId: string } | { roomName: string }) & { @@ -111,4 +111,4 @@ const channelsHistoryPropsSchema = { ], }; -export const isChannelsHistoryProps = ajv.compile(channelsHistoryPropsSchema); +export const isChannelsHistoryProps = ajvQuery.compile(channelsHistoryPropsSchema); diff --git a/packages/rest-typings/src/v1/channels/ChannelsListProps.ts b/packages/rest-typings/src/v1/channels/ChannelsListProps.ts index fbd793f55e674..5b2cbf8836c7c 100644 --- a/packages/rest-typings/src/v1/channels/ChannelsListProps.ts +++ b/packages/rest-typings/src/v1/channels/ChannelsListProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ChannelsListProps = PaginatedRequest<{ _id?: string }>; @@ -26,4 +26,4 @@ const channelsListPropsSchema = { additionalProperties: false, }; -export const isChannelsListProps = ajv.compile(channelsListPropsSchema); +export const isChannelsListProps = ajvQuery.compile(channelsListPropsSchema); diff --git a/packages/rest-typings/src/v1/channels/ChannelsMessagesProps.ts b/packages/rest-typings/src/v1/channels/ChannelsMessagesProps.ts index ceccb0afe7c19..f771a9a6eb24c 100644 --- a/packages/rest-typings/src/v1/channels/ChannelsMessagesProps.ts +++ b/packages/rest-typings/src/v1/channels/ChannelsMessagesProps.ts @@ -1,7 +1,7 @@ import type { IRoom } from '@rocket.chat/core-typings'; import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ChannelsMessagesProps = PaginatedRequest< { @@ -50,4 +50,4 @@ const channelsMessagesPropsSchema = { additionalProperties: false, }; -export const isChannelsMessagesProps = ajv.compile(channelsMessagesPropsSchema); +export const isChannelsMessagesProps = ajvQuery.compile(channelsMessagesPropsSchema); diff --git a/packages/rest-typings/src/v1/channels/ChannelsModeratorsProps.ts b/packages/rest-typings/src/v1/channels/ChannelsModeratorsProps.ts index d51f47ccf308f..66c620b14f74e 100644 --- a/packages/rest-typings/src/v1/channels/ChannelsModeratorsProps.ts +++ b/packages/rest-typings/src/v1/channels/ChannelsModeratorsProps.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ChannelsModeratorsProps = | { roomId: string; userId?: string; username?: string; user?: string } @@ -51,4 +51,4 @@ const channelsModeratorsPropsSchema = { ], }; -export const isChannelsModeratorsProps = ajv.compile(channelsModeratorsPropsSchema); +export const isChannelsModeratorsProps = ajvQuery.compile(channelsModeratorsPropsSchema); diff --git a/packages/rest-typings/src/v1/channels/ChannelsOnlineProps.ts b/packages/rest-typings/src/v1/channels/ChannelsOnlineProps.ts index ef5599cc83467..70964fe6fa5c1 100644 --- a/packages/rest-typings/src/v1/channels/ChannelsOnlineProps.ts +++ b/packages/rest-typings/src/v1/channels/ChannelsOnlineProps.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ChannelsOnlineProps = { _id?: string; query?: Record }; const channelsOnlyPropsSchema = { @@ -16,4 +16,4 @@ const channelsOnlyPropsSchema = { required: [], additionalProperties: false, }; -export const isChannelsOnlineProps = ajv.compile(channelsOnlyPropsSchema); +export const isChannelsOnlineProps = ajvQuery.compile(channelsOnlyPropsSchema); diff --git a/packages/rest-typings/src/v1/channels/ChannelsRolesProps.ts b/packages/rest-typings/src/v1/channels/ChannelsRolesProps.ts index b81f18a5865a7..6abb585cce534 100644 --- a/packages/rest-typings/src/v1/channels/ChannelsRolesProps.ts +++ b/packages/rest-typings/src/v1/channels/ChannelsRolesProps.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ChannelsRolesProps = { roomId: string } | { roomName: string }; const channelsRolesPropsSchema = { @@ -26,4 +26,4 @@ const channelsRolesPropsSchema = { ], }; -export const isChannelsRolesProps = ajv.compile(channelsRolesPropsSchema); +export const isChannelsRolesProps = ajvQuery.compile(channelsRolesPropsSchema); diff --git a/packages/rest-typings/src/v1/chat.ts b/packages/rest-typings/src/v1/chat.ts index b52bba2d61ed5..f3a6e61f677b0 100644 --- a/packages/rest-typings/src/v1/chat.ts +++ b/packages/rest-typings/src/v1/chat.ts @@ -1,6 +1,6 @@ import type { IMessage, IRoom, MessageAttachment, IReadReceiptWithUser, MessageUrl, IThreadMainMessage } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; import type { PaginatedRequest } from '../helpers/PaginatedRequest'; type ChatSendMessage = { @@ -123,7 +123,7 @@ const ChatGetDiscussionsSchema = { additionalProperties: false, }; -export const isChatGetDiscussionsProps = ajv.compile(ChatGetDiscussionsSchema); +export const isChatGetDiscussionsProps = ajvQuery.compile(ChatGetDiscussionsSchema); type ChatReportMessage = { messageId: IMessage['_id']; @@ -193,7 +193,7 @@ const ChatGetThreadsListSchema = { additionalProperties: false, }; -export const isChatGetThreadsListProps = ajv.compile(ChatGetThreadsListSchema); +export const isChatGetThreadsListProps = ajvQuery.compile(ChatGetThreadsListSchema); type ChatSyncThreadsList = { rid: IRoom['_id']; @@ -350,7 +350,7 @@ const ChatSearchSchema = { additionalProperties: false, }; -export const isChatSearchProps = ajv.compile(ChatSearchSchema); +export const isChatSearchProps = ajvQuery.compile(ChatSearchSchema); interface IChatUpdate { roomId: IRoom['_id']; @@ -527,7 +527,7 @@ const GetStarredMessagesSchema = { additionalProperties: false, }; -export const isChatGetStarredMessagesProps = ajv.compile(GetStarredMessagesSchema); +export const isChatGetStarredMessagesProps = ajvQuery.compile(GetStarredMessagesSchema); type GetPinnedMessages = { roomId: IRoom['_id']; @@ -560,7 +560,7 @@ const GetPinnedMessagesSchema = { additionalProperties: false, }; -export const isChatGetPinnedMessagesProps = ajv.compile(GetPinnedMessagesSchema); +export const isChatGetPinnedMessagesProps = ajvQuery.compile(GetPinnedMessagesSchema); type GetMentionedMessages = { roomId: IRoom['_id']; @@ -593,7 +593,7 @@ const GetMentionedMessagesSchema = { additionalProperties: false, }; -export const isChatGetMentionedMessagesProps = ajv.compile(GetMentionedMessagesSchema); +export const isChatGetMentionedMessagesProps = ajvQuery.compile(GetMentionedMessagesSchema); type ChatSyncMessages = { roomId: IRoom['_id']; @@ -636,7 +636,7 @@ const ChatSyncMessagesSchema = { additionalProperties: false, }; -export const isChatSyncMessagesProps = ajv.compile(ChatSyncMessagesSchema); +export const isChatSyncMessagesProps = ajvQuery.compile(ChatSyncMessagesSchema); type ChatSyncThreadMessages = PaginatedRequest<{ tmid: string; @@ -671,7 +671,7 @@ const ChatSyncThreadMessagesSchema = { additionalProperties: false, }; -export const isChatSyncThreadMessagesProps = ajv.compile(ChatSyncThreadMessagesSchema); +export const isChatSyncThreadMessagesProps = ajvQuery.compile(ChatSyncThreadMessagesSchema); type ChatGetThreadMessages = PaginatedRequest<{ tmid: string; @@ -701,7 +701,7 @@ const ChatGetThreadMessagesSchema = { additionalProperties: false, }; -export const isChatGetThreadMessagesProps = ajv.compile(ChatGetThreadMessagesSchema); +export const isChatGetThreadMessagesProps = ajvQuery.compile(ChatGetThreadMessagesSchema); type ChatGetDeletedMessages = PaginatedRequest<{ roomId: IRoom['_id']; @@ -737,7 +737,7 @@ const ChatGetDeletedMessagesSchema = { additionalProperties: false, }; -export const isChatGetDeletedMessagesProps = ajv.compile(ChatGetDeletedMessagesSchema); +export const isChatGetDeletedMessagesProps = ajvQuery.compile(ChatGetDeletedMessagesSchema); type ChatPostMessage = | { diff --git a/packages/rest-typings/src/v1/cloud.ts b/packages/rest-typings/src/v1/cloud.ts index 7ecb2411405c1..435beb8739e3c 100644 --- a/packages/rest-typings/src/v1/cloud.ts +++ b/packages/rest-typings/src/v1/cloud.ts @@ -1,6 +1,6 @@ import type { CloudRegistrationIntentData, CloudConfirmationPollData, CloudRegistrationStatus } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; type CloudManualRegister = { cloudBlob: string; @@ -57,7 +57,7 @@ const CloudConfirmationPollSchema = { additionalProperties: false, }; -export const isCloudConfirmationPollProps = ajv.compile(CloudConfirmationPollSchema); +export const isCloudConfirmationPollProps = ajvQuery.compile(CloudConfirmationPollSchema); export type CloudEndpoints = { '/v1/cloud.manualRegister': { diff --git a/packages/rest-typings/src/v1/customSounds.ts b/packages/rest-typings/src/v1/customSounds.ts index 759d995b6620f..1b15644723a84 100644 --- a/packages/rest-typings/src/v1/customSounds.ts +++ b/packages/rest-typings/src/v1/customSounds.ts @@ -1,6 +1,6 @@ import type { ICustomSound } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajvQuery } from './Ajv'; import { type PaginatedRequest } from '../helpers/PaginatedRequest'; type CustomSoundsGetOne = { _id: ICustomSound['_id'] }; @@ -17,7 +17,7 @@ const CustomSoundsGetOneSchema = { additionalProperties: false, }; -export const isCustomSoundsGetOneProps = ajv.compile(CustomSoundsGetOneSchema); +export const isCustomSoundsGetOneProps = ajvQuery.compile(CustomSoundsGetOneSchema); type CustomSoundsList = PaginatedRequest<{ name?: string }>; @@ -49,4 +49,4 @@ const CustomSoundsListSchema = { additionalProperties: false, }; -export const isCustomSoundsListProps = ajv.compile(CustomSoundsListSchema); +export const isCustomSoundsListProps = ajvQuery.compile(CustomSoundsListSchema); diff --git a/packages/rest-typings/src/v1/dm/DmFileProps.ts b/packages/rest-typings/src/v1/dm/DmFileProps.ts index a6a86c99cb5b2..076783c90421e 100644 --- a/packages/rest-typings/src/v1/dm/DmFileProps.ts +++ b/packages/rest-typings/src/v1/dm/DmFileProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type DmFileProps = PaginatedRequest< ({ roomId: string; username?: string } | { roomId?: string; username: string }) & { @@ -54,4 +54,4 @@ const dmFilesListPropsSchema = { additionalProperties: false, }; -export const isDmFileProps = ajv.compile(dmFilesListPropsSchema); +export const isDmFileProps = ajvQuery.compile(dmFilesListPropsSchema); diff --git a/packages/rest-typings/src/v1/dm/DmHistoryProps.ts b/packages/rest-typings/src/v1/dm/DmHistoryProps.ts index 9a745a06deb76..e48a74e7b00a1 100644 --- a/packages/rest-typings/src/v1/dm/DmHistoryProps.ts +++ b/packages/rest-typings/src/v1/dm/DmHistoryProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type DmHistoryProps = PaginatedRequest<{ roomId: string; @@ -51,4 +51,4 @@ const DmHistoryPropsSchema = { additionalProperties: false, }; -export const isDmHistoryProps = ajv.compile(DmHistoryPropsSchema); +export const isDmHistoryProps = ajvQuery.compile(DmHistoryPropsSchema); diff --git a/packages/rest-typings/src/v1/dm/DmMembersProps.ts b/packages/rest-typings/src/v1/dm/DmMembersProps.ts index 9cebf3fa7b1d1..c06ddc028dbd9 100644 --- a/packages/rest-typings/src/v1/dm/DmMembersProps.ts +++ b/packages/rest-typings/src/v1/dm/DmMembersProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type DmMemberProps = PaginatedRequest< ( @@ -15,7 +15,7 @@ export type DmMemberProps = PaginatedRequest< } >; -export const isDmMemberProps = ajv.compile({ +export const isDmMemberProps = ajvQuery.compile({ oneOf: [ { type: 'object', diff --git a/packages/rest-typings/src/v1/dm/DmMessagesProps.ts b/packages/rest-typings/src/v1/dm/DmMessagesProps.ts index a829c88ac8722..cc9ec44ca9835 100644 --- a/packages/rest-typings/src/v1/dm/DmMessagesProps.ts +++ b/packages/rest-typings/src/v1/dm/DmMessagesProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type DmMessagesProps = PaginatedRequest< ({ roomId: string } | { username: string }) & { @@ -11,7 +11,7 @@ export type DmMessagesProps = PaginatedRequest< } >; -export const isDmMessagesProps = ajv.compile({ +export const isDmMessagesProps = ajvQuery.compile({ oneOf: [ { type: 'object', diff --git a/packages/rest-typings/src/v1/email-inbox.ts b/packages/rest-typings/src/v1/email-inbox.ts index 52c60ed378b65..48ac0869d23a9 100644 --- a/packages/rest-typings/src/v1/email-inbox.ts +++ b/packages/rest-typings/src/v1/email-inbox.ts @@ -1,6 +1,6 @@ import type { IEmailInbox } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; import type { PaginatedRequest } from '../helpers/PaginatedRequest'; import type { PaginatedResult } from '../helpers/PaginatedResult'; @@ -30,7 +30,7 @@ const EmailInboxListPropsSchema = { additionalProperties: false, }; -export const isEmailInboxList = ajv.compile(EmailInboxListPropsSchema); +export const isEmailInboxList = ajvQuery.compile(EmailInboxListPropsSchema); type EmailInboxProps = { _id?: string; @@ -154,7 +154,7 @@ const EmailInboxSearchPropsSchema = { additionalProperties: false, }; -export const isEmailInboxSearch = ajv.compile(EmailInboxSearchPropsSchema); +export const isEmailInboxSearch = ajvQuery.compile(EmailInboxSearchPropsSchema); export type EmailInboxEndpoints = { '/v1/email-inbox.list': { diff --git a/packages/rest-typings/src/v1/emojiCustom.ts b/packages/rest-typings/src/v1/emojiCustom.ts index 923af25859d26..84a56c45a81be 100644 --- a/packages/rest-typings/src/v1/emojiCustom.ts +++ b/packages/rest-typings/src/v1/emojiCustom.ts @@ -1,6 +1,6 @@ import type { ICustomEmojiDescriptor, IEmojiCustom } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; import type { PaginatedRequest } from '../helpers/PaginatedRequest'; import type { PaginatedResult } from '../helpers/PaginatedResult'; @@ -44,7 +44,7 @@ const emojiCustomListSchema = { additionalProperties: false, }; -export const isEmojiCustomList = ajv.compile(emojiCustomListSchema); +export const isEmojiCustomList = ajvQuery.compile(emojiCustomListSchema); export type EmojiCustomEndpoints = { '/v1/emoji-custom.all': { diff --git a/packages/rest-typings/src/v1/groups/GroupsFilesProps.ts b/packages/rest-typings/src/v1/groups/GroupsFilesProps.ts index 29ca73b548acb..9448c0c987fcb 100644 --- a/packages/rest-typings/src/v1/groups/GroupsFilesProps.ts +++ b/packages/rest-typings/src/v1/groups/GroupsFilesProps.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; import type { GroupsBaseProps } from './BaseProps'; import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; @@ -52,4 +52,4 @@ const GroupsFilesPropsSchema = { additionalProperties: true, // keep additional properties for backwards compatibility, otherwise this would be a breaking change }; -export const isGroupsFilesProps = ajv.compile(GroupsFilesPropsSchema); +export const isGroupsFilesProps = ajvQuery.compile(GroupsFilesPropsSchema); diff --git a/packages/rest-typings/src/v1/groups/GroupsMessagesProps.ts b/packages/rest-typings/src/v1/groups/GroupsMessagesProps.ts index b82a3db1347ca..7a489e29069f5 100644 --- a/packages/rest-typings/src/v1/groups/GroupsMessagesProps.ts +++ b/packages/rest-typings/src/v1/groups/GroupsMessagesProps.ts @@ -1,6 +1,6 @@ import type { IRoom } from '@rocket.chat/core-typings'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; import { withGroupBaseProperties } from './BaseProps'; import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; @@ -47,4 +47,4 @@ const GroupsMessagesPropsSchema = withGroupBaseProperties({ }, }); -export const isGroupsMessagesProps = ajv.compile(GroupsMessagesPropsSchema); +export const isGroupsMessagesProps = ajvQuery.compile(GroupsMessagesPropsSchema); diff --git a/packages/rest-typings/src/v1/groups/GroupsOnlineProps.ts b/packages/rest-typings/src/v1/groups/GroupsOnlineProps.ts index 7a47afdc606f7..769ce8a628489 100644 --- a/packages/rest-typings/src/v1/groups/GroupsOnlineProps.ts +++ b/packages/rest-typings/src/v1/groups/GroupsOnlineProps.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type GroupsOnlineProps = { _id?: string; query?: Record }; @@ -18,4 +18,4 @@ const groupsOnlinePropsSchema = { additionalProperties: false, }; -export const isGroupsOnlineProps = ajv.compile(groupsOnlinePropsSchema); +export const isGroupsOnlineProps = ajvQuery.compile(groupsOnlinePropsSchema); diff --git a/packages/rest-typings/src/v1/import/GetCurrentImportOperationParamsGET.ts b/packages/rest-typings/src/v1/import/GetCurrentImportOperationParamsGET.ts index 1e83cb88cafff..4d58fa654053e 100644 --- a/packages/rest-typings/src/v1/import/GetCurrentImportOperationParamsGET.ts +++ b/packages/rest-typings/src/v1/import/GetCurrentImportOperationParamsGET.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type GetCurrentImportOperationParamsGET = Record; @@ -9,6 +9,6 @@ const GetCurrentImportOperationParamsGETSchema = { required: [], }; -export const isGetCurrentImportOperationParamsGET = ajv.compile( +export const isGetCurrentImportOperationParamsGET = ajvQuery.compile( GetCurrentImportOperationParamsGETSchema, ); diff --git a/packages/rest-typings/src/v1/import/GetImportFileDataParamsGET.ts b/packages/rest-typings/src/v1/import/GetImportFileDataParamsGET.ts index 5498dd128f4b0..71487e705b4a1 100644 --- a/packages/rest-typings/src/v1/import/GetImportFileDataParamsGET.ts +++ b/packages/rest-typings/src/v1/import/GetImportFileDataParamsGET.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type GetImportFileDataParamsGET = Record; @@ -9,4 +9,4 @@ const GetImportFileDataParamsGETSchema = { required: [], }; -export const isGetImportFileDataParamsGET = ajv.compile(GetImportFileDataParamsGETSchema); +export const isGetImportFileDataParamsGET = ajvQuery.compile(GetImportFileDataParamsGETSchema); diff --git a/packages/rest-typings/src/v1/import/GetImportProgressParamsGET.ts b/packages/rest-typings/src/v1/import/GetImportProgressParamsGET.ts index 4236dc4b61a29..e07764242e31b 100644 --- a/packages/rest-typings/src/v1/import/GetImportProgressParamsGET.ts +++ b/packages/rest-typings/src/v1/import/GetImportProgressParamsGET.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type GetImportProgressParamsGET = Record; @@ -9,4 +9,4 @@ const GetImportProgressParamsGETSchema = { required: [], }; -export const isGetImportProgressParamsGET = ajv.compile(GetImportProgressParamsGETSchema); +export const isGetImportProgressParamsGET = ajvQuery.compile(GetImportProgressParamsGETSchema); diff --git a/packages/rest-typings/src/v1/import/GetLatestImportOperationsParamsGET.ts b/packages/rest-typings/src/v1/import/GetLatestImportOperationsParamsGET.ts index e561f17cc6784..fa4170217134d 100644 --- a/packages/rest-typings/src/v1/import/GetLatestImportOperationsParamsGET.ts +++ b/packages/rest-typings/src/v1/import/GetLatestImportOperationsParamsGET.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type GetLatestImportOperationsParamsGET = Record; @@ -9,6 +9,6 @@ const GetLatestImportOperationsParamsGETSchema = { required: [], }; -export const isGetLatestImportOperationsParamsGET = ajv.compile( +export const isGetLatestImportOperationsParamsGET = ajvQuery.compile( GetLatestImportOperationsParamsGETSchema, ); diff --git a/packages/rest-typings/src/v1/import/ImportersListParamsGET.ts b/packages/rest-typings/src/v1/import/ImportersListParamsGET.ts index acb082f609931..41892f8a482cf 100644 --- a/packages/rest-typings/src/v1/import/ImportersListParamsGET.ts +++ b/packages/rest-typings/src/v1/import/ImportersListParamsGET.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ImportersListParamsGET = Record; @@ -9,4 +9,4 @@ const ImportersListParamsGETSchema = { required: [], }; -export const isImportersListParamsGET = ajv.compile(ImportersListParamsGETSchema); +export const isImportersListParamsGET = ajvQuery.compile(ImportersListParamsGETSchema); diff --git a/packages/rest-typings/src/v1/integrations/IntegrationsGetProps.ts b/packages/rest-typings/src/v1/integrations/IntegrationsGetProps.ts index 1a593bc1c3773..1542dec4d041f 100644 --- a/packages/rest-typings/src/v1/integrations/IntegrationsGetProps.ts +++ b/packages/rest-typings/src/v1/integrations/IntegrationsGetProps.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type IntegrationsGetProps = { integrationId: string; createdBy?: string }; @@ -17,4 +17,4 @@ const integrationsGetSchema = { required: ['integrationId'], }; -export const isIntegrationsGetProps = ajv.compile(integrationsGetSchema); +export const isIntegrationsGetProps = ajvQuery.compile(integrationsGetSchema); diff --git a/packages/rest-typings/src/v1/integrations/IntegrationsHistoryProps.ts b/packages/rest-typings/src/v1/integrations/IntegrationsHistoryProps.ts index 222d10481d92c..517116de0e147 100644 --- a/packages/rest-typings/src/v1/integrations/IntegrationsHistoryProps.ts +++ b/packages/rest-typings/src/v1/integrations/IntegrationsHistoryProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type IntegrationsHistoryProps = PaginatedRequest<{ id: string }>; @@ -16,4 +16,4 @@ const integrationsHistorySchema = { additionalProperties: false, }; -export const isIntegrationsHistoryProps = ajv.compile(integrationsHistorySchema); +export const isIntegrationsHistoryProps = ajvQuery.compile(integrationsHistorySchema); diff --git a/packages/rest-typings/src/v1/integrations/IntegrationsListProps.ts b/packages/rest-typings/src/v1/integrations/IntegrationsListProps.ts index d4c0728c580ee..bbaf788f4520b 100644 --- a/packages/rest-typings/src/v1/integrations/IntegrationsListProps.ts +++ b/packages/rest-typings/src/v1/integrations/IntegrationsListProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type IntegrationsListProps = PaginatedRequest<{ name?: string; type?: string; query?: string }>; @@ -35,4 +35,4 @@ const integrationsListSchema = { additionalProperties: false, }; -export const isIntegrationsListProps = ajv.compile(integrationsListSchema); +export const isIntegrationsListProps = ajvQuery.compile(integrationsListSchema); diff --git a/packages/rest-typings/src/v1/licenses.ts b/packages/rest-typings/src/v1/licenses.ts index 8bfdca27e6ac3..cca1168a8874d 100644 --- a/packages/rest-typings/src/v1/licenses.ts +++ b/packages/rest-typings/src/v1/licenses.ts @@ -1,6 +1,6 @@ import type { LicenseInfo, Cloud } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; type licensesAddProps = { license: string; @@ -34,7 +34,7 @@ const licensesInfoPropsSchema = { additionalProperties: false, }; -export const isLicensesInfoProps = ajv.compile(licensesInfoPropsSchema); +export const isLicensesInfoProps = ajvQuery.compile(licensesInfoPropsSchema); export type LicensesEndpoints = { '/v1/licenses.info': { diff --git a/packages/rest-typings/src/v1/misc.ts b/packages/rest-typings/src/v1/misc.ts index 1fb5af84175e4..5df161c0e1c33 100644 --- a/packages/rest-typings/src/v1/misc.ts +++ b/packages/rest-typings/src/v1/misc.ts @@ -1,6 +1,6 @@ import type { IRoom, IUser } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; import type { PaginatedRequest } from '../helpers/PaginatedRequest'; type ShieldSvg = { @@ -51,7 +51,7 @@ const SpotlightSchema = { additionalProperties: false, }; -export const isSpotlightProps = ajv.compile(SpotlightSchema); +export const isSpotlightProps = ajvQuery.compile(SpotlightSchema); type Directory = PaginatedRequest<{ text: string; @@ -95,7 +95,7 @@ const DirectorySchema = { additionalProperties: false, }; -export const isDirectoryProps = ajv.compile(DirectorySchema); +export const isDirectoryProps = ajvQuery.compile(DirectorySchema); type MethodCall = { method: string; params: unknown[]; id: string; msg: 'string' }; @@ -185,7 +185,7 @@ export type MiscEndpoints = { '/v1/spotlight': { GET: (params: Spotlight) => { - users: Pick, 'name' | 'status' | 'statusText' | 'avatarETag' | '_id' | 'username'>[]; + users: (Pick, 'name' | 'status' | '_id' | 'username'> & Partial>)[]; rooms: Pick, 't' | 'name' | 'lastMessage' | '_id'>[]; }; }; diff --git a/packages/rest-typings/src/v1/moderation/GetUserReportsParams.ts b/packages/rest-typings/src/v1/moderation/GetUserReportsParams.ts index a15dae65e19c5..f9bccddb193be 100644 --- a/packages/rest-typings/src/v1/moderation/GetUserReportsParams.ts +++ b/packages/rest-typings/src/v1/moderation/GetUserReportsParams.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; type GetUserReportsParams = { userId: string; @@ -37,4 +37,4 @@ const ajvParams = { additionalProperties: false, }; -export const isGetUserReportsParams = ajv.compile(ajvParams); +export const isGetUserReportsParams = ajvQuery.compile(ajvParams); diff --git a/packages/rest-typings/src/v1/moderation/ReportHistoryProps.ts b/packages/rest-typings/src/v1/moderation/ReportHistoryProps.ts index 48b859a7899b9..b328e8cf2cee8 100644 --- a/packages/rest-typings/src/v1/moderation/ReportHistoryProps.ts +++ b/packages/rest-typings/src/v1/moderation/ReportHistoryProps.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; type ReportHistoryProps = { latest?: string; @@ -42,4 +42,4 @@ const reportHistoryPropsSchema = { additionalProperties: false, }; -export const isReportHistoryProps = ajv.compile(reportHistoryPropsSchema); +export const isReportHistoryProps = ajvQuery.compile(reportHistoryPropsSchema); diff --git a/packages/rest-typings/src/v1/moderation/ReportInfoParams.ts b/packages/rest-typings/src/v1/moderation/ReportInfoParams.ts index 0c1d59403ccc8..f1c7c965da4f1 100644 --- a/packages/rest-typings/src/v1/moderation/ReportInfoParams.ts +++ b/packages/rest-typings/src/v1/moderation/ReportInfoParams.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ReportInfoParams = { reportId: string; @@ -17,4 +17,4 @@ const ajvParams = { additionalProperties: false, }; -export const isReportInfoParams = ajv.compile(ajvParams); +export const isReportInfoParams = ajvQuery.compile(ajvParams); diff --git a/packages/rest-typings/src/v1/moderation/ReportsByMsgIdParams.ts b/packages/rest-typings/src/v1/moderation/ReportsByMsgIdParams.ts index fee9e54c6f920..70b476230557b 100644 --- a/packages/rest-typings/src/v1/moderation/ReportsByMsgIdParams.ts +++ b/packages/rest-typings/src/v1/moderation/ReportsByMsgIdParams.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; type ReportsByMsgIdParams = { msgId: string; @@ -35,4 +35,4 @@ const schema = { additionalProperties: false, }; -export const isReportsByMsgIdParams = ajv.compile(schema); +export const isReportsByMsgIdParams = ajvQuery.compile(schema); diff --git a/packages/rest-typings/src/v1/omnichannel.ts b/packages/rest-typings/src/v1/omnichannel.ts index d42354fd0e332..fe5988d3583c1 100644 --- a/packages/rest-typings/src/v1/omnichannel.ts +++ b/packages/rest-typings/src/v1/omnichannel.ts @@ -36,7 +36,7 @@ import type { import { ILivechatAgentStatus } from '@rocket.chat/core-typings'; import type { WithId } from 'mongodb'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; import type { PaginatedRequest } from '../helpers/PaginatedRequest'; import type { PaginatedResult } from '../helpers/PaginatedResult'; @@ -57,7 +57,7 @@ const LivechatVisitorsInfoSchema = { additionalProperties: false, }; -export const isLivechatVisitorsInfoProps = ajv.compile(LivechatVisitorsInfoSchema); +export const isLivechatVisitorsInfoProps = ajvQuery.compile(LivechatVisitorsInfoSchema); type LivechatRoomOnHold = { roomId: IRoom['_id']; @@ -160,7 +160,7 @@ const LivechatDepartmentDepartmentIdAgentsGETSchema = { additionalProperties: false, }; -export const isLivechatDepartmentDepartmentIdAgentsGETProps = ajv.compile( +export const isLivechatDepartmentDepartmentIdAgentsGETProps = ajvQuery.compile( LivechatDepartmentDepartmentIdAgentsGETSchema, ); @@ -248,7 +248,7 @@ const LivechatVisitorTokenGetSchema = { additionalProperties: false, }; -export const isLivechatVisitorTokenGetProps = ajv.compile(LivechatVisitorTokenGetSchema); +export const isLivechatVisitorTokenGetProps = ajvQuery.compile(LivechatVisitorTokenGetSchema); type LivechatVisitorTokenDelete = { token: string; @@ -481,7 +481,7 @@ const LivechatMonitorsListSchema = { additionalProperties: false, }; -export const isLivechatMonitorsListProps = ajv.compile(LivechatMonitorsListSchema); +export const isLivechatMonitorsListProps = ajvQuery.compile(LivechatMonitorsListSchema); type POSTLivechatMonitorCreateRequest = { username: string; @@ -687,7 +687,7 @@ const LivechatTagsListSchema = { additionalProperties: false, }; -export const isLivechatTagsListProps = ajv.compile(LivechatTagsListSchema); +export const isLivechatTagsListProps = ajvQuery.compile(LivechatTagsListSchema); type LivechatDepartmentProps = PaginatedRequest<{ text?: string; @@ -741,7 +741,7 @@ const LivechatDepartmentSchema = { additionalProperties: false, }; -export const isGETLivechatDepartmentProps = ajv.compile(LivechatDepartmentSchema); +export const isGETLivechatDepartmentProps = ajvQuery.compile(LivechatDepartmentSchema); type POSTLivechatDepartmentProps = { department: LivechatDepartmentDTO; @@ -888,7 +888,7 @@ const LivechatDepartmentsAvailableByUnitIdSchema = { additionalProperties: false, }; -export const isLivechatDepartmentsAvailableByUnitIdProps = ajv.compile( +export const isLivechatDepartmentsAvailableByUnitIdProps = ajvQuery.compile( LivechatDepartmentsAvailableByUnitIdSchema, ); @@ -921,7 +921,7 @@ const LivechatDepartmentsByUnitSchema = { additionalProperties: false, }; -export const isLivechatDepartmentsByUnitProps = ajv.compile(LivechatDepartmentsByUnitSchema); +export const isLivechatDepartmentsByUnitProps = ajvQuery.compile(LivechatDepartmentsByUnitSchema); type LivechatDepartmentsByUnitIdProps = PaginatedRequest; @@ -949,7 +949,7 @@ const LivechatDepartmentsByUnitIdSchema = { additionalProperties: false, }; -export const isLivechatDepartmentsByUnitIdProps = ajv.compile(LivechatDepartmentsByUnitIdSchema); +export const isLivechatDepartmentsByUnitIdProps = ajvQuery.compile(LivechatDepartmentsByUnitIdSchema); type LivechatUsersManagerGETProps = PaginatedRequest<{ text?: string; @@ -1003,7 +1003,7 @@ const LivechatUsersManagerGETSchema = { additionalProperties: false, }; -export const isLivechatUsersManagerGETProps = ajv.compile(LivechatUsersManagerGETSchema); +export const isLivechatUsersManagerGETProps = ajvQuery.compile(LivechatUsersManagerGETSchema); type LivechatUsersManagerPOSTProps = PaginatedRequest<{ username: string }>; @@ -1074,7 +1074,7 @@ const LivechatQueuePropsSchema = { additionalProperties: false, }; -export const isLivechatQueueProps = ajv.compile(LivechatQueuePropsSchema); +export const isLivechatQueueProps = ajvQuery.compile(LivechatQueuePropsSchema); type CannedResponsesProps = PaginatedRequest<{ scope?: string; @@ -1131,7 +1131,7 @@ const CannedResponsesPropsSchema = { additionalProperties: false, }; -export const isCannedResponsesProps = ajv.compile(CannedResponsesPropsSchema); +export const isCannedResponsesProps = ajvQuery.compile(CannedResponsesPropsSchema); type LivechatCustomFieldsProps = PaginatedRequest<{ text?: string }>; @@ -1162,7 +1162,7 @@ const LivechatCustomFieldsSchema = { additionalProperties: false, }; -export const isLivechatCustomFieldsProps = ajv.compile(LivechatCustomFieldsSchema); +export const isLivechatCustomFieldsProps = ajvQuery.compile(LivechatCustomFieldsSchema); export type LivechatRoomsProps = { roomName?: string; @@ -1276,7 +1276,7 @@ const LivechatRidMessagesSchema = { additionalProperties: false, }; -export const isLivechatRidMessagesProps = ajv.compile(LivechatRidMessagesSchema); +export const isLivechatRidMessagesProps = ajvQuery.compile(LivechatRidMessagesSchema); type LivechatUsersAgentProps = PaginatedRequest<{ text?: string }>; @@ -1308,7 +1308,7 @@ const LivechatUsersAgentSchema = { additionalProperties: false, }; -export const isLivechatUsersAgentProps = ajv.compile(LivechatUsersAgentSchema); +export const isLivechatUsersAgentProps = ajvQuery.compile(LivechatUsersAgentSchema); type LivechatPrioritiesProps = PaginatedRequest<{ text?: string }>; @@ -1344,7 +1344,7 @@ const LivechatPrioritiesPropsSchema = { additionalProperties: false, }; -export const isLivechatPrioritiesProps = ajv.compile(LivechatPrioritiesPropsSchema); +export const isLivechatPrioritiesProps = ajvQuery.compile(LivechatPrioritiesPropsSchema); type CreateOrUpdateLivechatSlaProps = { name: string; @@ -1632,7 +1632,7 @@ const GETOmnichannelContactsSchema = { additionalProperties: false, }; -export const isGETOmnichannelContactsProps = ajv.compile(GETOmnichannelContactsSchema); +export const isGETOmnichannelContactsProps = ajvQuery.compile(GETOmnichannelContactsSchema); type GETOmnichannelContactsSearchProps = PaginatedRequest<{ searchText: string; @@ -1662,7 +1662,7 @@ const GETOmnichannelContactsSearchSchema = { additionalProperties: false, }; -export const isGETOmnichannelContactsSearchProps = ajv.compile(GETOmnichannelContactsSearchSchema); +export const isGETOmnichannelContactsSearchProps = ajvQuery.compile(GETOmnichannelContactsSearchSchema); type GETOmnichannelContactsCheckExistenceProps = { contactId?: string; @@ -1712,7 +1712,7 @@ const GETOmnichannelContactsCheckExistenceSchema = { ], }; -export const isGETOmnichannelContactsCheckExistenceProps = ajv.compile( +export const isGETOmnichannelContactsCheckExistenceProps = ajvQuery.compile( GETOmnichannelContactsCheckExistenceSchema, ); @@ -1744,7 +1744,7 @@ const GETOmnichannelContactHistorySchema = { additionalProperties: false, }; -export const isGETOmnichannelContactHistoryProps = ajv.compile(GETOmnichannelContactHistorySchema); +export const isGETOmnichannelContactHistoryProps = ajvQuery.compile(GETOmnichannelContactHistorySchema); type GETOmnichannelContactsChannelsProps = { contactId: string; @@ -1761,7 +1761,9 @@ const GETOmnichannelContactsChannelsSchema = { additionalProperties: false, }; -export const isGETOmnichannelContactsChannelsProps = ajv.compile(GETOmnichannelContactsChannelsSchema); +export const isGETOmnichannelContactsChannelsProps = ajvQuery.compile( + GETOmnichannelContactsChannelsSchema, +); type GETOmnichannelContactProps = { contactId: string }; @@ -1776,7 +1778,7 @@ const GETOmnichannelContactSchema = { additionalProperties: false, }; -export const isGETOmnichannelContactProps = ajv.compile(GETOmnichannelContactSchema); +export const isGETOmnichannelContactProps = ajvQuery.compile(GETOmnichannelContactSchema); type GETOmnichannelContactSearchProps = { email: string } | { phone: string }; @@ -1808,7 +1810,7 @@ const LivechatAnalyticsAgentsAverageServiceTimeSchema = { additionalProperties: false, }; -export const isLivechatAnalyticsAgentsAverageServiceTimeProps = ajv.compile( +export const isLivechatAnalyticsAgentsAverageServiceTimeProps = ajvQuery.compile( LivechatAnalyticsAgentsAverageServiceTimeSchema, ); @@ -1837,7 +1839,7 @@ const GETOmnichannelContactSearchSchema = { ], }; -export const isGETOmnichannelContactSearchProps = ajv.compile(GETOmnichannelContactSearchSchema); +export const isGETOmnichannelContactSearchProps = ajvQuery.compile(GETOmnichannelContactSearchSchema); type POSTLivechatAgentStatusProps = { status?: ILivechatAgent['statusLivechat']; agentId?: string }; @@ -1929,7 +1931,7 @@ const LivechatAnalyticsAgentsTotalServiceTimeSchema = { additionalProperties: false, }; -export const isLivechatAnalyticsAgentsTotalServiceTimeProps = ajv.compile( +export const isLivechatAnalyticsAgentsTotalServiceTimeProps = ajvQuery.compile( LivechatAnalyticsAgentsTotalServiceTimeSchema, ); @@ -1966,9 +1968,8 @@ const LivechatAnalyticsAgentsAvailableForServiceHistorySchema = { additionalProperties: false, }; -export const isLivechatAnalyticsAgentsAvailableForServiceHistoryProps = ajv.compile( - LivechatAnalyticsAgentsAvailableForServiceHistorySchema, -); +export const isLivechatAnalyticsAgentsAvailableForServiceHistoryProps = + ajvQuery.compile(LivechatAnalyticsAgentsAvailableForServiceHistorySchema); type LivechatAnalyticsDepartmentsAmountOfChatsProps = PaginatedRequest<{ start: string; @@ -2008,7 +2009,7 @@ const LivechatAnalyticsDepartmentsAmountOfChatsSchema = { additionalProperties: false, }; -export const isLivechatAnalyticsDepartmentsAmountOfChatsProps = ajv.compile( +export const isLivechatAnalyticsDepartmentsAmountOfChatsProps = ajvQuery.compile( LivechatAnalyticsDepartmentsAmountOfChatsSchema, ); @@ -2045,7 +2046,7 @@ const LivechatAnalyticsDepartmentsAverageServiceTimeSchema = { additionalProperties: false, }; -export const isLivechatAnalyticsDepartmentsAverageServiceTimeProps = ajv.compile( +export const isLivechatAnalyticsDepartmentsAverageServiceTimeProps = ajvQuery.compile( LivechatAnalyticsDepartmentsAverageServiceTimeSchema, ); @@ -2083,7 +2084,7 @@ const LivechatAnalyticsDepartmentsAverageChatDurationTimeSchema = { }; export const isLivechatAnalyticsDepartmentsAverageChatDurationTimeProps = - ajv.compile(LivechatAnalyticsDepartmentsAverageChatDurationTimeSchema); + ajvQuery.compile(LivechatAnalyticsDepartmentsAverageChatDurationTimeSchema); type LivechatAnalyticsDepartmentsTotalServiceTimeProps = PaginatedRequest<{ start: string; @@ -2118,7 +2119,7 @@ const LivechatAnalyticsDepartmentsTotalServiceTimeSchema = { additionalProperties: false, }; -export const isLivechatAnalyticsDepartmentsTotalServiceTimeProps = ajv.compile( +export const isLivechatAnalyticsDepartmentsTotalServiceTimeProps = ajvQuery.compile( LivechatAnalyticsDepartmentsTotalServiceTimeSchema, ); @@ -2155,7 +2156,7 @@ const LivechatAnalyticsDepartmentsAverageWaitingTimeSchema = { additionalProperties: false, }; -export const isLivechatAnalyticsDepartmentsAverageWaitingTimeProps = ajv.compile( +export const isLivechatAnalyticsDepartmentsAverageWaitingTimeProps = ajvQuery.compile( LivechatAnalyticsDepartmentsAverageWaitingTimeSchema, ); @@ -2192,9 +2193,8 @@ const LivechatAnalyticsDepartmentsTotalTransferredChatsSchema = { additionalProperties: false, }; -export const isLivechatAnalyticsDepartmentsTotalTransferredChatsProps = ajv.compile( - LivechatAnalyticsDepartmentsTotalTransferredChatsSchema, -); +export const isLivechatAnalyticsDepartmentsTotalTransferredChatsProps = + ajvQuery.compile(LivechatAnalyticsDepartmentsTotalTransferredChatsSchema); type LivechatAnalyticsDepartmentsTotalAbandonedChatsProps = PaginatedRequest<{ start: string; @@ -2229,9 +2229,8 @@ const LivechatAnalyticsDepartmentsTotalAbandonedChatsSchema = { additionalProperties: false, }; -export const isLivechatAnalyticsDepartmentsTotalAbandonedChatsProps = ajv.compile( - LivechatAnalyticsDepartmentsTotalAbandonedChatsSchema, -); +export const isLivechatAnalyticsDepartmentsTotalAbandonedChatsProps = + ajvQuery.compile(LivechatAnalyticsDepartmentsTotalAbandonedChatsSchema); type LivechatAnalyticsDepartmentsPercentageAbandonedChatsProps = PaginatedRequest<{ start: string; @@ -2267,7 +2266,7 @@ const LivechatAnalyticsDepartmentsPercentageAbandonedChatsSchema = { }; export const isLivechatAnalyticsDepartmentsPercentageAbandonedChatsProps = - ajv.compile(LivechatAnalyticsDepartmentsPercentageAbandonedChatsSchema); + ajvQuery.compile(LivechatAnalyticsDepartmentsPercentageAbandonedChatsSchema); type GETAgentNextToken = { department?: string; @@ -2284,7 +2283,7 @@ const GETAgentNextTokenSchema = { additionalProperties: false, }; -export const isGETAgentNextToken = ajv.compile(GETAgentNextTokenSchema); +export const isGETAgentNextToken = ajvQuery.compile(GETAgentNextTokenSchema); type GETLivechatConfigParams = { token?: string; @@ -2311,7 +2310,7 @@ const GETLivechatConfigParamsSchema = { additionalProperties: false, }; -export const isGETLivechatConfigParams = ajv.compile(GETLivechatConfigParamsSchema); +export const isGETLivechatConfigParams = ajvQuery.compile(GETLivechatConfigParamsSchema); export const GETLivechatConfigRoutingSchema = { type: 'object', @@ -2351,7 +2350,7 @@ export const GETLivechatConfigRoutingSchema = { additionalProperties: false, }; -export const GETLivechatConfigRouting = ajv.compile<{ config: OmichannelRoutingConfig | undefined }>(GETLivechatConfigRoutingSchema); +export const GETLivechatConfigRouting = ajvQuery.compile<{ config: OmichannelRoutingConfig | undefined }>(GETLivechatConfigRoutingSchema); type POSTLivechatCustomFieldParams = { token: string; @@ -2436,7 +2435,7 @@ const GETWebRTCCallSchema = { additionalProperties: false, }; -export const isGETWebRTCCall = ajv.compile(GETWebRTCCallSchema); +export const isGETWebRTCCall = ajvQuery.compile(GETWebRTCCallSchema); type PUTWebRTCCallId = { rid: string; status: string }; @@ -2638,7 +2637,7 @@ const GETLivechatMessageIdParamsSchema = { additionalProperties: false, }; -export const isGETLivechatMessageIdParams = ajv.compile(GETLivechatMessageIdParamsSchema); +export const isGETLivechatMessageIdParams = ajvQuery.compile(GETLivechatMessageIdParamsSchema); type PUTLivechatMessageIdParams = { token: string; @@ -2745,7 +2744,7 @@ const GETLivechatMessagesHistoryRidParamsSchema = { additionalProperties: false, }; -export const isGETLivechatMessagesHistoryRidParams = ajv.compile( +export const isGETLivechatMessagesHistoryRidParams = ajvQuery.compile( GETLivechatMessagesHistoryRidParamsSchema, ); @@ -2791,7 +2790,7 @@ const GETLivechatMessagesParamsSchema = { additionalProperties: false, }; -export const isGETLivechatMessagesParams = ajv.compile(GETLivechatMessagesParamsSchema); +export const isGETLivechatMessagesParams = ajvQuery.compile(GETLivechatMessagesParamsSchema); type GETLivechatRoomParams = { token: string; @@ -2818,7 +2817,7 @@ const GETLivechatRoomParamsSchema = { additionalProperties: true, }; -export const isGETLivechatRoomParams = ajv.compile(GETLivechatRoomParamsSchema); +export const isGETLivechatRoomParams = ajvQuery.compile(GETLivechatRoomParamsSchema); type POSTLivechatRoomCloseParams = { token: string; @@ -3079,7 +3078,7 @@ const GETLivechatVisitorsPagesVisitedRoomIdParamsSchema = { additionalProperties: false, }; -export const isGETLivechatVisitorsPagesVisitedRoomIdParams = ajv.compile( +export const isGETLivechatVisitorsPagesVisitedRoomIdParams = ajvQuery.compile( GETLivechatVisitorsPagesVisitedRoomIdParamsSchema, ); @@ -3105,7 +3104,7 @@ const GETLivechatVisitorsChatHistoryRoomRoomIdVisitorVisitorIdParamsSchema = { }; export const isGETLivechatVisitorsChatHistoryRoomRoomIdVisitorVisitorIdParams = - ajv.compile( + ajvQuery.compile( GETLivechatVisitorsChatHistoryRoomRoomIdVisitorVisitorIdParamsSchema, ); @@ -3152,7 +3151,7 @@ const GETLivechatVisitorsSearchChatsRoomRoomIdVisitorVisitorIdParamsSchema = { }; export const isGETLivechatVisitorsSearchChatsRoomRoomIdVisitorVisitorIdParams = - ajv.compile( + ajvQuery.compile( GETLivechatVisitorsSearchChatsRoomRoomIdVisitorVisitorIdParamsSchema, ); @@ -3169,7 +3168,7 @@ const GETLivechatVisitorsAutocompleteParamsSchema = { additionalProperties: false, }; -export const isGETLivechatVisitorsAutocompleteParams = ajv.compile( +export const isGETLivechatVisitorsAutocompleteParams = ajvQuery.compile( GETLivechatVisitorsAutocompleteParamsSchema, ); @@ -3198,7 +3197,7 @@ const GETLivechatVisitorsSearchSchema = { additionalProperties: false, }; -export const isGETLivechatVisitorsSearch = ajv.compile(GETLivechatVisitorsSearchSchema); +export const isGETLivechatVisitorsSearch = ajvQuery.compile(GETLivechatVisitorsSearchSchema); type GETLivechatAgentsAgentIdDepartmentsParams = { enabledDepartmentsOnly?: booleanString }; @@ -3213,7 +3212,7 @@ const GETLivechatAgentsAgentIdDepartmentsParamsSchema = { additionalProperties: false, }; -export const isGETLivechatAgentsAgentIdDepartmentsParams = ajv.compile( +export const isGETLivechatAgentsAgentIdDepartmentsParams = ajvQuery.compile( GETLivechatAgentsAgentIdDepartmentsParamsSchema, ); @@ -3234,7 +3233,7 @@ const GETBusinessHourParamsSchema = { additionalProperties: false, }; -export const isGETBusinessHourParams = ajv.compile(GETBusinessHourParamsSchema); +export const isGETBusinessHourParams = ajvQuery.compile(GETBusinessHourParamsSchema); type GETLivechatTriggersParams = PaginatedRequest; @@ -3420,7 +3419,7 @@ export const POSTLivechatBusinessHoursRemoveSuccessSchema = { export const POSTLivechatBusinessHoursRemoveSuccessResponse = ajv.compile(POSTLivechatBusinessHoursRemoveSuccessSchema); -export const isGETLivechatTriggersParams = ajv.compile(GETLivechatTriggersParamsSchema); +export const isGETLivechatTriggersParams = ajvQuery.compile(GETLivechatTriggersParamsSchema); export type GETLivechatRoomsParams = PaginatedRequest<{ fields?: string; @@ -3522,7 +3521,7 @@ const GETLivechatRoomsParamsSchema = { additionalProperties: false, }; -export const isGETLivechatRoomsParams = ajv.compile(GETLivechatRoomsParamsSchema); +export const isGETLivechatRoomsParams = ajvQuery.compile(GETLivechatRoomsParamsSchema); export type POSTLivechatRoomPriorityParams = { priorityId: string; @@ -3574,7 +3573,7 @@ const GETLivechatQueueParamsSchema = { additionalProperties: false, }; -export const isGETLivechatQueueParams = ajv.compile(GETLivechatQueueParamsSchema); +export const isGETLivechatQueueParams = ajvQuery.compile(GETLivechatQueueParamsSchema); type GETLivechatPrioritiesParams = PaginatedRequest<{ text?: string }>; @@ -3602,7 +3601,7 @@ const GETLivechatPrioritiesParamsSchema = { additionalProperties: false, }; -export const isGETLivechatPrioritiesParams = ajv.compile(GETLivechatPrioritiesParamsSchema); +export const isGETLivechatPrioritiesParams = ajvQuery.compile(GETLivechatPrioritiesParamsSchema); type DELETELivechatPriorityParams = { priorityId: string; @@ -3666,7 +3665,7 @@ const GETLivechatInquiriesListParamsSchema = { additionalProperties: false, }; -export const isGETLivechatInquiriesListParams = ajv.compile(GETLivechatInquiriesListParamsSchema); +export const isGETLivechatInquiriesListParams = ajvQuery.compile(GETLivechatInquiriesListParamsSchema); type POSTLivechatInquiriesTakeParams = { inquiryId: string; @@ -3747,7 +3746,7 @@ const GETLivechatInquiriesQueuedForUserParamsSchema = { additionalProperties: false, }; -export const isGETLivechatInquiriesQueuedForUserParams = ajv.compile( +export const isGETLivechatInquiriesQueuedForUserParams = ajvQuery.compile( GETLivechatInquiriesQueuedForUserParamsSchema, ); @@ -3766,7 +3765,9 @@ const GETLivechatInquiriesGetOneParamsSchema = { required: ['roomId'], }; -export const isGETLivechatInquiriesGetOneParams = ajv.compile(GETLivechatInquiriesGetOneParamsSchema); +export const isGETLivechatInquiriesGetOneParams = ajvQuery.compile( + GETLivechatInquiriesGetOneParamsSchema, +); type POSTLivechatInquiriesReturnAsInquiry = { roomId: string; @@ -3834,7 +3835,7 @@ const GETLivechatAnalyticsDashboardsConversationTotalizersParamsSchema = { required: ['start', 'end'], }; -export const isGETDashboardTotalizerParams = ajv.compile( +export const isGETDashboardTotalizerParams = ajvQuery.compile( GETLivechatAnalyticsDashboardsConversationTotalizersParamsSchema, ); @@ -3855,7 +3856,7 @@ const GETLivechatAnalyticsDashboardsAgentStatusParamsSchema = { additionalProperties: true, }; -export const isGETDashboardsAgentStatusParams = ajv.compile( +export const isGETDashboardsAgentStatusParams = ajvQuery.compile( GETLivechatAnalyticsDashboardsAgentStatusParamsSchema, ); @@ -3886,7 +3887,7 @@ const GETLivechatAnalyticsDashboardsChartDataParamsSchema = { required: ['chartName', 'start', 'end'], }; -export const isGETLivechatAnalyticsDashboardsChartDataParams = ajv.compile( +export const isGETLivechatAnalyticsDashboardsChartDataParams = ajvQuery.compile( GETLivechatAnalyticsDashboardsChartDataParamsSchema, ); @@ -3951,17 +3952,17 @@ const PUTLivechatPrioritySchema = { export const isPUTLivechatPriority = ajv.compile(PUTLivechatPrioritySchema); type POSTomnichannelIntegrations = { - LivechatWebhookUrl: string; - LivechatSecretToken: string; - LivechatHttpTimeout: number; - LivechatWebhookOnStart: boolean; - LivechatWebhookOnClose: boolean; - LivechatWebhookOnChatTaken: boolean; - LivechatWebhookOnChatQueued: boolean; - LivechatWebhookOnForward: boolean; - LivechatWebhookOnOfflineMsg: boolean; - LivechatWebhookOnVisitorMessage: boolean; - LivechatWebhookOnAgentMessage: boolean; + LivechatWebhookUrl?: string; + LivechatSecretToken?: string; + LivechatHttpTimeout?: number; + LivechatWebhookOnStart?: boolean; + LivechatWebhookOnClose?: boolean; + LivechatWebhookOnChatTaken?: boolean; + LivechatWebhookOnChatQueued?: boolean; + LivechatWebhookOnForward?: boolean; + LivechatWebhookOnOfflineMsg?: boolean; + LivechatWebhookOnVisitorMessage?: boolean; + LivechatWebhookOnAgentMessage?: boolean; }; const POSTomnichannelIntegrationsSchema = { @@ -3969,47 +3970,36 @@ const POSTomnichannelIntegrationsSchema = { properties: { LivechatWebhookUrl: { type: 'string', - nullable: true, }, LivechatSecretToken: { type: 'string', - nullable: true, }, LivechatHttpTimeout: { type: 'number', - nullable: true, }, LivechatWebhookOnStart: { type: 'boolean', - nullable: true, }, LivechatWebhookOnClose: { type: 'boolean', - nullable: true, }, LivechatWebhookOnChatTaken: { type: 'boolean', - nullable: true, }, LivechatWebhookOnChatQueued: { type: 'boolean', - nullable: true, }, LivechatWebhookOnForward: { type: 'boolean', - nullable: true, }, LivechatWebhookOnOfflineMsg: { type: 'boolean', - nullable: true, }, LivechatWebhookOnVisitorMessage: { type: 'boolean', - nullable: true, }, LivechatWebhookOnAgentMessage: { type: 'boolean', - nullable: true, }, }, required: [], @@ -4249,7 +4239,7 @@ const LivechatAnalyticsAgentOverviewPropsSchema = { additionalProperties: false, }; -export const isLivechatAnalyticsAgentOverviewProps = ajv.compile( +export const isLivechatAnalyticsAgentOverviewProps = ajvQuery.compile( LivechatAnalyticsAgentOverviewPropsSchema, ); @@ -4281,7 +4271,7 @@ const LivechatAnalyticsOverviewPropsSchema = { additionalProperties: false, }; -export const isLivechatAnalyticsOverviewProps = ajv.compile(LivechatAnalyticsOverviewPropsSchema); +export const isLivechatAnalyticsOverviewProps = ajvQuery.compile(LivechatAnalyticsOverviewPropsSchema); type LivechatTriggerWebhookTestParams = { webhookUrl: string; diff --git a/packages/rest-typings/src/v1/roles.ts b/packages/rest-typings/src/v1/roles.ts index 93845a150cecd..9defd3643fdfb 100644 --- a/packages/rest-typings/src/v1/roles.ts +++ b/packages/rest-typings/src/v1/roles.ts @@ -1,6 +1,6 @@ import type { RocketChatRecordDeleted, IRole, IUserInRole } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; import type { PaginatedRequest } from '../helpers/PaginatedRequest'; type RoleDeleteProps = { roleId: IRole['_id'] }; @@ -111,7 +111,7 @@ const RolesGetUsersInRolePropsSchema = { additionalProperties: false, }; -export const isRolesGetUsersInRoleProps = ajv.compile(RolesGetUsersInRolePropsSchema); +export const isRolesGetUsersInRoleProps = ajvQuery.compile(RolesGetUsersInRolePropsSchema); type RoleSyncProps = { updatedSince?: string; diff --git a/packages/rest-typings/src/v1/rooms.ts b/packages/rest-typings/src/v1/rooms.ts index 3aa1a850a746b..112a8eff276a5 100644 --- a/packages/rest-typings/src/v1/rooms.ts +++ b/packages/rest-typings/src/v1/rooms.ts @@ -1,6 +1,6 @@ import type { IMessage, IRoom, IUser, RoomAdminFieldsType, IUpload, IE2EEMessage, ITeam, ISubscription } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; import type { PaginatedRequest } from '../helpers/PaginatedRequest'; import type { PaginatedResult } from '../helpers/PaginatedResult'; @@ -456,7 +456,7 @@ const GETRoomsNameExistsSchema = { additionalProperties: false, }; -export const isGETRoomsNameExists = ajv.compile(GETRoomsNameExistsSchema); +export const isGETRoomsNameExists = ajvQuery.compile(GETRoomsNameExistsSchema); type RoomsIsMemberProps = { roomId: string } & ({ username: string } | { userId: string }); @@ -471,7 +471,7 @@ const RoomsIsMemberPropsSchema = { additionalProperties: false, }; -export const isRoomsIsMemberProps = ajv.compile(RoomsIsMemberPropsSchema); +export const isRoomsIsMemberProps = ajvQuery.compile(RoomsIsMemberPropsSchema); export type Notifications = { disableNotifications?: string; @@ -551,7 +551,7 @@ const roomsImagesPropsSchema = { additionalProperties: false, }; -export const isRoomsImagesProps = ajv.compile(roomsImagesPropsSchema); +export const isRoomsImagesProps = ajvQuery.compile(roomsImagesPropsSchema); export type RoomsCleanHistoryProps = { roomId: IRoom['_id']; @@ -667,7 +667,7 @@ const membersOrderedByRoleRolePropsSchema = { additionalProperties: false, }; -export const isRoomsMembersOrderedByRoleProps = ajv.compile(membersOrderedByRoleRolePropsSchema); +export const isRoomsMembersOrderedByRoleProps = ajvQuery.compile(membersOrderedByRoleRolePropsSchema); type RoomsHideProps = { roomId: string; diff --git a/packages/rest-typings/src/v1/server-events/ServerEventsAuditSettingsParamsGET.ts b/packages/rest-typings/src/v1/server-events/ServerEventsAuditSettingsParamsGET.ts index 330a3b1f1d1f0..740913ead60f4 100644 --- a/packages/rest-typings/src/v1/server-events/ServerEventsAuditSettingsParamsGET.ts +++ b/packages/rest-typings/src/v1/server-events/ServerEventsAuditSettingsParamsGET.ts @@ -1,7 +1,7 @@ import type { IAuditServerActor } from '@rocket.chat/core-typings'; import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type ServerEventsAuditSettingsParamsGET = PaginatedRequest<{ start?: string; @@ -71,4 +71,6 @@ const ServerEventsAuditSettingsParamsGetSchema = { additionalProperties: false, }; -export const isServerEventsAuditSettingsProps = ajv.compile(ServerEventsAuditSettingsParamsGetSchema); +export const isServerEventsAuditSettingsProps = ajvQuery.compile( + ServerEventsAuditSettingsParamsGetSchema, +); diff --git a/packages/rest-typings/src/v1/settings.ts b/packages/rest-typings/src/v1/settings.ts index a7bf38c8145ee..bfd4571cb1cac 100644 --- a/packages/rest-typings/src/v1/settings.ts +++ b/packages/rest-typings/src/v1/settings.ts @@ -1,6 +1,6 @@ import type { ISetting, ISettingColor, LoginServiceConfiguration } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajvQuery } from './Ajv'; import type { PaginatedRequest } from '../helpers/PaginatedRequest'; import type { PaginatedResult } from '../helpers/PaginatedResult'; @@ -55,7 +55,7 @@ const SettingsPublicWithPaginationSchema = { additionalProperties: false, }; -export const isSettingsPublicWithPaginationProps = ajv.compile(SettingsPublicWithPaginationSchema); +export const isSettingsPublicWithPaginationProps = ajvQuery.compile(SettingsPublicWithPaginationSchema); type SettingsGetParams = PaginatedRequest<{ includeDefaults?: boolean; query?: string }>; @@ -85,7 +85,7 @@ const SettingsGetSchema = { additionalProperties: false, }; -export const isSettingsGetParams = ajv.compile(SettingsGetSchema); +export const isSettingsGetParams = ajvQuery.compile(SettingsGetSchema); export type SettingsEndpoints = { '/v1/settings.public': { diff --git a/packages/rest-typings/src/v1/subscriptionsEndpoints.ts b/packages/rest-typings/src/v1/subscriptionsEndpoints.ts index ce820565673c7..d188f4d594f69 100644 --- a/packages/rest-typings/src/v1/subscriptionsEndpoints.ts +++ b/packages/rest-typings/src/v1/subscriptionsEndpoints.ts @@ -1,6 +1,6 @@ import type { ISubscription, IMessage, IRoom } from '@rocket.chat/core-typings'; -import { ajv } from './Ajv'; +import { ajv, ajvQuery } from './Ajv'; type SubscriptionsGet = { updatedSince?: string }; @@ -22,7 +22,7 @@ const SubscriptionsGetSchema = { additionalProperties: false, }; -export const isSubscriptionsGetProps = ajv.compile(SubscriptionsGetSchema); +export const isSubscriptionsGetProps = ajvQuery.compile(SubscriptionsGetSchema); const SubscriptionsGetOneSchema = { type: 'object', @@ -35,7 +35,7 @@ const SubscriptionsGetOneSchema = { additionalProperties: false, }; -export const isSubscriptionsGetOneProps = ajv.compile(SubscriptionsGetOneSchema); +export const isSubscriptionsGetOneProps = ajvQuery.compile(SubscriptionsGetOneSchema); const SubscriptionsReadSchema = { anyOf: [ @@ -104,7 +104,7 @@ const SubscriptionsUnreadSchema = { ], }; -export const isSubscriptionsUnreadProps = ajv.compile(SubscriptionsUnreadSchema); +export const isSubscriptionsUnreadProps = ajvQuery.compile(SubscriptionsUnreadSchema); export type SubscriptionsEndpoints = { '/v1/subscriptions.get': { diff --git a/packages/rest-typings/src/v1/teams/TeamsListChildren.ts b/packages/rest-typings/src/v1/teams/TeamsListChildren.ts index 41128e18a05f8..b5de9f8c65aa1 100644 --- a/packages/rest-typings/src/v1/teams/TeamsListChildren.ts +++ b/packages/rest-typings/src/v1/teams/TeamsListChildren.ts @@ -1,7 +1,7 @@ import type { ITeam } from '@rocket.chat/core-typings'; import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; type GeneralProps = { filter?: string; @@ -33,4 +33,4 @@ const TeamsListChildrenPropsSchema = { oneOf: [{ required: ['teamId'] }, { required: ['teamName'] }, { required: ['roomId'] }], }; -export const isTeamsListChildrenProps = ajv.compile(TeamsListChildrenPropsSchema); +export const isTeamsListChildrenProps = ajvQuery.compile(TeamsListChildrenPropsSchema); diff --git a/packages/rest-typings/src/v1/users/UsersInfoParamsGet.ts b/packages/rest-typings/src/v1/users/UsersInfoParamsGet.ts index 47d56a3cc2e19..30dd4e9131c62 100644 --- a/packages/rest-typings/src/v1/users/UsersInfoParamsGet.ts +++ b/packages/rest-typings/src/v1/users/UsersInfoParamsGet.ts @@ -1,4 +1,4 @@ -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type UsersInfoParamsGet = ({ userId: string } | { username: string } | { importId: string }) & { fields?: string; @@ -61,4 +61,4 @@ const UsersInfoParamsGetSchema = { ], }; -export const isUsersInfoParamsGetProps = ajv.compile(UsersInfoParamsGetSchema); +export const isUsersInfoParamsGetProps = ajvQuery.compile(UsersInfoParamsGetSchema); diff --git a/packages/rest-typings/src/v1/users/UsersListStatusParamsGET.ts b/packages/rest-typings/src/v1/users/UsersListStatusParamsGET.ts index 49c1329ffbc65..ab350bac66afc 100644 --- a/packages/rest-typings/src/v1/users/UsersListStatusParamsGET.ts +++ b/packages/rest-typings/src/v1/users/UsersListStatusParamsGET.ts @@ -1,5 +1,5 @@ import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type UsersListStatusParamsGET = PaginatedRequest<{ status?: 'active' | 'deactivated'; @@ -58,4 +58,4 @@ const UsersListStatusParamsGetSchema = { additionalProperties: false, }; -export const isUsersListStatusProps = ajv.compile(UsersListStatusParamsGetSchema); +export const isUsersListStatusProps = ajvQuery.compile(UsersListStatusParamsGetSchema); diff --git a/packages/rest-typings/src/v1/videoConference/VideoConfInfoProps.ts b/packages/rest-typings/src/v1/videoConference/VideoConfInfoProps.ts index e70a5a7a3f794..81117e9952557 100644 --- a/packages/rest-typings/src/v1/videoConference/VideoConfInfoProps.ts +++ b/packages/rest-typings/src/v1/videoConference/VideoConfInfoProps.ts @@ -1,6 +1,6 @@ import type { JSONSchemaType } from 'ajv'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type VideoConfInfoProps = { callId: string }; @@ -16,4 +16,4 @@ const videoConfInfoPropsSchema: JSONSchemaType = { additionalProperties: false, }; -export const isVideoConfInfoProps = ajv.compile(videoConfInfoPropsSchema); +export const isVideoConfInfoProps = ajvQuery.compile(videoConfInfoPropsSchema); diff --git a/packages/rest-typings/src/v1/videoConference/VideoConfListProps.ts b/packages/rest-typings/src/v1/videoConference/VideoConfListProps.ts index d4e42b11efd98..68d5dc771904d 100644 --- a/packages/rest-typings/src/v1/videoConference/VideoConfListProps.ts +++ b/packages/rest-typings/src/v1/videoConference/VideoConfListProps.ts @@ -1,6 +1,6 @@ import type { JSONSchemaType } from 'ajv'; -import { ajv } from '../Ajv'; +import { ajvQuery } from '../Ajv'; export type VideoConfListProps = { roomId: string; @@ -22,4 +22,4 @@ const videoConfListPropsSchema: JSONSchemaType = { additionalProperties: false, }; -export const isVideoConfListProps = ajv.compile(videoConfListPropsSchema); +export const isVideoConfListProps = ajvQuery.compile(videoConfListPropsSchema); diff --git a/packages/ui-avatar/src/components/UserAvatar.tsx b/packages/ui-avatar/src/components/UserAvatar.tsx index a82916a555e30..961592d094955 100644 --- a/packages/ui-avatar/src/components/UserAvatar.tsx +++ b/packages/ui-avatar/src/components/UserAvatar.tsx @@ -15,7 +15,7 @@ type UserIdProp = { username?: never; }; type UserAvatarProps = Omit & { - etag?: string; + etag?: string | null; url?: string; title?: string; } & (UsernameProp | UserIdProp); diff --git a/packages/ui-contexts/src/AvatarUrlContext.ts b/packages/ui-contexts/src/AvatarUrlContext.ts index 1f13e27647205..5ed28412318ee 100644 --- a/packages/ui-contexts/src/AvatarUrlContext.ts +++ b/packages/ui-contexts/src/AvatarUrlContext.ts @@ -4,9 +4,9 @@ const dummy = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcS export type AvatarUrlContextValue = { getUserPathAvatar: { - (username: string, etag?: string): string; - (params: { userId: string; etag?: string }): string; - (params: { username: string; etag?: string }): string; + (username: string, etag?: string | null): string; + (params: { userId: string; etag?: string | null }): string; + (params: { username: string; etag?: string | null }): string; }; getRoomPathAvatar: (...args: any) => string; }; diff --git a/packages/ui-kit/src/surfaces/banner/BannerView.ts b/packages/ui-kit/src/surfaces/banner/BannerView.ts index 4857aa667ab4c..9174af27fbca9 100644 --- a/packages/ui-kit/src/surfaces/banner/BannerView.ts +++ b/packages/ui-kit/src/surfaces/banner/BannerView.ts @@ -1,6 +1,7 @@ import type { Keys as IconName } from '@rocket.chat/icons'; import typia from 'typia'; +import type { TextObject } from '../../blocks/TextObject'; import type { View } from '../View'; import type { BannerSurfaceLayout } from './UiKitParserBanner'; @@ -13,7 +14,8 @@ export type BannerView = Omit & { inline?: boolean; variant?: 'neutral' | 'info' | 'success' | 'warning' | 'danger'; icon?: IconName; - title?: string; // TODO: change to plain_text block in the future + /** Title as plain string (legacy) or UiKit text object (e.g. { type: 'mrkdwn', text: '...' }). */ + title?: string | TextObject; blocks: BannerSurfaceLayout; };