summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--mattermost.go20
-rw-r--r--webapp/actions/analytics_actions.jsx2
-rw-r--r--webapp/actions/channel_actions.jsx2
-rw-r--r--webapp/actions/global_actions.jsx4
-rw-r--r--webapp/actions/post_actions.jsx2
-rw-r--r--webapp/actions/team_actions.jsx2
-rw-r--r--webapp/actions/user_actions.jsx2
-rw-r--r--webapp/actions/websocket_actions.jsx4
-rw-r--r--webapp/client/client.jsx1670
-rw-r--r--webapp/client/web_client.jsx (renamed from webapp/utils/web_client.jsx)2
-rw-r--r--webapp/client/web_websocket_client.jsx (renamed from webapp/utils/websocket_client.jsx)2
-rw-r--r--webapp/client/websocket_client.jsx165
-rw-r--r--webapp/components/activity_log_modal.jsx2
-rw-r--r--webapp/components/admin_console/admin_settings.jsx2
-rw-r--r--webapp/components/admin_console/admin_sidebar_header.jsx2
-rw-r--r--webapp/components/admin_console/brand_image_setting.jsx2
-rw-r--r--webapp/components/admin_console/compliance_reports.jsx2
-rw-r--r--webapp/components/admin_console/email_connection_test.jsx2
-rw-r--r--webapp/components/admin_console/license_settings.jsx2
-rw-r--r--webapp/components/admin_console/recycle_db.jsx2
-rw-r--r--webapp/components/admin_console/reload_config.jsx2
-rw-r--r--webapp/components/admin_console/reset_password_modal.jsx2
-rw-r--r--webapp/components/admin_console/saml_settings.jsx2
-rw-r--r--webapp/components/admin_console/sync_now_button.jsx2
-rw-r--r--webapp/components/admin_console/team_users.jsx2
-rw-r--r--webapp/components/admin_console/user_item.jsx2
-rw-r--r--webapp/components/authorize.jsx2
-rw-r--r--webapp/components/channel_header.jsx2
-rw-r--r--webapp/components/channel_invite_button.jsx2
-rw-r--r--webapp/components/channel_members_modal.jsx2
-rw-r--r--webapp/components/channel_notifications_modal.jsx2
-rw-r--r--webapp/components/claim/components/email_to_ldap.jsx2
-rw-r--r--webapp/components/claim/components/email_to_oauth.jsx2
-rw-r--r--webapp/components/claim/components/oauth_to_email.jsx2
-rw-r--r--webapp/components/create_comment.jsx2
-rw-r--r--webapp/components/create_post.jsx2
-rw-r--r--webapp/components/delete_channel_modal.jsx2
-rw-r--r--webapp/components/delete_post_modal.jsx2
-rw-r--r--webapp/components/do_verify_email.jsx2
-rw-r--r--webapp/components/edit_channel_header_modal.jsx2
-rw-r--r--webapp/components/edit_channel_purpose_modal.jsx2
-rw-r--r--webapp/components/edit_post_modal.jsx2
-rw-r--r--webapp/components/file_attachment.jsx2
-rw-r--r--webapp/components/file_upload.jsx2
-rw-r--r--webapp/components/invite_member_modal.jsx2
-rw-r--r--webapp/components/login/login_controller.jsx2
-rw-r--r--webapp/components/navbar.jsx2
-rw-r--r--webapp/components/new_channel_flow.jsx2
-rw-r--r--webapp/components/password_reset_form.jsx2
-rw-r--r--webapp/components/password_reset_send_link.jsx2
-rw-r--r--webapp/components/popover_list_members.jsx2
-rw-r--r--webapp/components/post_view/components/pending_post_options.jsx2
-rw-r--r--webapp/components/register_app_modal.jsx2
-rw-r--r--webapp/components/rename_channel_modal.jsx2
-rw-r--r--webapp/components/rhs_comment.jsx2
-rw-r--r--webapp/components/root.jsx2
-rw-r--r--webapp/components/search_bar.jsx4
-rw-r--r--webapp/components/should_verify_email.jsx2
-rw-r--r--webapp/components/sidebar_header.jsx2
-rw-r--r--webapp/components/signup_user_complete.jsx2
-rw-r--r--webapp/components/suggestion/at_mention_provider.jsx2
-rw-r--r--webapp/components/suggestion/search_user_provider.jsx2
-rw-r--r--webapp/components/team_general_tab.jsx2
-rw-r--r--webapp/components/team_members_dropdown.jsx2
-rw-r--r--webapp/components/user_list_row.jsx2
-rw-r--r--webapp/components/user_profile.jsx2
-rw-r--r--webapp/components/user_settings/manage_languages.jsx2
-rw-r--r--webapp/components/user_settings/user_settings_general.jsx2
-rw-r--r--webapp/components/user_settings/user_settings_notifications.jsx2
-rw-r--r--webapp/components/user_settings/user_settings_security.jsx2
-rw-r--r--webapp/components/youtube_video.jsx2
-rw-r--r--webapp/package.json1
-rw-r--r--webapp/routes/route_team.jsx2
-rw-r--r--webapp/tests/client_admin.test.jsx311
-rw-r--r--webapp/tests/client_channel.test.jsx353
-rw-r--r--webapp/tests/client_command.test.jsx116
-rw-r--r--webapp/tests/client_emoji.test.jsx100
-rw-r--r--webapp/tests/client_general.test.jsx85
-rw-r--r--webapp/tests/client_hooks.test.jsx132
-rw-r--r--webapp/tests/client_oauth.test.jsx53
-rw-r--r--webapp/tests/client_post.test.jsx201
-rw-r--r--webapp/tests/client_preferences.test.jsx65
-rw-r--r--webapp/tests/client_team.test.jsx244
-rw-r--r--webapp/tests/client_user.test.jsx558
-rw-r--r--webapp/tests/test_helper.jsx174
-rw-r--r--webapp/utils/async_client.jsx2
-rw-r--r--webapp/utils/channel_intro_messages.jsx2
-rw-r--r--webapp/utils/post_utils.jsx2
-rw-r--r--webapp/utils/utils.jsx2
-rw-r--r--webapp/webpack.config.js18
91 files changed, 4310 insertions, 109 deletions
diff --git a/.gitignore b/.gitignore
index 08c2665f8..e2622a829 100644
--- a/.gitignore
+++ b/.gitignore
@@ -67,6 +67,7 @@ web/sass-files/sass/.sass-cache/
# Default local file storage
data/*
+webapp/data/*
api/data/*
enterprise
diff --git a/mattermost.go b/mattermost.go
index c07c38b2b..ef3d37241 100644
--- a/mattermost.go
+++ b/mattermost.go
@@ -363,6 +363,11 @@ type TeamForUpgrade struct {
func setupClientTests() {
*utils.Cfg.TeamSettings.EnableOpenServer = true
+ *utils.Cfg.ServiceSettings.EnableCommands = false
+ *utils.Cfg.ServiceSettings.EnableOnlyAdminIntegrations = false
+ *utils.Cfg.ServiceSettings.EnableCustomEmoji = true
+ utils.Cfg.ServiceSettings.EnableIncomingWebhooks = false
+ utils.Cfg.ServiceSettings.EnableOutgoingWebhooks = false
}
func executeTestCommand(cmd *exec.Cmd) {
@@ -391,24 +396,11 @@ func runWebClientTests() {
executeTestCommand(cmd)
}
-func runJavascriptClientTests() {
- os.Chdir("../mattermost-driver-javascript")
- cmd := exec.Command("npm", "test")
- executeTestCommand(cmd)
-}
-
func cmdRunClientTests() {
if flagCmdRunWebClientTests {
- api.StartServer()
setupClientTests()
- runWebClientTests()
- api.StopServer()
- }
-
- if flagCmdRunJavascriptClientTests {
api.StartServer()
- setupClientTests()
- runJavascriptClientTests()
+ runWebClientTests()
api.StopServer()
}
}
diff --git a/webapp/actions/analytics_actions.jsx b/webapp/actions/analytics_actions.jsx
index 05e4eeee2..924afdaed 100644
--- a/webapp/actions/analytics_actions.jsx
+++ b/webapp/actions/analytics_actions.jsx
@@ -1,7 +1,7 @@
// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
export function track(category, action, label, property, value) {
Client.track(category, action, label, property, value);
diff --git a/webapp/actions/channel_actions.jsx b/webapp/actions/channel_actions.jsx
index a590f9a9b..e8cd5aff0 100644
--- a/webapp/actions/channel_actions.jsx
+++ b/webapp/actions/channel_actions.jsx
@@ -7,7 +7,7 @@ import TeamStore from 'stores/team_store.jsx';
import UserStore from 'stores/user_store.jsx';
import ChannelStore from 'stores/channel_store.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
export function goToChannel(channel) {
if (channel.fake) {
diff --git a/webapp/actions/global_actions.jsx b/webapp/actions/global_actions.jsx
index 8d90b226d..ba92255ce 100644
--- a/webapp/actions/global_actions.jsx
+++ b/webapp/actions/global_actions.jsx
@@ -17,9 +17,9 @@ import {handleNewPost} from 'actions/post_actions.jsx';
import Constants from 'utils/constants.jsx';
const ActionTypes = Constants.ActionTypes;
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
-import WebSocketClient from 'utils/websocket_client.jsx';
+import WebSocketClient from 'client/web_websocket_client.jsx';
import * as Utils from 'utils/utils.jsx';
import en from 'i18n/en.json';
diff --git a/webapp/actions/post_actions.jsx b/webapp/actions/post_actions.jsx
index a6b464a24..ae359d7f2 100644
--- a/webapp/actions/post_actions.jsx
+++ b/webapp/actions/post_actions.jsx
@@ -12,7 +12,7 @@ import * as PostUtils from 'utils/post_utils.jsx';
import Constants from 'utils/constants.jsx';
const ActionTypes = Constants.ActionTypes;
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
export function handleNewPost(post, msg) {
diff --git a/webapp/actions/team_actions.jsx b/webapp/actions/team_actions.jsx
index 249c9d540..ea6be8504 100644
--- a/webapp/actions/team_actions.jsx
+++ b/webapp/actions/team_actions.jsx
@@ -7,7 +7,7 @@ import Constants from 'utils/constants.jsx';
const ActionTypes = Constants.ActionTypes;
import * as AsyncClient from 'utils/async_client.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import {browserHistory} from 'react-router/es6';
diff --git a/webapp/actions/user_actions.jsx b/webapp/actions/user_actions.jsx
index 6d14e9fba..054bb017f 100644
--- a/webapp/actions/user_actions.jsx
+++ b/webapp/actions/user_actions.jsx
@@ -3,7 +3,7 @@
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import PreferenceStore from 'stores/preference_store.jsx';
import TeamStore from 'stores/team_store.jsx';
diff --git a/webapp/actions/websocket_actions.jsx b/webapp/actions/websocket_actions.jsx
index 03c01b60b..8285c2c93 100644
--- a/webapp/actions/websocket_actions.jsx
+++ b/webapp/actions/websocket_actions.jsx
@@ -13,8 +13,8 @@ import BrowserStore from 'stores/browser_store.jsx';
import ErrorStore from 'stores/error_store.jsx';
import NotificationStore from 'stores/notification_store.jsx'; //eslint-disable-line no-unused-vars
-import Client from 'utils/web_client.jsx';
-import WebSocketClient from 'utils/websocket_client.jsx';
+import Client from 'client/web_client.jsx';
+import WebSocketClient from 'client/web_websocket_client.jsx';
import * as Utils from 'utils/utils.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
diff --git a/webapp/client/client.jsx b/webapp/client/client.jsx
new file mode 100644
index 000000000..5ee28be78
--- /dev/null
+++ b/webapp/client/client.jsx
@@ -0,0 +1,1670 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import request from 'superagent';
+
+const HEADER_X_VERSION_ID = 'x-version-id';
+const HEADER_TOKEN = 'token';
+const HEADER_BEARER = 'BEARER';
+const HEADER_AUTH = 'Authorization';
+
+export default class Client {
+ constructor() {
+ this.teamId = '';
+ this.serverVersion = '';
+ this.logToConsole = false;
+ this.useToken = false;
+ this.token = '';
+ this.url = '';
+ this.urlVersion = '/api/v3';
+ this.defaultHeaders = {
+ 'X-Requested-With': 'XMLHttpRequest'
+ };
+
+ this.translations = {
+ connectionError: 'There appears to be a problem with your internet connection.',
+ unknownError: 'We received an unexpected status code from the server.'
+ };
+ }
+
+ setUrl(url) {
+ this.url = url;
+ }
+
+ setAcceptLanguage(locale) {
+ this.defaultHeaders['Accept-Language'] = locale;
+ }
+
+ setTeamId(id) {
+ this.teamId = id;
+ }
+
+ getTeamId() {
+ if (this.teamId === '') {
+ console.error('You are trying to use a route that requires a team_id, but you have not called setTeamId() in client.jsx'); // eslint-disable-line no-console
+ }
+
+ return this.teamId;
+ }
+
+ getServerVersion() {
+ return this.serverVersion;
+ }
+
+ getBaseRoute() {
+ return `${this.url}${this.urlVersion}`;
+ }
+
+ getAdminRoute() {
+ return `${this.url}${this.urlVersion}/admin`;
+ }
+
+ getGeneralRoute() {
+ return `${this.url}${this.urlVersion}/general`;
+ }
+
+ getLicenseRoute() {
+ return `${this.url}${this.urlVersion}/license`;
+ }
+
+ getTeamsRoute() {
+ return `${this.url}${this.urlVersion}/teams`;
+ }
+
+ getTeamNeededRoute() {
+ return `${this.url}${this.urlVersion}/teams/${this.getTeamId()}`;
+ }
+
+ getChannelsRoute() {
+ return `${this.url}${this.urlVersion}/teams/${this.getTeamId()}/channels`;
+ }
+
+ getChannelNameRoute(channelName) {
+ return `${this.url}${this.urlVersion}/teams/${this.getTeamId()}/channels/name/${channelName}`;
+ }
+
+ getChannelNeededRoute(channelId) {
+ return `${this.url}${this.urlVersion}/teams/${this.getTeamId()}/channels/${channelId}`;
+ }
+
+ getCommandsRoute() {
+ return `${this.url}${this.urlVersion}/teams/${this.getTeamId()}/commands`;
+ }
+
+ getEmojiRoute() {
+ return `${this.url}${this.urlVersion}/emoji`;
+ }
+
+ getHooksRoute() {
+ return `${this.url}${this.urlVersion}/teams/${this.getTeamId()}/hooks`;
+ }
+
+ getPostsRoute(channelId) {
+ return `${this.url}${this.urlVersion}/teams/${this.getTeamId()}/channels/${channelId}/posts`;
+ }
+
+ getUsersRoute() {
+ return `${this.url}${this.urlVersion}/users`;
+ }
+
+ getFilesRoute() {
+ return `${this.url}${this.urlVersion}/teams/${this.getTeamId()}/files`;
+ }
+
+ getOAuthRoute() {
+ return `${this.url}${this.urlVersion}/oauth`;
+ }
+
+ getUserNeededRoute(userId) {
+ return `${this.url}${this.urlVersion}/users/${userId}`;
+ }
+
+ setTranslations(messages) {
+ this.translations = messages;
+ }
+
+ enableLogErrorsToConsole(enabled) {
+ this.logToConsole = enabled;
+ }
+
+ useHeaderToken() {
+ this.useToken = true;
+ if (this.token !== '') {
+ this.defaultHeaders[HEADER_AUTH] = `${HEADER_BEARER} ${this.token}`;
+ }
+ }
+
+ track(category, action, label, property, value) { // eslint-disable-line no-unused-vars
+ // NO-OP for inherited classes to override
+ }
+
+ trackPage() {
+ // NO-OP for inherited classes to override
+ }
+
+ handleError(err, res) { // eslint-disable-line no-unused-vars
+ // NO-OP for inherited classes to override
+ }
+
+ handleResponse(methodName, successCallback, errorCallback, err, res) {
+ if (res && res.header) {
+ this.serverVersion = res.header[HEADER_X_VERSION_ID];
+ if (res.header[HEADER_X_VERSION_ID]) {
+ this.serverVersion = res.header[HEADER_X_VERSION_ID];
+ }
+ }
+
+ if (err) {
+ // test to make sure it looks like a server JSON error response
+ var e = null;
+ if (res && res.body && res.body.id) {
+ e = res.body;
+ }
+
+ var msg = '';
+
+ if (e) {
+ msg = 'method=' + methodName + ' msg=' + e.message + ' detail=' + e.detailed_error + ' rid=' + e.request_id;
+ } else {
+ msg = 'method=' + methodName + ' status=' + err.status + ' statusCode=' + err.statusCode + ' err=' + err;
+
+ if (err.status === 0 || !err.status) {
+ e = {message: this.translations.connectionError};
+ } else {
+ e = {message: this.translations.unknownError + ' (' + err.status + ')'};
+ }
+ }
+
+ if (this.logToConsole) {
+ console.error(msg); // eslint-disable-line no-console
+ console.error(e); // eslint-disable-line no-console
+ }
+
+ this.track('api', 'api_weberror', methodName, 'message', msg);
+
+ this.handleError(err, res);
+
+ if (errorCallback) {
+ errorCallback(e, err, res);
+ return;
+ }
+ }
+
+ if (successCallback) {
+ successCallback(res.body, res);
+ }
+ }
+
+ // General Routes Section
+
+ getClientConfig(success, error) {
+ return request.
+ get(`${this.getGeneralRoute()}/client_props`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getClientConfig', success, error));
+ }
+
+ getPing(success, error) {
+ return request.
+ get(`${this.getGeneralRoute()}/ping`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getPing', success, error));
+ }
+
+ logClientError(msg) {
+ var l = {};
+ l.level = 'ERROR';
+ l.message = msg;
+
+ request.
+ post(`${this.getGeneralRoute()}/log_client`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(l).
+ end(this.handleResponse.bind(this, 'logClientError', null, null));
+ }
+
+ // Admin / Licensing Routes Section
+
+ reloadConfig(success, error) {
+ return request.
+ get(`${this.getAdminRoute()}/reload_config`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'reloadConfig', success, error));
+ }
+
+ recycleDatabaseConnection(success, error) {
+ return request.
+ get(`${this.getAdminRoute()}/recycle_db_conn`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'recycleDatabaseConnection', success, error));
+ }
+
+ getTranslations(url, success, error) {
+ return request.
+ get(url).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getTranslations', success, error));
+ }
+
+ getComplianceReports(success, error) {
+ return request.
+ get(`${this.getAdminRoute()}/compliance_reports`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getComplianceReports', success, error));
+ }
+
+ uploadBrandImage(image, success, error) {
+ request.
+ post(`${this.getAdminRoute()}/upload_brand_image`).
+ set(this.defaultHeaders).
+ accept('application/json').
+ attach('image', image, image.name).
+ end(this.handleResponse.bind(this, 'uploadBrandImage', success, error));
+ }
+
+ saveComplianceReports(job, success, error) {
+ return request.
+ post(`${this.getAdminRoute()}/save_compliance_report`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(job).
+ end(this.handleResponse.bind(this, 'saveComplianceReports', success, error));
+ }
+
+ getLogs(success, error) {
+ return request.
+ get(`${this.getAdminRoute()}/logs`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getLogs', success, error));
+ }
+
+ getServerAudits(success, error) {
+ return request.
+ get(`${this.getAdminRoute()}/audits`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getServerAudits', success, error));
+ }
+
+ getConfig(success, error) {
+ return request.
+ get(`${this.getAdminRoute()}/config`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getConfig', success, error));
+ }
+
+ getAnalytics(name, teamId, success, error) {
+ let url = `${this.getAdminRoute()}/analytics/`;
+ if (teamId == null) {
+ url += name;
+ } else {
+ url += teamId + '/' + name;
+ }
+
+ return request.
+ get(url).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getAnalytics', success, error));
+ }
+
+ getTeamAnalytics(teamId, name, success, error) {
+ return request.
+ get(`${this.getAdminRoute()}/analytics/${teamId}/${name}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getTeamAnalytics', success, error));
+ }
+
+ saveConfig(config, success, error) {
+ request.
+ post(`${this.getAdminRoute()}/save_config`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(config).
+ end(this.handleResponse.bind(this, 'saveConfig', success, error));
+ }
+
+ testEmail(config, success, error) {
+ request.
+ post(`${this.getAdminRoute()}/test_email`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(config).
+ end(this.handleResponse.bind(this, 'testEmail', success, error));
+ }
+
+ getClientLicenceConfig(success, error) {
+ request.
+ get(`${this.getLicenseRoute()}/client_config`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getClientLicenceConfig', success, error));
+ }
+
+ removeLicenseFile(success, error) {
+ request.
+ post(`${this.getLicenseRoute()}/remove`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'removeLicenseFile', success, error));
+ }
+
+ uploadLicenseFile(license, success, error) {
+ request.
+ post(`${this.getLicenseRoute()}/add`).
+ set(this.defaultHeaders).
+ accept('application/json').
+ attach('license', license, license.name).
+ end(this.handleResponse.bind(this, 'uploadLicenseFile', success, error));
+
+ this.track('api', 'api_license_upload');
+ }
+
+ importSlack(fileData, success, error) {
+ request.
+ post(`${this.getTeamNeededRoute()}/import_team`).
+ set(this.defaultHeaders).
+ accept('application/octet-stream').
+ send(fileData).
+ end(this.handleResponse.bind(this, 'importSlack', success, error));
+ }
+
+ exportTeam(success, error) {
+ request.
+ get(`${this.getTeamsRoute()}/export_team`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'exportTeam', success, error));
+ }
+
+ signupTeam(email, success, error) {
+ request.
+ post(`${this.getTeamsRoute()}/signup`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({email}).
+ end(this.handleResponse.bind(this, 'signupTeam', success, error));
+
+ this.track('api', 'api_teams_signup');
+ }
+
+ adminResetMfa(userId, success, error) {
+ const data = {};
+ data.user_id = userId;
+
+ request.
+ post(`${this.getAdminRoute()}/reset_mfa`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'adminResetMfa', success, error));
+ }
+
+ adminResetPassword(userId, newPassword, success, error) {
+ var data = {};
+ data.new_password = newPassword;
+ data.user_id = userId;
+
+ request.
+ post(`${this.getAdminRoute()}/reset_password`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'adminResetPassword', success, error));
+
+ this.track('api', 'api_admin_reset_password');
+ }
+
+ ldapSyncNow(success, error) {
+ request.
+ post(`${this.getAdminRoute()}/ldap_sync_now`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'ldapSyncNow', success, error));
+ }
+
+ // Team Routes Section
+
+ createTeamFromSignup(teamSignup, success, error) {
+ request.
+ post(`${this.getTeamsRoute()}/create_from_signup`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(teamSignup).
+ end(this.handleResponse.bind(this, 'createTeamFromSignup', success, error));
+ }
+
+ findTeamByName(teamName, success, error) {
+ request.
+ post(`${this.getTeamsRoute()}/find_team_by_name`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({name: teamName}).
+ end(this.handleResponse.bind(this, 'findTeamByName', success, error));
+ }
+
+ createTeam(team, success, error) {
+ request.
+ post(`${this.getTeamsRoute()}/create`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(team).
+ end(this.handleResponse.bind(this, 'createTeam', success, error));
+
+ this.track('api', 'api_users_create', '', 'email', team.name);
+ }
+
+ updateTeam(team, success, error) {
+ request.
+ post(`${this.getTeamNeededRoute()}/update`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(team).
+ end(this.handleResponse.bind(this, 'updateTeam', success, error));
+
+ this.track('api', 'api_teams_update_name');
+ }
+
+ getAllTeams(success, error) {
+ request.
+ get(`${this.getTeamsRoute()}/all`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getAllTeams', success, error));
+ }
+
+ getAllTeamListings(success, error) {
+ request.
+ get(`${this.getTeamsRoute()}/all_team_listings`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getAllTeamListings', success, error));
+ }
+
+ getMyTeam(success, error) {
+ request.
+ get(`${this.getTeamNeededRoute()}/me`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getMyTeam', success, error));
+ }
+
+ getTeamMembers(teamId, success, error) {
+ request.
+ get(`${this.getTeamsRoute()}/members/${teamId}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getTeamMembers', success, error));
+ }
+
+ inviteMembers(data, success, error) {
+ request.
+ post(`${this.getTeamNeededRoute()}/invite_members`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'inviteMembers', success, error));
+
+ this.track('api', 'api_teams_invite_members');
+ }
+
+ addUserToTeam(teamId, userId, success, error) {
+ let nonEmptyTeamId = teamId;
+ if (nonEmptyTeamId === '') {
+ nonEmptyTeamId = this.getTeamId();
+ }
+
+ request.
+ post(`${this.getTeamsRoute()}/${nonEmptyTeamId}/add_user_to_team`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({user_id: userId}).
+ end(this.handleResponse.bind(this, 'addUserToTeam', success, error));
+
+ this.track('api', 'api_teams_invite_members');
+ }
+
+ addUserToTeamFromInvite(data, hash, inviteId, success, error) {
+ request.
+ post(`${this.getTeamsRoute()}/add_user_to_team_from_invite`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({hash, data, invite_id: inviteId}).
+ end(this.handleResponse.bind(this, 'addUserToTeam', success, error));
+
+ this.track('api', 'api_teams_invite_members');
+ }
+
+ removeUserFromTeam(teamId, userId, success, error) {
+ let nonEmptyTeamId = teamId;
+ if (nonEmptyTeamId === '') {
+ nonEmptyTeamId = this.getTeamId();
+ }
+
+ request.
+ post(`${this.getTeamsRoute()}/${nonEmptyTeamId}/remove_user_from_team`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({user_id: userId}).
+ end(this.handleResponse.bind(this, 'removeUserFromTeam', success, error));
+
+ this.track('api', 'api_teams_remove_members');
+ }
+
+ getInviteInfo(inviteId, success, error) {
+ request.
+ post(`${this.getTeamsRoute()}/get_invite_info`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({invite_id: inviteId}).
+ end(this.handleResponse.bind(this, 'getInviteInfo', success, error));
+ }
+
+ // User Routes Setions
+
+ createUser(user, success, error) {
+ this.createUserWithInvite(user, null, null, null, success, error);
+ }
+
+ createUserWithInvite(user, data, emailHash, inviteId, success, error) {
+ var url = `${this.getUsersRoute()}/create`;
+
+ url += '?d=' + encodeURIComponent(data);
+
+ if (emailHash) {
+ url += '&h=' + encodeURIComponent(emailHash);
+ }
+
+ if (inviteId) {
+ url += '&iid=' + encodeURIComponent(inviteId);
+ }
+
+ request.
+ post(url).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(user).
+ end(this.handleResponse.bind(this, 'createUser', success, error));
+
+ this.track('api', 'api_users_create', '', 'email', user.email);
+ }
+
+ updateUser(user, type, success, error) {
+ request.
+ post(`${this.getUsersRoute()}/update`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(user).
+ end(this.handleResponse.bind(this, 'updateUser', success, error));
+
+ if (type) {
+ this.track('api', 'api_users_update_' + type);
+ } else {
+ this.track('api', 'api_users_update');
+ }
+ }
+
+ updatePassword(userId, currentPassword, newPassword, success, error) {
+ var data = {};
+ data.user_id = userId;
+ data.current_password = currentPassword;
+ data.new_password = newPassword;
+
+ request.
+ post(`${this.getUsersRoute()}/newpassword`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'updatePassword', success, error));
+
+ this.track('api', 'api_users_newpassword');
+ }
+
+ updateUserNotifyProps(notifyProps, success, error) {
+ request.
+ post(`${this.getUsersRoute()}/update_notify`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(notifyProps).
+ end(this.handleResponse.bind(this, 'updateUserNotifyProps', success, error));
+
+ this.track('api', 'api_users_update_notification_settings');
+ }
+
+ updateRoles(teamId, userId, newRoles, success, error) {
+ var data = {
+ team_id: teamId,
+ user_id: userId,
+ new_roles: newRoles
+ };
+
+ request.
+ post(`${this.getUsersRoute()}/update_roles`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'updateRoles', success, error));
+
+ this.track('api', 'api_users_update_roles');
+ }
+
+ updateActive(userId, active, success, error) {
+ var data = {};
+ data.user_id = userId;
+ data.active = '' + active;
+
+ request.
+ post(`${this.getUsersRoute()}/update_active`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'updateActive', success, error));
+
+ this.track('api', 'api_users_update_roles');
+ }
+
+ sendPasswordReset(email, success, error) {
+ var data = {};
+ data.email = email;
+
+ request.
+ post(`${this.getUsersRoute()}/send_password_reset`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'sendPasswordReset', success, error));
+
+ this.track('api', 'api_users_send_password_reset');
+ }
+
+ resetPassword(code, newPassword, success, error) {
+ var data = {};
+ data.new_password = newPassword;
+ data.code = code;
+
+ request.
+ post(`${this.getUsersRoute()}/reset_password`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'resetPassword', success, error));
+
+ this.track('api', 'api_users_reset_password');
+ }
+
+ emailToOAuth(email, password, service, success, error) {
+ var data = {};
+ data.password = password;
+ data.email = email;
+ data.service = service;
+
+ request.
+ post(`${this.getUsersRoute()}/claim/email_to_oauth`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'emailToOAuth', success, error));
+
+ this.track('api', 'api_users_email_to_oauth');
+ }
+
+ oauthToEmail(email, password, success, error) {
+ var data = {};
+ data.password = password;
+ data.email = email;
+
+ request.
+ post(`${this.getUsersRoute()}/claim/oauth_to_email`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'oauthToEmail', success, error));
+
+ this.track('api', 'api_users_oauth_to_email');
+ }
+
+ emailToLdap(email, password, ldapId, ldapPassword, success, error) {
+ var data = {};
+ data.email_password = password;
+ data.email = email;
+ data.ldap_id = ldapId;
+ data.ldap_password = ldapPassword;
+
+ request.
+ post(`${this.getUsersRoute()}/claim/email_to_ldap`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'emailToLdap', success, error));
+
+ this.track('api', 'api_users_email_to_ldap');
+ }
+
+ ldapToEmail(email, emailPassword, ldapPassword, success, error) {
+ var data = {};
+ data.email = email;
+ data.ldap_password = ldapPassword;
+ data.email_password = emailPassword;
+
+ request.
+ post(`${this.getUsersRoute()}/claim/ldap_to_email`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'ldapToEmail', success, error));
+
+ this.track('api', 'api_users_oauth_to_email');
+ }
+
+ getInitialLoad(success, error) {
+ request.
+ get(`${this.getUsersRoute()}/initial_load`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getInitialLoad', success, error));
+ }
+
+ getMe(success, error) {
+ request.
+ get(`${this.getUsersRoute()}/me`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getMe', success, error));
+ }
+
+ login(loginId, password, mfaToken, success, error) {
+ this.doLogin({login_id: loginId, password, token: mfaToken}, success, error);
+
+ this.track('api', 'api_users_login', '', 'login_id', loginId);
+ }
+
+ loginById(id, password, mfaToken, success, error) {
+ this.doLogin({id, password, token: mfaToken}, success, error);
+
+ this.track('api', 'api_users_login', '', 'id', id);
+ }
+
+ loginByLdap(loginId, password, mfaToken, success, error) {
+ this.doLogin({login_id: loginId, password, token: mfaToken, ldap_only: 'true'}, success, error);
+
+ this.track('api', 'api_users_login', '', 'login_id', loginId);
+ }
+
+ doLogin(outgoingData, success, error) {
+ var outer = this; // eslint-disable-line consistent-this
+
+ request.
+ post(`${this.getUsersRoute()}/login`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(outgoingData).
+ end(this.handleResponse.bind(
+ this,
+ 'login',
+ (data, res) => {
+ if (res && res.header) {
+ outer.token = res.header[HEADER_TOKEN];
+
+ if (outer.useToken) {
+ outer.defaultHeaders[HEADER_AUTH] = `${HEADER_BEARER} ${outer.token}`;
+ }
+ }
+
+ if (success) {
+ success(data, res);
+ }
+ },
+ error
+ ));
+ }
+
+ logout(success, error) {
+ request.
+ post(`${this.getUsersRoute()}/logout`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'logout', success, error));
+
+ this.track('api', 'api_users_logout');
+ }
+
+ checkMfa(loginId, success, error) {
+ const data = {
+ login_id: loginId
+ };
+
+ request.
+ post(`${this.getUsersRoute()}/mfa`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'checkMfa', success, error));
+
+ this.track('api', 'api_users_oauth_to_email');
+ }
+
+ revokeSession(altId, success, error) {
+ request.
+ post(`${this.getUsersRoute()}/revoke_session`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({id: altId}).
+ end(this.handleResponse.bind(this, 'revokeSession', success, error));
+ }
+
+ getSessions(userId, success, error) {
+ request.
+ get(`${this.getUserNeededRoute(userId)}/sessions`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getSessions', success, error));
+ }
+
+ getAudits(userId, success, error) {
+ request.
+ get(`${this.getUserNeededRoute(userId)}/audits`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getAudits', success, error));
+ }
+
+ getDirectProfiles(success, error) {
+ request.
+ get(`${this.getUsersRoute()}/direct_profiles`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getDirectProfiles', success, error));
+ }
+
+ getProfiles(success, error) {
+ request.
+ get(`${this.getUsersRoute()}/profiles/${this.getTeamId()}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getProfiles', success, error));
+ }
+
+ getProfilesForTeam(teamId, success, error) {
+ request.
+ get(`${this.getUsersRoute()}/profiles/${teamId}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getProfilesForTeam', success, error));
+ }
+
+ getProfilesForDirectMessageList(success, error) {
+ request.
+ get(`${this.getUsersRoute()}/profiles_for_dm_list/${this.getTeamId()}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getProfilesForDirectMessageList', success, error));
+ }
+
+ getStatuses(success, error) {
+ request.
+ get(`${this.getUsersRoute()}/status`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getStatuses', success, error));
+ }
+
+ verifyEmail(uid, hid, success, error) {
+ request.
+ post(`${this.getUsersRoute()}/verify_email`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({uid, hid}).
+ end(this.handleResponse.bind(this, 'verifyEmail', success, error));
+ }
+
+ resendVerification(email, success, error) {
+ request.
+ post(`${this.getUsersRoute()}/resend_verification`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({email}).
+ end(this.handleResponse.bind(this, 'resendVerification', success, error));
+ }
+
+ updateMfa(token, activate, success, error) {
+ const data = {};
+ data.activate = activate;
+ data.token = token;
+
+ request.
+ post(`${this.getUsersRoute()}/update_mfa`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'updateMfa', success, error));
+ }
+
+ uploadProfileImage(image, success, error) {
+ request.
+ post(`${this.getUsersRoute()}/newimage`).
+ set(this.defaultHeaders).
+ attach('image', image, image.name).
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'uploadProfileImage', success, error));
+
+ this.track('api', 'api_users_update_profile_picture');
+ }
+
+ // Channel Routes Section
+
+ createChannel(channel, success, error) {
+ request.
+ post(`${this.getChannelsRoute()}/create`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(channel).
+ end(this.handleResponse.bind(this, 'createChannel', success, error));
+
+ this.track('api', 'api_channels_create', channel.type, 'name', channel.name);
+ }
+
+ createDirectChannel(userId, success, error) {
+ request.
+ post(`${this.getChannelsRoute()}/create_direct`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({user_id: userId}).
+ end(this.handleResponse.bind(this, 'createDirectChannel', success, error));
+ }
+
+ updateChannel(channel, success, error) {
+ request.
+ post(`${this.getChannelsRoute()}/update`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(channel).
+ end(this.handleResponse.bind(this, 'updateChannel', success, error));
+
+ this.track('api', 'api_channels_update');
+ }
+
+ updateChannelHeader(channelId, header, success, error) {
+ const data = {
+ channel_id: channelId,
+ channel_header: header
+ };
+
+ request.
+ post(`${this.getChannelsRoute()}/update_header`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'updateChannel', success, error));
+
+ this.track('api', 'api_channels_header');
+ }
+
+ updateChannelPurpose(channelId, purpose, success, error) {
+ const data = {
+ channel_id: channelId,
+ channel_purpose: purpose
+ };
+
+ request.
+ post(`${this.getChannelsRoute()}/update_purpose`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'updateChannelPurpose', success, error));
+
+ this.track('api', 'api_channels_purpose');
+ }
+
+ updateChannelNotifyProps(data, success, error) {
+ request.
+ post(`${this.getChannelsRoute()}/update_notify_props`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'updateChannelNotifyProps', success, error));
+ }
+
+ leaveChannel(channelId, success, error) {
+ request.
+ post(`${this.getChannelNeededRoute(channelId)}/leave`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'leaveChannel', success, error));
+
+ this.track('api', 'api_channels_leave');
+ }
+
+ joinChannel(channelId, success, error) {
+ request.
+ post(`${this.getChannelNeededRoute(channelId)}/join`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'joinChannel', success, error));
+
+ this.track('api', 'api_channels_join');
+ }
+
+ joinChannelByName(name, success, error) {
+ request.
+ post(`${this.getChannelNameRoute(name)}/join`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'joinChannelByName', success, error));
+
+ this.track('api', 'api_channels_join_name');
+ }
+
+ deleteChannel(channelId, success, error) {
+ request.
+ post(`${this.getChannelNeededRoute(channelId)}/delete`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'deleteChannel', success, error));
+
+ this.track('api', 'api_channels_delete');
+ }
+
+ updateLastViewedAt(channelId, success, error) {
+ request.
+ post(`${this.getChannelNeededRoute(channelId)}/update_last_viewed_at`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'updateLastViewedAt', success, error));
+ }
+
+ setLastViewedAt(channelId, lastViewedAt, success, error) {
+ request.
+ post(`${this.getChannelNeededRoute(channelId)}/set_last_viewed_at`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({last_viewed_at: lastViewedAt}).
+ end(this.handleResponse.bind(this, 'setLastViewedAt', success, error));
+ }
+
+ getChannels(success, error) {
+ request.
+ get(`${this.getChannelsRoute()}/`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getChannels', success, error));
+ }
+
+ getChannel(channelId, success, error) {
+ request.
+ get(`${this.getChannelNeededRoute(channelId)}/`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getChannel', success, error));
+
+ this.track('api', 'api_channel_get');
+ }
+
+ getMoreChannels(success, error) {
+ request.
+ get(`${this.getChannelsRoute()}/more`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getMoreChannels', success, error));
+ }
+
+ getChannelCounts(success, error) {
+ request.
+ get(`${this.getChannelsRoute()}/counts`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getChannelCounts', success, error));
+ }
+
+ getChannelExtraInfo(channelId, memberLimit, success, error) {
+ var url = `${this.getChannelNeededRoute(channelId)}/extra_info`;
+ if (memberLimit) {
+ url += '/' + memberLimit;
+ }
+
+ request.
+ get(url).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getChannelExtraInfo', success, error));
+ }
+
+ addChannelMember(channelId, userId, success, error) {
+ request.
+ post(`${this.getChannelNeededRoute(channelId)}/add`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({user_id: userId}).
+ end(this.handleResponse.bind(this, 'addChannelMember', success, error));
+
+ this.track('api', 'api_channels_add_member');
+ }
+
+ removeChannelMember(channelId, userId, success, error) {
+ request.
+ post(`${this.getChannelNeededRoute(channelId)}/remove`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({user_id: userId}).
+ end(this.handleResponse.bind(this, 'removeChannelMember', success, error));
+
+ this.track('api', 'api_channels_remove_member');
+ }
+
+ // Routes for Commands
+
+ listCommands(success, error) {
+ request.
+ get(`${this.getCommandsRoute()}/list`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'listCommands', success, error));
+ }
+
+ executeCommand(channelId, command, suggest, success, error) {
+ request.
+ post(`${this.getCommandsRoute()}/execute`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({channelId, command, suggest: '' + suggest}).
+ end(this.handleResponse.bind(this, 'executeCommand', success, error));
+
+ this.track('api', 'api_integrations_used');
+ }
+
+ addCommand(command, success, error) {
+ request.
+ post(`${this.getCommandsRoute()}/create`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(command).
+ end(this.handleResponse.bind(this, 'addCommand', success, error));
+
+ this.track('api', 'api_integrations_created');
+ }
+
+ deleteCommand(commandId, success, error) {
+ request.
+ post(`${this.getCommandsRoute()}/delete`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({id: commandId}).
+ end(this.handleResponse.bind(this, 'deleteCommand', success, error));
+
+ this.track('api', 'api_integrations_deleted');
+ }
+
+ listTeamCommands(success, error) {
+ request.
+ get(`${this.getCommandsRoute()}/list_team_commands`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'listTeamCommands', success, error));
+ }
+
+ regenCommandToken(commandId, success, error) {
+ request.
+ post(`${this.getCommandsRoute()}/regen_token`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({id: commandId}).
+ end(this.handleResponse.bind(this, 'regenCommandToken', success, error));
+ }
+
+ // Routes for Posts
+
+ createPost(post, success, error) {
+ request.
+ post(`${this.getPostsRoute(post.channel_id)}/create`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(post).
+ end(this.handleResponse.bind(this, 'createPost', success, error));
+
+ this.track('api', 'api_posts_create', post.channel_id, 'length', post.message.length);
+
+ if (post.message.match(/\s#./)) {
+ this.track('api', 'api_posts_hashtag');
+ }
+
+ if (post.message.match(/\s@./)) {
+ this.track('api', 'api_posts_mentions');
+ }
+ }
+
+ // This is a temporary route to get around a problem with the permissions system that
+ // will be fixed in 3.1 or 3.2
+ getPermalinkTmp(postId, success, error) {
+ request.
+ get(`${this.getTeamNeededRoute()}/pltmp/${postId}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getPermalinkTmp', success, error));
+ }
+
+ getPostById(postId, success, error) {
+ request.
+ get(`${this.getTeamNeededRoute()}/posts/${postId}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getPostById', success, error));
+ }
+
+ getPost(channelId, postId, success, error) {
+ request.
+ get(`${this.getChannelNeededRoute(channelId)}/posts/${postId}/get`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getPost', success, error));
+ }
+
+ updatePost(post, success, error) {
+ request.
+ post(`${this.getPostsRoute(post.channel_id)}/update`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(post).
+ end(this.handleResponse.bind(this, 'updatePost', success, error));
+
+ this.track('api', 'api_posts_update');
+ }
+
+ deletePost(channelId, postId, success, error) {
+ request.
+ post(`${this.getChannelNeededRoute(channelId)}/posts/${postId}/delete`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'deletePost', success, error));
+
+ this.track('api', 'api_posts_delete');
+ }
+
+ search(terms, isOrSearch, success, error) {
+ const data = {};
+ data.terms = terms;
+ data.is_or_search = isOrSearch;
+
+ request.
+ post(`${this.getTeamNeededRoute()}/posts/search`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'search', success, error));
+
+ this.track('api', 'api_posts_search');
+ }
+
+ getPostsPage(channelId, offset, limit, success, error) {
+ request.
+ get(`${this.getPostsRoute(channelId)}/page/${offset}/${limit}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getPostsPage', success, error));
+ }
+
+ getPosts(channelId, since, success, error) {
+ request.
+ get(`${this.getPostsRoute(channelId)}/since/${since}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getPosts', success, error));
+ }
+
+ getPostsBefore(channelId, postId, offset, numPost, success, error) {
+ request.
+ get(`${this.getPostsRoute(channelId)}/${postId}/before/${offset}/${numPost}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getPostsBefore', success, error));
+ }
+
+ getPostsAfter(channelId, postId, offset, numPost, success, error) {
+ request.
+ get(`${this.getPostsRoute(channelId)}/${postId}/after/${offset}/${numPost}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getPostsAfter', success, error));
+ }
+
+ // Routes for Files
+
+ getFileInfo(filename, success, error) {
+ request.
+ get(`${this.getFilesRoute()}/get_info${filename}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getFileInfo', success, error));
+ }
+
+ getPublicLink(filename, success, error) {
+ const data = {
+ filename
+ };
+
+ request.
+ post(`${this.getFilesRoute()}/get_public_link`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(data).
+ end(this.handleResponse.bind(this, 'getPublicLink', success, error));
+ }
+
+ uploadFile(file, filename, channelId, clientId, success, error) {
+ return request.
+ post(`${this.getFilesRoute()}/upload`).
+ set(this.defaultHeaders).
+ attach('files', file, filename).
+ field('channel_id', channelId).
+ field('client_ids', clientId).
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'uploadFile', success, error));
+ }
+
+ // Routes for OAuth
+
+ registerOAuthApp(app, success, error) {
+ request.
+ post(`${this.getOAuthRoute()}/register`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(app).
+ end(this.handleResponse.bind(this, 'registerOAuthApp', success, error));
+
+ this.track('api', 'api_apps_register');
+ }
+
+ allowOAuth2(responseType, clientId, redirectUri, state, scope, success, error) {
+ request.
+ get(`${this.getOAuthRoute()}/allow`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ query({response_type: responseType}).
+ query({client_id: clientId}).
+ query({redirect_uri: redirectUri}).
+ query({scope}).
+ query({state}).
+ end(this.handleResponse.bind(this, 'allowOAuth2', success, error));
+ }
+
+ // Routes for Hooks
+
+ addIncomingHook(hook, success, error) {
+ request.
+ post(`${this.getHooksRoute()}/incoming/create`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(hook).
+ end(this.handleResponse.bind(this, 'addIncomingHook', success, error));
+
+ this.track('api', 'api_integrations_created');
+ }
+
+ deleteIncomingHook(hookId, success, error) {
+ request.
+ post(`${this.getHooksRoute()}/incoming/delete`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({id: hookId}).
+ end(this.handleResponse.bind(this, 'deleteIncomingHook', success, error));
+
+ this.track('api', 'api_integrations_deleted');
+ }
+
+ listIncomingHooks(success, error) {
+ request.
+ get(`${this.getHooksRoute()}/incoming/list`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'listIncomingHooks', success, error));
+ }
+
+ addOutgoingHook(hook, success, error) {
+ request.
+ post(`${this.getHooksRoute()}/outgoing/create`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(hook).
+ end(this.handleResponse.bind(this, 'addOutgoingHook', success, error));
+
+ this.track('api', 'api_integrations_created');
+ }
+
+ deleteOutgoingHook(hookId, success, error) {
+ request.
+ post(`${this.getHooksRoute()}/outgoing/delete`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({id: hookId}).
+ end(this.handleResponse.bind(this, 'deleteOutgoingHook', success, error));
+
+ this.track('api', 'api_integrations_deleted');
+ }
+
+ listOutgoingHooks(success, error) {
+ request.
+ get(`${this.getHooksRoute()}/outgoing/list`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'listOutgoingHooks', success, error));
+ }
+
+ regenOutgoingHookToken(hookId, success, error) {
+ request.
+ post(`${this.getHooksRoute()}/outgoing/regen_token`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send({id: hookId}).
+ end(this.handleResponse.bind(this, 'regenOutgoingHookToken', success, error));
+ }
+
+ // Routes for Preferences
+
+ getAllPreferences(success, error) {
+ request.
+ get(`${this.getBaseRoute()}/preferences/`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getAllPreferences', success, error));
+ }
+
+ savePreferences(preferences, success, error) {
+ request.
+ post(`${this.getBaseRoute()}/preferences/save`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(preferences).
+ end(this.handleResponse.bind(this, 'savePreferences', success, error));
+ }
+
+ getPreferenceCategory(category, success, error) {
+ request.
+ get(`${this.getBaseRoute()}/preferences/${category}`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'getPreferenceCategory', success, error));
+ }
+
+ deletePreferences(preferences, success, error) {
+ request.
+ post(`${this.getBaseRoute()}/preferences/delete`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ send(preferences).
+ end(this.handleResponse.bind(this, 'deletePreferences', success, error));
+ }
+
+ // Routes for Emoji
+
+ listEmoji(success, error) {
+ request.
+ get(`${this.getEmojiRoute()}/list`).
+ set(this.defaultHeaders).
+ type('application/json').
+ accept('application/json').
+ end(this.handleResponse.bind(this, 'listEmoji', success, error));
+ }
+
+ addEmoji(emoji, image, success, error) {
+ request.
+ post(`${this.getEmojiRoute()}/create`).
+ set(this.defaultHeaders).
+ accept('application/json').
+ attach('image', image, image.name).
+ field('emoji', JSON.stringify(emoji)).
+ end(this.handleResponse.bind(this, 'addEmoji', success, error));
+ }
+
+ deleteEmoji(id, success, error) {
+ request.
+ post(`${this.getEmojiRoute()}/delete`).
+ set(this.defaultHeaders).
+ accept('application/json').
+ send({id}).
+ end(this.handleResponse.bind(this, 'deleteEmoji', success, error));
+ }
+
+ getCustomEmojiImageUrl(id) {
+ return `${this.getEmojiRoute()}/${id}`;
+ }
+
+ uploadCertificateFile(file, success, error) {
+ request.
+ post(`${this.getAdminRoute()}/add_certificate`).
+ set(this.defaultHeaders).
+ accept('application/json').
+ attach('certificate', file, file.name).
+ end(this.handleResponse.bind(this, 'uploadCertificateFile', success, error));
+ }
+
+ removeCertificateFile(filename, success, error) {
+ request.
+ post(`${this.getAdminRoute()}/remove_certificate`).
+ set(this.defaultHeaders).
+ accept('application/json').
+ send({filename}).
+ end(this.handleResponse.bind(this, 'removeCertificateFile', success, error));
+ }
+}
diff --git a/webapp/utils/web_client.jsx b/webapp/client/web_client.jsx
index b974ad31f..d6474f1d9 100644
--- a/webapp/utils/web_client.jsx
+++ b/webapp/client/web_client.jsx
@@ -1,7 +1,7 @@
// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
-import Client from 'mattermost/client.jsx';
+import Client from './client.jsx';
import TeamStore from '../stores/team_store.jsx';
import BrowserStore from '../stores/browser_store.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
diff --git a/webapp/utils/websocket_client.jsx b/webapp/client/web_websocket_client.jsx
index 135d96466..d05207608 100644
--- a/webapp/utils/websocket_client.jsx
+++ b/webapp/client/web_websocket_client.jsx
@@ -1,7 +1,7 @@
// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
-import WebSocketClient from 'mattermost/websocket_client.jsx';
+import WebSocketClient from './websocket_client.jsx';
var WebClient = new WebSocketClient();
export default WebClient;
diff --git a/webapp/client/websocket_client.jsx b/webapp/client/websocket_client.jsx
new file mode 100644
index 000000000..99d2311b7
--- /dev/null
+++ b/webapp/client/websocket_client.jsx
@@ -0,0 +1,165 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+const MAX_WEBSOCKET_FAILS = 7;
+const MIN_WEBSOCKET_RETRY_TIME = 3000; // 3 sec
+const MAX_WEBSOCKET_RETRY_TIME = 300000; // 5 mins
+
+export default class WebSocketClient {
+ constructor() {
+ this.conn = null;
+ this.sequence = 1;
+ this.connectFailCount = 0;
+ this.manuallyClosed = false;
+ this.eventCallback = null;
+ this.responseCallbacks = {};
+ this.reconnectCallback = null;
+ this.errorCallback = null;
+ this.closeCallback = null;
+ }
+
+ initialize(connectionUrl) {
+ if (this.conn) {
+ return;
+ }
+
+ if (this.connectFailCount === 0) {
+ console.log('websocket connecting to ' + connectionUrl); //eslint-disable-line no-console
+ }
+
+ this.manuallyClosed = false;
+
+ this.conn = new WebSocket(connectionUrl);
+
+ this.conn.onopen = () => {
+ if (this.reconnectCallback) {
+ this.reconnectCallback();
+ }
+
+ if (this.connectFailCount > 0) {
+ console.log('websocket re-established connection'); //eslint-disable-line no-console
+ }
+
+ this.connectFailCount = 0;
+ };
+
+ this.conn.onclose = () => {
+ this.conn = null;
+ this.sequence = 1;
+
+ if (this.connectFailCount === 0) {
+ console.log('websocket closed'); //eslint-disable-line no-console
+ }
+
+ if (this.manuallyClosed) {
+ return;
+ }
+
+ this.connectFailCount++;
+
+ if (this.closeCallback) {
+ this.closeCallback(this.connectFailCount);
+ }
+
+ let retryTime = MIN_WEBSOCKET_RETRY_TIME;
+
+ // If we've failed a bunch of connections then start backing off
+ if (this.connectFailCount > MAX_WEBSOCKET_FAILS) {
+ retryTime = MIN_WEBSOCKET_RETRY_TIME * this.connectFailCount * this.connectFailCount;
+ if (retryTime > MAX_WEBSOCKET_RETRY_TIME) {
+ retryTime = MAX_WEBSOCKET_RETRY_TIME;
+ }
+ }
+
+ setTimeout(
+ () => {
+ this.initialize(connectionUrl);
+ },
+ retryTime
+ );
+ };
+
+ this.conn.onerror = (evt) => {
+ if (this.connectFailCount <= 1) {
+ console.log('websocket error'); //eslint-disable-line no-console
+ console.log(evt); //eslint-disable-line no-console
+ }
+
+ if (this.errorCallback) {
+ this.errorCallback(evt);
+ }
+ };
+
+ this.conn.onmessage = (evt) => {
+ const msg = JSON.parse(evt.data);
+ if (msg.seq_reply) {
+ if (msg.error) {
+ console.log(msg); //eslint-disable-line no-console
+ }
+
+ if (this.responseCallbacks[msg.seq_reply]) {
+ this.responseCallbacks[msg.seq_reply](msg);
+ Reflect.deleteProperty(this.responseCallbacks, msg.seq_reply);
+ }
+ } else if (this.eventCallback) {
+ this.eventCallback(msg);
+ }
+ };
+ }
+
+ setEventCallback(callback) {
+ this.eventCallback = callback;
+ }
+
+ setReconnectCallback(callback) {
+ this.reconnectCallback = callback;
+ }
+
+ setErrorCallback(callback) {
+ this.errorCallback = callback;
+ }
+
+ setCloseCallback(callback) {
+ this.closeCallback = callback;
+ }
+
+ close() {
+ this.manuallyClosed = true;
+ this.connectFailCount = 0;
+ this.sequence = 1;
+ if (this.conn && this.conn.readyState === WebSocket.OPEN) {
+ this.conn.close();
+ }
+ }
+
+ sendMessage(action, data, responseCallback) {
+ const msg = {
+ action,
+ seq: this.sequence++,
+ data
+ };
+
+ if (responseCallback) {
+ this.responseCallbacks[msg.seq] = responseCallback;
+ }
+
+ if (this.conn && this.conn.readyState === WebSocket.OPEN) {
+ this.conn.send(JSON.stringify(msg));
+ } else if (!this.conn || this.conn.readyState === WebSocket.Closed) {
+ this.conn = null;
+ this.initialize();
+ }
+ }
+
+ userTyping(channelId, parentId) {
+ const data = {};
+ data.channel_id = channelId;
+ data.parent_id = parentId;
+
+ this.sendMessage('user_typing', data);
+ }
+
+ getStatuses(callback) {
+ this.sendMessage('get_statuses', null, callback);
+ }
+}
diff --git a/webapp/components/activity_log_modal.jsx b/webapp/components/activity_log_modal.jsx
index ab6224906..7560cf5d9 100644
--- a/webapp/components/activity_log_modal.jsx
+++ b/webapp/components/activity_log_modal.jsx
@@ -3,7 +3,7 @@
import $ from 'jquery';
import UserStore from 'stores/user_store.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import {Modal} from 'react-bootstrap';
import LoadingScreen from './loading_screen.jsx';
diff --git a/webapp/components/admin_console/admin_settings.jsx b/webapp/components/admin_console/admin_settings.jsx
index eda2d1d8a..d670d599d 100644
--- a/webapp/components/admin_console/admin_settings.jsx
+++ b/webapp/components/admin_console/admin_settings.jsx
@@ -4,7 +4,7 @@
import React from 'react';
import * as AsyncClient from 'utils/async_client.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import FormError from 'components/form_error.jsx';
import SaveButton from 'components/admin_console/save_button.jsx';
diff --git a/webapp/components/admin_console/admin_sidebar_header.jsx b/webapp/components/admin_console/admin_sidebar_header.jsx
index 400730030..86c2c6b0f 100644
--- a/webapp/components/admin_console/admin_sidebar_header.jsx
+++ b/webapp/components/admin_console/admin_sidebar_header.jsx
@@ -4,7 +4,7 @@
import $ from 'jquery';
import AdminNavbarDropdown from './admin_navbar_dropdown.jsx';
import UserStore from 'stores/user_store.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import {FormattedMessage} from 'react-intl';
diff --git a/webapp/components/admin_console/brand_image_setting.jsx b/webapp/components/admin_console/brand_image_setting.jsx
index 252328f25..653073200 100644
--- a/webapp/components/admin_console/brand_image_setting.jsx
+++ b/webapp/components/admin_console/brand_image_setting.jsx
@@ -5,7 +5,7 @@ import $ from 'jquery';
import React from 'react';
import ReactDOM from 'react-dom';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import FormError from 'components/form_error.jsx';
diff --git a/webapp/components/admin_console/compliance_reports.jsx b/webapp/components/admin_console/compliance_reports.jsx
index 9bde450ff..eb7faa0f6 100644
--- a/webapp/components/admin_console/compliance_reports.jsx
+++ b/webapp/components/admin_console/compliance_reports.jsx
@@ -7,7 +7,7 @@ import * as Utils from '../../utils/utils.jsx';
import AdminStore from '../../stores/admin_store.jsx';
import UserStore from '../../stores/user_store.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from '../../utils/async_client.jsx';
import {FormattedMessage, FormattedDate, FormattedTime} from 'react-intl';
diff --git a/webapp/components/admin_console/email_connection_test.jsx b/webapp/components/admin_console/email_connection_test.jsx
index c90c80b99..c66543bbf 100644
--- a/webapp/components/admin_console/email_connection_test.jsx
+++ b/webapp/components/admin_console/email_connection_test.jsx
@@ -3,7 +3,7 @@
import React from 'react';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import {FormattedMessage} from 'react-intl';
diff --git a/webapp/components/admin_console/license_settings.jsx b/webapp/components/admin_console/license_settings.jsx
index 94cd83c07..a1e1f277c 100644
--- a/webapp/components/admin_console/license_settings.jsx
+++ b/webapp/components/admin_console/license_settings.jsx
@@ -4,7 +4,7 @@
import $ from 'jquery';
import ReactDOM from 'react-dom';
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import {injectIntl, intlShape, defineMessages, FormattedMessage, FormattedHTMLMessage} from 'react-intl';
diff --git a/webapp/components/admin_console/recycle_db.jsx b/webapp/components/admin_console/recycle_db.jsx
index 0a88e6a89..db13b5295 100644
--- a/webapp/components/admin_console/recycle_db.jsx
+++ b/webapp/components/admin_console/recycle_db.jsx
@@ -3,7 +3,7 @@
import React from 'react';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
diff --git a/webapp/components/admin_console/reload_config.jsx b/webapp/components/admin_console/reload_config.jsx
index a04a98690..cf65fee8b 100644
--- a/webapp/components/admin_console/reload_config.jsx
+++ b/webapp/components/admin_console/reload_config.jsx
@@ -3,7 +3,7 @@
import React from 'react';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import {getConfig} from 'utils/async_client.jsx';
diff --git a/webapp/components/admin_console/reset_password_modal.jsx b/webapp/components/admin_console/reset_password_modal.jsx
index c383a4fb8..6d5a03f2a 100644
--- a/webapp/components/admin_console/reset_password_modal.jsx
+++ b/webapp/components/admin_console/reset_password_modal.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import ReactDOM from 'react-dom';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
import {Modal} from 'react-bootstrap';
diff --git a/webapp/components/admin_console/saml_settings.jsx b/webapp/components/admin_console/saml_settings.jsx
index 5fba78b75..ae6f3e169 100644
--- a/webapp/components/admin_console/saml_settings.jsx
+++ b/webapp/components/admin_console/saml_settings.jsx
@@ -12,7 +12,7 @@ import RemoveFileSetting from './remove_file_setting.jsx';
import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
import SettingsGroup from './settings_group.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
export default class SamlSettings extends AdminSettings {
diff --git a/webapp/components/admin_console/sync_now_button.jsx b/webapp/components/admin_console/sync_now_button.jsx
index 7197b7b35..7b08b241d 100644
--- a/webapp/components/admin_console/sync_now_button.jsx
+++ b/webapp/components/admin_console/sync_now_button.jsx
@@ -3,7 +3,7 @@
import React from 'react';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
diff --git a/webapp/components/admin_console/team_users.jsx b/webapp/components/admin_console/team_users.jsx
index f82c20a86..56b76c195 100644
--- a/webapp/components/admin_console/team_users.jsx
+++ b/webapp/components/admin_console/team_users.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import AdminStore from 'stores/admin_store.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import FormError from 'components/form_error.jsx';
import LoadingScreen from '../loading_screen.jsx';
import UserItem from './user_item.jsx';
diff --git a/webapp/components/admin_console/user_item.jsx b/webapp/components/admin_console/user_item.jsx
index 79dbd5639..3743c075d 100644
--- a/webapp/components/admin_console/user_item.jsx
+++ b/webapp/components/admin_console/user_item.jsx
@@ -1,7 +1,7 @@
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
import * as Utils from 'utils/utils.jsx';
import UserStore from 'stores/user_store.jsx';
diff --git a/webapp/components/authorize.jsx b/webapp/components/authorize.jsx
index b18469568..49ca0f36b 100644
--- a/webapp/components/authorize.jsx
+++ b/webapp/components/authorize.jsx
@@ -1,7 +1,7 @@
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
diff --git a/webapp/components/channel_header.jsx b/webapp/components/channel_header.jsx
index e69f470a3..5757fd3b2 100644
--- a/webapp/components/channel_header.jsx
+++ b/webapp/components/channel_header.jsx
@@ -27,7 +27,7 @@ import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
import * as Utils from 'utils/utils.jsx';
import * as TextFormatting from 'utils/text_formatting.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
const UserStatuses = Constants.UserStatuses;
diff --git a/webapp/components/channel_invite_button.jsx b/webapp/components/channel_invite_button.jsx
index 979e029ae..59eda8e41 100644
--- a/webapp/components/channel_invite_button.jsx
+++ b/webapp/components/channel_invite_button.jsx
@@ -4,7 +4,7 @@
import React from 'react';
import * as AsyncClient from 'utils/async_client.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import {FormattedMessage} from 'react-intl';
import SpinnerButton from 'components/spinner_button.jsx';
diff --git a/webapp/components/channel_members_modal.jsx b/webapp/components/channel_members_modal.jsx
index ecea891bb..55250d5c5 100644
--- a/webapp/components/channel_members_modal.jsx
+++ b/webapp/components/channel_members_modal.jsx
@@ -9,7 +9,7 @@ import UserStore from 'stores/user_store.jsx';
import ChannelStore from 'stores/channel_store.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import {FormattedMessage} from 'react-intl';
diff --git a/webapp/components/channel_notifications_modal.jsx b/webapp/components/channel_notifications_modal.jsx
index e6430402a..f18cefa23 100644
--- a/webapp/components/channel_notifications_modal.jsx
+++ b/webapp/components/channel_notifications_modal.jsx
@@ -6,7 +6,7 @@ import {Modal} from 'react-bootstrap';
import SettingItemMin from './setting_item_min.jsx';
import SettingItemMax from './setting_item_max.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import ChannelStore from 'stores/channel_store.jsx';
import {FormattedMessage} from 'react-intl';
diff --git a/webapp/components/claim/components/email_to_ldap.jsx b/webapp/components/claim/components/email_to_ldap.jsx
index 92d822a34..4a59b818e 100644
--- a/webapp/components/claim/components/email_to_ldap.jsx
+++ b/webapp/components/claim/components/email_to_ldap.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import React from 'react';
import ReactDOM from 'react-dom';
diff --git a/webapp/components/claim/components/email_to_oauth.jsx b/webapp/components/claim/components/email_to_oauth.jsx
index 422b31a3a..d7c4956a6 100644
--- a/webapp/components/claim/components/email_to_oauth.jsx
+++ b/webapp/components/claim/components/email_to_oauth.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
import React from 'react';
diff --git a/webapp/components/claim/components/oauth_to_email.jsx b/webapp/components/claim/components/oauth_to_email.jsx
index 79392849f..ed604583d 100644
--- a/webapp/components/claim/components/oauth_to_email.jsx
+++ b/webapp/components/claim/components/oauth_to_email.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
import React from 'react';
diff --git a/webapp/components/create_comment.jsx b/webapp/components/create_comment.jsx
index bf23f7b44..d6744e9fb 100644
--- a/webapp/components/create_comment.jsx
+++ b/webapp/components/create_comment.jsx
@@ -4,7 +4,7 @@
import $ from 'jquery';
import ReactDOM from 'react-dom';
import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import UserStore from 'stores/user_store.jsx';
import PostDeletedModal from './post_deleted_modal.jsx';
import PostStore from 'stores/post_store.jsx';
diff --git a/webapp/components/create_post.jsx b/webapp/components/create_post.jsx
index 9b61cca24..c0da9ae1d 100644
--- a/webapp/components/create_post.jsx
+++ b/webapp/components/create_post.jsx
@@ -11,7 +11,7 @@ import TutorialTip from './tutorial/tutorial_tip.jsx';
import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import * as ChannelActions from 'actions/channel_actions.jsx';
diff --git a/webapp/components/delete_channel_modal.jsx b/webapp/components/delete_channel_modal.jsx
index 925fa163c..7ec6fde44 100644
--- a/webapp/components/delete_channel_modal.jsx
+++ b/webapp/components/delete_channel_modal.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import * as AsyncClient from 'utils/async_client.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import {Modal} from 'react-bootstrap';
import TeamStore from 'stores/team_store.jsx';
import Constants from 'utils/constants.jsx';
diff --git a/webapp/components/delete_post_modal.jsx b/webapp/components/delete_post_modal.jsx
index b2aea6590..6563e3ee8 100644
--- a/webapp/components/delete_post_modal.jsx
+++ b/webapp/components/delete_post_modal.jsx
@@ -3,7 +3,7 @@
import $ from 'jquery';
import ReactDOM from 'react-dom';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import PostStore from 'stores/post_store.jsx';
import ModalStore from 'stores/modal_store.jsx';
import {Modal} from 'react-bootstrap';
diff --git a/webapp/components/do_verify_email.jsx b/webapp/components/do_verify_email.jsx
index c54d32b56..e0ac3218e 100644
--- a/webapp/components/do_verify_email.jsx
+++ b/webapp/components/do_verify_email.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import {FormattedMessage} from 'react-intl';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import LoadingScreen from './loading_screen.jsx';
import {browserHistory, Link} from 'react-router/es6';
diff --git a/webapp/components/edit_channel_header_modal.jsx b/webapp/components/edit_channel_header_modal.jsx
index cfc89500d..6112668ba 100644
--- a/webapp/components/edit_channel_header_modal.jsx
+++ b/webapp/components/edit_channel_header_modal.jsx
@@ -3,7 +3,7 @@
import ReactDOM from 'react-dom';
import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
import * as Utils from 'utils/utils.jsx';
import PreferenceStore from 'stores/preference_store.jsx';
diff --git a/webapp/components/edit_channel_purpose_modal.jsx b/webapp/components/edit_channel_purpose_modal.jsx
index 747ac6fed..664a94cf2 100644
--- a/webapp/components/edit_channel_purpose_modal.jsx
+++ b/webapp/components/edit_channel_purpose_modal.jsx
@@ -4,7 +4,7 @@
import $ from 'jquery';
import ReactDOM from 'react-dom';
import * as AsyncClient from 'utils/async_client.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'react-intl';
import PreferenceStore from 'stores/preference_store.jsx';
diff --git a/webapp/components/edit_post_modal.jsx b/webapp/components/edit_post_modal.jsx
index 8be0ba243..b346503a9 100644
--- a/webapp/components/edit_post_modal.jsx
+++ b/webapp/components/edit_post_modal.jsx
@@ -3,7 +3,7 @@
import $ from 'jquery';
import ReactDOM from 'react-dom';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
import Textbox from './textbox.jsx';
diff --git a/webapp/components/file_attachment.jsx b/webapp/components/file_attachment.jsx
index b6d535b84..f9c361afc 100644
--- a/webapp/components/file_attachment.jsx
+++ b/webapp/components/file_attachment.jsx
@@ -4,7 +4,7 @@
import $ from 'jquery';
import ReactDOM from 'react-dom';
import * as utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
import {intlShape, injectIntl, defineMessages} from 'react-intl';
diff --git a/webapp/components/file_upload.jsx b/webapp/components/file_upload.jsx
index 1a3c6eadc..ee3871b29 100644
--- a/webapp/components/file_upload.jsx
+++ b/webapp/components/file_upload.jsx
@@ -4,7 +4,7 @@
import $ from 'jquery';
import 'jquery-dragster/jquery.dragster.js';
import ReactDOM from 'react-dom';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
import ChannelStore from 'stores/channel_store.jsx';
import * as Utils from 'utils/utils.jsx';
diff --git a/webapp/components/invite_member_modal.jsx b/webapp/components/invite_member_modal.jsx
index 68a7b7b15..1ba3b0c4e 100644
--- a/webapp/components/invite_member_modal.jsx
+++ b/webapp/components/invite_member_modal.jsx
@@ -5,7 +5,7 @@ import ReactDOM from 'react-dom';
import * as utils from 'utils/utils.jsx';
import Constants from 'utils/constants.jsx';
const ActionTypes = Constants.ActionTypes;
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
import ModalStore from 'stores/modal_store.jsx';
import UserStore from 'stores/user_store.jsx';
diff --git a/webapp/components/login/login_controller.jsx b/webapp/components/login/login_controller.jsx
index d2dbf1800..0e5440b4b 100644
--- a/webapp/components/login/login_controller.jsx
+++ b/webapp/components/login/login_controller.jsx
@@ -8,7 +8,7 @@ import FormError from 'components/form_error.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
import UserStore from 'stores/user_store.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as TextFormatting from 'utils/text_formatting.jsx';
diff --git a/webapp/components/navbar.jsx b/webapp/components/navbar.jsx
index c2d262819..b9dea4370 100644
--- a/webapp/components/navbar.jsx
+++ b/webapp/components/navbar.jsx
@@ -21,7 +21,7 @@ import TeamStore from 'stores/team_store.jsx';
import ChannelSwitchModal from './channel_switch_modal.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as Utils from 'utils/utils.jsx';
diff --git a/webapp/components/new_channel_flow.jsx b/webapp/components/new_channel_flow.jsx
index f6e91afc4..e0ab2d5a1 100644
--- a/webapp/components/new_channel_flow.jsx
+++ b/webapp/components/new_channel_flow.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import UserStore from 'stores/user_store.jsx';
import NewChannelModal from './new_channel_modal.jsx';
diff --git a/webapp/components/password_reset_form.jsx b/webapp/components/password_reset_form.jsx
index 05bf29eae..b37e07f2d 100644
--- a/webapp/components/password_reset_form.jsx
+++ b/webapp/components/password_reset_form.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import ReactDOM from 'react-dom';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import Constants from 'utils/constants.jsx';
diff --git a/webapp/components/password_reset_send_link.jsx b/webapp/components/password_reset_send_link.jsx
index 48179e162..18741b816 100644
--- a/webapp/components/password_reset_send_link.jsx
+++ b/webapp/components/password_reset_send_link.jsx
@@ -4,7 +4,7 @@
import $ from 'jquery';
import ReactDOM from 'react-dom';
import * as Utils from 'utils/utils.jsx';
-import client from 'utils/web_client.jsx';
+import client from 'client/web_client.jsx';
import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
diff --git a/webapp/components/popover_list_members.jsx b/webapp/components/popover_list_members.jsx
index 28e45d5d6..306fa7a2e 100644
--- a/webapp/components/popover_list_members.jsx
+++ b/webapp/components/popover_list_members.jsx
@@ -7,7 +7,7 @@ import UserStore from 'stores/user_store.jsx';
import {Popover, Overlay} from 'react-bootstrap';
import * as Utils from 'utils/utils.jsx';
import Constants from 'utils/constants.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import {FormattedMessage} from 'react-intl';
import {browserHistory} from 'react-router/es6';
diff --git a/webapp/components/post_view/components/pending_post_options.jsx b/webapp/components/post_view/components/pending_post_options.jsx
index 536ec541c..711ea832c 100644
--- a/webapp/components/post_view/components/pending_post_options.jsx
+++ b/webapp/components/post_view/components/pending_post_options.jsx
@@ -6,7 +6,7 @@ import ChannelStore from 'stores/channel_store.jsx';
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import Constants from 'utils/constants.jsx';
diff --git a/webapp/components/register_app_modal.jsx b/webapp/components/register_app_modal.jsx
index 82a095c75..b9523c3ed 100644
--- a/webapp/components/register_app_modal.jsx
+++ b/webapp/components/register_app_modal.jsx
@@ -1,7 +1,7 @@
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import ModalStore from 'stores/modal_store.jsx';
import {Modal} from 'react-bootstrap';
diff --git a/webapp/components/rename_channel_modal.jsx b/webapp/components/rename_channel_modal.jsx
index 4dc84d971..f83cf110f 100644
--- a/webapp/components/rename_channel_modal.jsx
+++ b/webapp/components/rename_channel_modal.jsx
@@ -4,7 +4,7 @@
import ReactDOM from 'react-dom';
import TeamStore from 'stores/team_store.jsx';
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import Constants from 'utils/constants.jsx';
diff --git a/webapp/components/rhs_comment.jsx b/webapp/components/rhs_comment.jsx
index ac029f6fa..758642cae 100644
--- a/webapp/components/rhs_comment.jsx
+++ b/webapp/components/rhs_comment.jsx
@@ -12,7 +12,7 @@ import * as GlobalActions from 'actions/global_actions.jsx';
import * as TextFormatting from 'utils/text_formatting.jsx';
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
diff --git a/webapp/components/root.jsx b/webapp/components/root.jsx
index f98ed4c3d..9bb7d2970 100644
--- a/webapp/components/root.jsx
+++ b/webapp/components/root.jsx
@@ -3,7 +3,7 @@
import * as GlobalActions from 'actions/global_actions.jsx';
import LocalizationStore from 'stores/localization_store.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import {IntlProvider} from 'react-intl';
diff --git a/webapp/components/search_bar.jsx b/webapp/components/search_bar.jsx
index 290572612..c92adcd9b 100644
--- a/webapp/components/search_bar.jsx
+++ b/webapp/components/search_bar.jsx
@@ -3,7 +3,7 @@
import $ from 'jquery';
import ReactDOM from 'react-dom';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import SearchStore from 'stores/search_store.jsx';
import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
@@ -206,4 +206,4 @@ export default class SearchBar extends React.Component {
</div>
);
}
-} \ No newline at end of file
+}
diff --git a/webapp/components/should_verify_email.jsx b/webapp/components/should_verify_email.jsx
index 18a936b13..5ac67e383 100644
--- a/webapp/components/should_verify_email.jsx
+++ b/webapp/components/should_verify_email.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import {FormattedMessage} from 'react-intl';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import React from 'react';
import {Link} from 'react-router/es6';
diff --git a/webapp/components/sidebar_header.jsx b/webapp/components/sidebar_header.jsx
index 76d9cf214..29503c410 100644
--- a/webapp/components/sidebar_header.jsx
+++ b/webapp/components/sidebar_header.jsx
@@ -7,7 +7,7 @@ import NavbarDropdown from './navbar_dropdown.jsx';
import PreferenceStore from 'stores/preference_store.jsx';
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
const Preferences = Constants.Preferences;
diff --git a/webapp/components/signup_user_complete.jsx b/webapp/components/signup_user_complete.jsx
index 629fb2f78..9d65aee19 100644
--- a/webapp/components/signup_user_complete.jsx
+++ b/webapp/components/signup_user_complete.jsx
@@ -11,7 +11,7 @@ import BrowserStore from 'stores/browser_store.jsx';
import UserStore from 'stores/user_store.jsx';
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
import React from 'react';
diff --git a/webapp/components/suggestion/at_mention_provider.jsx b/webapp/components/suggestion/at_mention_provider.jsx
index a3e5cd59b..b33662420 100644
--- a/webapp/components/suggestion/at_mention_provider.jsx
+++ b/webapp/components/suggestion/at_mention_provider.jsx
@@ -7,7 +7,7 @@ import SuggestionStore from 'stores/suggestion_store.jsx';
import ChannelStore from 'stores/channel_store.jsx';
import UserStore from 'stores/user_store.jsx';
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import {FormattedMessage} from 'react-intl';
import Suggestion from './suggestion.jsx';
diff --git a/webapp/components/suggestion/search_user_provider.jsx b/webapp/components/suggestion/search_user_provider.jsx
index 1a3075a30..7a5bdabf1 100644
--- a/webapp/components/suggestion/search_user_provider.jsx
+++ b/webapp/components/suggestion/search_user_provider.jsx
@@ -3,7 +3,7 @@
import React from 'react';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import SuggestionStore from 'stores/suggestion_store.jsx';
import UserStore from 'stores/user_store.jsx';
diff --git a/webapp/components/team_general_tab.jsx b/webapp/components/team_general_tab.jsx
index ac50c69a0..7ca8f8fce 100644
--- a/webapp/components/team_general_tab.jsx
+++ b/webapp/components/team_general_tab.jsx
@@ -5,7 +5,7 @@ import $ from 'jquery';
import SettingItemMin from './setting_item_min.jsx';
import SettingItemMax from './setting_item_max.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import TeamStore from 'stores/team_store.jsx';
diff --git a/webapp/components/team_members_dropdown.jsx b/webapp/components/team_members_dropdown.jsx
index f8c217aed..b583d2caa 100644
--- a/webapp/components/team_members_dropdown.jsx
+++ b/webapp/components/team_members_dropdown.jsx
@@ -3,7 +3,7 @@
import UserStore from 'stores/user_store.jsx';
import ChannelStore from 'stores/channel_store.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as Utils from 'utils/utils.jsx';
import ConfirmModal from './confirm_modal.jsx';
diff --git a/webapp/components/user_list_row.jsx b/webapp/components/user_list_row.jsx
index a7838ec32..aae3d4dd8 100644
--- a/webapp/components/user_list_row.jsx
+++ b/webapp/components/user_list_row.jsx
@@ -4,7 +4,7 @@
import Constants from 'utils/constants.jsx';
import PreferenceStore from 'stores/preference_store.jsx';
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import React from 'react';
export default function UserListRow({user, teamMember, actions, actionProps}) {
diff --git a/webapp/components/user_profile.jsx b/webapp/components/user_profile.jsx
index 9a6045be7..c7020fed9 100644
--- a/webapp/components/user_profile.jsx
+++ b/webapp/components/user_profile.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import * as Utils from 'utils/utils.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import UserStore from 'stores/user_store.jsx';
import {Popover, OverlayTrigger} from 'react-bootstrap';
diff --git a/webapp/components/user_settings/manage_languages.jsx b/webapp/components/user_settings/manage_languages.jsx
index f6e2aaa6d..a62482462 100644
--- a/webapp/components/user_settings/manage_languages.jsx
+++ b/webapp/components/user_settings/manage_languages.jsx
@@ -3,7 +3,7 @@
import SettingItemMax from '../setting_item_max.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as I18n from 'i18n/i18n.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
import Constants from 'utils/constants.jsx';
diff --git a/webapp/components/user_settings/user_settings_general.jsx b/webapp/components/user_settings/user_settings_general.jsx
index 9b0e6a204..2a411a607 100644
--- a/webapp/components/user_settings/user_settings_general.jsx
+++ b/webapp/components/user_settings/user_settings_general.jsx
@@ -9,7 +9,7 @@ import SettingPicture from '../setting_picture.jsx';
import UserStore from 'stores/user_store.jsx';
import ErrorStore from 'stores/error_store.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as Utils from 'utils/utils.jsx';
diff --git a/webapp/components/user_settings/user_settings_notifications.jsx b/webapp/components/user_settings/user_settings_notifications.jsx
index b9e9b6de1..e116ea7c4 100644
--- a/webapp/components/user_settings/user_settings_notifications.jsx
+++ b/webapp/components/user_settings/user_settings_notifications.jsx
@@ -7,7 +7,7 @@ import SettingItemMax from '../setting_item_max.jsx';
import UserStore from 'stores/user_store.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as Utils from 'utils/utils.jsx';
diff --git a/webapp/components/user_settings/user_settings_security.jsx b/webapp/components/user_settings/user_settings_security.jsx
index 976e65981..a4f02a614 100644
--- a/webapp/components/user_settings/user_settings_security.jsx
+++ b/webapp/components/user_settings/user_settings_security.jsx
@@ -11,7 +11,7 @@ import ToggleModalButton from '../toggle_modal_button.jsx';
import PreferenceStore from 'stores/preference_store.jsx';
import TeamStore from 'stores/team_store.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as Utils from 'utils/utils.jsx';
import Constants from 'utils/constants.jsx';
diff --git a/webapp/components/youtube_video.jsx b/webapp/components/youtube_video.jsx
index 4295b27e9..0012b1e98 100644
--- a/webapp/components/youtube_video.jsx
+++ b/webapp/components/youtube_video.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import ChannelStore from 'stores/channel_store.jsx';
-import WebClient from 'utils/web_client.jsx';
+import WebClient from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
const ytRegex = /(?:http|https):\/\/(?:www\.)?(?:(?:youtube\.com\/(?:(?:v\/)|(\/u\/\w\/)|(?:(?:watch|embed\/watch)(?:\/|.*v=))|(?:embed\/)|(?:user\/[^\/]+\/u\/[0-9]\/)))|(?:youtu\.be\/))([^#&\?]*)/;
diff --git a/webapp/package.json b/webapp/package.json
index fb34b3d90..7aa2515cd 100644
--- a/webapp/package.json
+++ b/webapp/package.json
@@ -18,7 +18,6 @@
"keymirror": "0.1.1",
"marked": "mattermost/marked#12d2be4cdf54d4ec95fead934e18840b6a2c1a7b",
"match-at": "0.1.0",
- "mattermost": "mattermost/mattermost-javascript#84b6f1ebf33aa4b5d8e7ddd7be97d3f5bff5ed17",
"object-assign": "4.1.0",
"perfect-scrollbar": "0.6.12",
"react": "15.2.1",
diff --git a/webapp/routes/route_team.jsx b/webapp/routes/route_team.jsx
index cb4f09ae4..27817710f 100644
--- a/webapp/routes/route_team.jsx
+++ b/webapp/routes/route_team.jsx
@@ -11,7 +11,7 @@ import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import Constants from 'utils/constants.jsx';
const ActionTypes = Constants.ActionTypes;
import * as AsyncClient from 'utils/async_client.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as Utils from 'utils/utils.jsx';
import ChannelStore from 'stores/channel_store.jsx';
diff --git a/webapp/tests/client_admin.test.jsx b/webapp/tests/client_admin.test.jsx
new file mode 100644
index 000000000..a6a6e1a85
--- /dev/null
+++ b/webapp/tests/client_admin.test.jsx
@@ -0,0 +1,311 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+var assert = require('assert');
+import TestHelper from './test_helper.jsx';
+
+describe('Client.Admin', function() {
+ this.timeout(10000);
+
+ it('Admin.reloadConfig', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().reloadConfig(
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.recycleDatabaseConnection', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().recycleDatabaseConnection(
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.getComplianceReports', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().getComplianceReports(
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.saveComplianceReports', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+
+ var job = {};
+ job.desc = 'desc';
+ job.emails = '';
+ job.keywords = 'test';
+ job.start_at = new Date();
+ job.end_at = new Date();
+
+ TestHelper.basicClient().saveComplianceReports(
+ job,
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.getLogs', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().getLogs(
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.getServerAudits', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().getServerAudits(
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.getConfig', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().getConfig(
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.getAnalytics', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().getAnalytics(
+ 'standard',
+ null,
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.getTeamAnalytics', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().getTeamAnalytics(
+ TestHelper.basicTeam().id,
+ 'standard',
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.saveConfig', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ var config = {};
+ config.site_name = 'test';
+
+ TestHelper.basicClient().saveConfig(
+ config,
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.testEmail', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ var config = {};
+ config.site_name = 'test';
+
+ TestHelper.basicClient().testEmail(
+ config,
+ function() {
+ done(new Error('should need system admin permissions'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.system_permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.adminResetMfa', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+
+ TestHelper.basicClient().adminResetMfa(
+ TestHelper.basicUser().id,
+ function() {
+ done(new Error('should need a license'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.adminResetPassword', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ var user = TestHelper.basicUser();
+
+ TestHelper.basicClient().resetPassword(
+ user.id,
+ 'new_password',
+ function() {
+ throw Error('shouldnt work');
+ },
+ function(err) {
+ // this should fail since you're not a system admin
+ assert.equal(err.id, 'api.context.invalid_param.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('License.getClientLicenceConfig', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getClientLicenceConfig(
+ function(data) {
+ assert.equal(data.IsLicensed, 'false');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('License.removeLicenseFile', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().removeLicenseFile(
+ function() {
+ done(new Error('not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.permissions.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('Admin.ldapSyncNow', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+
+ TestHelper.basicClient().ldapSyncNow(
+ function() {
+ throw Error('shouldnt work');
+ },
+ function() {
+ // this should fail since you're not a system admin
+ done();
+ }
+ );
+ });
+ });
+
+ /*it('License.uploadLicenseFile', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().uploadLicenseFile(
+ 'form data',
+ function() {
+ done(new Error('not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.permissions.app_error');
+ done();
+ }
+ );
+ });
+ });*/
+
+ // TODO XXX FIX ME - this test depends on make dist
+
+ // it('General.getTranslations', function(done) {
+ // TestHelper.initBasic(() => {
+ // TestHelper.basicClient().getTranslations(
+ // 'http://localhost:8065/static/i18n/es.json',
+ // function(data) {
+ // assert.equal(data['login.or'], 'o');
+ // done();
+ // },
+ // function(err) {
+ // done(new Error(err.message));
+ // }
+ // );
+ // });
+ // });
+});
+
diff --git a/webapp/tests/client_channel.test.jsx b/webapp/tests/client_channel.test.jsx
new file mode 100644
index 000000000..72ba91f9d
--- /dev/null
+++ b/webapp/tests/client_channel.test.jsx
@@ -0,0 +1,353 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import assert from 'assert';
+import TestHelper from './test_helper.jsx';
+
+describe('Client.Channels', function() {
+ this.timeout(100000);
+
+ it('createChannel', function(done) {
+ TestHelper.initBasic(() => {
+ var channel = TestHelper.fakeChannel();
+ channel.team_id = TestHelper.basicTeam().id;
+ TestHelper.basicClient().createChannel(
+ channel,
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ assert.equal(data.name, channel.name);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ /* TODO: FIX THIS TEST
+ it('createDirectChannel', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().createUser(
+ TestHelper.fakeUser(),
+ function(user2) {
+ TestHelper.basicClient().addUserToTeam(
+ user2.id,
+ function() {
+ TestHelper.basicClient().createDirectChannel(
+ user2.id,
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+ */
+
+ it('updateChannel', function(done) {
+ TestHelper.initBasic(() => {
+ var channel = TestHelper.basicChannel();
+ channel.display_name = 'changed';
+ TestHelper.basicClient().updateChannel(
+ channel,
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ assert.equal(data.display_name, 'changed');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('updateChannelHeader', function(done) {
+ TestHelper.initBasic(() => {
+ var channel = TestHelper.basicChannel();
+ channel.display_name = 'changed';
+ TestHelper.basicClient().updateChannelHeader(
+ channel.id,
+ 'new header',
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ assert.equal(data.header, 'new header');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('updateChannelPurpose', function(done) {
+ TestHelper.initBasic(() => {
+ var channel = TestHelper.basicChannel();
+ channel.display_name = 'changed';
+ TestHelper.basicClient().updateChannelPurpose(
+ channel.id,
+ 'new purpose',
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ assert.equal(data.purpose, 'new purpose');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('updateChannelNotifyProps', function(done) {
+ TestHelper.initBasic(() => {
+ var props = {};
+ props.channel_id = TestHelper.basicChannel().id;
+ props.user_id = TestHelper.basicUser().id;
+ props.desktop = 'all';
+ TestHelper.basicClient().updateChannelNotifyProps(
+ props,
+ function(data) {
+ assert.equal(data.desktop, 'all');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('leaveChannel', function(done) {
+ TestHelper.initBasic(() => {
+ var channel = TestHelper.basicChannel();
+ TestHelper.basicClient().leaveChannel(
+ channel.id,
+ function(data) {
+ assert.equal(data.id, channel.id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('joinChannel', function(done) {
+ TestHelper.initBasic(() => {
+ var channel = TestHelper.basicChannel();
+ TestHelper.basicClient().leaveChannel(
+ channel.id,
+ function() {
+ TestHelper.basicClient().joinChannel(
+ channel.id,
+ function() {
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('joinChannelByName', function(done) {
+ TestHelper.initBasic(() => {
+ var channel = TestHelper.basicChannel();
+ TestHelper.basicClient().leaveChannel(
+ channel.id,
+ function() {
+ TestHelper.basicClient().joinChannelByName(
+ channel.name,
+ function() {
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('deleteChannel', function(done) {
+ TestHelper.initBasic(() => {
+ var channel = TestHelper.basicChannel();
+ TestHelper.basicClient().deleteChannel(
+ channel.id,
+ function(data) {
+ assert.equal(data.id, channel.id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('updateLastViewedAt', function(done) {
+ TestHelper.initBasic(() => {
+ var channel = TestHelper.basicChannel();
+ TestHelper.basicClient().updateLastViewedAt(
+ channel.id,
+ function(data) {
+ assert.equal(data.id, channel.id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getChannels', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getChannels(
+ function(data) {
+ assert.equal(data.channels.length, 3);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getChannel', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getChannel(
+ TestHelper.basicChannel().id,
+ function(data) {
+ assert.equal(TestHelper.basicChannel().id, data.channel.id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getMoreChannels', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getMoreChannels(
+ function(data) {
+ assert.equal(data.channels.length, 0);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getChannelCounts', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getChannelCounts(
+ function(data) {
+ assert.equal(data.counts[TestHelper.basicChannel().id], 1);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getChannelExtraInfo', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getChannelExtraInfo(
+ TestHelper.basicChannel().id,
+ 5,
+ function(data) {
+ assert.equal(data.member_count, 1);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ /* TODO FIX THIS TEST
+ it('addChannelMember', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().createUser(
+ TestHelper.fakeUser(),
+ function(user2) {
+ TestHelper.basicClient().addUserToTeam(
+ user2.id,
+ function() {
+ TestHelper.basicClient().addChannelMember(
+ TestHelper.basicChannel().id,
+ user2.id,
+ function(data) {
+ assert.equal(data.channel_id.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+ */
+
+ it('removeChannelMember', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().removeChannelMember(
+ TestHelper.basicChannel().id,
+ TestHelper.basicUser().id,
+ function(data) {
+ assert.equal(data.channel_id.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+});
+
diff --git a/webapp/tests/client_command.test.jsx b/webapp/tests/client_command.test.jsx
new file mode 100644
index 000000000..769fa2fa0
--- /dev/null
+++ b/webapp/tests/client_command.test.jsx
@@ -0,0 +1,116 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import assert from 'assert';
+import TestHelper from './test_helper.jsx';
+
+describe('Client.Commands', function() {
+ this.timeout(100000);
+
+ it('listCommands', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().listCommands(
+ function(data) {
+ assert.equal(data.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('listTeamCommands', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().listTeamCommands(
+ function() {
+ done(new Error('cmds not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.command.disabled.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('executeCommand', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().executeCommand(
+ TestHelper.basicChannel().id,
+ '/shrug',
+ null,
+ function(data) {
+ assert.equal(data.response_type, 'in_channel');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('addCommand', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+
+ var cmd = {};
+ cmd.url = 'http://www.gonowhere.com';
+ cmd.trigger = '/hello';
+ cmd.method = 'P';
+ cmd.username = '';
+ cmd.icon_url = '';
+ cmd.auto_complete = false;
+ cmd.auto_complete_desc = '';
+ cmd.auto_complete_hint = '';
+ cmd.display_name = 'Unit Test';
+
+ TestHelper.basicClient().addCommand(
+ cmd,
+ function() {
+ done(new Error('cmds not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.command.disabled.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('deleteCommand', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().deleteCommand(
+ TestHelper.generateId(),
+ function() {
+ done(new Error('cmds not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.command.disabled.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('regenCommandToken', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().regenCommandToken(
+ TestHelper.generateId(),
+ function() {
+ done(new Error('cmds not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.command.disabled.app_error');
+ done();
+ }
+ );
+ });
+ });
+});
+
diff --git a/webapp/tests/client_emoji.test.jsx b/webapp/tests/client_emoji.test.jsx
new file mode 100644
index 000000000..98f25cb7d
--- /dev/null
+++ b/webapp/tests/client_emoji.test.jsx
@@ -0,0 +1,100 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import assert from 'assert';
+import TestHelper from './test_helper.jsx';
+
+const fs = require('fs');
+
+describe('Client.Emoji', function() {
+ this.timeout(100000);
+
+ before(function() {
+ // write a temporary file so that we have something to upload for testing
+ const buffer = new Buffer('R0lGODlhAQABAIABAP///wAAACwAAAAAAQABAAACAkQBADs=', 'base64');
+
+ const testGif = fs.openSync('test.gif', 'w+');
+ fs.writeFileSync(testGif, buffer);
+ });
+
+ it('addEmoji', function(done) {
+ TestHelper.initBasic(() => {
+ const name = TestHelper.generateId();
+
+ TestHelper.basicClient().addEmoji(
+ {creator_id: TestHelper.basicUser().id, name},
+ fs.createReadStream('test.gif'),
+ function(data) {
+ assert.equal(data.name, name);
+ assert.notEqual(data.id, null);
+
+ TestHelper.basicClient().deleteEmoji(data.id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('deleteEmoji', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().addEmoji(
+ {creator_id: TestHelper.basicUser().id, name: TestHelper.generateId()},
+ fs.createReadStream('test.gif'),
+ function(data) {
+ TestHelper.basicClient().deleteEmoji(
+ data.id,
+ function() {
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('listEmoji', function(done) {
+ TestHelper.initBasic(() => {
+ const name = TestHelper.generateId();
+ TestHelper.basicClient().addEmoji(
+ {creator_id: TestHelper.basicUser().id, name},
+ fs.createReadStream('test.gif'),
+ function() {
+ TestHelper.basicClient().listEmoji(
+ function(data) {
+ assert(data.length > 0, true);
+
+ let found = false;
+ for (const emoji of data) {
+ if (emoji.name === name) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found) {
+ done();
+ } else {
+ done(new Error('test emoji wasn\'t returned'));
+ }
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+});
diff --git a/webapp/tests/client_general.test.jsx b/webapp/tests/client_general.test.jsx
new file mode 100644
index 000000000..61e7832da
--- /dev/null
+++ b/webapp/tests/client_general.test.jsx
@@ -0,0 +1,85 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+var assert = require('assert');
+import TestHelper from './test_helper.jsx';
+
+describe('Client.General', function() {
+ this.timeout(10000);
+
+ it('General.getClientConfig', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getClientConfig(
+ function(data) {
+ assert.equal(data.SiteName, 'Mattermost');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('General.getPing', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getPing(
+ function(data) {
+ assert.equal(data.version.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('General.logClientError', function(done) {
+ TestHelper.initBasic(() => {
+ var config = {};
+ config.site_name = 'test';
+ TestHelper.basicClient().logClientError('this is a test');
+ done();
+ });
+ });
+
+ it('File.getFileInfo', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+
+ TestHelper.basicClient().getFileInfo(
+ `/${TestHelper.basicChannel().id}/${TestHelper.basicUser().id}/filename.txt`,
+ function(data) {
+ assert.equal(data.filename, 'filename.txt');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('File.getPublicLink', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ var data = {};
+ data.channel_id = TestHelper.basicChannel().id;
+ data.user_id = TestHelper.basicUser().id;
+ data.filename = `/${TestHelper.basicChannel().id}/${TestHelper.basicUser().id}/filename.txt`;
+
+ TestHelper.basicClient().getPublicLink(
+ data,
+ function() {
+ done(new Error('not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.file.get_public_link.disabled.app_error');
+ done();
+ }
+ );
+ });
+ });
+});
+
diff --git a/webapp/tests/client_hooks.test.jsx b/webapp/tests/client_hooks.test.jsx
new file mode 100644
index 000000000..8d09802a9
--- /dev/null
+++ b/webapp/tests/client_hooks.test.jsx
@@ -0,0 +1,132 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import assert from 'assert';
+import TestHelper from './test_helper.jsx';
+
+describe('Client.Hooks', function() {
+ this.timeout(100000);
+
+ it('addIncomingHook', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+
+ var hook = {};
+ hook.channel_id = TestHelper.basicChannel().id;
+ hook.description = 'desc';
+ hook.display_name = 'Unit Test';
+
+ TestHelper.basicClient().addIncomingHook(
+ hook,
+ function() {
+ done(new Error('hooks not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.webhook.create_incoming.disabled.app_errror');
+ done();
+ }
+ );
+ });
+ });
+
+ it('deleteIncomingHook', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().deleteIncomingHook(
+ TestHelper.generateId(),
+ function() {
+ done(new Error('hooks not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.webhook.delete_incoming.disabled.app_errror');
+ done();
+ }
+ );
+ });
+ });
+
+ it('listIncomingHooks', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().listIncomingHooks(
+ function() {
+ done(new Error('hooks not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.webhook.get_incoming.disabled.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('addOutgoingHook', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+
+ var hook = {};
+ hook.channel_id = TestHelper.basicChannel().id;
+ hook.description = 'desc';
+ hook.display_name = 'Unit Test';
+
+ TestHelper.basicClient().addOutgoingHook(
+ hook,
+ function() {
+ done(new Error('hooks not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.webhook.create_outgoing.disabled.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('deleteOutgoingHook', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().deleteOutgoingHook(
+ TestHelper.generateId(),
+ function() {
+ done(new Error('hooks not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.webhook.delete_outgoing.disabled.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('listOutgoingHooks', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().listOutgoingHooks(
+ function() {
+ done(new Error('hooks not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.webhook.get_outgoing.disabled.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('regenOutgoingHookToken', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().regenOutgoingHookToken(
+ TestHelper.generateId(),
+ function() {
+ done(new Error('hooks not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.webhook.regen_outgoing_token.disabled.app_error');
+ done();
+ }
+ );
+ });
+ });
+});
+
diff --git a/webapp/tests/client_oauth.test.jsx b/webapp/tests/client_oauth.test.jsx
new file mode 100644
index 000000000..a9a6bd919
--- /dev/null
+++ b/webapp/tests/client_oauth.test.jsx
@@ -0,0 +1,53 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import assert from 'assert';
+import TestHelper from './test_helper.jsx';
+
+describe('Client.OAuth', function() {
+ this.timeout(100000);
+
+ it('registerOAuthApp', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+
+ var app = {};
+ app.name = 'test';
+ app.homepage = 'homepage';
+ app.description = 'desc';
+ app.callback_urls = '';
+
+ TestHelper.basicClient().registerOAuthApp(
+ app,
+ function() {
+ done(new Error('not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.oauth.register_oauth_app.turn_off.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('allowOAuth2', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+
+ TestHelper.basicClient().allowOAuth2(
+ 'GET',
+ '123456',
+ 'http://nowhere.com',
+ 'state',
+ 'scope',
+ function() {
+ done(new Error('not enabled'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.oauth.allow_oauth.turn_off.app_error');
+ done();
+ }
+ );
+ });
+ });
+});
diff --git a/webapp/tests/client_post.test.jsx b/webapp/tests/client_post.test.jsx
new file mode 100644
index 000000000..3c6f05c9f
--- /dev/null
+++ b/webapp/tests/client_post.test.jsx
@@ -0,0 +1,201 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import assert from 'assert';
+import TestHelper from './test_helper.jsx';
+
+describe('Client.Posts', function() {
+ this.timeout(100000);
+
+ it('createPost', function(done) {
+ TestHelper.initBasic(() => {
+ var post = TestHelper.fakePost();
+ post.channel_id = TestHelper.basicChannel().id;
+
+ TestHelper.basicClient().createPost(
+ post,
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getPostById', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getPostById(
+ TestHelper.basicPost().id,
+ function(data) {
+ assert.equal(data.order[0], TestHelper.basicPost().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getPost', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getPost(
+ TestHelper.basicChannel().id,
+ TestHelper.basicPost().id,
+ function(data) {
+ assert.equal(data.order[0], TestHelper.basicPost().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('updatePost', function(done) {
+ TestHelper.initBasic(() => {
+ var post = TestHelper.basicPost();
+ post.message = 'new message';
+ post.channel_id = TestHelper.basicChannel().id;
+
+ TestHelper.basicClient().updatePost(
+ post,
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('deletePost', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().deletePost(
+ TestHelper.basicChannel().id,
+ TestHelper.basicPost().id,
+ function(data) {
+ assert.equal(data.id, TestHelper.basicPost().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('searchPost', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().search(
+ 'unit test',
+ false,
+ function(data) {
+ assert.equal(data.order[0], TestHelper.basicPost().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getPostsPage', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getPostsPage(
+ TestHelper.basicChannel().id,
+ 0,
+ 10,
+ function(data) {
+ assert.equal(data.order[0], TestHelper.basicPost().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getPosts', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getPosts(
+ TestHelper.basicChannel().id,
+ 0,
+ function(data) {
+ assert.equal(data.order[0], TestHelper.basicPost().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getPostsBefore', function(done) {
+ TestHelper.initBasic(() => {
+ var post = TestHelper.fakePost();
+ post.channel_id = TestHelper.basicChannel().id;
+
+ TestHelper.basicClient().createPost(
+ post,
+ function(rpost) {
+ TestHelper.basicClient().getPostsBefore(
+ TestHelper.basicChannel().id,
+ rpost.id,
+ 0,
+ 10,
+ function(data) {
+ assert.equal(data.order[0], TestHelper.basicPost().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getPostsAfter', function(done) {
+ TestHelper.initBasic(() => {
+ var post = TestHelper.fakePost();
+ post.channel_id = TestHelper.basicChannel().id;
+
+ TestHelper.basicClient().createPost(
+ post,
+ function(rpost) {
+ TestHelper.basicClient().getPostsAfter(
+ TestHelper.basicChannel().id,
+ TestHelper.basicPost().id,
+ 0,
+ 10,
+ function(data) {
+ assert.equal(data.order[0], rpost.id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+});
+
diff --git a/webapp/tests/client_preferences.test.jsx b/webapp/tests/client_preferences.test.jsx
new file mode 100644
index 000000000..95b026bfc
--- /dev/null
+++ b/webapp/tests/client_preferences.test.jsx
@@ -0,0 +1,65 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import assert from 'assert';
+import TestHelper from './test_helper.jsx';
+
+describe('Client.Preferences', function() {
+ this.timeout(100000);
+
+ it('getAllPreferences', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getAllPreferences(
+ function(data) {
+ assert.equal(data[0].category, 'tutorial_step');
+ assert.equal(data[0].user_id, TestHelper.basicUser().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('savePreferences', function(done) {
+ TestHelper.initBasic(() => {
+ var perf = {};
+ perf.user_id = TestHelper.basicUser().id;
+ perf.category = 'test';
+ perf.name = 'name';
+ perf.value = 'value';
+
+ var perfs = [];
+ perfs.push(perf);
+
+ TestHelper.basicClient().savePreferences(
+ perfs,
+ function(data) {
+ assert.equal(data, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getPreferenceCategory', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getPreferenceCategory(
+ 'tutorial_step',
+ function(data) {
+ assert.equal(data[0].category, 'tutorial_step');
+ assert.equal(data[0].user_id, TestHelper.basicUser().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+});
+
diff --git a/webapp/tests/client_team.test.jsx b/webapp/tests/client_team.test.jsx
new file mode 100644
index 000000000..389a6ef50
--- /dev/null
+++ b/webapp/tests/client_team.test.jsx
@@ -0,0 +1,244 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import assert from 'assert';
+import TestHelper from './test_helper.jsx';
+
+describe('Client.Team', function() {
+ this.timeout(100000);
+
+ it('findTeamByName', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().findTeamByName(
+ TestHelper.basicTeam().name,
+ function(data) {
+ assert.equal(data, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('signupTeam', function(done) {
+ var client = TestHelper.createClient();
+ var email = TestHelper.fakeEmail();
+
+ client.signupTeam(
+ email,
+ function(data) {
+ assert.equal(data.email, email);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+
+ it('createTeamFromSignup', function(done) {
+ var client = TestHelper.createClient();
+ var email = TestHelper.fakeEmail();
+
+ client.signupTeam(
+ email,
+ function(data) {
+ var teamSignup = {};
+ teamSignup.invites = [];
+ teamSignup.data = decodeURIComponent(data.follow_link.split('&h=')[0].replace('/signup_team_complete/?d=', ''));
+ teamSignup.hash = decodeURIComponent(data.follow_link.split('&h=')[1]);
+
+ teamSignup.user = TestHelper.fakeUser();
+ teamSignup.team = TestHelper.fakeTeam();
+ teamSignup.team.email = teamSignup.user.email;
+
+ client.createTeamFromSignup(
+ teamSignup,
+ function(data2) {
+ assert.equal(data2.team.id.length > 0, true);
+ assert.equal(data2.user.id.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+
+ it('createTeam', function(done) {
+ var client = TestHelper.createClient();
+ var team = TestHelper.fakeTeam();
+ client.createTeam(
+ team,
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ assert.equal(data.name, team.name);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+
+ it('getAllTeams', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getAllTeams(
+ function(data) {
+ assert.equal(data[TestHelper.basicTeam().id].name, TestHelper.basicTeam().name);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getAllTeamListings', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getAllTeamListings(
+ function(data) {
+ assert.equal(data != null, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getMyTeam', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getMyTeam(
+ function(data) {
+ assert.equal(data.name, TestHelper.basicTeam().name);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('GetTeamMembers', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getTeamMembers(
+ TestHelper.basicTeam().id,
+ function(data) {
+ assert.equal(data.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('inviteMembers', function(done) {
+ TestHelper.initBasic(() => {
+ var data = {};
+ data.invites = [];
+ var invite = {};
+ invite.email = TestHelper.fakeEmail();
+ invite.firstName = 'first';
+ invite.lastName = 'last';
+ data.invites.push(invite);
+
+ TestHelper.basicClient().inviteMembers(
+ data,
+ function(dataBack) {
+ assert.equal(dataBack.invites.length, 1);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('updateTeam', function(done) {
+ TestHelper.initBasic(() => {
+ var team = TestHelper.basicTeam();
+ team.display_name = 'test_updated';
+
+ TestHelper.basicClient().updateTeam(
+ team,
+ function(data) {
+ assert.equal(data.display_name, 'test_updated');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('addUserToTeam', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().createUser(
+ TestHelper.fakeUser(),
+ function(user2) {
+ TestHelper.basicClient().addUserToTeam(
+ '',
+ user2.id,
+ function(data) {
+ assert.equal(data.user_id, user2.id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('removeUserFromTeam', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().removeUserFromTeam(
+ '',
+ TestHelper.basicUser().id,
+ function(data) {
+ assert.equal(data.user_id, TestHelper.basicUser().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getInviteInfo', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getInviteInfo(
+ TestHelper.basicTeam().invite_id,
+ function(data) {
+ assert.equal(data.display_name.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+});
+
diff --git a/webapp/tests/client_user.test.jsx b/webapp/tests/client_user.test.jsx
new file mode 100644
index 000000000..eef841018
--- /dev/null
+++ b/webapp/tests/client_user.test.jsx
@@ -0,0 +1,558 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import assert from 'assert';
+import TestHelper from './test_helper.jsx';
+
+describe('Client.User', function() {
+ this.timeout(100000);
+
+ it('getMe', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getMe(
+ function(data) {
+ assert.equal(data.id, TestHelper.basicUser().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getInitialLoad', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getInitialLoad(
+ function(data) {
+ assert.equal(data.user.id.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('createUser', function(done) {
+ var client = TestHelper.createClient();
+ var user = TestHelper.fakeUser();
+ client.createUser(
+ user,
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ assert.equal(data.email, user.email);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+
+ it('loginByEmail', function(done) {
+ var client = TestHelper.createClient();
+ var user = TestHelper.fakeUser();
+ client.createUser(
+ user,
+ function() {
+ client.login(
+ user.email,
+ user.password,
+ null,
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ assert.equal(data.email, user.email);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+
+ it('loginById', function(done) {
+ var client = TestHelper.createClient();
+ var user = TestHelper.fakeUser();
+ client.createUser(
+ user,
+ function(newUser) {
+ assert.equal(user.email, newUser.email);
+ client.loginById(
+ newUser.id,
+ user.password,
+ null,
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ assert.equal(data.email, user.email);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+
+ it('loginByUsername', function(done) {
+ var client = TestHelper.createClient();
+ var user = TestHelper.fakeUser();
+ client.createUser(
+ user,
+ function() {
+ client.login(
+ user.username,
+ user.password,
+ null,
+ function(data) {
+ assert.equal(data.id.length > 0, true);
+ assert.equal(data.email, user.email);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+
+ it('updateUser', function(done) {
+ TestHelper.initBasic(() => {
+ var user = TestHelper.basicUser();
+ user.nickname = 'updated';
+
+ TestHelper.basicClient().updateUser(
+ user, null,
+ function(data) {
+ assert.equal(data.nickname, 'updated');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('updatePassword', function(done) {
+ TestHelper.initBasic(() => {
+ var user = TestHelper.basicUser();
+
+ TestHelper.basicClient().updatePassword(
+ user.id,
+ user.password,
+ 'update_password',
+ function(data) {
+ assert.equal(data.user_id, user.id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('updateUserNotifyProps', function(done) {
+ TestHelper.initBasic(() => {
+ var user = TestHelper.basicUser();
+
+ var notifyProps = {
+ all: 'true',
+ channel: 'true',
+ desktop: 'all',
+ desktop_sound: 'true',
+ email: 'false',
+ first_name: 'false',
+ mention_keys: '',
+ user_id: user.id
+ };
+
+ TestHelper.basicClient().updateUserNotifyProps(
+ notifyProps,
+ function(data) {
+ assert.equal(data.notify_props.email, 'false');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('updateRoles', function(done) {
+ TestHelper.initBasic(() => {
+ var user = TestHelper.basicUser();
+ var team = TestHelper.basicTeam();
+
+ TestHelper.basicClient().updateRoles(
+ team.id,
+ user.id,
+ '',
+ function(data) {
+ assert.equal(data.user_id, user.id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ /* TODO: FIX THIS TEST
+ it('updateActive', function(done) {
+ TestHelper.initBasic(() => {
+ var user = TestHelper.basicUser();
+
+ TestHelper.basicClient().updateActive(
+ user.id,
+ false,
+ function(data) {
+ assert.equal(data.last_activity_at > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });*/
+
+ it('sendPasswordReset', function(done) {
+ TestHelper.initBasic(() => {
+ var user = TestHelper.basicUser();
+
+ TestHelper.basicClient().sendPasswordReset(
+ user.email,
+ function(data) {
+ assert.equal(data.email, user.email);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('resetPassword', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+
+ TestHelper.basicClient().resetPassword(
+ '',
+ 'new_password',
+ function() {
+ throw Error('shouldnt work');
+ },
+ function(err) {
+ // this should fail since you're not a system admin
+ assert.equal(err.id, 'api.context.invalid_param.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('emailToOAuth', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ var user = TestHelper.basicUser();
+
+ TestHelper.basicClient().emailToOAuth(
+ user.email,
+ 'new_password',
+ 'gitlab',
+ function() {
+ throw Error('shouldnt work');
+ },
+ function(err) {
+ // this should fail since you're not a system admin
+ assert.equal(err.id, 'api.user.check_user_password.invalid.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('oauthToEmail', function(done) {
+ TestHelper.initBasic(() => {
+ var user = TestHelper.basicUser();
+
+ TestHelper.basicClient().oauthToEmail(
+ user.email,
+ 'new_password',
+ function(data) {
+ assert.equal(data.follow_link.length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('emailToLdap', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ var user = TestHelper.basicUser();
+
+ TestHelper.basicClient().emailToLdap(
+ user.email,
+ user.password,
+ 'unknown_id',
+ 'unknown_pwd',
+ function() {
+ throw Error('shouldnt work');
+ },
+ function() {
+ done();
+ }
+ );
+ });
+ });
+
+ it('ldapToEmail', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ var user = TestHelper.basicUser();
+
+ TestHelper.basicClient().ldapToEmail(
+ user.email,
+ 'new_password',
+ 'new_password',
+ function() {
+ throw Error('shouldnt work');
+ },
+ function(err) {
+ assert.equal(err.id, 'api.user.ldap_to_email.not_ldap_account.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('logout', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().logout(
+ function(data) {
+ assert.equal(data.user_id, TestHelper.basicUser().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('checkMfa', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().checkMfa(
+ TestHelper.generateId(),
+ function(data) {
+ assert.equal(data.mfa_required, 'false');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getSessions', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getSessions(
+ TestHelper.basicUser().id,
+ function(data) {
+ assert.equal(data[0].user_id, TestHelper.basicUser().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('revokeSession', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getSessions(
+ TestHelper.basicUser().id,
+ function(sessions) {
+ TestHelper.basicClient().revokeSession(
+ sessions[0].id,
+ function(data) {
+ assert.equal(data.id, sessions[0].id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getAudits', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getAudits(
+ TestHelper.basicUser().id,
+ function(data) {
+ assert.equal(data[0].user_id, TestHelper.basicUser().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getDirectProfiles', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getDirectProfiles(
+ function(data) {
+ assert.equal(Object.keys(data).length === 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.getDirectProfiles));
+ }
+ );
+ });
+ });
+
+ it('getProfiles', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getProfiles(
+ function(data) {
+ assert.equal(data[TestHelper.basicUser().id].id, TestHelper.basicUser().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getProfilesForTeam', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getProfilesForTeam(
+ TestHelper.basicTeam().id,
+ function(data) {
+ assert.equal(data[TestHelper.basicUser().id].id, TestHelper.basicUser().id);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('getProfilesForDirectMessageList', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().getProfilesForDirectMessageList(
+ function(data) {
+ assert.equal(Object.keys(data).length > 0, true);
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ /* TODO: FIX THIS TEST
+ it('getStatuses', function(done) {
+ TestHelper.initBasic(() => {
+ var ids = [];
+ ids.push(TestHelper.basicUser().id);
+
+ TestHelper.basicClient().getStatuses(
+ ids,
+ function(data) {
+ assert.equal(data[TestHelper.basicUser().id], 'online');
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+ */
+
+ it('verifyEmail', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().verifyEmail(
+ 'junk',
+ 'junk',
+ function() {
+ done(new Error('should be invalid'));
+ },
+ function(err) {
+ assert.equal(err.id, 'api.context.invalid_param.app_error');
+ done();
+ }
+ );
+ });
+ });
+
+ it('resendVerification', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().resendVerification(
+ TestHelper.basicUser().email,
+ function() {
+ done();
+ },
+ function(err) {
+ done(new Error(err.message));
+ }
+ );
+ });
+ });
+
+ it('updateMfa', function(done) {
+ TestHelper.initBasic(() => {
+ TestHelper.basicClient().enableLogErrorsToConsole(false); // Disabling since this unit test causes an error
+ TestHelper.basicClient().updateMfa(
+ 'junk',
+ true,
+ function() {
+ done(new Error('not enabled'));
+ },
+ function() {
+ done();
+ }
+ );
+ });
+ });
+});
diff --git a/webapp/tests/test_helper.jsx b/webapp/tests/test_helper.jsx
new file mode 100644
index 000000000..41d0c15ba
--- /dev/null
+++ b/webapp/tests/test_helper.jsx
@@ -0,0 +1,174 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import Client from 'client/client.jsx';
+import jqd from 'jquery-deferred';
+
+class TestHelperClass {
+ basicClient = () => {
+ return this.basicc;
+ }
+
+ basicTeam = () => {
+ return this.basict;
+ }
+
+ basicUser = () => {
+ return this.basicu;
+ }
+
+ basicChannel = () => {
+ return this.basicch;
+ }
+
+ basicPost = () => {
+ return this.basicp;
+ }
+
+ generateId = () => {
+ // implementation taken from http://stackoverflow.com/a/2117523
+ var id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
+
+ id = id.replace(/[xy]/g, function replaceRandom(c) {
+ var r = Math.floor(Math.random() * 16);
+
+ var v;
+ if (c === 'x') {
+ v = r;
+ } else {
+ v = (r & 0x3) | 0x8;
+ }
+
+ return v.toString(16);
+ });
+
+ return 'uid' + id;
+ }
+
+ createClient() {
+ var c = new Client();
+ c.setUrl('http://localhost:8065');
+ c.useHeaderToken();
+ c.enableLogErrorsToConsole(true);
+ return c;
+ }
+
+ fakeEmail = () => {
+ return 'success' + this.generateId() + '@simulator.amazonses.com';
+ }
+
+ fakeUser = () => {
+ var user = {};
+ user.email = this.fakeEmail();
+ user.allow_marketing = true;
+ user.password = 'password1';
+ user.username = this.generateId();
+ return user;
+ }
+
+ fakeTeam = () => {
+ var team = {};
+ team.name = this.generateId();
+ team.display_name = `Unit Test ${team.name}`;
+ team.type = 'O';
+ team.email = this.fakeEmail();
+ team.allowed_domains = '';
+ return team;
+ }
+
+ fakeChannel = () => {
+ var channel = {};
+ channel.name = this.generateId();
+ channel.display_name = `Unit Test ${channel.name}`;
+ channel.type = 'O'; // open channel
+ return channel;
+ }
+
+ fakePost = () => {
+ var post = {};
+ post.message = `Unit Test ${this.generateId()}`;
+ return post;
+ }
+
+ initBasic = (callback) => {
+ this.basicc = this.createClient();
+
+ var d1 = jqd.Deferred();
+ var email = this.fakeEmail();
+ var outer = this; // eslint-disable-line consistent-this
+
+ this.basicClient().signupTeam(
+ email,
+ function(rsignUp) {
+ var teamSignup = {};
+ teamSignup.invites = [];
+ teamSignup.data = decodeURIComponent(rsignUp.follow_link.split('&h=')[0].replace('/signup_team_complete/?d=', ''));
+ teamSignup.hash = decodeURIComponent(rsignUp.follow_link.split('&h=')[1]);
+
+ teamSignup.user = outer.fakeUser();
+ teamSignup.team = outer.fakeTeam();
+ teamSignup.team.email = email;
+ teamSignup.user.email = email;
+ var password = teamSignup.user.password;
+
+ outer.basicClient().createTeamFromSignup(
+ teamSignup,
+ function(rteamSignup) {
+ outer.basict = rteamSignup.team;
+ outer.basicu = rteamSignup.user;
+ outer.basicu.password = password;
+ outer.basicClient().setTeamId(outer.basict.id);
+ outer.basicClient().login(
+ rteamSignup.user.email,
+ password,
+ null,
+ function() {
+ outer.basicClient().useHeaderToken();
+ var channel = outer.fakeChannel();
+ channel.team_id = outer.basicTeam().id;
+ outer.basicClient().createChannel(
+ channel,
+ function(rchannel) {
+ outer.basicch = rchannel;
+ var post = outer.fakePost();
+ post.channel_id = rchannel.id;
+
+ outer.basicClient().createPost(
+ post,
+ function(rpost) {
+ outer.basicp = rpost;
+ d1.resolve();
+ },
+ function(err) {
+ throw err;
+ }
+ );
+ },
+ function(err) {
+ throw err;
+ }
+ );
+ },
+ function(err) {
+ throw err;
+ }
+ );
+ },
+ function(err) {
+ throw err;
+ }
+ );
+ },
+ function(err) {
+ throw err;
+ }
+ );
+
+ jqd.when(d1).done(() => {
+ callback();
+ });
+ }
+}
+
+var TestHelper = new TestHelperClass();
+export default TestHelper;
diff --git a/webapp/utils/async_client.jsx b/webapp/utils/async_client.jsx
index 0241db90d..196ced5d9 100644
--- a/webapp/utils/async_client.jsx
+++ b/webapp/utils/async_client.jsx
@@ -2,7 +2,7 @@
// See License.txt for license information.
import $ from 'jquery';
-import Client from './web_client.jsx';
+import Client from 'client/web_client.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
import BrowserStore from 'stores/browser_store.jsx';
diff --git a/webapp/utils/channel_intro_messages.jsx b/webapp/utils/channel_intro_messages.jsx
index 6418615a4..27ce42701 100644
--- a/webapp/utils/channel_intro_messages.jsx
+++ b/webapp/utils/channel_intro_messages.jsx
@@ -11,7 +11,7 @@ import UserStore from 'stores/user_store.jsx';
import TeamStore from 'stores/team_store.jsx';
import Constants from 'utils/constants.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import React from 'react';
import {FormattedMessage, FormattedHTMLMessage, FormattedDate} from 'react-intl';
diff --git a/webapp/utils/post_utils.jsx b/webapp/utils/post_utils.jsx
index ee723a246..4bba784cb 100644
--- a/webapp/utils/post_utils.jsx
+++ b/webapp/utils/post_utils.jsx
@@ -1,7 +1,7 @@
// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
-import Client from 'utils/web_client.jsx';
+import Client from 'client/web_client.jsx';
import Constants from 'utils/constants.jsx';
export function isSystemMessage(post) {
diff --git a/webapp/utils/utils.jsx b/webapp/utils/utils.jsx
index 907c01229..a8a93b452 100644
--- a/webapp/utils/utils.jsx
+++ b/webapp/utils/utils.jsx
@@ -11,7 +11,7 @@ import TeamStore from 'stores/team_store.jsx';
import Constants from 'utils/constants.jsx';
var ActionTypes = Constants.ActionTypes;
import * as AsyncClient from './async_client.jsx';
-import Client from './web_client.jsx';
+import Client from 'client/web_client.jsx';
import {browserHistory} from 'react-router/es6';
import {FormattedMessage} from 'react-intl';
diff --git a/webapp/webpack.config.js b/webapp/webpack.config.js
index da9ed9600..10dcdcce3 100644
--- a/webapp/webpack.config.js
+++ b/webapp/webpack.config.js
@@ -44,24 +44,6 @@ var config = {
}
},
{
- test: /node_modules\/mattermost\/client\.jsx?$/,
- loader: 'babel',
- query: {
- presets: ['react', 'es2015-webpack', 'stage-0'],
- plugins: ['transform-runtime'],
- cacheDirectory: DEV
- }
- },
- {
- test: /node_modules\/mattermost\/websocket_client\.jsx?$/,
- loader: 'babel',
- query: {
- presets: ['react', 'es2015-webpack', 'stage-0'],
- plugins: ['transform-runtime'],
- cacheDirectory: DEV
- }
- },
- {
test: /\.json$/,
loader: 'json'
},