Files
mattermost/webapp/platform/client/src/client4.ts
Miguel de la Cruz b4d8b6239c Excludes remote channels from channel search (#28708)
* Excludes remote channels from channel search

This is done through a new body parameter in the SearchAllChannels
endpoint that allows to search for local only channels, which are
either channels that are shared but marked as homed locally, or
channels that are not shared at all.

* fix lint

* Fix tests

---------

Co-authored-by: Caleb Roseland <caleb@calebroseland.com>
2024-10-18 07:41:24 -06:00

4455 lines
143 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
/* eslint-disable max-lines */
import FormData from 'form-data';
import type {ClusterInfo, AnalyticsRow, SchemaMigration, LogFilterQuery} from '@mattermost/types/admin';
import type {AppBinding, AppCallRequest, AppCallResponse} from '@mattermost/types/apps';
import type {Audit} from '@mattermost/types/audits';
import type {UserAutocomplete, AutocompleteSuggestion} from '@mattermost/types/autocomplete';
import type {Bot, BotPatch} from '@mattermost/types/bots';
import type {ChannelBookmark, ChannelBookmarkCreate, ChannelBookmarkPatch} from '@mattermost/types/channel_bookmarks';
import type {ChannelCategory, OrderedChannelCategories} from '@mattermost/types/channel_categories';
import type {
Channel,
ChannelMemberCountsByGroup,
ChannelMembership,
ChannelModeration,
ChannelModerationPatch,
ChannelStats,
ChannelsWithTotalCount,
ChannelUnread,
ChannelViewResponse,
ChannelWithTeamData,
ChannelSearchOpts,
ServerChannel,
} from '@mattermost/types/channels';
import type {Options, StatusOK, ClientResponse, FetchPaginatedThreadOptions, OptsSignalExt} from '@mattermost/types/client4';
import {LogLevel} from '@mattermost/types/client4';
import type {
Address,
Product,
CloudCustomer,
CloudCustomerPatch,
Invoice,
Limits,
NotifyAdminRequest,
Subscription,
ValidBusinessEmail,
NewsletterRequestBody,
Installation,
} from '@mattermost/types/cloud';
import type {Compliance} from '@mattermost/types/compliance';
import type {
ClientConfig,
ClientLicense,
DataRetentionPolicy,
License,
AdminConfig,
EnvironmentConfig,
RequestLicenseBody,
AllowedIPRanges,
AllowedIPRange,
FetchIPResponse,
} from '@mattermost/types/config';
import type {
DataRetentionCustomPolicies,
CreateDataRetentionCustomPolicy,
PatchDataRetentionCustomPolicy,
GetDataRetentionCustomPoliciesRequest,
} from '@mattermost/types/data_retention';
import type {Draft} from '@mattermost/types/drafts';
import type {CustomEmoji} from '@mattermost/types/emojis';
import type {ServerError} from '@mattermost/types/errors';
import type {FileInfo, FileUploadResponse, FileSearchResults} from '@mattermost/types/files';
import type {SystemSetting} from '@mattermost/types/general';
import type {
Group,
GroupPatch,
GroupSyncable,
MixedUnlinkedGroup,
SyncablePatch,
UsersWithGroupsAndCount,
GroupsWithCount,
GroupCreateWithUserIds,
GroupSearchParams,
CustomGroupPatch,
GetGroupsParams,
GetGroupsForUserParams,
GroupStats,
} from '@mattermost/types/groups';
import type {PostActionResponse} from '@mattermost/types/integration_actions';
import type {
Command,
CommandArgs,
CommandResponse,
DialogSubmission,
IncomingWebhook,
IncomingWebhooksWithCount,
OAuthApp,
OutgoingOAuthConnection,
OutgoingWebhook,
SubmitDialogResponse,
} from '@mattermost/types/integrations';
import type {Job, JobTypeBase} from '@mattermost/types/jobs';
import type {ServerLimits} from '@mattermost/types/limits';
import type {
MarketplaceApp,
MarketplacePlugin,
} from '@mattermost/types/marketplace';
import type {MfaSecret} from '@mattermost/types/mfa';
import type {
ClientPluginManifest,
PluginManifest,
PluginsResponse,
PluginStatus,
} from '@mattermost/types/plugins';
import type {Post, PostList, PostSearchResults, PostsUsageResponse, TeamsUsageResponse, PaginatedPostList, FilesUsageResponse, PostAcknowledgement, PostAnalytics, PostInfo} from '@mattermost/types/posts';
import type {PreferenceType} from '@mattermost/types/preferences';
import type {ProductNotices} from '@mattermost/types/product_notices';
import type {Reaction} from '@mattermost/types/reactions';
import type {RemoteCluster, RemoteClusterAcceptInvite, RemoteClusterPatch, RemoteClusterWithPassword} from '@mattermost/types/remote_clusters';
import type {UserReport, UserReportFilter, UserReportOptions} from '@mattermost/types/reports';
import type {Role} from '@mattermost/types/roles';
import type {SamlCertificateStatus, SamlMetadataResponse} from '@mattermost/types/saml';
import type {Scheme} from '@mattermost/types/schemes';
import type {Session} from '@mattermost/types/sessions';
import type {CompleteOnboardingRequest} from '@mattermost/types/setup';
import type {SharedChannelRemote} from '@mattermost/types/shared_channels';
import type {
GetTeamMembersOpts,
Team,
TeamInviteWithError,
TeamMembership,
TeamMemberWithError,
TeamStats,
TeamsWithCount,
TeamUnread,
TeamSearchOpts,
PagedTeamSearchOpts,
NotPagedTeamSearchOpts,
} from '@mattermost/types/teams';
import type {TermsOfService} from '@mattermost/types/terms_of_service';
import type {UserThreadList, UserThread, UserThreadWithPost} from '@mattermost/types/threads';
import type {
AuthChangeResponse,
UserAccessToken,
UserProfile,
UsersStats,
UserStatus,
GetFilteredUsersStatsOpts,
UserCustomStatus,
} from '@mattermost/types/users';
import type {DeepPartial, PartialExcept, RelationOneToOne} from '@mattermost/types/utilities';
import {cleanUrlForLogging} from './errors';
import {buildQueryString} from './helpers';
import type {TelemetryHandler} from './telemetry';
const HEADER_AUTH = 'Authorization';
const HEADER_BEARER = 'BEARER';
const HEADER_CONTENT_TYPE = 'Content-Type';
const HEADER_REQUESTED_WITH = 'X-Requested-With';
const HEADER_USER_AGENT = 'User-Agent';
export const HEADER_X_CLUSTER_ID = 'X-Cluster-Id';
const HEADER_X_CSRF_TOKEN = 'X-CSRF-Token';
export const HEADER_X_VERSION_ID = 'X-Version-Id';
const LOGS_PER_PAGE_DEFAULT = 10000;
const AUTOCOMPLETE_LIMIT_DEFAULT = 25;
const PER_PAGE_DEFAULT = 60;
export const DEFAULT_LIMIT_BEFORE = 30;
export const DEFAULT_LIMIT_AFTER = 30;
export default class Client4 {
logToConsole = false;
serverVersion = '';
clusterId = '';
token = '';
csrf = '';
url = '';
urlVersion = '/api/v4';
userAgent: string | null = null;
enableLogging = false;
defaultHeaders: {[x: string]: string} = {};
userId = '';
diagnosticId = '';
includeCookies = true;
setAuthHeader = true;
translations = {
connectionError: 'There appears to be a problem with your internet connection.',
unknownError: 'We received an unexpected status code from the server.',
};
userRoles = '';
telemetryHandler?: TelemetryHandler;
getUrl() {
return this.url;
}
getAbsoluteUrl(baseUrl: string) {
if (typeof baseUrl !== 'string' || !baseUrl.startsWith('/')) {
return baseUrl;
}
return this.getUrl() + baseUrl;
}
setUrl(url: string) {
this.url = url;
}
setUserAgent(userAgent: string) {
this.userAgent = userAgent;
}
getToken() {
return this.token;
}
setToken(token: string) {
this.token = token;
}
setCSRF(csrfToken: string) {
this.csrf = csrfToken;
}
setAcceptLanguage(locale: string) {
this.defaultHeaders['Accept-Language'] = locale;
}
setHeader(header: string, value: string) {
this.defaultHeaders[header] = value;
}
removeHeader(header: string) {
delete this.defaultHeaders[header];
}
setEnableLogging(enable: boolean) {
this.enableLogging = enable;
}
setIncludeCookies(include: boolean) {
this.includeCookies = include;
}
setUserId(userId: string) {
this.userId = userId;
}
setUserRoles(roles: string) {
this.userRoles = roles;
}
setDiagnosticId(diagnosticId: string) {
this.diagnosticId = diagnosticId;
}
setTelemetryHandler(telemetryHandler?: TelemetryHandler) {
this.telemetryHandler = telemetryHandler;
}
getServerVersion() {
return this.serverVersion;
}
getUrlVersion() {
return this.urlVersion;
}
getBaseRoute() {
return `${this.url}${this.urlVersion}`;
}
getAppsProxyRoute() {
return `${this.url}/plugins/com.mattermost.apps`;
}
getUsersRoute() {
return `${this.getBaseRoute()}/users`;
}
getUserRoute(userId: string) {
return `${this.getUsersRoute()}/${userId}`;
}
getTeamsRoute() {
return `${this.getBaseRoute()}/teams`;
}
getTeamRoute(teamId: string) {
return `${this.getTeamsRoute()}/${teamId}`;
}
getTeamSchemeRoute(teamId: string) {
return `${this.getTeamRoute(teamId)}/scheme`;
}
getTeamNameRoute(teamName: string) {
return `${this.getTeamsRoute()}/name/${teamName}`;
}
getTeamMembersRoute(teamId: string) {
return `${this.getTeamRoute(teamId)}/members`;
}
getTeamMemberRoute(teamId: string, userId: string) {
return `${this.getTeamMembersRoute(teamId)}/${userId}`;
}
getChannelsRoute() {
return `${this.getBaseRoute()}/channels`;
}
getChannelRoute(channelId: string) {
return `${this.getChannelsRoute()}/${channelId}`;
}
getChannelMembersRoute(channelId: string) {
return `${this.getChannelRoute(channelId)}/members`;
}
getChannelMemberRoute(channelId: string, userId: string) {
return `${this.getChannelMembersRoute(channelId)}/${userId}`;
}
getChannelSchemeRoute(channelId: string) {
return `${this.getChannelRoute(channelId)}/scheme`;
}
getChannelBookmarksRoute(channelId: string) {
return `${this.getChannelRoute(channelId)}/bookmarks`;
}
getChannelBookmarkRoute(channelId: string, bookmarkId: string) {
return `${this.getChannelRoute(channelId)}/bookmarks/${bookmarkId}`;
}
getChannelCategoriesRoute(userId: string, teamId: string) {
return `${this.getBaseRoute()}/users/${userId}/teams/${teamId}/channels/categories`;
}
getRemoteClustersRoute() {
return `${this.getBaseRoute()}/remotecluster`;
}
getRemoteClusterRoute(remoteId: string) {
return `${this.getRemoteClustersRoute()}/${remoteId}`;
}
getPostsRoute() {
return `${this.getBaseRoute()}/posts`;
}
getPostRoute(postId: string) {
return `${this.getPostsRoute()}/${postId}`;
}
getReactionsRoute() {
return `${this.getBaseRoute()}/reactions`;
}
getCommandsRoute() {
return `${this.getBaseRoute()}/commands`;
}
getFilesRoute() {
return `${this.getBaseRoute()}/files`;
}
getFileRoute(fileId: string) {
return `${this.getFilesRoute()}/${fileId}`;
}
getPreferencesRoute(userId: string) {
return `${this.getUserRoute(userId)}/preferences`;
}
getIncomingHooksRoute() {
return `${this.getBaseRoute()}/hooks/incoming`;
}
getIncomingHookRoute(hookId: string) {
return `${this.getBaseRoute()}/hooks/incoming/${hookId}`;
}
getOutgoingHooksRoute() {
return `${this.getBaseRoute()}/hooks/outgoing`;
}
getOutgoingHookRoute(hookId: string) {
return `${this.getBaseRoute()}/hooks/outgoing/${hookId}`;
}
getOAuthRoute() {
return `${this.url}/oauth`;
}
getOAuthAppsRoute() {
return `${this.getBaseRoute()}/oauth/apps`;
}
getOAuthAppRoute(appId: string) {
return `${this.getOAuthAppsRoute()}/${appId}`;
}
getOutgoingOAuthConnectionsRoute() {
return `${this.getBaseRoute()}/oauth/outgoing_connections`;
}
getOutgoingOAuthConnectionRoute(connectionId: string) {
return `${this.getBaseRoute()}/oauth/outgoing_connections/${connectionId}`;
}
getEmojisRoute() {
return `${this.getBaseRoute()}/emoji`;
}
getEmojiRoute(emojiId: string) {
return `${this.getEmojisRoute()}/${emojiId}`;
}
getBrandRoute() {
return `${this.getBaseRoute()}/brand`;
}
getBrandImageUrl(timestamp: string) {
return `${this.getBrandRoute()}/image?t=${timestamp}`;
}
getDataRetentionRoute() {
return `${this.getBaseRoute()}/data_retention`;
}
getJobsRoute() {
return `${this.getBaseRoute()}/jobs`;
}
getPluginsRoute() {
return `${this.getBaseRoute()}/plugins`;
}
getPluginRoute(pluginId: string) {
return `${this.getPluginsRoute()}/${pluginId}`;
}
getPluginsMarketplaceRoute() {
return `${this.getPluginsRoute()}/marketplace`;
}
getRolesRoute() {
return `${this.getBaseRoute()}/roles`;
}
getSchemesRoute() {
return `${this.getBaseRoute()}/schemes`;
}
getBotsRoute() {
return `${this.getBaseRoute()}/bots`;
}
getBotRoute(botUserId: string) {
return `${this.getBotsRoute()}/${botUserId}`;
}
getGroupsRoute() {
return `${this.getBaseRoute()}/groups`;
}
getGroupRoute(groupID: string) {
return `${this.getGroupsRoute()}/${groupID}`;
}
getNoticesRoute() {
return `${this.getBaseRoute()}/system/notices`;
}
getCloudRoute() {
return `${this.getBaseRoute()}/cloud`;
}
getHostedCustomerRoute() {
return `${this.getBaseRoute()}/hosted_customer`;
}
getUsageRoute() {
return `${this.getBaseRoute()}/usage`;
}
getPermissionsRoute() {
return `${this.getBaseRoute()}/permissions`;
}
getUserThreadsRoute(userID: string, teamID: string): string {
return `${this.getUserRoute(userID)}/teams/${teamID}/threads`;
}
getUserThreadRoute(userId: string, teamId: string, threadId: string): string {
return `${this.getUserThreadsRoute(userId, teamId)}/${threadId}`;
}
getSystemRoute(): string {
return `${this.getBaseRoute()}/system`;
}
getDraftsRoute() {
return `${this.getBaseRoute()}/drafts`;
}
getReportsRoute(): string {
return `${this.getBaseRoute()}/reports`;
}
getLimitsRoute(): string {
return `${this.getBaseRoute()}/limits`;
}
getServerLimitsRoute() {
return `${this.getLimitsRoute()}/server`;
}
getClientMetricsRoute() {
return `${this.getBaseRoute()}/client_perf`;
}
getCSRFFromCookie() {
if (typeof document !== 'undefined' && typeof document.cookie !== 'undefined') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.startsWith('MMCSRF=')) {
return cookie.replace('MMCSRF=', '');
}
}
}
return '';
}
getOptions(options: Options) {
const newOptions: Options = {...options};
const headers: {[x: string]: string} = {
[HEADER_REQUESTED_WITH]: 'XMLHttpRequest',
...this.defaultHeaders,
};
if (this.setAuthHeader && this.token) {
headers[HEADER_AUTH] = `${HEADER_BEARER} ${this.token}`;
}
const csrfToken = this.csrf || this.getCSRFFromCookie();
if (options.method && options.method.toLowerCase() !== 'get' && csrfToken) {
headers[HEADER_X_CSRF_TOKEN] = csrfToken;
}
if (this.includeCookies) {
newOptions.credentials = 'include';
}
if (this.userAgent) {
headers[HEADER_USER_AGENT] = this.userAgent;
}
if (!headers[HEADER_CONTENT_TYPE] && options.body) {
// when the body is an instance of FormData we let browser set the Content-Type header generated by FormData interface with correct boundary
if (!(options.body instanceof FormData)) {
headers[HEADER_CONTENT_TYPE] = 'application/json';
}
}
if (newOptions.headers) {
Object.assign(headers, newOptions.headers);
}
return {
...newOptions,
headers,
};
}
// User Routes
createUser = (user: UserProfile, token: string, inviteId: string, redirect?: string) => {
this.trackEvent('api', 'api_users_create');
const queryParams: any = {};
if (token) {
queryParams.t = token;
}
if (inviteId) {
queryParams.iid = inviteId;
}
if (redirect) {
queryParams.r = redirect;
}
return this.doFetch<UserProfile>(
`${this.getUsersRoute()}${buildQueryString(queryParams)}`,
{method: 'post', body: JSON.stringify(user)},
);
};
patchMe = (userPatch: Partial<UserProfile>) => {
return this.doFetch<UserProfile>(
`${this.getUserRoute('me')}/patch`,
{method: 'put', body: JSON.stringify(userPatch)},
);
};
patchUser = (userPatch: Partial<UserProfile> & {id: string}) => {
this.trackEvent('api', 'api_users_patch');
return this.doFetch<UserProfile>(
`${this.getUserRoute(userPatch.id)}/patch`,
{method: 'put', body: JSON.stringify(userPatch)},
);
};
updateUser = (user: UserProfile) => {
this.trackEvent('api', 'api_users_update');
return this.doFetch<UserProfile>(
`${this.getUserRoute(user.id)}`,
{method: 'put', body: JSON.stringify(user)},
);
};
promoteGuestToUser = (userId: string) => {
this.trackEvent('api', 'api_users_promote_guest_to_user');
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/promote`,
{method: 'post'},
);
};
demoteUserToGuest = (userId: string) => {
this.trackEvent('api', 'api_users_demote_user_to_guest');
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/demote`,
{method: 'post'},
);
};
updateUserRoles = (userId: string, roles: string) => {
this.trackEvent('api', 'api_users_update_roles');
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/roles`,
{method: 'put', body: JSON.stringify({roles})},
);
};
updateUserMfa = (userId: string, activate: boolean, code: string) => {
const body: any = {
activate,
};
if (activate) {
body.code = code;
}
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/mfa`,
{method: 'put', body: JSON.stringify(body)},
);
};
updateUserPassword = (userId: string, currentPassword: string, newPassword: string) => {
this.trackEvent('api', 'api_users_newpassword');
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/password`,
{method: 'put', body: JSON.stringify({current_password: currentPassword, new_password: newPassword})},
);
};
resetUserPassword = (token: string, newPassword: string) => {
this.trackEvent('api', 'api_users_reset_password');
return this.doFetch<StatusOK>(
`${this.getUsersRoute()}/password/reset`,
{method: 'post', body: JSON.stringify({token, new_password: newPassword})},
);
};
getKnownUsers = () => {
return this.doFetch<Array<UserProfile['id']>>(
`${this.getUsersRoute()}/known`,
{method: 'get'},
);
};
sendPasswordResetEmail = (email: string) => {
this.trackEvent('api', 'api_users_send_password_reset');
return this.doFetch<StatusOK>(
`${this.getUsersRoute()}/password/reset/send`,
{method: 'post', body: JSON.stringify({email})},
);
};
updateUserActive = (userId: string, active: boolean) => {
this.trackEvent('api', 'api_users_update_active');
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/active`,
{method: 'put', body: JSON.stringify({active})},
);
};
uploadProfileImage = (userId: string, imageData: File) => {
this.trackEvent('api', 'api_users_update_profile_picture');
const formData = new FormData();
formData.append('image', imageData);
const request: any = {
method: 'post',
body: formData,
};
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/image`,
request,
);
};
setDefaultProfileImage = (userId: string) => {
this.trackEvent('api', 'api_users_set_default_profile_picture');
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/image`,
{method: 'delete'},
);
};
verifyUserEmail = (token: string) => {
return this.doFetch<StatusOK>(
`${this.getUsersRoute()}/email/verify`,
{method: 'post', body: JSON.stringify({token})},
);
};
updateMyTermsOfServiceStatus = (termsOfServiceId: string, accepted: boolean) => {
return this.doFetch<StatusOK>(
`${this.getUserRoute('me')}/terms_of_service`,
{method: 'post', body: JSON.stringify({termsOfServiceId, accepted})},
);
};
getTermsOfService = () => {
return this.doFetch<TermsOfService>(
`${this.getBaseRoute()}/terms_of_service`,
{method: 'get'},
);
};
createTermsOfService = (text: string) => {
return this.doFetch<TermsOfService>(
`${this.getBaseRoute()}/terms_of_service`,
{method: 'post', body: JSON.stringify({text})},
);
};
sendVerificationEmail = (email: string) => {
return this.doFetch<StatusOK>(
`${this.getUsersRoute()}/email/verify/send`,
{method: 'post', body: JSON.stringify({email})},
);
};
login = async (loginId: string, password: string, token = '', ldapOnly = false) => {
this.trackEvent('api', 'api_users_login');
if (ldapOnly) {
this.trackEvent('api', 'api_users_login_ldap');
}
const body: any = {
login_id: loginId,
password,
token,
deviceId: '',
};
if (ldapOnly) {
body.ldap_only = 'true';
}
const {
data: profile,
headers,
} = await this.doFetchWithResponse<UserProfile>(
`${this.getUsersRoute()}/login`,
{method: 'post', body: JSON.stringify(body)},
);
if (headers.has('Token')) {
this.setToken(headers.get('Token')!);
}
return profile;
};
loginWithDesktopToken = async (token: string) => {
const body: any = {
token,
deviceId: '',
};
return this.doFetch<UserProfile>(
`${this.getUsersRoute()}/login/desktop_token`,
{method: 'post', body: JSON.stringify(body)},
);
};
loginById = (id: string, password: string, token = '') => {
this.trackEvent('api', 'api_users_login');
const body: any = {
id,
password,
token,
device_id: '',
};
return this.doFetch<UserProfile>(
`${this.getUsersRoute()}/login`,
{method: 'post', body: JSON.stringify(body)},
);
};
logout = async () => {
this.trackEvent('api', 'api_users_logout');
const {response} = await this.doFetchWithResponse(
`${this.getUsersRoute()}/logout`,
{method: 'post'},
);
if (response.ok) {
this.token = '';
}
this.serverVersion = '';
return response;
};
getProfiles = (page = 0, perPage = PER_PAGE_DEFAULT, options: Record<string, any> = {}) => {
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}${buildQueryString({page, per_page: perPage, ...options})}`,
{method: 'get'},
);
};
getProfilesByIds = (userIds: string[], options = {}) => {
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}/ids${buildQueryString(options)}`,
{method: 'post', body: JSON.stringify(userIds)},
);
};
getProfilesByUsernames = (usernames: string[]) => {
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}/usernames`,
{method: 'post', body: JSON.stringify(usernames)},
);
};
getProfilesInTeam = (teamId: string, page = 0, perPage = PER_PAGE_DEFAULT, sort = '', options = {}) => {
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}${buildQueryString({...options, in_team: teamId, page, per_page: perPage, sort})}`,
{method: 'get'},
);
};
getProfilesNotInTeam = (teamId: string, groupConstrained: boolean, page = 0, perPage = PER_PAGE_DEFAULT) => {
const queryStringObj: any = {not_in_team: teamId, page, per_page: perPage};
if (groupConstrained) {
queryStringObj.group_constrained = true;
}
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}${buildQueryString(queryStringObj)}`,
{method: 'get'},
);
};
getProfilesWithoutTeam = (page = 0, perPage = PER_PAGE_DEFAULT, options = {}) => {
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}${buildQueryString({...options, without_team: 1, page, per_page: perPage})}`,
{method: 'get'},
);
};
getProfilesInChannel = (channelId: string, page = 0, perPage = PER_PAGE_DEFAULT, sort = '', options: {active?: boolean} = {}) => {
const queryStringObj = {in_channel: channelId, page, per_page: perPage, sort};
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}${buildQueryString({...queryStringObj, ...options})}`,
{method: 'get'},
);
};
getProfilesInGroupChannels = (channelsIds: string[]) => {
return this.doFetch<Record<string, UserProfile[]>>(
`${this.getUsersRoute()}/group_channels`,
{method: 'post', body: JSON.stringify(channelsIds)},
);
};
getProfilesNotInChannel = (teamId: string, channelId: string, groupConstrained: boolean, page = 0, perPage = PER_PAGE_DEFAULT) => {
const queryStringObj: any = {in_team: teamId, not_in_channel: channelId, page, per_page: perPage};
if (groupConstrained) {
queryStringObj.group_constrained = true;
}
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}${buildQueryString(queryStringObj)}`,
{method: 'get'},
);
};
getProfilesInGroup = (groupId: string, page = 0, perPage = PER_PAGE_DEFAULT, sort = '') => {
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}${buildQueryString({in_group: groupId, page, per_page: perPage, sort})}`,
{method: 'get'},
);
};
getProfilesNotInGroup = (groupId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}${buildQueryString({not_in_group: groupId, page, per_page: perPage})}`,
{method: 'get'},
);
};
getMe = () => {
return this.doFetch<UserProfile>(
`${this.getUserRoute('me')}`,
{method: 'get'},
);
};
getUser = (userId: string) => {
return this.doFetch<UserProfile>(
`${this.getUserRoute(userId)}`,
{method: 'get'},
);
};
getUserByUsername = (username: string) => {
return this.doFetch<UserProfile>(
`${this.getUsersRoute()}/username/${username}`,
{method: 'get'},
);
};
getUserByEmail = (email: string) => {
return this.doFetch<UserProfile>(
`${this.getUsersRoute()}/email/${email}`,
{method: 'get'},
);
};
getProfilePictureUrl = (userId: string, lastPictureUpdate: number) => {
const params: any = {};
if (lastPictureUpdate) {
params._ = lastPictureUpdate;
}
return `${this.getUserRoute(userId)}/image${buildQueryString(params)}`;
};
getDefaultProfilePictureUrl = (userId: string) => {
return `${this.getUserRoute(userId)}/image/default`;
};
autocompleteUsers = (name: string, teamId: string, channelId: string, options = {
limit: AUTOCOMPLETE_LIMIT_DEFAULT,
}) => {
return this.doFetch<UserAutocomplete>(`${this.getUsersRoute()}/autocomplete${buildQueryString({
in_team: teamId,
in_channel: channelId,
name,
limit: options.limit,
})}`, {
method: 'get',
});
};
getSessions = (userId: string) => {
return this.doFetch<Session[]>(
`${this.getUserRoute(userId)}/sessions`,
{method: 'get'},
);
};
revokeSession = (userId: string, sessionId: string) => {
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/sessions/revoke`,
{method: 'post', body: JSON.stringify({session_id: sessionId})},
);
};
revokeAllSessionsForUser = (userId: string) => {
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/sessions/revoke/all`,
{method: 'post'},
);
};
revokeSessionsForAllUsers = () => {
return this.doFetch<StatusOK>(
`${this.getUsersRoute()}/sessions/revoke/all`,
{method: 'post'},
);
};
getUserAudits = (userId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Audit[]>(
`${this.getUserRoute(userId)}/audits${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getUsersForReporting = (filter: UserReportOptions) => {
const queryString = buildQueryString(filter);
return this.doFetch<UserReport[]>(
`${this.getReportsRoute()}/users${queryString}`,
{method: 'get'},
);
};
getUserCountForReporting = (filter: UserReportFilter) => {
const queryString = buildQueryString(filter);
return this.doFetch<number>(
`${this.getReportsRoute()}/users/count${queryString}`,
{method: 'get'},
);
};
startUsersBatchExport = (filter: UserReportFilter) => {
const queryString = buildQueryString(filter);
return this.doFetch<StatusOK>(
`${this.getReportsRoute()}/users/export${queryString}`,
{method: 'post'},
);
};
/**
* @deprecated
*/
checkUserMfa = (loginId: string) => {
return this.doFetch<{mfa_required: boolean}>(
`${this.getUsersRoute()}/mfa`,
{method: 'post', body: JSON.stringify({login_id: loginId})},
);
};
generateMfaSecret = (userId: string) => {
return this.doFetch<MfaSecret>(
`${this.getUserRoute(userId)}/mfa/generate`,
{method: 'post'},
);
};
searchUsers = (term: string, options: any) => {
this.trackEvent('api', 'api_search_users');
return this.doFetch<UserProfile[]>(
`${this.getUsersRoute()}/search`,
{method: 'post', body: JSON.stringify({term, ...options})},
);
};
getStatusesByIds = (userIds: string[]) => {
return this.doFetch<UserStatus[]>(
`${this.getUsersRoute()}/status/ids`,
{method: 'post', body: JSON.stringify(userIds)},
);
};
getStatus = (userId: string) => {
return this.doFetch<UserStatus>(
`${this.getUserRoute(userId)}/status`,
{method: 'get'},
);
};
updateStatus = (status: UserStatus) => {
return this.doFetch<UserStatus>(
`${this.getUserRoute(status.user_id)}/status`,
{method: 'put', body: JSON.stringify(status)},
);
};
updateCustomStatus = (customStatus: UserCustomStatus) => {
return this.doFetch(
`${this.getUserRoute('me')}/status/custom`,
{method: 'put', body: JSON.stringify(customStatus)},
);
};
unsetCustomStatus = () => {
return this.doFetch(
`${this.getUserRoute('me')}/status/custom`,
{method: 'delete'},
);
};
removeRecentCustomStatus = (customStatus: UserCustomStatus) => {
return this.doFetch(
`${this.getUserRoute('me')}/status/custom/recent/delete`,
{method: 'post', body: JSON.stringify(customStatus)},
);
};
moveThread = (postId: string, channelId: string) => {
const url = this.getPostRoute(postId) + '/move';
return this.doFetch<StatusOK>(
url,
{method: 'post', body: JSON.stringify({channel_id: channelId})},
);
};
switchEmailToOAuth = (service: string, email: string, password: string, mfaCode = '') => {
this.trackEvent('api', 'api_users_email_to_oauth');
return this.doFetch<AuthChangeResponse>(
`${this.getUsersRoute()}/login/switch`,
{method: 'post', body: JSON.stringify({current_service: 'email', new_service: service, email, password, mfa_code: mfaCode})},
);
};
switchOAuthToEmail = (currentService: string, email: string, password: string) => {
this.trackEvent('api', 'api_users_oauth_to_email');
return this.doFetch<AuthChangeResponse>(
`${this.getUsersRoute()}/login/switch`,
{method: 'post', body: JSON.stringify({current_service: currentService, new_service: 'email', email, new_password: password})},
);
};
switchEmailToLdap = (email: string, emailPassword: string, ldapId: string, ldapPassword: string, mfaCode = '') => {
this.trackEvent('api', 'api_users_email_to_ldap');
return this.doFetch<AuthChangeResponse>(
`${this.getUsersRoute()}/login/switch`,
{method: 'post', body: JSON.stringify({current_service: 'email', new_service: 'ldap', email, password: emailPassword, ldap_id: ldapId, new_password: ldapPassword, mfa_code: mfaCode})},
);
};
switchLdapToEmail = (ldapPassword: string, email: string, emailPassword: string, mfaCode = '') => {
this.trackEvent('api', 'api_users_ldap_to_email');
return this.doFetch<AuthChangeResponse>(
`${this.getUsersRoute()}/login/switch`,
{method: 'post', body: JSON.stringify({current_service: 'ldap', new_service: 'email', email, password: ldapPassword, new_password: emailPassword, mfa_code: mfaCode})},
);
};
getAuthorizedOAuthApps = (userId: string) => {
return this.doFetch<OAuthApp[]>(
`${this.getUserRoute(userId)}/oauth/apps/authorized`,
{method: 'get'},
);
};
authorizeOAuthApp = (responseType: string, clientId: string, redirectUri: string, state: string, scope: string) => {
return this.doFetch<void>(
`${this.url}/oauth/authorize`,
{method: 'post', body: JSON.stringify({client_id: clientId, response_type: responseType, redirect_uri: redirectUri, state, scope})},
);
};
deauthorizeOAuthApp = (clientId: string) => {
return this.doFetch<StatusOK>(
`${this.url}/oauth/deauthorize`,
{method: 'post', body: JSON.stringify({client_id: clientId})},
);
};
createUserAccessToken = (userId: string, description: string) => {
this.trackEvent('api', 'api_users_create_access_token');
return this.doFetch<UserAccessToken>(
`${this.getUserRoute(userId)}/tokens`,
{method: 'post', body: JSON.stringify({description})},
);
};
getUserAccessToken = (tokenId: string) => {
return this.doFetch<UserAccessToken>(
`${this.getUsersRoute()}/tokens/${tokenId}`,
{method: 'get'},
);
};
getUserAccessTokensForUser = (userId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<UserAccessToken[]>(
`${this.getUserRoute(userId)}/tokens${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getUserAccessTokens = (page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<UserAccessToken[]>(
`${this.getUsersRoute()}/tokens${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
revokeUserAccessToken = (tokenId: string) => {
this.trackEvent('api', 'api_users_revoke_access_token');
return this.doFetch<StatusOK>(
`${this.getUsersRoute()}/tokens/revoke`,
{method: 'post', body: JSON.stringify({token_id: tokenId})},
);
};
disableUserAccessToken = (tokenId: string) => {
return this.doFetch<StatusOK>(
`${this.getUsersRoute()}/tokens/disable`,
{method: 'post', body: JSON.stringify({token_id: tokenId})},
);
};
enableUserAccessToken = (tokenId: string) => {
return this.doFetch<StatusOK>(
`${this.getUsersRoute()}/tokens/enable`,
{method: 'post', body: JSON.stringify({token_id: tokenId})},
);
};
// Limits Routes
getServerLimits = () => {
return this.doFetchWithResponse<ServerLimits>(
`${this.getServerLimitsRoute()}`,
{
method: 'get',
},
);
};
// Team Routes
createTeam = (team: Team) => {
this.trackEvent('api', 'api_teams_create');
return this.doFetch<Team>(
`${this.getTeamsRoute()}`,
{method: 'post', body: JSON.stringify(team)},
);
};
deleteTeam = (teamId: string) => {
this.trackEvent('api', 'api_teams_delete');
return this.doFetch<StatusOK>(
`${this.getTeamRoute(teamId)}`,
{method: 'delete'},
);
};
unarchiveTeam = (teamId: string) => {
return this.doFetch<Team>(
`${this.getTeamRoute(teamId)}/restore`,
{method: 'post'},
);
};
updateTeam = (team: Team) => {
this.trackEvent('api', 'api_teams_update_name', {team_id: team.id});
return this.doFetch<Team>(
`${this.getTeamRoute(team.id)}`,
{method: 'put', body: JSON.stringify(team)},
);
};
patchTeam = (team: Partial<Team> & {id: string}) => {
this.trackEvent('api', 'api_teams_patch_name', {team_id: team.id});
return this.doFetch<Team>(
`${this.getTeamRoute(team.id)}/patch`,
{method: 'put', body: JSON.stringify(team)},
);
};
regenerateTeamInviteId = (teamId: string) => {
this.trackEvent('api', 'api_teams_regenerate_invite_id', {team_id: teamId});
return this.doFetch<Team>(
`${this.getTeamRoute(teamId)}/regenerate_invite_id`,
{method: 'post'},
);
};
updateTeamScheme = (teamId: string, schemeId: string) => {
const patch = {scheme_id: schemeId};
this.trackEvent('api', 'api_teams_update_scheme', {team_id: teamId, ...patch});
return this.doFetch<StatusOK>(
`${this.getTeamSchemeRoute(teamId)}`,
{method: 'put', body: JSON.stringify(patch)},
);
};
checkIfTeamExists = (teamName: string) => {
return this.doFetch<{exists: boolean}>(
`${this.getTeamNameRoute(teamName)}/exists`,
{method: 'get'},
);
};
getTeams = (page = 0, perPage = PER_PAGE_DEFAULT, includeTotalCount = false, excludePolicyConstrained = false) => {
return this.doFetch<Team[] | TeamsWithCount>(
`${this.getTeamsRoute()}${buildQueryString({page, per_page: perPage, include_total_count: includeTotalCount, exclude_policy_constrained: excludePolicyConstrained})}`,
{method: 'get'},
);
};
searchTeams(term: string, opts: PagedTeamSearchOpts): Promise<Team[]>;
searchTeams(term: string, opts: NotPagedTeamSearchOpts): Promise<TeamsWithCount>;
searchTeams(term: string, opts: TeamSearchOpts): Promise<Team[] | TeamsWithCount> {
this.trackEvent('api', 'api_search_teams');
return this.doFetch<Team[] | TeamsWithCount>(
`${this.getTeamsRoute()}/search`,
{method: 'post', body: JSON.stringify({term, ...opts})},
);
}
getTeam = (teamId: string) => {
return this.doFetch<Team>(
this.getTeamRoute(teamId),
{method: 'get'},
);
};
getTeamByName = (teamName: string) => {
this.trackEvent('api', 'api_teams_get_team_by_name');
return this.doFetch<Team>(
this.getTeamNameRoute(teamName),
{method: 'get'},
);
};
getMyTeams = () => {
return this.doFetch<Team[]>(
`${this.getUserRoute('me')}/teams`,
{method: 'get'},
);
};
getTeamsForUser = (userId: string) => {
return this.doFetch<Team[]>(
`${this.getUserRoute(userId)}/teams`,
{method: 'get'},
);
};
getMyTeamMembers = () => {
return this.doFetch<TeamMembership[]>(
`${this.getUserRoute('me')}/teams/members`,
{method: 'get'},
);
};
getMyTeamUnreads = (includeCollapsedThreads = false) => {
return this.doFetch<TeamUnread[]>(
`${this.getUserRoute('me')}/teams/unread${buildQueryString({include_collapsed_threads: includeCollapsedThreads})}`,
{method: 'get'},
);
};
getTeamMembers = (teamId: string, page = 0, perPage = PER_PAGE_DEFAULT, options?: GetTeamMembersOpts) => {
return this.doFetch<TeamMembership[]>(
`${this.getTeamMembersRoute(teamId)}${buildQueryString({page, per_page: perPage, ...options})}`,
{method: 'get'},
);
};
getTeamMembersForUser = (userId: string) => {
return this.doFetch<TeamMembership[]>(
`${this.getUserRoute(userId)}/teams/members`,
{method: 'get'},
);
};
getTeamMember = (teamId: string, userId: string) => {
return this.doFetch<TeamMembership>(
`${this.getTeamMemberRoute(teamId, userId)}`,
{method: 'get'},
);
};
getTeamMembersByIds = (teamId: string, userIds: string[]) => {
return this.doFetch<TeamMembership[]>(
`${this.getTeamMembersRoute(teamId)}/ids`,
{method: 'post', body: JSON.stringify(userIds)},
);
};
addToTeam = (teamId: string, userId: string) => {
this.trackEvent('api', 'api_teams_invite_members', {team_id: teamId});
const member = {user_id: userId, team_id: teamId};
return this.doFetch<TeamMembership>(
`${this.getTeamMembersRoute(teamId)}`,
{method: 'post', body: JSON.stringify(member)},
);
};
addToTeamFromInvite = (token = '', inviteId = '') => {
this.trackEvent('api', 'api_teams_invite_members');
const query = buildQueryString({token, invite_id: inviteId});
return this.doFetch<TeamMembership>(
`${this.getTeamsRoute()}/members/invite${query}`,
{method: 'post'},
);
};
addUsersToTeam = (teamId: string, userIds: string[]) => {
this.trackEvent('api', 'api_teams_batch_add_members', {team_id: teamId, count: userIds.length});
const members: any = [];
userIds.forEach((id) => members.push({team_id: teamId, user_id: id}));
return this.doFetch<TeamMembership[]>(
`${this.getTeamMembersRoute(teamId)}/batch`,
{method: 'post', body: JSON.stringify(members)},
);
};
addUsersToTeamGracefully = (teamId: string, userIds: string[]) => {
this.trackEvent('api', 'api_teams_batch_add_members', {team_id: teamId, count: userIds.length});
const members: any = [];
userIds.forEach((id) => members.push({team_id: teamId, user_id: id}));
return this.doFetch<TeamMemberWithError[]>(
`${this.getTeamMembersRoute(teamId)}/batch?graceful=true`,
{method: 'post', body: JSON.stringify(members)},
);
};
joinTeam = (inviteId: string) => {
const query = buildQueryString({invite_id: inviteId});
return this.doFetch<TeamMembership>(
`${this.getTeamsRoute()}/members/invite${query}`,
{method: 'post'},
);
};
removeFromTeam = (teamId: string, userId: string) => {
this.trackEvent('api', 'api_teams_remove_members', {team_id: teamId});
return this.doFetch<StatusOK>(
`${this.getTeamMemberRoute(teamId, userId)}`,
{method: 'delete'},
);
};
getTeamStats = (teamId: string) => {
return this.doFetch<TeamStats>(
`${this.getTeamRoute(teamId)}/stats`,
{method: 'get'},
);
};
getTotalUsersStats = () => {
return this.doFetch<UsersStats>(
`${this.getUsersRoute()}/stats`,
{method: 'get'},
);
};
getFilteredUsersStats = (options: GetFilteredUsersStatsOpts) => {
return this.doFetch<UsersStats>(
`${this.getUsersRoute()}/stats/filtered${buildQueryString(options)}`,
{method: 'get'},
);
};
invalidateAllEmailInvites = () => {
return this.doFetch<StatusOK>(
`${this.getTeamsRoute()}/invites/email`,
{method: 'delete'},
);
};
getTeamInviteInfo = (inviteId: string) => {
return this.doFetch<{
display_name: string;
description: string;
name: string;
id: string;
}>(
`${this.getTeamsRoute()}/invite/${inviteId}`,
{method: 'get'},
);
};
updateTeamMemberRoles = (teamId: string, userId: string, roles: string[]) => {
this.trackEvent('api', 'api_teams_update_member_roles', {team_id: teamId});
return this.doFetch<StatusOK>(
`${this.getTeamMemberRoute(teamId, userId)}/roles`,
{method: 'put', body: JSON.stringify({roles})},
);
};
sendEmailInvitesToTeam = (teamId: string, emails: string[]) => {
this.trackEvent('api', 'api_teams_invite_members', {team_id: teamId});
return this.doFetch<StatusOK>(
`${this.getTeamRoute(teamId)}/invite/email`,
{method: 'post', body: JSON.stringify(emails)},
);
};
sendEmailGuestInvitesToChannels = (teamId: string, channelIds: string[], emails: string[], message: string) => {
this.trackEvent('api', 'api_teams_invite_guests', {team_id: teamId, channel_ids: channelIds});
return this.doFetch<StatusOK>(
`${this.getTeamRoute(teamId)}/invite-guests/email`,
{method: 'post', body: JSON.stringify({emails, channels: channelIds, message})},
);
};
sendEmailInvitesToTeamGracefully = (teamId: string, emails: string[]) => {
this.trackEvent('api', 'api_teams_invite_members', {team_id: teamId});
return this.doFetch<TeamInviteWithError[]>(
`${this.getTeamRoute(teamId)}/invite/email?graceful=true`,
{method: 'post', body: JSON.stringify(emails)},
);
};
sendEmailInvitesToTeamAndChannelsGracefully = (
teamId: string,
channelIds: string[],
emails: string[],
message: string,
) => {
this.trackEvent('api', 'api_teams_invite_members_to_channels', {team_id: teamId, channel_len: channelIds.length});
return this.doFetch<TeamInviteWithError[]>(
`${this.getTeamRoute(teamId)}/invite/email?graceful=true`,
{method: 'post', body: JSON.stringify({emails, channelIds, message})},
);
};
sendEmailGuestInvitesToChannelsGracefully = async (teamId: string, channelIds: string[], emails: string[], message: string) => {
this.trackEvent('api', 'api_teams_invite_guests', {team_id: teamId, channel_ids: channelIds});
return this.doFetch<TeamInviteWithError[]>(
`${this.getTeamRoute(teamId)}/invite-guests/email?graceful=true`,
{method: 'post', body: JSON.stringify({emails, channels: channelIds, message})},
);
};
getTeamIconUrl = (teamId: string, lastTeamIconUpdate: number) => {
const params: any = {};
if (lastTeamIconUpdate) {
params._ = lastTeamIconUpdate;
}
return `${this.getTeamRoute(teamId)}/image${buildQueryString(params)}`;
};
setTeamIcon = (teamId: string, imageData: File) => {
this.trackEvent('api', 'api_team_set_team_icon');
const formData = new FormData();
formData.append('image', imageData);
const request: any = {
method: 'post',
body: formData,
};
return this.doFetch<StatusOK>(
`${this.getTeamRoute(teamId)}/image`,
request,
);
};
removeTeamIcon = (teamId: string) => {
this.trackEvent('api', 'api_team_remove_team_icon');
return this.doFetch<StatusOK>(
`${this.getTeamRoute(teamId)}/image`,
{method: 'delete'},
);
};
updateTeamMemberSchemeRoles = (teamId: string, userId: string, isSchemeUser: boolean, isSchemeAdmin: boolean) => {
const body = {scheme_user: isSchemeUser, scheme_admin: isSchemeAdmin};
return this.doFetch<StatusOK>(
`${this.getTeamRoute(teamId)}/members/${userId}/schemeRoles`,
{method: 'put', body: JSON.stringify(body)},
);
};
// Channel Routes
getAllChannels(
page: number | undefined,
perPage: number | undefined,
notAssociatedToGroup: string | undefined,
excludeDefaultChannels: boolean | undefined,
includeTotalCount: false | undefined,
includeDeleted: boolean | undefined,
excludePolicyConstrained: boolean | undefined
): Promise<ChannelWithTeamData[]>;
getAllChannels(
page: number | undefined,
perPage: number | undefined,
notAssociatedToGroup: string | undefined,
excludeDefaultChannels: boolean | undefined,
includeTotalCount: true,
includeDeleted: boolean | undefined,
excludePolicyConstrained: boolean | undefined
): Promise<ChannelsWithTotalCount>;
getAllChannels(
page = 0,
perPage = PER_PAGE_DEFAULT,
notAssociatedToGroup = '',
excludeDefaultChannels = false,
includeTotalCount = false,
includeDeleted = false,
excludePolicyConstrained = false,
) {
const queryData = {
page,
per_page: perPage,
not_associated_to_group: notAssociatedToGroup,
exclude_default_channels: excludeDefaultChannels,
include_total_count: includeTotalCount,
include_deleted: includeDeleted,
exclude_policy_constrained: excludePolicyConstrained,
};
return this.doFetch<ChannelWithTeamData[] | ChannelsWithTotalCount>(
`${this.getChannelsRoute()}${buildQueryString(queryData)}`,
{method: 'get'},
);
}
createChannel = (channel: Channel) => {
this.trackEvent('api', 'api_channels_create', {team_id: channel.team_id});
return this.doFetch<ServerChannel>(
`${this.getChannelsRoute()}`,
{method: 'post', body: JSON.stringify(channel)},
);
};
createDirectChannel = (userIds: string[]) => {
this.trackEvent('api', 'api_channels_create_direct');
return this.doFetch<ServerChannel>(
`${this.getChannelsRoute()}/direct`,
{method: 'post', body: JSON.stringify(userIds)},
);
};
createGroupChannel = (userIds: string[]) => {
this.trackEvent('api', 'api_channels_create_group');
return this.doFetch<ServerChannel>(
`${this.getChannelsRoute()}/group`,
{method: 'post', body: JSON.stringify(userIds)},
);
};
deleteChannel = (channelId: string) => {
this.trackEvent('api', 'api_channels_delete', {channel_id: channelId});
return this.doFetch<StatusOK>(
`${this.getChannelRoute(channelId)}`,
{method: 'delete'},
);
};
unarchiveChannel = (channelId: string) => {
this.trackEvent('api', 'api_channels_unarchive', {channel_id: channelId});
return this.doFetch<ServerChannel>(
`${this.getChannelRoute(channelId)}/restore`,
{method: 'post'},
);
};
updateChannel = (channel: Channel) => {
this.trackEvent('api', 'api_channels_update', {channel_id: channel.id});
return this.doFetch<ServerChannel>(
`${this.getChannelRoute(channel.id)}`,
{method: 'put', body: JSON.stringify(channel)},
);
};
updateChannelPrivacy = (channelId: string, privacy: any) => {
this.trackEvent('api', 'api_channels_update_privacy', {channel_id: channelId, privacy});
return this.doFetch<ServerChannel>(
`${this.getChannelRoute(channelId)}/privacy`,
{method: 'put', body: JSON.stringify({privacy})},
);
};
patchChannel = (channelId: string, channelPatch: Partial<Channel>) => {
this.trackEvent('api', 'api_channels_patch', {channel_id: channelId});
return this.doFetch<ServerChannel>(
`${this.getChannelRoute(channelId)}/patch`,
{method: 'put', body: JSON.stringify(channelPatch)},
);
};
updateChannelNotifyProps = (props: any) => {
this.trackEvent('api', 'api_users_update_channel_notifications', {channel_id: props.channel_id});
return this.doFetch<StatusOK>(
`${this.getChannelMemberRoute(props.channel_id, props.user_id)}/notify_props`,
{method: 'put', body: JSON.stringify(props)},
);
};
updateChannelScheme = (channelId: string, schemeId: string) => {
const patch = {scheme_id: schemeId};
this.trackEvent('api', 'api_channels_update_scheme', {channel_id: channelId, ...patch});
return this.doFetch<StatusOK>(
`${this.getChannelSchemeRoute(channelId)}`,
{method: 'put', body: JSON.stringify(patch)},
);
};
getChannel = (channelId: string) => {
return this.doFetch<ServerChannel>(
`${this.getChannelRoute(channelId)}`,
{method: 'get'},
);
};
getChannelByName = (teamId: string, channelName: string, includeDeleted = false) => {
return this.doFetch<ServerChannel>(
`${this.getTeamRoute(teamId)}/channels/name/${channelName}?include_deleted=${includeDeleted}`,
{method: 'get'},
);
};
getChannelByNameAndTeamName = (teamName: string, channelName: string, includeDeleted = false) => {
return this.doFetch<ServerChannel>(
`${this.getTeamNameRoute(teamName)}/channels/name/${channelName}?include_deleted=${includeDeleted}`,
{method: 'get'},
);
};
getChannels = (teamId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<ServerChannel[]>(
`${this.getTeamRoute(teamId)}/channels${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getAllTeamsChannels = () => {
return this.doFetch<ServerChannel[]>(
`${this.getUsersRoute()}/me/channels`,
{method: 'get'},
);
};
getArchivedChannels = (teamId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<ServerChannel[]>(
`${this.getTeamRoute(teamId)}/channels/deleted${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getMyChannels = (teamId: string, includeDeleted = false) => {
return this.doFetch<ServerChannel[]>(
`${this.getUserRoute('me')}/teams/${teamId}/channels${buildQueryString({include_deleted: includeDeleted})}`,
{method: 'get'},
);
};
getAllChannelsMembers = (userId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<ChannelMembership[]>(
`${this.getUserRoute(userId)}/channel_members${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getMyChannelMember = (channelId: string) => {
return this.doFetch<ChannelMembership>(
`${this.getChannelMemberRoute(channelId, 'me')}`,
{method: 'get'},
);
};
getMyChannelMembers = (teamId: string) => {
return this.doFetch<ChannelMembership[]>(
`${this.getUserRoute('me')}/teams/${teamId}/channels/members`,
{method: 'get'},
);
};
getChannelMembers = (channelId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<ChannelMembership[]>(
`${this.getChannelMembersRoute(channelId)}${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getChannelTimezones = (channelId: string) => {
return this.doFetch<string[]>(
`${this.getChannelRoute(channelId)}/timezones`,
{method: 'get'},
);
};
getChannelMember = (channelId: string, userId: string) => {
return this.doFetch<ChannelMembership>(
`${this.getChannelMemberRoute(channelId, userId)}`,
{method: 'get'},
);
};
getChannelMembersByIds = (channelId: string, userIds: string[]) => {
return this.doFetch<ChannelMembership[]>(
`${this.getChannelMembersRoute(channelId)}/ids`,
{method: 'post', body: JSON.stringify(userIds)},
);
};
addToChannels = (userIds: string[], channelId: string, postRootId = '') => {
this.trackEvent('api', 'api_channels_add_members', {channel_id: channelId});
const members = {user_ids: userIds, channel_id: channelId, post_root_id: postRootId};
return this.doFetch<ChannelMembership[]>(
`${this.getChannelMembersRoute(channelId)}`,
{method: 'post', body: JSON.stringify(members)},
);
};
addToChannel = (userId: string, channelId: string, postRootId = '') => {
this.trackEvent('api', 'api_channels_add_member', {channel_id: channelId});
const member = {user_id: userId, channel_id: channelId, post_root_id: postRootId};
return this.doFetch<ChannelMembership>(
`${this.getChannelMembersRoute(channelId)}`,
{method: 'post', body: JSON.stringify(member)},
);
};
removeFromChannel = (userId: string, channelId: string) => {
this.trackEvent('api', 'api_channels_remove_member', {channel_id: channelId});
return this.doFetch<StatusOK>(
`${this.getChannelMemberRoute(channelId, userId)}`,
{method: 'delete'},
);
};
updateChannelMemberRoles = (channelId: string, userId: string, roles: string) => {
return this.doFetch<StatusOK>(
`${this.getChannelMemberRoute(channelId, userId)}/roles`,
{method: 'put', body: JSON.stringify({roles})},
);
};
getChannelStats = (channelId: string, includeFileCount = false) => {
const param = includeFileCount ? '' : '?exclude_files_count=true';
return this.doFetch<ChannelStats>(
`${this.getChannelRoute(channelId)}/stats${param}`,
{method: 'get'},
);
};
getChannelsMemberCount = (channelIds: string[]) => {
return this.doFetch<Record<string, number>>(
`${this.getChannelsRoute()}/stats/member_count`,
{method: 'post', body: JSON.stringify(channelIds)},
);
};
getChannelModerations = (channelId: string) => {
return this.doFetch<ChannelModeration[]>(
`${this.getChannelRoute(channelId)}/moderations`,
{method: 'get'},
);
};
patchChannelModerations = (channelId: string, channelModerationsPatch: ChannelModerationPatch[]) => {
return this.doFetch<ChannelModeration[]>(
`${this.getChannelRoute(channelId)}/moderations/patch`,
{method: 'put', body: JSON.stringify(channelModerationsPatch)},
);
};
getChannelMemberCountsByGroup = (channelId: string, includeTimezones: boolean) => {
return this.doFetch<ChannelMemberCountsByGroup>(
`${this.getChannelRoute(channelId)}/member_counts_by_group?include_timezones=${includeTimezones}`,
{method: 'get'},
);
};
viewMyChannel = (channelId: string) => {
const data = {channel_id: channelId, collapsed_threads_supported: true};
return this.doFetch<ChannelViewResponse>(
`${this.getChannelsRoute()}/members/me/view`,
{method: 'post', body: JSON.stringify(data)},
);
};
readMultipleChannels = (channelIds: string[]) => {
return this.doFetch<ChannelViewResponse>(
`${this.getChannelsRoute()}/members/me/mark_read`,
{method: 'post', body: JSON.stringify(channelIds)},
);
};
autocompleteChannels = (teamId: string, name: string) => {
return this.doFetch<Channel[]>(
`${this.getTeamRoute(teamId)}/channels/autocomplete${buildQueryString({name})}`,
{method: 'get'},
);
};
autocompleteChannelsForSearch = (teamId: string, name: string) => {
return this.doFetch<Channel[]>(
`${this.getTeamRoute(teamId)}/channels/search_autocomplete${buildQueryString({name})}`,
{method: 'get'},
);
};
searchChannels = (teamId: string, term: string) => {
return this.doFetch<Channel[]>(
`${this.getTeamRoute(teamId)}/channels/search`,
{method: 'post', body: JSON.stringify({term})},
);
};
searchArchivedChannels = (teamId: string, term: string) => {
return this.doFetch<Channel[]>(
`${this.getTeamRoute(teamId)}/channels/search_archived`,
{method: 'post', body: JSON.stringify({term})},
);
};
searchAllChannels(term: string, opts: {page: number; per_page: number} & ChannelSearchOpts & OptsSignalExt): Promise<ChannelsWithTotalCount>;
searchAllChannels(term: string, opts: Omit<ChannelSearchOpts, 'page' | 'per_page'> & OptsSignalExt | undefined): Promise<ChannelWithTeamData[]>;
searchAllChannels(term: string, opts: ChannelSearchOpts & OptsSignalExt = {}) {
const body = {
term,
...opts,
};
const includeDeleted = Boolean(opts.include_deleted);
const nonAdminSearch = Boolean(opts.nonAdminSearch);
const excludeRemote = Boolean(opts.exclude_remote);
let queryParams: {include_deleted?: boolean; system_console?: boolean; exclude_remote?: boolean} = {include_deleted: includeDeleted, exclude_remote: excludeRemote};
if (nonAdminSearch) {
queryParams = {system_console: false};
delete body.nonAdminSearch;
}
return this.doFetch<ChannelWithTeamData[] | ChannelsWithTotalCount>(
`${this.getChannelsRoute()}/search${buildQueryString(queryParams)}`,
{method: 'post', body: JSON.stringify(body), signal: opts.signal},
);
}
searchGroupChannels = (term: string) => {
return this.doFetch<Channel[]>(
`${this.getChannelsRoute()}/group/search`,
{method: 'post', body: JSON.stringify({term})},
);
};
updateChannelMemberSchemeRoles = (channelId: string, userId: string, isSchemeUser: boolean, isSchemeAdmin: boolean) => {
const body = {scheme_user: isSchemeUser, scheme_admin: isSchemeAdmin};
return this.doFetch<StatusOK>(
`${this.getChannelRoute(channelId)}/members/${userId}/schemeRoles`,
{method: 'put', body: JSON.stringify(body)},
);
};
// Channel Bookmark Routes
getChannelBookmarks = (channelId: string, bookmarksSince?: number) => {
return this.doFetch<ChannelBookmark[]>(
`${this.getChannelBookmarksRoute(channelId)}${buildQueryString({bookmarks_since: bookmarksSince})}`,
{method: 'get'},
);
};
createChannelBookmark = (channelId: string, channelBookmark: ChannelBookmarkCreate, connectionId: string) => {
return this.doFetch<ChannelBookmark>(
`${this.getChannelBookmarksRoute(channelId)}`,
{method: 'post', body: JSON.stringify(channelBookmark), headers: {'Connection-Id': connectionId}},
);
};
deleteChannelBookmark = (channelId: string, channelBookmarkId: string, connectionId: string) => {
return this.doFetch<ChannelBookmark>(
`${this.getChannelBookmarkRoute(channelId, channelBookmarkId)}`,
{method: 'delete', headers: {'Connection-Id': connectionId}},
);
};
updateChannelBookmark = (channelId: string, channelBookmarkId: string, patch: ChannelBookmarkPatch, connectionId: string) => {
return this.doFetch<{updated: ChannelBookmark; deleted: ChannelBookmark}>(
`${this.getChannelBookmarkRoute(channelId, channelBookmarkId)}`,
{method: 'PATCH', body: JSON.stringify(patch), headers: {'Connection-Id': connectionId}},
);
};
updateChannelBookmarkSortOrder = (channelId: string, channelBookmarkId: string, newOrder: number, connectionId: string) => {
return this.doFetch<ChannelBookmark[]>(
`${this.getChannelBookmarksRoute(channelId)}/${channelBookmarkId}/sort_order`,
{method: 'post', body: JSON.stringify(newOrder), headers: {'Connection-Id': connectionId}},
);
};
// Channel Category Routes
getChannelCategories = (userId: string, teamId: string) => {
return this.doFetch<OrderedChannelCategories>(
`${this.getChannelCategoriesRoute(userId, teamId)}`,
{method: 'get'},
);
};
createChannelCategory = (userId: string, teamId: string, category: Partial<ChannelCategory>) => {
return this.doFetch<ChannelCategory>(
`${this.getChannelCategoriesRoute(userId, teamId)}`,
{method: 'post', body: JSON.stringify(category)},
);
};
updateChannelCategories = (userId: string, teamId: string, categories: ChannelCategory[]) => {
return this.doFetch<ChannelCategory[]>(
`${this.getChannelCategoriesRoute(userId, teamId)}`,
{method: 'put', body: JSON.stringify(categories)},
);
};
getChannelCategoryOrder = (userId: string, teamId: string) => {
return this.doFetch<string[]>(
`${this.getChannelCategoriesRoute(userId, teamId)}/order`,
{method: 'get'},
);
};
updateChannelCategoryOrder = (userId: string, teamId: string, categoryOrder: string[]) => {
return this.doFetch<string[]>(
`${this.getChannelCategoriesRoute(userId, teamId)}/order`,
{method: 'put', body: JSON.stringify(categoryOrder)},
);
};
getChannelCategory = (userId: string, teamId: string, categoryId: string) => {
return this.doFetch<ChannelCategory>(
`${this.getChannelCategoriesRoute(userId, teamId)}/${categoryId}`,
{method: 'get'},
);
};
updateChannelCategory = (userId: string, teamId: string, category: ChannelCategory) => {
return this.doFetch<ChannelCategory>(
`${this.getChannelCategoriesRoute(userId, teamId)}/${category.id}`,
{method: 'put', body: JSON.stringify(category)},
);
};
deleteChannelCategory = (userId: string, teamId: string, categoryId: string) => {
return this.doFetch<ChannelCategory>(
`${this.getChannelCategoriesRoute(userId, teamId)}/${categoryId}`,
{method: 'delete'},
);
};
// Remote Clusters Routes
getRemoteClusters = (options: {excludePlugins: boolean}) => {
return this.doFetch<RemoteCluster[]>(
`${this.getRemoteClustersRoute()}${buildQueryString({exclude_plugins: options.excludePlugins})}`,
{method: 'GET'},
);
};
getRemoteCluster = (remoteId: string) => {
return this.doFetch<RemoteCluster>(
`${this.getRemoteClusterRoute(remoteId)}`,
{method: 'GET'},
);
};
createRemoteCluster = (remoteCluster: PartialExcept<RemoteClusterWithPassword, 'name' | 'display_name'>) => {
return this.doFetch<{invite: string; password: string; remote_cluster: RemoteCluster}>(
`${this.getRemoteClustersRoute()}`,
{method: 'POST', body: JSON.stringify(remoteCluster)},
);
};
patchRemoteCluster = (remoteId: string, patch: Partial<RemoteClusterPatch>) => {
return this.doFetch<RemoteCluster>(
`${this.getRemoteClusterRoute(remoteId)}`,
{method: 'PATCH', body: JSON.stringify(patch)},
);
};
deleteRemoteCluster = (remoteId: string) => {
return this.doFetch(
`${this.getRemoteClusterRoute(remoteId)}`,
{method: 'DELETE'},
);
};
acceptInviteRemoteCluster = (remoteClusterAcceptInvite: RemoteClusterAcceptInvite) => {
return this.doFetch<RemoteCluster>(
`${this.getRemoteClustersRoute()}/accept_invite`,
{method: 'POST', body: JSON.stringify(remoteClusterAcceptInvite)},
);
};
generateInviteRemoteCluster = (remoteId: string, remoteCluster: Partial<Pick<RemoteClusterWithPassword, 'password'>>) => {
return this.doFetch<string>(
`${this.getRemoteClusterRoute(remoteId)}/generate_invite`,
{method: 'POST', body: JSON.stringify(remoteCluster)},
);
};
// Shared Channels Routes
getSharedChannelRemotes = (
remoteId: string,
filters: {
exclude_remote?: boolean;
exclude_home?: boolean;
include_deleted?: boolean;
include_unconfirmed?: boolean;
exclude_confirmed?: boolean;
},
) => {
return this.doFetch<SharedChannelRemote[]>(
`${this.getRemoteClusterRoute(remoteId)}/sharedchannelremotes${buildQueryString(filters)}`,
{method: 'GET'},
);
};
sharedChannelRemoteInvite = (remoteId: string, channelId: string) => {
return this.doFetch<StatusOK>(
`${this.getRemoteClusterRoute(remoteId)}/channels/${channelId}/invite`,
{method: 'POST'},
);
};
sharedChannelRemoteUninvite = (remoteId: string, channelId: string) => {
return this.doFetch<StatusOK>(
`${this.getRemoteClusterRoute(remoteId)}/channels/${channelId}/uninvite`,
{method: 'POST'},
);
};
// Post Routes
createPost = async (post: Post) => {
const result = await this.doFetch<Post>(
`${this.getPostsRoute()}`,
{method: 'post', body: JSON.stringify(post)},
);
const analyticsData = {channel_id: result.channel_id, post_id: result.id, user_actual_id: result.user_id, root_id: result.root_id} as PostAnalytics;
if (post.metadata?.priority) {
analyticsData.priority = post.metadata.priority.priority;
analyticsData.requested_ack = post.metadata.priority.requested_ack;
analyticsData.persistent_notifications = post.metadata.priority.persistent_notifications;
}
this.trackEvent('api', 'api_posts_create', analyticsData);
if (result.root_id != null && result.root_id !== '') {
this.trackEvent('api', 'api_posts_replied', analyticsData);
}
return result;
};
updatePost = (post: Post) => {
this.trackEvent('api', 'api_posts_update', {channel_id: post.channel_id, post_id: post.id});
return this.doFetch<Post>(
`${this.getPostRoute(post.id)}`,
{method: 'put', body: JSON.stringify(post)},
);
};
getPost = (postId: string) => {
return this.doFetch<Post>(
`${this.getPostRoute(postId)}`,
{method: 'get'},
);
};
patchPost = (postPatch: Partial<Post> & {id: string}) => {
this.trackEvent('api', 'api_posts_patch', {channel_id: postPatch.channel_id, post_id: postPatch.id});
return this.doFetch<Post>(
`${this.getPostRoute(postPatch.id)}/patch`,
{method: 'put', body: JSON.stringify(postPatch)},
);
};
deletePost = (postId: string) => {
this.trackEvent('api', 'api_posts_delete');
return this.doFetch<StatusOK>(
`${this.getPostRoute(postId)}`,
{method: 'delete'},
);
};
getPostThread = (postId: string, fetchThreads = true, collapsedThreads = false, collapsedThreadsExtended = false) => {
// this is to ensure we have backwards compatibility for `getPostThread`
return this.getPaginatedPostThread(postId, {fetchThreads, collapsedThreads, collapsedThreadsExtended});
};
getPaginatedPostThread = async (postId: string, options: FetchPaginatedThreadOptions): Promise<PaginatedPostList> => {
// getting all option parameters with defaults from the options object and spread the rest
const {
fetchThreads = true,
collapsedThreads = false,
collapsedThreadsExtended = false,
direction = 'down',
fetchAll = false,
perPage = fetchAll ? undefined : PER_PAGE_DEFAULT,
...rest
} = options;
return this.doFetch<PaginatedPostList>(
`${this.getPostRoute(postId)}/thread${buildQueryString({skipFetchThreads: !fetchThreads, collapsedThreads, collapsedThreadsExtended, direction, perPage, ...rest})}`,
{method: 'get'},
);
};
getPosts = (channelId: string, page = 0, perPage = PER_PAGE_DEFAULT, fetchThreads = true, collapsedThreads = false, collapsedThreadsExtended = false) => {
return this.doFetch<PostList>(
`${this.getChannelRoute(channelId)}/posts${buildQueryString({page, per_page: perPage, skipFetchThreads: !fetchThreads, collapsedThreads, collapsedThreadsExtended})}`,
{method: 'get'},
);
};
getPostsUnread = (channelId: string, userId: string, limitAfter = DEFAULT_LIMIT_AFTER, limitBefore = DEFAULT_LIMIT_BEFORE, fetchThreads = true, collapsedThreads = false, collapsedThreadsExtended = false) => {
return this.doFetch<PostList>(
`${this.getUserRoute(userId)}/channels/${channelId}/posts/unread${buildQueryString({limit_after: limitAfter, limit_before: limitBefore, skipFetchThreads: !fetchThreads, collapsedThreads, collapsedThreadsExtended})}`,
{method: 'get'},
);
};
getPostsSince = (channelId: string, since: number, fetchThreads = true, collapsedThreads = false, collapsedThreadsExtended = false) => {
return this.doFetch<PostList>(
`${this.getChannelRoute(channelId)}/posts${buildQueryString({since, skipFetchThreads: !fetchThreads, collapsedThreads, collapsedThreadsExtended})}`,
{method: 'get'},
);
};
getPostsBefore = (channelId: string, postId: string, page = 0, perPage = PER_PAGE_DEFAULT, fetchThreads = true, collapsedThreads = false, collapsedThreadsExtended = false) => {
return this.doFetch<PostList>(
`${this.getChannelRoute(channelId)}/posts${buildQueryString({before: postId, page, per_page: perPage, skipFetchThreads: !fetchThreads, collapsedThreads, collapsedThreadsExtended})}`,
{method: 'get'},
);
};
getPostsAfter = (channelId: string, postId: string, page = 0, perPage = PER_PAGE_DEFAULT, fetchThreads = true, collapsedThreads = false, collapsedThreadsExtended = false) => {
return this.doFetch<PostList>(
`${this.getChannelRoute(channelId)}/posts${buildQueryString({after: postId, page, per_page: perPage, skipFetchThreads: !fetchThreads, collapsedThreads, collapsedThreadsExtended})}`,
{method: 'get'},
);
};
getUserThreads = (
userId: UserProfile['id'] = 'me',
teamId: Team['id'],
{
before = '',
after = '',
perPage = PER_PAGE_DEFAULT,
extended = false,
deleted = false,
unread = false,
since = 0,
totalsOnly = false,
threadsOnly = false,
},
) => {
return this.doFetch<UserThreadList>(
`${this.getUserThreadsRoute(userId, teamId)}${buildQueryString({before, after, per_page: perPage, extended, deleted, unread, since, totalsOnly, threadsOnly})}`,
{method: 'get'},
);
};
getUserThread = (userId: string, teamId: string, threadId: string, extended = false) => {
const url = `${this.getUserThreadRoute(userId, teamId, threadId)}`;
return this.doFetch<UserThreadWithPost>(
`${url}${buildQueryString({extended})}`,
{method: 'get'},
);
};
updateThreadsReadForUser = (userId: string, teamId: string) => {
const url = `${this.getUserThreadsRoute(userId, teamId)}/read`;
return this.doFetch<StatusOK>(
url,
{method: 'put'},
);
};
updateThreadReadForUser = (userId: string, teamId: string, threadId: string, timestamp: number) => {
const url = `${this.getUserThreadRoute(userId, teamId, threadId)}/read/${timestamp}`;
return this.doFetch<UserThread>(
url,
{method: 'put'},
);
};
markThreadAsUnreadForUser = (userId: string, teamId: string, threadId: string, postId: string) => {
const url = `${this.getUserThreadRoute(userId, teamId, threadId)}/set_unread/${postId}`;
return this.doFetch<UserThread>(
url,
{method: 'post'},
);
};
updateThreadFollowForUser = (userId: string, teamId: string, threadId: string, state: boolean) => {
const url = this.getUserThreadRoute(userId, teamId, threadId) + '/following';
return this.doFetch<StatusOK>(
url,
{method: state ? 'put' : 'delete'},
);
};
getFileInfosForPost = (postId: string) => {
return this.doFetch<FileInfo[]>(
`${this.getPostRoute(postId)}/files/info`,
{method: 'get'},
);
};
getFlaggedPosts = (userId: string, channelId = '', teamId = '', page = 0, perPage = PER_PAGE_DEFAULT) => {
this.trackEvent('api', 'api_posts_get_flagged', {team_id: teamId});
return this.doFetch<PostList>(
`${this.getUserRoute(userId)}/posts/flagged${buildQueryString({channel_id: channelId, team_id: teamId, page, per_page: perPage})}`,
{method: 'get'},
);
};
getPinnedPosts = (channelId: string) => {
this.trackEvent('api', 'api_posts_get_pinned', {channel_id: channelId});
return this.doFetch<PostList>(
`${this.getChannelRoute(channelId)}/pinned`,
{method: 'get'},
);
};
markPostAsUnread = (userId: string, postId: string) => {
this.trackEvent('api', 'api_post_set_unread_post');
return this.doFetch<ChannelUnread>(
`${this.getUserRoute(userId)}/posts/${postId}/set_unread`,
{method: 'post', body: JSON.stringify({collapsed_threads_supported: true})},
);
};
addPostReminder = (userId: string, postId: string, timestamp: number) => {
this.trackEvent('api', 'api_post_set_reminder');
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/posts/${postId}/reminder`,
{method: 'post', body: JSON.stringify({target_time: timestamp})},
);
};
pinPost = (postId: string) => {
this.trackEvent('api', 'api_posts_pin');
return this.doFetch<StatusOK>(
`${this.getPostRoute(postId)}/pin`,
{method: 'post'},
);
};
unpinPost = (postId: string) => {
this.trackEvent('api', 'api_posts_unpin');
return this.doFetch<StatusOK>(
`${this.getPostRoute(postId)}/unpin`,
{method: 'post'},
);
};
getPostInfo = (postId: string) => {
return this.doFetch<PostInfo>(
`${this.getPostRoute(postId)}/info`,
{method: 'get'},
);
};
getPostsByIds = (postIds: string[]) => {
return this.doFetch<Post[]>(
`${this.getPostsRoute()}/ids`,
{method: 'post', body: JSON.stringify(postIds)},
);
};
getPostEditHistory = (postId: string) => {
return this.doFetch<Post[]>(
`${this.getPostRoute(postId)}/edit_history`,
{method: 'get'},
);
};
addReaction = (userId: string, postId: string, emojiName: string) => {
this.trackEvent('api', 'api_reactions_save', {post_id: postId});
return this.doFetch<Reaction>(
`${this.getReactionsRoute()}`,
{method: 'post', body: JSON.stringify({user_id: userId, post_id: postId, emoji_name: emojiName})},
);
};
removeReaction = (userId: string, postId: string, emojiName: string) => {
this.trackEvent('api', 'api_reactions_delete', {post_id: postId});
return this.doFetch<StatusOK>(
`${this.getUserRoute(userId)}/posts/${postId}/reactions/${emojiName}`,
{method: 'delete'},
);
};
getReactionsForPost = (postId: string) => {
return this.doFetch<Reaction[]>(
`${this.getPostRoute(postId)}/reactions`,
{method: 'get'},
);
};
searchPostsWithParams = (teamId: string, params: any) => {
this.trackEvent('api', 'api_posts_search', {team_id: teamId});
let route = `${this.getPostsRoute()}/search`;
if (teamId) {
route = `${this.getTeamRoute(teamId)}/posts/search`;
}
return this.doFetch<PostSearchResults>(
route,
{method: 'post', body: JSON.stringify(params)},
);
};
searchPosts = (teamId: string, terms: string, isOrSearch: boolean) => {
return this.searchPostsWithParams(teamId, {terms, is_or_search: isOrSearch});
};
searchFilesWithParams = (teamId: string, params: any) => {
this.trackEvent('api', 'api_files_search', {team_id: teamId});
return this.doFetch<FileSearchResults>(
`${this.getTeamRoute(teamId)}/files/search`,
{method: 'post', body: JSON.stringify(params)},
);
};
searchFiles = (teamId: string, terms: string, isOrSearch: boolean) => {
return this.searchFilesWithParams(teamId, {terms, is_or_search: isOrSearch});
};
doPostAction = (postId: string, actionId: string, selectedOption = '') => {
return this.doPostActionWithCookie(postId, actionId, '', selectedOption);
};
doPostActionWithCookie = (postId: string, actionId: string, actionCookie: string, selectedOption = '') => {
if (selectedOption) {
this.trackEvent('api', 'api_interactive_messages_menu_selected');
} else {
this.trackEvent('api', 'api_interactive_messages_button_clicked');
}
const msg: any = {
selected_option: selectedOption,
};
if (actionCookie !== '') {
msg.cookie = actionCookie;
}
return this.doFetch<PostActionResponse>(
`${this.getPostRoute(postId)}/actions/${encodeURIComponent(actionId)}`,
{method: 'post', body: JSON.stringify(msg)},
);
};
// Files Routes
getFileUrl(fileId: string, timestamp: number) {
let url = `${this.getFileRoute(fileId)}`;
if (timestamp) {
url += `?${timestamp}`;
}
return url;
}
getFileThumbnailUrl(fileId: string, timestamp: number) {
let url = `${this.getFileRoute(fileId)}/thumbnail`;
if (timestamp) {
url += `?${timestamp}`;
}
return url;
}
getFilePreviewUrl(fileId: string, timestamp: number) {
let url = `${this.getFileRoute(fileId)}/preview`;
if (timestamp) {
url += `?${timestamp}`;
}
return url;
}
uploadFile = (fileFormData: any, isBookmark?: boolean) => {
this.trackEvent('api', 'api_files_upload');
const request: any = {
method: 'post',
body: fileFormData,
};
return this.doFetch<FileUploadResponse>(
`${this.getFilesRoute()}${buildQueryString({bookmark: isBookmark})}`,
request,
);
};
getFilePublicLink = (fileId: string) => {
return this.doFetch<{
link: string;
}>(
`${this.getFileRoute(fileId)}/link`,
{method: 'get'},
);
};
acknowledgePost = (postId: string, userId: string) => {
this.trackEvent('api', 'api_posts_ack');
return this.doFetch<PostAcknowledgement>(
`${this.getUserRoute(userId)}/posts/${postId}/ack`,
{method: 'post'},
);
};
unacknowledgePost = (postId: string, userId: string) => {
this.trackEvent('api', 'api_posts_unack');
return this.doFetch<null>(
`${this.getUserRoute(userId)}/posts/${postId}/ack`,
{method: 'delete'},
);
};
// Preference Routes
savePreferences = (userId: string, preferences: PreferenceType[]) => {
return this.doFetch<StatusOK>(
`${this.getPreferencesRoute(userId)}`,
{method: 'put', body: JSON.stringify(preferences)},
);
};
getMyPreferences = () => {
return this.doFetch<PreferenceType>(
`${this.getPreferencesRoute('me')}`,
{method: 'get'},
);
};
getUserPreferences = (userId: string) => {
return this.doFetch<PreferenceType[]>(
`${this.getPreferencesRoute(userId)}`,
{method: 'get'},
);
};
deletePreferences = (userId: string, preferences: PreferenceType[]) => {
return this.doFetch<StatusOK>(
`${this.getPreferencesRoute(userId)}/delete`,
{method: 'post', body: JSON.stringify(preferences)},
);
};
// General Routes
ping = (getServerStatus: boolean, deviceId?: string) => {
return this.doFetch<{
status: string;
ActiveSearchBackend: string;
database_status: string;
filestore_status: string;
root_status: boolean;
}>(
`${this.getBaseRoute()}/system/ping${buildQueryString({get_server_status: getServerStatus, device_id: deviceId, use_rest_semantics: true})}`,
{method: 'get'},
);
};
upgradeToEnterprise = async () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/upgrade_to_enterprise`,
{method: 'post'},
);
};
upgradeToEnterpriseStatus = async () => {
return this.doFetch<{
percentage: number;
error: string | null;
}>(
`${this.getBaseRoute()}/upgrade_to_enterprise/status`,
{method: 'get'},
);
};
restartServer = async () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/restart`,
{method: 'post'},
);
};
logClientError = (message: string, level = LogLevel.Error) => {
const url = `${this.getBaseRoute()}/logs`;
if (!this.enableLogging) {
throw new ClientError(this.getUrl(), {
message: 'Logging disabled.',
url,
});
}
return this.doFetch<{
message: string;
}>(
url,
{method: 'post', body: JSON.stringify({message, level})},
);
};
getClientConfigOld = () => {
return this.doFetch<ClientConfig>(
`${this.getBaseRoute()}/config/client?format=old`,
{method: 'get'},
);
};
getClientLicenseOld = () => {
return this.doFetch<ClientLicense>(
`${this.getBaseRoute()}/license/client?format=old`,
{method: 'get'},
);
};
setFirstAdminVisitMarketplaceStatus = async () => {
return this.doFetch<StatusOK>(
`${this.getPluginsRoute()}/marketplace/first_admin_visit`,
{method: 'post', body: JSON.stringify({first_admin_visit_marketplace_status: true})},
);
};
getFirstAdminVisitMarketplaceStatus = async () => {
return this.doFetch<SystemSetting>(
`${this.getPluginsRoute()}/marketplace/first_admin_visit`,
{method: 'get'},
);
};
getFirstAdminSetupComplete = async () => {
return this.doFetch<SystemSetting>(
`${this.getSystemRoute()}/onboarding/complete`,
{method: 'get'},
);
};
getTranslations = (url: string) => {
return this.doFetch<Record<string, string>>(
url,
{method: 'get'},
);
};
getWebSocketUrl = () => {
return `${this.getBaseRoute()}/websocket`;
};
// Integration Routes
createIncomingWebhook = (hook: IncomingWebhook) => {
this.trackEvent('api', 'api_integrations_created', {team_id: hook.team_id});
return this.doFetch<IncomingWebhook>(
`${this.getIncomingHooksRoute()}`,
{method: 'post', body: JSON.stringify(hook)},
);
};
getIncomingWebhook = (hookId: string) => {
return this.doFetch<IncomingWebhook>(
`${this.getIncomingHookRoute(hookId)}`,
{method: 'get'},
);
};
getIncomingWebhooks = (teamId = '', page = 0, perPage = PER_PAGE_DEFAULT, includeTotalCount = false) => {
const queryParams: any = {
page,
per_page: perPage,
include_total_count: includeTotalCount,
};
if (teamId) {
queryParams.team_id = teamId;
}
return this.doFetch<IncomingWebhook[] | IncomingWebhooksWithCount>(
`${this.getIncomingHooksRoute()}${buildQueryString(queryParams)}`,
{method: 'get'},
);
};
removeIncomingWebhook = (hookId: string) => {
this.trackEvent('api', 'api_integrations_deleted');
return this.doFetch<StatusOK>(
`${this.getIncomingHookRoute(hookId)}`,
{method: 'delete'},
);
};
updateIncomingWebhook = (hook: IncomingWebhook) => {
this.trackEvent('api', 'api_integrations_updated', {team_id: hook.team_id});
return this.doFetch<IncomingWebhook>(
`${this.getIncomingHookRoute(hook.id)}`,
{method: 'put', body: JSON.stringify(hook)},
);
};
createOutgoingWebhook = (hook: OutgoingWebhook) => {
this.trackEvent('api', 'api_integrations_created', {team_id: hook.team_id});
return this.doFetch<OutgoingWebhook>(
`${this.getOutgoingHooksRoute()}`,
{method: 'post', body: JSON.stringify(hook)},
);
};
getOutgoingWebhook = (hookId: string) => {
return this.doFetch<OutgoingWebhook>(
`${this.getOutgoingHookRoute(hookId)}`,
{method: 'get'},
);
};
getOutgoingWebhooks = (channelId = '', teamId = '', page = 0, perPage = PER_PAGE_DEFAULT) => {
const queryParams: any = {
page,
per_page: perPage,
};
if (channelId) {
queryParams.channel_id = channelId;
}
if (teamId) {
queryParams.team_id = teamId;
}
return this.doFetch<OutgoingWebhook[]>(
`${this.getOutgoingHooksRoute()}${buildQueryString(queryParams)}`,
{method: 'get'},
);
};
removeOutgoingWebhook = (hookId: string) => {
this.trackEvent('api', 'api_integrations_deleted');
return this.doFetch<StatusOK>(
`${this.getOutgoingHookRoute(hookId)}`,
{method: 'delete'},
);
};
updateOutgoingWebhook = (hook: OutgoingWebhook) => {
this.trackEvent('api', 'api_integrations_updated', {team_id: hook.team_id});
return this.doFetch<OutgoingWebhook>(
`${this.getOutgoingHookRoute(hook.id)}`,
{method: 'put', body: JSON.stringify(hook)},
);
};
regenOutgoingHookToken = (id: string) => {
return this.doFetch<OutgoingWebhook>(
`${this.getOutgoingHookRoute(id)}/regen_token`,
{method: 'post'},
);
};
getCommandsList = (teamId: string) => {
return this.doFetch<Command[]>(
`${this.getCommandsRoute()}?team_id=${teamId}`,
{method: 'get'},
);
};
getCommandAutocompleteSuggestionsList = (userInput: string, teamId: string, commandArgs: CommandArgs) => {
return this.doFetch<AutocompleteSuggestion[]>(
`${this.getTeamRoute(teamId)}/commands/autocomplete_suggestions${buildQueryString({...commandArgs, user_input: userInput})}`,
{method: 'get'},
);
};
getAutocompleteCommandsList = (teamId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Command[]>(
`${this.getTeamRoute(teamId)}/commands/autocomplete${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getCustomTeamCommands = (teamId: string) => {
return this.doFetch<Command[]>(
`${this.getCommandsRoute()}?team_id=${teamId}&custom_only=true`,
{method: 'get'},
);
};
executeCommand = (command: string, commandArgs: CommandArgs) => {
this.trackEvent('api', 'api_integrations_used');
return this.doFetch<CommandResponse>(
`${this.getCommandsRoute()}/execute`,
{method: 'post', body: JSON.stringify({command, ...commandArgs})},
);
};
addCommand = (command: Command) => {
this.trackEvent('api', 'api_integrations_created');
return this.doFetch<Command>(
`${this.getCommandsRoute()}`,
{method: 'post', body: JSON.stringify(command)},
);
};
editCommand = (command: Command) => {
this.trackEvent('api', 'api_integrations_created');
return this.doFetch<Command>(
`${this.getCommandsRoute()}/${command.id}`,
{method: 'put', body: JSON.stringify(command)},
);
};
regenCommandToken = (id: string) => {
return this.doFetch<{
token: string;
}>(
`${this.getCommandsRoute()}/${id}/regen_token`,
{method: 'put'},
);
};
deleteCommand = (id: string) => {
this.trackEvent('api', 'api_integrations_deleted');
return this.doFetch<StatusOK>(
`${this.getCommandsRoute()}/${id}`,
{method: 'delete'},
);
};
createOAuthApp = (app: OAuthApp) => {
this.trackEvent('api', 'api_apps_register');
return this.doFetch<OAuthApp>(
`${this.getOAuthAppsRoute()}`,
{method: 'post', body: JSON.stringify(app)},
);
};
editOAuthApp = (app: OAuthApp) => {
return this.doFetch<OAuthApp>(
`${this.getOAuthAppsRoute()}/${app.id}`,
{method: 'put', body: JSON.stringify(app)},
);
};
getOAuthApps = (page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<OAuthApp[]>(
`${this.getOAuthAppsRoute()}${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getAppsOAuthAppIDs = () => {
return this.doFetch<string[]>(
`${this.getAppsProxyRoute()}/api/v1/oauth-app-ids`,
{method: 'get'},
);
};
getAppsBotIDs = () => {
return this.doFetch<string[]>(
`${this.getAppsProxyRoute()}/api/v1/bot-ids`,
{method: 'get'},
);
};
getOAuthApp = (appId: string) => {
return this.doFetch<OAuthApp>(
`${this.getOAuthAppRoute(appId)}`,
{method: 'get'},
);
};
getOutgoingOAuthConnections = (teamId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<OutgoingOAuthConnection[]>(
`${this.getOutgoingOAuthConnectionsRoute()}${buildQueryString({team_id: teamId, page, per_page: perPage})}`,
{method: 'get'},
);
};
getOutgoingOAuthConnectionsForAudience = (teamId: string, audience: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<OutgoingOAuthConnection[]>(
`${this.getOutgoingOAuthConnectionsRoute()}${buildQueryString({team_id: teamId, page, per_page: perPage, audience})}`,
{method: 'get'},
);
};
getOutgoingOAuthConnection = (teamId: string, connectionId: string) => {
return this.doFetch<OutgoingOAuthConnection>(
`${this.getOutgoingOAuthConnectionRoute(connectionId)}${buildQueryString({team_id: teamId})}`,
{method: 'get'},
);
};
createOutgoingOAuthConnection = (teamId: string, connection: OutgoingOAuthConnection) => {
this.trackEvent('api', 'api_outgoing_oauth_connection_register');
return this.doFetch<OutgoingOAuthConnection>(
`${this.getOutgoingOAuthConnectionsRoute()}${buildQueryString({team_id: teamId})}`,
{method: 'post', body: JSON.stringify(connection)},
);
};
editOutgoingOAuthConnection = (teamId: string, connection: OutgoingOAuthConnection) => {
return this.doFetch<OutgoingOAuthConnection>(
`${this.getOutgoingOAuthConnectionsRoute()}/${connection.id}${buildQueryString({team_id: teamId})}`,
{method: 'put', body: JSON.stringify(connection)},
);
};
validateOutgoingOAuthConnection = (teamId: string, connection: OutgoingOAuthConnection) => {
return this.doFetch<OutgoingOAuthConnection>(
`${this.getOutgoingOAuthConnectionsRoute()}/validate${buildQueryString({team_id: teamId})}`,
{method: 'post', body: JSON.stringify(connection)},
);
};
getOAuthAppInfo = (appId: string) => {
return this.doFetch<OAuthApp>(
`${this.getOAuthAppRoute(appId)}/info`,
{method: 'get'},
);
};
deleteOAuthApp = (appId: string) => {
this.trackEvent('api', 'api_apps_delete');
return this.doFetch<StatusOK>(
`${this.getOAuthAppRoute(appId)}`,
{method: 'delete'},
);
};
regenOAuthAppSecret = (appId: string) => {
return this.doFetch<OAuthApp>(
`${this.getOAuthAppRoute(appId)}/regen_secret`,
{method: 'post'},
);
};
deleteOutgoingOAuthConnection = (connectionId: string) => {
this.trackEvent('api', 'api_apps_delete');
return this.doFetch<StatusOK>(
`${this.getOutgoingOAuthConnectionRoute(connectionId)}`,
{method: 'delete'},
);
};
submitInteractiveDialog = (data: DialogSubmission) => {
this.trackEvent('api', 'api_interactive_messages_dialog_submitted');
return this.doFetch<SubmitDialogResponse>(
`${this.getBaseRoute()}/actions/dialogs/submit`,
{method: 'post', body: JSON.stringify(data)},
);
};
// Emoji Routes
createCustomEmoji = (emoji: CustomEmoji, imageData: File) => {
this.trackEvent('api', 'api_emoji_custom_add');
const formData = new FormData();
formData.append('image', imageData);
formData.append('emoji', JSON.stringify(emoji));
const request: any = {
method: 'post',
body: formData,
};
return this.doFetch<CustomEmoji>(
`${this.getEmojisRoute()}`,
request,
);
};
getCustomEmoji = (id: string) => {
return this.doFetch<CustomEmoji>(
`${this.getEmojisRoute()}/${id}`,
{method: 'get'},
);
};
getCustomEmojiByName = (name: string) => {
return this.doFetch<CustomEmoji>(
`${this.getEmojisRoute()}/name/${name}`,
{method: 'get'},
);
};
getCustomEmojisByNames = (names: string[]) => {
return this.doFetch<CustomEmoji[]>(
`${this.getEmojisRoute()}/names`,
{method: 'post', body: JSON.stringify(names)},
);
};
getCustomEmojis = (page = 0, perPage = PER_PAGE_DEFAULT, sort = '') => {
return this.doFetch<CustomEmoji[]>(
`${this.getEmojisRoute()}${buildQueryString({page, per_page: perPage, sort})}`,
{method: 'get'},
);
};
deleteCustomEmoji = (emojiId: string) => {
this.trackEvent('api', 'api_emoji_custom_delete');
return this.doFetch<StatusOK>(
`${this.getEmojiRoute(emojiId)}`,
{method: 'delete'},
);
};
getSystemEmojiImageUrl = (filename: string) => {
const extension = filename.endsWith('.png') ? '' : '.png';
return `${this.url}/static/emoji/${filename}${extension}`;
};
getCustomEmojiImageUrl = (id: string) => {
return `${this.getEmojiRoute(id)}/image`;
};
searchCustomEmoji = (term: string, options = {}) => {
return this.doFetch<CustomEmoji[]>(
`${this.getEmojisRoute()}/search`,
{method: 'post', body: JSON.stringify({term, ...options})},
);
};
autocompleteCustomEmoji = (name: string) => {
return this.doFetch<CustomEmoji[]>(
`${this.getEmojisRoute()}/autocomplete${buildQueryString({name})}`,
{method: 'get'},
);
};
// Data Retention
getDataRetentionPolicy = () => {
return this.doFetch<DataRetentionPolicy>(
`${this.getDataRetentionRoute()}/policy`,
{method: 'get'},
);
};
getDataRetentionCustomPolicies = (page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<GetDataRetentionCustomPoliciesRequest>(
`${this.getDataRetentionRoute()}/policies${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getDataRetentionCustomPolicy = (id: string) => {
return this.doFetch<DataRetentionCustomPolicies>(
`${this.getDataRetentionRoute()}/policies/${id}`,
{method: 'get'},
);
};
deleteDataRetentionCustomPolicy = (id: string) => {
return this.doFetch<DataRetentionCustomPolicies>(
`${this.getDataRetentionRoute()}/policies/${id}`,
{method: 'delete'},
);
};
searchDataRetentionCustomPolicyChannels = (policyId: string, term: string, opts: ChannelSearchOpts) => {
return this.doFetch<DataRetentionCustomPolicies>(
`${this.getDataRetentionRoute()}/policies/${policyId}/channels/search`,
{method: 'post', body: JSON.stringify({term, ...opts})},
);
};
searchDataRetentionCustomPolicyTeams = (policyId: string, term: string, opts: TeamSearchOpts) => {
return this.doFetch<DataRetentionCustomPolicies>(
`${this.getDataRetentionRoute()}/policies/${policyId}/teams/search`,
{method: 'post', body: JSON.stringify({term, ...opts})},
);
};
getDataRetentionCustomPolicyTeams = (id: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Team[]>(
`${this.getDataRetentionRoute()}/policies/${id}/teams${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getDataRetentionCustomPolicyChannels = (id: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<{channels: Channel[]; total_count: number}>(
`${this.getDataRetentionRoute()}/policies/${id}/channels${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
createDataRetentionPolicy = (policy: CreateDataRetentionCustomPolicy) => {
return this.doFetch<DataRetentionCustomPolicies>(
`${this.getDataRetentionRoute()}/policies`,
{method: 'post', body: JSON.stringify(policy)},
);
};
updateDataRetentionPolicy = (id: string, policy: PatchDataRetentionCustomPolicy) => {
return this.doFetch<DataRetentionCustomPolicies>(
`${this.getDataRetentionRoute()}/policies/${id}`,
{method: 'PATCH', body: JSON.stringify(policy)},
);
};
addDataRetentionPolicyTeams = (id: string, teams: string[]) => {
return this.doFetch<DataRetentionCustomPolicies>(
`${this.getDataRetentionRoute()}/policies/${id}/teams`,
{method: 'post', body: JSON.stringify(teams)},
);
};
removeDataRetentionPolicyTeams = (id: string, teams: string[]) => {
return this.doFetch<DataRetentionCustomPolicies>(
`${this.getDataRetentionRoute()}/policies/${id}/teams`,
{method: 'delete', body: JSON.stringify(teams)},
);
};
addDataRetentionPolicyChannels = (id: string, channels: string[]) => {
return this.doFetch<DataRetentionCustomPolicies>(
`${this.getDataRetentionRoute()}/policies/${id}/channels`,
{method: 'post', body: JSON.stringify(channels)},
);
};
removeDataRetentionPolicyChannels = (id: string, channels: string[]) => {
return this.doFetch<DataRetentionCustomPolicies>(
`${this.getDataRetentionRoute()}/policies/${id}/channels`,
{method: 'delete', body: JSON.stringify(channels)},
);
};
// Jobs Routes
getJob = (id: string) => {
return this.doFetch<Job>(
`${this.getJobsRoute()}/${id}`,
{method: 'get'},
);
};
getJobs = (page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Job[]>(
`${this.getJobsRoute()}${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getJobsByType = (type: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Job[]>(
`${this.getJobsRoute()}/type/${type}${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
createJob = (job: JobTypeBase) => {
return this.doFetch<Job>(
`${this.getJobsRoute()}`,
{method: 'post', body: JSON.stringify(job)},
);
};
cancelJob = (id: string) => {
return this.doFetch<StatusOK>(
`${this.getJobsRoute()}/${id}/cancel`,
{method: 'post'},
);
};
// Admin Routes
getLogs = (logFilter: LogFilterQuery) => {
return this.doFetch<string[]>(
`${this.getBaseRoute()}/logs/query`,
{method: 'post', body: JSON.stringify(logFilter)},
);
};
getPlainLogs = (page = 0, perPage = LOGS_PER_PAGE_DEFAULT) => {
return this.doFetch<string[]>(
`${this.getBaseRoute()}/logs${buildQueryString({page, logs_per_page: perPage})}`,
{method: 'get'},
);
};
getAudits = (page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Audit[]>(
`${this.getBaseRoute()}/audits${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getConfig = () => {
return this.doFetch<AdminConfig>(
`${this.getBaseRoute()}/config`,
{method: 'get'},
);
};
updateConfig = (config: AdminConfig) => {
return this.doFetch<AdminConfig>(
`${this.getBaseRoute()}/config`,
{method: 'put', body: JSON.stringify(config)},
);
};
patchConfig = (patch: DeepPartial<AdminConfig>) => {
return this.doFetch<AdminConfig>(
`${this.getBaseRoute()}/config/patch`,
{method: 'put', body: JSON.stringify(patch)},
);
};
reloadConfig = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/config/reload`,
{method: 'post'},
);
};
getEnvironmentConfig = () => {
return this.doFetch<EnvironmentConfig>(
`${this.getBaseRoute()}/config/environment`,
{method: 'get'},
);
};
testEmail = (config?: AdminConfig) => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/email/test`,
{method: 'post', body: JSON.stringify(config)},
);
};
testSiteURL = (siteURL: string) => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/site_url/test`,
{method: 'post', body: JSON.stringify({site_url: siteURL})},
);
};
testS3Connection = (config?: AdminConfig) => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/file/s3_test`,
{method: 'post', body: JSON.stringify(config)},
);
};
invalidateCaches = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/caches/invalidate`,
{method: 'post'},
);
};
recycleDatabase = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/database/recycle`,
{method: 'post'},
);
};
createComplianceReport = (job: Partial<Compliance>) => {
return this.doFetch<Compliance>(
`${this.getBaseRoute()}/compliance/reports`,
{method: 'post', body: JSON.stringify(job)},
);
};
getComplianceReport = (reportId: string) => {
return this.doFetch<Compliance>(
`${this.getBaseRoute()}/compliance/reports/${reportId}`,
{method: 'get'},
);
};
getComplianceReports = (page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Compliance[]>(
`${this.getBaseRoute()}/compliance/reports${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
uploadBrandImage = (imageData: File) => {
const formData = new FormData();
formData.append('image', imageData);
const request: any = {
method: 'post',
body: formData,
};
return this.doFetch<StatusOK>(
`${this.getBrandRoute()}/image`,
request,
);
};
deleteBrandImage = () => {
return this.doFetch<StatusOK>(
`${this.getBrandRoute()}/image`,
{method: 'delete'},
);
};
getClusterStatus = () => {
return this.doFetch<ClusterInfo[]>(
`${this.getBaseRoute()}/cluster/status`,
{method: 'get'},
);
};
testLdap = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/ldap/test`,
{method: 'post'},
);
};
syncLdap = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/ldap/sync`,
{method: 'post'},
);
};
getLdapGroups = (page = 0, perPage = PER_PAGE_DEFAULT, opts = {}) => {
const query = {page, per_page: perPage, ...opts};
return this.doFetch<{
count: number;
groups: MixedUnlinkedGroup[];
}>(
`${this.getBaseRoute()}/ldap/groups${buildQueryString(query)}`,
{method: 'get'},
);
};
linkLdapGroup = (key: string) => {
return this.doFetch<Group>(
`${this.getBaseRoute()}/ldap/groups/${encodeURI(key)}/link`,
{method: 'post'},
);
};
unlinkLdapGroup = (key: string) => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/ldap/groups/${encodeURI(key)}/link`,
{method: 'delete'},
);
};
getSamlCertificateStatus = () => {
return this.doFetch<SamlCertificateStatus>(
`${this.getBaseRoute()}/saml/certificate/status`,
{method: 'get'},
);
};
uploadPublicSamlCertificate = (fileData: File) => {
const formData = new FormData();
formData.append('certificate', fileData);
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/saml/certificate/public`,
{
method: 'post',
body: formData,
},
);
};
uploadPrivateSamlCertificate = (fileData: File) => {
const formData = new FormData();
formData.append('certificate', fileData);
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/saml/certificate/private`,
{
method: 'post',
body: formData,
},
);
};
uploadPublicLdapCertificate = (fileData: File) => {
const formData = new FormData();
formData.append('certificate', fileData);
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/ldap/certificate/public`,
{
method: 'post',
body: formData,
},
);
};
uploadPrivateLdapCertificate = (fileData: File) => {
const formData = new FormData();
formData.append('certificate', fileData);
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/ldap/certificate/private`,
{
method: 'post',
body: formData,
},
);
};
uploadIdpSamlCertificate = (fileData: File) => {
const formData = new FormData();
formData.append('certificate', fileData);
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/saml/certificate/idp`,
{
method: 'post',
body: formData,
},
);
};
deletePublicSamlCertificate = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/saml/certificate/public`,
{method: 'delete'},
);
};
deletePrivateSamlCertificate = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/saml/certificate/private`,
{method: 'delete'},
);
};
deletePublicLdapCertificate = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/ldap/certificate/public`,
{method: 'delete'},
);
};
deletePrivateLdapCertificate = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/ldap/certificate/private`,
{method: 'delete'},
);
};
deleteIdpSamlCertificate = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/saml/certificate/idp`,
{method: 'delete'},
);
};
testElasticsearch = (config?: AdminConfig) => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/elasticsearch/test`,
{method: 'post', body: JSON.stringify(config)},
);
};
purgeElasticsearchIndexes = (indexes?: string[]) => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/elasticsearch/purge_indexes${indexes && indexes.length > 0 ? '?index=' + indexes.join(',') : ''}`,
{method: 'post'},
);
};
purgeBleveIndexes = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/bleve/purge_indexes`,
{method: 'post'},
);
};
uploadLicense = (fileData: File) => {
this.trackEvent('api', 'api_license_upload');
const formData = new FormData();
formData.append('license', fileData);
const request: any = {
method: 'post',
body: formData,
};
return this.doFetch<License>(
`${this.getBaseRoute()}/license`,
request,
);
};
requestTrialLicense = (body: RequestLicenseBody) => {
return this.doFetchWithResponse<ClientLicense>(
`${this.getBaseRoute()}/trial-license`,
{method: 'POST', body: JSON.stringify(body)},
);
};
removeLicense = () => {
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/license`,
{method: 'delete'},
);
};
getPrevTrialLicense = () => {
return this.doFetch<ClientLicense>(
`${this.getBaseRoute()}/trial-license/prev`,
{method: 'get'},
);
};
getAnalytics = (name = 'standard', teamId = '') => {
return this.doFetch<AnalyticsRow[]>(
`${this.getBaseRoute()}/analytics/old${buildQueryString({name, team_id: teamId})}`,
{method: 'get'},
);
};
// Role Routes
getRole = (roleId: string) => {
return this.doFetch<Role>(
`${this.getRolesRoute()}/${roleId}`,
{method: 'get'},
);
};
getRoleByName = (roleName: string) => {
return this.doFetch<Role>(
`${this.getRolesRoute()}/name/${roleName}`,
{method: 'get'},
);
};
getRolesByNames = (rolesNames: string[]) => {
return this.doFetch<Role[]>(
`${this.getRolesRoute()}/names`,
{method: 'post', body: JSON.stringify(rolesNames)},
);
};
patchRole = (roleId: string, rolePatch: Partial<Role>) => {
return this.doFetch<Role>(
`${this.getRolesRoute()}/${roleId}/patch`,
{method: 'put', body: JSON.stringify(rolePatch)},
);
};
// Scheme Routes
getSchemes = (scope = '', page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Scheme[]>(
`${this.getSchemesRoute()}${buildQueryString({scope, page, per_page: perPage})}`,
{method: 'get'},
);
};
createScheme = (scheme: Scheme) => {
this.trackEvent('api', 'api_schemes_create');
return this.doFetch<Scheme>(
`${this.getSchemesRoute()}`,
{method: 'post', body: JSON.stringify(scheme)},
);
};
getScheme = (schemeId: string) => {
return this.doFetch<Scheme>(
`${this.getSchemesRoute()}/${schemeId}`,
{method: 'get'},
);
};
deleteScheme = (schemeId: string) => {
this.trackEvent('api', 'api_schemes_delete');
return this.doFetch<StatusOK>(
`${this.getSchemesRoute()}/${schemeId}`,
{method: 'delete'},
);
};
patchScheme = (schemeId: string, schemePatch: Partial<Scheme>) => {
this.trackEvent('api', 'api_schemes_patch', {scheme_id: schemeId});
return this.doFetch<Scheme>(
`${this.getSchemesRoute()}/${schemeId}/patch`,
{method: 'put', body: JSON.stringify(schemePatch)},
);
};
getSchemeTeams = (schemeId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Team[]>(
`${this.getSchemesRoute()}/${schemeId}/teams${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getSchemeChannels = (schemeId: string, page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Channel[]>(
`${this.getSchemesRoute()}/${schemeId}/channels${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
// Plugin Routes
uploadPlugin = async (fileData: File, force = false) => {
this.trackEvent('api', 'api_plugin_upload');
const formData = new FormData();
if (force) {
formData.append('force', 'true');
}
formData.append('plugin', fileData);
const request: any = {
method: 'post',
body: formData,
};
return this.doFetch<PluginManifest>(
this.getPluginsRoute(),
request,
);
};
installPluginFromUrl = (pluginDownloadUrl: string, force = false) => {
this.trackEvent('api', 'api_install_plugin');
const queryParams = {plugin_download_url: pluginDownloadUrl, force};
return this.doFetch<PluginManifest>(
`${this.getPluginsRoute()}/install_from_url${buildQueryString(queryParams)}`,
{method: 'post'},
);
};
getPlugins = () => {
return this.doFetch<PluginsResponse>(
this.getPluginsRoute(),
{method: 'get'},
);
};
getRemoteMarketplacePlugins = (filter: string) => {
return this.doFetch<MarketplacePlugin[]>(
`${this.getPluginsMarketplaceRoute()}${buildQueryString({filter: filter || '', remote_only: true})}`,
{method: 'get'},
);
};
getMarketplacePlugins = (filter: string, localOnly = false) => {
return this.doFetch<MarketplacePlugin[]>(
`${this.getPluginsMarketplaceRoute()}${buildQueryString({filter: filter || '', local_only: localOnly})}`,
{method: 'get'},
);
};
installMarketplacePlugin = (id: string) => {
this.trackEvent('api', 'api_install_marketplace_plugin');
return this.doFetch<MarketplacePlugin>(
`${this.getPluginsMarketplaceRoute()}`,
{method: 'post', body: JSON.stringify({id})},
);
};
getMarketplaceApps = (filter: string) => {
return this.doFetch<MarketplaceApp[]>(
`${this.getAppsProxyRoute()}/api/v1/marketplace${buildQueryString({filter: filter || ''})}`,
{method: 'get'},
);
};
getPluginStatuses = () => {
return this.doFetch<PluginStatus[]>(
`${this.getPluginsRoute()}/statuses`,
{method: 'get'},
);
};
removePlugin = (pluginId: string) => {
return this.doFetch<StatusOK>(
this.getPluginRoute(pluginId),
{method: 'delete'},
);
};
getWebappPlugins = () => {
return this.doFetch<ClientPluginManifest[]>(
`${this.getPluginsRoute()}/webapp`,
{method: 'get'},
);
};
enablePlugin = (pluginId: string) => {
return this.doFetch<StatusOK>(
`${this.getPluginRoute(pluginId)}/enable`,
{method: 'post'},
);
};
disablePlugin = (pluginId: string) => {
return this.doFetch<StatusOK>(
`${this.getPluginRoute(pluginId)}/disable`,
{method: 'post'},
);
};
// Groups
linkGroupSyncable = (groupID: string, syncableID: string, syncableType: string, patch: Partial<SyncablePatch>) => {
return this.doFetch<GroupSyncable>(
`${this.getGroupRoute(groupID)}/${syncableType}s/${syncableID}/link`,
{method: 'post', body: JSON.stringify(patch)},
);
};
unlinkGroupSyncable = (groupID: string, syncableID: string, syncableType: string) => {
return this.doFetch<StatusOK>(
`${this.getGroupRoute(groupID)}/${syncableType}s/${syncableID}/link`,
{method: 'delete'},
);
};
getGroupSyncables = (groupID: string, syncableType: string) => {
return this.doFetch<GroupSyncable[]>(
`${this.getGroupRoute(groupID)}/${syncableType}s`,
{method: 'get'},
);
};
getGroup = (groupID: string, includeMemberCount = false) => {
return this.doFetch<Group>(
`${this.getGroupRoute(groupID)}${buildQueryString({include_member_count: includeMemberCount})}`,
{method: 'get'},
);
};
getGroupStats = (groupID: string) => {
return this.doFetch<GroupStats>(
`${this.getGroupRoute(groupID)}/stats`,
{method: 'get'},
);
};
getGroups = (opts: GetGroupsForUserParams | GetGroupsParams) => {
return this.doFetch<Group[]>(
`${this.getGroupsRoute()}${buildQueryString(opts)}`,
{method: 'get'},
);
};
getGroupsByUserId = (userID: string) => {
return this.doFetch<Group[]>(
`${this.getUsersRoute()}/${userID}/groups`,
{method: 'get'},
);
};
getGroupsNotAssociatedToTeam = (teamID: string, q = '', page = 0, perPage = PER_PAGE_DEFAULT, source = 'ldap') => {
this.trackEvent('api', 'api_groups_get_not_associated_to_team', {team_id: teamID});
return this.doFetch<Group[]>(
`${this.getGroupsRoute()}${buildQueryString({not_associated_to_team: teamID, page, per_page: perPage, q, include_member_count: true, group_source: source})}`,
{method: 'get'},
);
};
getGroupsNotAssociatedToChannel = (channelID: string, q = '', page = 0, perPage = PER_PAGE_DEFAULT, filterParentTeamPermitted = false, source = 'ldap') => {
this.trackEvent('api', 'api_groups_get_not_associated_to_channel', {channel_id: channelID});
const query = {
not_associated_to_channel: channelID,
page,
per_page: perPage,
q,
include_member_count: true,
filter_parent_team_permitted: filterParentTeamPermitted,
group_source: source,
};
return this.doFetch<Group[]>(
`${this.getGroupsRoute()}${buildQueryString(query)}`,
{method: 'get'},
);
};
createGroupWithUserIds = (group: GroupCreateWithUserIds) => {
return this.doFetch<Group>(
this.getGroupsRoute(),
{method: 'post', body: JSON.stringify(group)},
);
};
addUsersToGroup = (groupId: string, userIds: string[]) => {
return this.doFetch<UserProfile[]>(
`${this.getGroupRoute(groupId)}/members`,
{method: 'post', body: JSON.stringify({user_ids: userIds})},
);
};
removeUsersFromGroup = (groupId: string, userIds: string[]) => {
return this.doFetch<UserProfile[]>(
`${this.getGroupRoute(groupId)}/members`,
{method: 'delete', body: JSON.stringify({user_ids: userIds})},
);
};
searchGroups = (params: GroupSearchParams) => {
return this.doFetch<Group[]>(
`${this.getGroupsRoute()}${buildQueryString(params)}`,
{method: 'get'},
);
};
executeAppCall = async (call: AppCallRequest, trackAsSubmit: boolean) => {
const callCopy: AppCallRequest = {
...call,
context: {
...call.context,
track_as_submit: trackAsSubmit,
user_agent: 'webapp',
},
};
return this.doFetch<AppCallResponse>(
`${this.getAppsProxyRoute()}/api/v1/call`,
{method: 'post', body: JSON.stringify(callCopy)},
);
};
getAppsBindings = async (channelID: string, teamID: string) => {
const params = {
channel_id: channelID,
team_id: teamID,
user_agent: 'webapp',
};
return this.doFetch<AppBinding[]>(
`${this.getAppsProxyRoute()}/api/v1/bindings${buildQueryString(params)}`,
{method: 'get'},
);
};
getGroupsAssociatedToTeam = (teamID: string, q = '', page = 0, perPage = PER_PAGE_DEFAULT, filterAllowReference = false) => {
this.trackEvent('api', 'api_groups_get_associated_to_team', {team_id: teamID});
return this.doFetch<{
groups: Group[];
total_group_count: number;
}>(
`${this.getBaseRoute()}/teams/${teamID}/groups${buildQueryString({page, per_page: perPage, q, include_member_count: true, filter_allow_reference: filterAllowReference})}`,
{method: 'get'},
);
};
getGroupsAssociatedToChannel = (channelID: string, q = '', page = 0, perPage = PER_PAGE_DEFAULT, filterAllowReference = false) => {
this.trackEvent('api', 'api_groups_get_associated_to_channel', {channel_id: channelID});
return this.doFetch<{
groups: Group[];
total_group_count: number;
}>(
`${this.getBaseRoute()}/channels/${channelID}/groups${buildQueryString({page, per_page: perPage, q, include_member_count: true, filter_allow_reference: filterAllowReference})}`,
{method: 'get'},
);
};
getAllGroupsAssociatedToTeam = (teamID: string, filterAllowReference = false, includeMemberCount = false) => {
return this.doFetch<GroupsWithCount>(
`${this.getBaseRoute()}/teams/${teamID}/groups${buildQueryString({paginate: false, filter_allow_reference: filterAllowReference, include_member_count: includeMemberCount})}`,
{method: 'get'},
);
};
getAllGroupsAssociatedToChannelsInTeam = (teamID: string, filterAllowReference = false) => {
return this.doFetch<{
groups: RelationOneToOne<Channel, Group>;
}>(
`${this.getBaseRoute()}/teams/${teamID}/groups_by_channels${buildQueryString({paginate: false, filter_allow_reference: filterAllowReference})}`,
{method: 'get'},
);
};
getAllGroupsAssociatedToChannel = (channelID: string, filterAllowReference = false, includeMemberCount = false) => {
return this.doFetch<GroupsWithCount>(
`${this.getBaseRoute()}/channels/${channelID}/groups${buildQueryString({paginate: false, filter_allow_reference: filterAllowReference, include_member_count: includeMemberCount})}`,
{method: 'get'},
);
};
patchGroupSyncable = (groupID: string, syncableID: string, syncableType: string, patch: Partial<SyncablePatch>) => {
return this.doFetch<GroupSyncable>(
`${this.getGroupRoute(groupID)}/${syncableType}s/${syncableID}/patch`,
{method: 'put', body: JSON.stringify(patch)},
);
};
patchGroup = (groupID: string, patch: GroupPatch | CustomGroupPatch) => {
return this.doFetch<Group>(
`${this.getGroupRoute(groupID)}/patch`,
{method: 'put', body: JSON.stringify(patch)},
);
};
archiveGroup = (groupId: string) => {
return this.doFetch<Group>(
`${this.getGroupRoute(groupId)}`,
{method: 'delete'},
);
};
restoreGroup = (groupId: string) => {
return this.doFetch<Group>(
`${this.getGroupRoute(groupId)}/restore`,
{method: 'post'},
);
};
createGroupTeamsAndChannels = (userID: string) => {
return this.doFetch<Group>(
`${this.getBaseRoute()}/ldap/users/${userID}/group_sync_memberships`,
{method: 'post'},
);
};
// Bot Routes
createBot = (bot: Partial<Bot>) => {
return this.doFetch<Bot>(
`${this.getBotsRoute()}`,
{method: 'post', body: JSON.stringify(bot)},
);
};
patchBot = (botUserId: string, botPatch: Partial<BotPatch>) => {
return this.doFetch<Bot>(
`${this.getBotRoute(botUserId)}`,
{method: 'put', body: JSON.stringify(botPatch)},
);
};
getBot = (botUserId: string) => {
return this.doFetch<Bot>(
`${this.getBotRoute(botUserId)}`,
{method: 'get'},
);
};
getBots = (page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Bot[]>(
`${this.getBotsRoute()}${buildQueryString({page, per_page: perPage})}`,
{method: 'get'},
);
};
getBotsIncludeDeleted = (page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Bot[]>(
`${this.getBotsRoute()}${buildQueryString({include_deleted: true, page, per_page: perPage})}`,
{method: 'get'},
);
};
getBotsOrphaned = (page = 0, perPage = PER_PAGE_DEFAULT) => {
return this.doFetch<Bot[]>(
`${this.getBotsRoute()}${buildQueryString({only_orphaned: true, page, per_page: perPage})}`,
{method: 'get'},
);
};
disableBot = (botUserId: string) => {
return this.doFetch<Bot>(
`${this.getBotRoute(botUserId)}/disable`,
{method: 'post'},
);
};
enableBot = (botUserId: string) => {
return this.doFetch<Bot>(
`${this.getBotRoute(botUserId)}/enable`,
{method: 'post'},
);
};
assignBot = (botUserId: string, newOwnerId: string) => {
return this.doFetch<Bot>(
`${this.getBotRoute(botUserId)}/assign/${newOwnerId}`,
{method: 'post'},
);
};
// Cloud routes
getCloudProducts = (includeLegacyProducts?: boolean) => {
let query = '';
if (includeLegacyProducts) {
query = '?include_legacy=true';
}
return this.doFetch<Product[]>(
`${this.getCloudRoute()}/products${query}`, {method: 'get'},
);
};
getSelfHostedProducts = () => {
return this.doFetch<Product[]>(
`${this.getCloudRoute()}/products/selfhosted`, {method: 'get'},
);
};
subscribeToNewsletter = (newletterRequestBody: NewsletterRequestBody) => {
return this.doFetch<StatusOK>(
`${this.getHostedCustomerRoute()}/subscribe-newsletter`,
{method: 'post', body: JSON.stringify(newletterRequestBody)},
);
};
cwsAvailabilityCheck = () => {
return this.doFetchWithResponse(
`${this.getCloudRoute()}/check-cws-connection`,
{method: 'get'},
);
};
getCloudCustomer = () => {
return this.doFetch<CloudCustomer>(
`${this.getCloudRoute()}/customer`, {method: 'get'},
);
};
updateCloudCustomer = (customerPatch: CloudCustomerPatch) => {
return this.doFetch<CloudCustomer>(
`${this.getCloudRoute()}/customer`,
{method: 'put', body: JSON.stringify(customerPatch)},
);
};
updateCloudCustomerAddress = (address: Address) => {
return this.doFetch<CloudCustomer>(
`${this.getCloudRoute()}/customer/address`,
{method: 'put', body: JSON.stringify(address)},
);
};
notifyAdmin = (req: NotifyAdminRequest) => {
return this.doFetchWithResponse<StatusOK>(
`${this.getUsersRoute()}/notify-admin`,
{method: 'post', body: JSON.stringify(req)},
);
};
validateBusinessEmail = (email = '') => {
return this.doFetchWithResponse<ValidBusinessEmail>(
`${this.getCloudRoute()}/validate-business-email`,
{method: 'post', body: JSON.stringify({email})},
);
};
validateWorkspaceBusinessEmail = () => {
return this.doFetchWithResponse<ValidBusinessEmail>(
`${this.getCloudRoute()}/validate-workspace-business-email`,
{method: 'post'},
);
};
getSubscription = () => {
return this.doFetch<Subscription>(
`${this.getCloudRoute()}/subscription`,
{method: 'get'},
);
};
getInstallation = () => {
return this.doFetch<Installation>(
`${this.getCloudRoute()}/installation`,
{method: 'get'},
);
};
getInvoices = () => {
return this.doFetch<Invoice[]>(
`${this.getCloudRoute()}/subscription/invoices`,
{method: 'get'},
);
};
getInvoicePdfUrl = (invoiceId: string) => {
return `${this.getCloudRoute()}/subscription/invoices/${invoiceId}/pdf`;
};
getCloudLimits = () => {
return this.doFetch<Limits>(
`${this.getCloudRoute()}/limits`,
{method: 'get'},
);
};
getPostsUsage = () => {
return this.doFetch<PostsUsageResponse>(
`${this.getUsageRoute()}/posts`,
{method: 'get'},
);
};
getFilesUsage = () => {
return this.doFetch<FilesUsageResponse>(
`${this.getUsageRoute()}/storage`,
{method: 'get'},
);
};
getTeamsUsage = () => {
return this.doFetch<TeamsUsageResponse>(
`${this.getUsageRoute()}/teams`,
{method: 'get'},
);
};
teamMembersMinusGroupMembers = (teamID: string, groupIDs: string[], page: number, perPage: number) => {
const query = `group_ids=${groupIDs.join(',')}&page=${page}&per_page=${perPage}`;
return this.doFetch<UsersWithGroupsAndCount>(
`${this.getTeamRoute(teamID)}/members_minus_group_members?${query}`,
{method: 'get'},
);
};
channelMembersMinusGroupMembers = (channelID: string, groupIDs: string[], page: number, perPage: number) => {
const query = `group_ids=${groupIDs.join(',')}&page=${page}&per_page=${perPage}`;
return this.doFetch<UsersWithGroupsAndCount>(
`${this.getChannelRoute(channelID)}/members_minus_group_members?${query}`,
{method: 'get'},
);
};
getSamlMetadataFromIdp = (samlMetadataURL: string) => {
return this.doFetch<SamlMetadataResponse>(
`${this.getBaseRoute()}/saml/metadatafromidp`, {method: 'post', body: JSON.stringify({saml_metadata_url: samlMetadataURL})},
);
};
setSamlIdpCertificateFromMetadata = (certData: string) => {
const request: any = {
method: 'post',
body: certData,
};
request.headers = {
'Content-Type': 'application/x-pem-file',
};
return this.doFetch<StatusOK>(
`${this.getBaseRoute()}/saml/certificate/idp`,
request,
);
};
getInProductNotices = (teamId: string, client: string, clientVersion: string) => {
return this.doFetch<ProductNotices>(
`${this.getNoticesRoute()}/${teamId}?client=${client}&clientVersion=${clientVersion}`,
{method: 'get'},
);
};
updateNoticesAsViewed = (noticeIds: string[]) => {
// Only one notice is marked as viewed at a time so using 0 index
this.trackEvent('ui', `notice_seen_${noticeIds[0]}`);
return this.doFetch<StatusOK>(
`${this.getNoticesRoute()}/view`,
{method: 'put', body: JSON.stringify(noticeIds)},
);
};
getAncillaryPermissions = (subsectionPermissions: string[]) => {
return this.doFetch<string[]>(
`${this.getPermissionsRoute()}/ancillary`,
{method: 'post', body: JSON.stringify(subsectionPermissions)},
);
};
completeSetup = (completeOnboardingRequest: CompleteOnboardingRequest) => {
return this.doFetch<StatusOK>(
`${this.getSystemRoute()}/onboarding/complete`,
{method: 'post', body: JSON.stringify(completeOnboardingRequest)},
);
};
getAppliedSchemaMigrations = () => {
return this.doFetch<SchemaMigration[]>(
`${this.getSystemRoute()}/schema/version`,
{method: 'get'},
);
};
getCallsChannelState = (channelId: string) => {
return this.doFetch<{enabled: boolean; id: string}>(
`${this.url}/plugins/${'com.mattermost.calls'}/${channelId}`,
{method: 'get'},
);
};
// Client Helpers
protected doFetch = async <ClientDataResponse>(url: string, options: Options): Promise<ClientDataResponse> => {
const {data} = await this.doFetchWithResponse<ClientDataResponse>(url, options);
return data;
};
private doFetchWithResponse = async <ClientDataResponse>(url: string, options: Options): Promise<ClientResponse<ClientDataResponse>> => {
const response = await fetch(url, this.getOptions(options));
const headers = parseAndMergeNestedHeaders(response.headers);
let data;
try {
if (headers.get('Content-Type') === 'application/json') {
data = await response.json();
} else {
data = await response.text();
}
} catch (err) {
throw new ClientError(this.getUrl(), {
message: 'Received invalid response from the server.',
url,
}, err);
}
if (headers.has(HEADER_X_VERSION_ID) && !headers.get('Cache-Control')) {
const serverVersion = headers.get(HEADER_X_VERSION_ID);
if (serverVersion && this.serverVersion !== serverVersion) {
this.serverVersion = serverVersion;
}
}
if (headers.has(HEADER_X_CLUSTER_ID)) {
const clusterId = headers.get(HEADER_X_CLUSTER_ID);
if (clusterId && this.clusterId !== clusterId) {
this.clusterId = clusterId;
}
}
if (response.ok || options.ignoreStatus) {
return {
response,
headers,
data,
};
}
const msg = data.message || '';
if (this.logToConsole) {
console.error(msg); // eslint-disable-line no-console
}
throw new ClientError(this.getUrl(), {
message: msg,
server_error_id: data.id,
status_code: data.status_code,
url,
});
};
trackEvent(category: string, event: string, props?: any) {
if (this.telemetryHandler) {
this.telemetryHandler.trackEvent(this.userId, this.userRoles, category, event, props);
}
}
pageVisited(category: string, name: string) {
if (this.telemetryHandler) {
this.telemetryHandler.pageVisited(this.userId, this.userRoles, category, name);
}
}
upsertDraft = async (draft: Draft, connectionId: string) => {
const result = await this.doFetch<Draft>(
`${this.getDraftsRoute()}`,
{
method: 'post',
body: JSON.stringify(draft),
headers: {
'Connection-Id': `${connectionId}`,
},
},
);
return result;
};
getUserDrafts = (teamId: Team['id']) => {
return this.doFetch<Draft[]>(
`${this.getUserRoute('me')}/teams/${teamId}/drafts`,
{method: 'get'},
);
};
deleteDraft = (channelId: Channel['id'], rootId = '', connectionId: string) => {
let endpoint = `${this.getUserRoute('me')}/channels/${channelId}/drafts`;
if (rootId !== '') {
endpoint += `/${rootId}`;
}
return this.doFetch<null>(
endpoint,
{
method: 'delete',
headers: {
'Connection-Id': `${connectionId}`,
},
},
);
};
getIPFilters = () => {
return this.doFetch<AllowedIPRange[]>(
`${this.getBaseRoute()}/ip_filtering`,
{method: 'get'},
);
};
getCurrentIP = () => {
return this.doFetch<FetchIPResponse>(
`${this.getBaseRoute()}/ip_filtering/my_ip`,
{method: 'get'},
);
};
applyIPFilters = (filters: AllowedIPRanges) => {
return this.doFetch<AllowedIPRange[]>(
`${this.getBaseRoute()}/ip_filtering`,
{method: 'post', body: JSON.stringify(filters)},
);
};
getGroupMessageMembersCommonTeams = (channelId: string) => {
return this.doFetchWithResponse<Team[]>(
`${this.getChannelRoute(channelId)}/common_teams`,
{method: 'get'},
);
};
convertGroupMessageToPrivateChannel = (channelId: string, teamId: string, displayName: string, name: string) => {
const body = {
channel_id: channelId,
team_id: teamId,
display_name: displayName,
name,
};
return this.doFetchWithResponse<Channel>(
`${this.getChannelRoute(channelId)}/convert_to_channel?team_id=${teamId}`,
{method: 'post', body: JSON.stringify(body)},
);
};
}
export function parseAndMergeNestedHeaders(originalHeaders: any) {
const headers = new Map();
let nestedHeaders = new Map();
originalHeaders.forEach((val: string, key: string) => {
const capitalizedKey = key.replace(/\b[a-z]/g, (l) => l.toUpperCase());
let realVal = val;
if (val && val.match(/\n\S+:\s\S+/)) {
const nestedHeaderStrings = val.split('\n');
realVal = nestedHeaderStrings.shift() as string;
const moreNestedHeaders = new Map(
nestedHeaderStrings.map((h: any) => h.split(/:\s/)),
);
nestedHeaders = new Map([...nestedHeaders, ...moreNestedHeaders]);
}
headers.set(capitalizedKey, realVal);
});
return new Map([...headers, ...nestedHeaders]);
}
export class ClientError extends Error implements ServerError {
url?: string;
server_error_id?: string;
status_code?: number;
constructor(baseUrl: string, data: ServerError, cause?: any) {
super(data.message + ': ' + cleanUrlForLogging(baseUrl, data.url || ''), {cause});
this.message = data.message;
this.url = data.url;
this.server_error_id = data.server_error_id;
this.status_code = data.status_code;
// Ensure message is treated as a property of this class when object spreading. Without this,
// copying the object by using `{...error}` would not include the message.
Object.defineProperty(this, 'message', {enumerable: true});
}
}