mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
654 lines (573 loc) • 21.4 kB
text/typescript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {AdminTypes} from 'action_types';
import {General} from '../constants';
import {Client4} from 'client';
import {Action, ActionFunc, batchActions, DispatchFunc, GetStateFunc} from 'types/actions';
import {Compliance} from 'types/compliance';
import {GroupSearchOpts} from 'types/groups';
import {bindClientFunc, forceLogoutIfNecessary} from './helpers';
import {logError} from './errors';
export function getLogs(page = 0, perPage: number = General.LOGS_PAGE_SIZE_DEFAULT): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getLogs,
onRequest: AdminTypes.GET_LOGS_REQUEST,
onSuccess: [AdminTypes.RECEIVED_LOGS, AdminTypes.GET_LOGS_SUCCESS],
onFailure: AdminTypes.GET_LOGS_FAILURE,
params: [
page,
perPage,
],
});
}
export function getAudits(page = 0, perPage: number = General.PAGE_SIZE_DEFAULT): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getAudits,
onRequest: AdminTypes.GET_AUDITS_REQUEST,
onSuccess: [AdminTypes.RECEIVED_AUDITS, AdminTypes.GET_AUDITS_SUCCESS],
onFailure: AdminTypes.GET_AUDITS_FAILURE,
params: [
page,
perPage,
],
});
}
export function getConfig(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getConfig,
onRequest: AdminTypes.GET_CONFIG_REQUEST,
onSuccess: [AdminTypes.RECEIVED_CONFIG, AdminTypes.GET_CONFIG_SUCCESS],
onFailure: AdminTypes.GET_CONFIG_FAILURE,
});
}
export function updateConfig(config: Record<string, any>): ActionFunc {
return bindClientFunc({
clientFunc: Client4.updateConfig,
onRequest: AdminTypes.UPDATE_CONFIG_REQUEST,
onSuccess: [AdminTypes.RECEIVED_CONFIG, AdminTypes.UPDATE_CONFIG_SUCCESS],
onFailure: AdminTypes.UPDATE_CONFIG_FAILURE,
params: [
config,
],
});
}
export function reloadConfig(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.reloadConfig,
onRequest: AdminTypes.RELOAD_CONFIG_REQUEST,
onSuccess: AdminTypes.RELOAD_CONFIG_SUCCESS,
onFailure: AdminTypes.RELOAD_CONFIG_FAILURE,
});
}
export function getEnvironmentConfig(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getEnvironmentConfig,
onRequest: AdminTypes.GET_ENVIRONMENT_CONFIG_REQUEST,
onSuccess: [AdminTypes.RECEIVED_ENVIRONMENT_CONFIG, AdminTypes.GET_ENVIRONMENT_CONFIG_SUCCESS],
onFailure: AdminTypes.GET_ENVIRONMENT_CONFIG_FAILURE,
});
}
export function testEmail(config: any): ActionFunc {
return bindClientFunc({
clientFunc: Client4.testEmail,
onRequest: AdminTypes.TEST_EMAIL_REQUEST,
onSuccess: AdminTypes.TEST_EMAIL_SUCCESS,
onFailure: AdminTypes.TEST_EMAIL_FAILURE,
params: [
config,
],
});
}
export function testSiteURL(siteURL: string): ActionFunc {
return bindClientFunc({
clientFunc: Client4.testSiteURL,
onRequest: AdminTypes.TEST_SITE_URL_REQUEST,
onSuccess: AdminTypes.TEST_SITE_URL_SUCCESS,
onFailure: AdminTypes.TEST_SITE_URL_FAILURE,
params: [
siteURL,
],
});
}
export function testS3Connection(config: any): ActionFunc {
return bindClientFunc({
clientFunc: Client4.testS3Connection,
onRequest: AdminTypes.TEST_S3_REQUEST,
onSuccess: AdminTypes.TEST_S3_SUCCESS,
onFailure: AdminTypes.TEST_S3_FAILURE,
params: [
config,
],
});
}
export function invalidateCaches(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.invalidateCaches,
onRequest: AdminTypes.INVALIDATE_CACHES_REQUEST,
onSuccess: AdminTypes.INVALIDATE_CACHES_SUCCESS,
onFailure: AdminTypes.INVALIDATE_CACHES_FAILURE,
});
}
export function recycleDatabase(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.recycleDatabase,
onRequest: AdminTypes.RECYCLE_DATABASE_REQUEST,
onSuccess: AdminTypes.RECYCLE_DATABASE_SUCCESS,
onFailure: AdminTypes.RECYCLE_DATABASE_FAILURE,
});
}
export function createComplianceReport(job: Partial<Compliance>): ActionFunc {
return bindClientFunc({
clientFunc: Client4.createComplianceReport,
onRequest: AdminTypes.CREATE_COMPLIANCE_REQUEST,
onSuccess: [AdminTypes.RECEIVED_COMPLIANCE_REPORT, AdminTypes.CREATE_COMPLIANCE_SUCCESS],
onFailure: AdminTypes.CREATE_COMPLIANCE_FAILURE,
params: [
job,
],
});
}
export function getComplianceReport(reportId: string): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getComplianceReport,
onRequest: AdminTypes.GET_COMPLIANCE_REQUEST,
onSuccess: [AdminTypes.RECEIVED_COMPLIANCE_REPORT, AdminTypes.GET_COMPLIANCE_SUCCESS],
onFailure: AdminTypes.GET_COMPLIANCE_FAILURE,
params: [
reportId,
],
});
}
export function getComplianceReports(page = 0, perPage: number = General.PAGE_SIZE_DEFAULT): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getComplianceReports,
onRequest: AdminTypes.GET_COMPLIANCE_REQUEST,
onSuccess: [AdminTypes.RECEIVED_COMPLIANCE_REPORTS, AdminTypes.GET_COMPLIANCE_SUCCESS],
onFailure: AdminTypes.GET_COMPLIANCE_FAILURE,
params: [
page,
perPage,
],
});
}
export function uploadBrandImage(imageData: File): ActionFunc {
return bindClientFunc({
clientFunc: Client4.uploadBrandImage,
onRequest: AdminTypes.UPLOAD_BRAND_IMAGE_REQUEST,
onSuccess: AdminTypes.UPLOAD_BRAND_IMAGE_SUCCESS,
onFailure: AdminTypes.UPLOAD_BRAND_IMAGE_FAILURE,
params: [
imageData,
],
});
}
export function deleteBrandImage(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.deleteBrandImage,
onRequest: AdminTypes.DELETE_BRAND_IMAGE_REQUEST,
onSuccess: AdminTypes.DELETE_BRAND_IMAGE_SUCCESS,
onFailure: AdminTypes.DELETE_BRAND_IMAGE_FAILURE,
});
}
export function getClusterStatus(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getClusterStatus,
onRequest: AdminTypes.GET_CLUSTER_STATUS_REQUEST,
onSuccess: [AdminTypes.RECEIVED_CLUSTER_STATUS, AdminTypes.GET_CLUSTER_STATUS_SUCCESS],
onFailure: AdminTypes.GET_CLUSTER_STATUS_FAILURE,
});
}
export function testLdap(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.testLdap,
onRequest: AdminTypes.TEST_LDAP_REQUEST,
onSuccess: AdminTypes.TEST_LDAP_SUCCESS,
onFailure: AdminTypes.TEST_LDAP_FAILURE,
});
}
export function syncLdap(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.syncLdap,
onRequest: AdminTypes.SYNC_LDAP_REQUEST,
onSuccess: AdminTypes.SYNC_LDAP_SUCCESS,
onFailure: AdminTypes.SYNC_LDAP_FAILURE,
});
}
export function getLdapGroups(page = 0, perPage: number = General.PAGE_SIZE_MAXIMUM, opts: GroupSearchOpts = {q: ''}): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getLdapGroups,
onRequest: AdminTypes.GET_LDAP_GROUPS_REQUEST,
onSuccess: [AdminTypes.RECEIVED_LDAP_GROUPS, AdminTypes.GET_LDAP_GROUPS_SUCCESS],
onFailure: AdminTypes.GET_LDAP_GROUPS_FAILURE,
params: [
page,
perPage,
opts,
],
});
}
export function linkLdapGroup(key: string): ActionFunc {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
dispatch({type: AdminTypes.LINK_LDAP_GROUP_REQUEST, data: key});
let data;
try {
data = await Client4.linkLdapGroup(key);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(batchActions([
{type: AdminTypes.LINK_LDAP_GROUP_FAILURE, error, data: key},
logError(error),
]));
return {error};
}
dispatch(batchActions([
{type: AdminTypes.LINK_LDAP_GROUP_SUCCESS, data: null},
{
type: AdminTypes.LINKED_LDAP_GROUP,
data: {
primary_key: key,
name: data.display_name,
mattermost_group_id: data.id,
has_syncables: false,
},
},
]));
return {data: true};
};
}
export function unlinkLdapGroup(key: string): ActionFunc {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
dispatch({type: AdminTypes.UNLINK_LDAP_GROUP_REQUEST, data: key});
try {
await Client4.unlinkLdapGroup(key);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(batchActions([
{type: AdminTypes.UNLINK_LDAP_GROUP_FAILURE, error, data: key},
logError(error),
]));
return {error};
}
dispatch(batchActions([
{type: AdminTypes.UNLINK_LDAP_GROUP_SUCCESS, data: null},
{type: AdminTypes.UNLINKED_LDAP_GROUP, data: key},
]));
return {data: true};
};
}
export function getSamlCertificateStatus(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getSamlCertificateStatus,
onRequest: AdminTypes.SAML_CERT_STATUS_REQUEST,
onSuccess: [AdminTypes.RECEIVED_SAML_CERT_STATUS, AdminTypes.SAML_CERT_STATUS_SUCCESS],
onFailure: AdminTypes.SAML_CERT_STATUS_FAILURE,
});
}
export function uploadPublicSamlCertificate(fileData: File): ActionFunc {
return bindClientFunc({
clientFunc: Client4.uploadPublicSamlCertificate,
onRequest: AdminTypes.UPLOAD_SAML_PUBLIC_REQUEST,
onSuccess: AdminTypes.UPLOAD_SAML_PUBLIC_SUCCESS,
onFailure: AdminTypes.UPLOAD_SAML_PUBLIC_FAILURE,
params: [
fileData,
],
});
}
export function uploadPrivateSamlCertificate(fileData: File): ActionFunc {
return bindClientFunc({
clientFunc: Client4.uploadPrivateSamlCertificate,
onRequest: AdminTypes.UPLOAD_SAML_PRIVATE_REQUEST,
onSuccess: AdminTypes.UPLOAD_SAML_PRIVATE_SUCCESS,
onFailure: AdminTypes.UPLOAD_SAML_PRIVATE_FAILURE,
params: [
fileData,
],
});
}
export function uploadPublicLdapCertificate(fileData: File): ActionFunc {
return bindClientFunc({
clientFunc: Client4.uploadPublicLdapCertificate,
onSuccess: AdminTypes.UPLOAD_LDAP_PUBLIC_SUCCESS,
params: [
fileData,
],
});
}
export function uploadPrivateLdapCertificate(fileData: File): ActionFunc {
return bindClientFunc({
clientFunc: Client4.uploadPrivateLdapCertificate,
onSuccess: AdminTypes.UPLOAD_LDAP_PRIVATE_SUCCESS,
params: [
fileData,
],
});
}
export function uploadIdpSamlCertificate(fileData: File): ActionFunc {
return bindClientFunc({
clientFunc: Client4.uploadIdpSamlCertificate,
onRequest: AdminTypes.UPLOAD_SAML_IDP_REQUEST,
onSuccess: AdminTypes.UPLOAD_SAML_IDP_SUCCESS,
onFailure: AdminTypes.UPLOAD_SAML_IDP_FAILURE,
params: [
fileData,
],
});
}
export function removePublicSamlCertificate(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.deletePublicSamlCertificate,
onRequest: AdminTypes.DELETE_SAML_PUBLIC_REQUEST,
onSuccess: AdminTypes.DELETE_SAML_PUBLIC_SUCCESS,
onFailure: AdminTypes.DELETE_SAML_PUBLIC_FAILURE,
});
}
export function removePrivateSamlCertificate(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.deletePrivateSamlCertificate,
onRequest: AdminTypes.DELETE_SAML_PRIVATE_REQUEST,
onSuccess: AdminTypes.DELETE_SAML_PRIVATE_SUCCESS,
onFailure: AdminTypes.DELETE_SAML_PRIVATE_FAILURE,
});
}
export function removePublicLdapCertificate(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.deletePublicLdapCertificate,
onSuccess: AdminTypes.DELETE_LDAP_PUBLIC_SUCCESS,
});
}
export function removePrivateLdapCertificate(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.deletePrivateLdapCertificate,
onSuccess: AdminTypes.DELETE_LDAP_PRIVATE_SUCCESS,
});
}
export function removeIdpSamlCertificate(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.deleteIdpSamlCertificate,
onRequest: AdminTypes.DELETE_SAML_IDP_REQUEST,
onSuccess: AdminTypes.DELETE_SAML_IDP_SUCCESS,
onFailure: AdminTypes.DELETE_SAML_IDP_FAILURE,
});
}
export function testElasticsearch(config: any): ActionFunc {
return bindClientFunc({
clientFunc: Client4.testElasticsearch,
onRequest: AdminTypes.TEST_ELASTICSEARCH_REQUEST,
onSuccess: AdminTypes.TEST_ELASTICSEARCH_SUCCESS,
onFailure: AdminTypes.TEST_ELASTICSEARCH_FAILURE,
params: [
config,
],
});
}
export function purgeElasticsearchIndexes(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.purgeElasticsearchIndexes,
onRequest: AdminTypes.PURGE_ELASTICSEARCH_INDEXES_REQUEST,
onSuccess: AdminTypes.PURGE_ELASTICSEARCH_INDEXES_SUCCESS,
onFailure: AdminTypes.PURGE_ELASTICSEARCH_INDEXES_FAILURE,
});
}
export function uploadLicense(fileData: File): ActionFunc {
return bindClientFunc({
clientFunc: Client4.uploadLicense,
onRequest: AdminTypes.UPLOAD_LICENSE_REQUEST,
onSuccess: AdminTypes.UPLOAD_LICENSE_SUCCESS,
onFailure: AdminTypes.UPLOAD_LICENSE_FAILURE,
params: [
fileData,
],
});
}
export function removeLicense(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.removeLicense,
onRequest: AdminTypes.REMOVE_LICENSE_REQUEST,
onSuccess: AdminTypes.REMOVE_LICENSE_SUCCESS,
onFailure: AdminTypes.REMOVE_LICENSE_FAILURE,
});
}
export function getAnalytics(name: string, teamId = ''): ActionFunc {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
dispatch({type: AdminTypes.GET_ANALYTICS_REQUEST, data: null});
let data;
try {
data = await Client4.getAnalytics(name, teamId);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(batchActions([
{type: AdminTypes.GET_ANALYTICS_FAILURE, error},
logError(error),
]));
return {error};
}
const actions: Action[] = [{type: AdminTypes.GET_ANALYTICS_SUCCESS, data: null}];
if (teamId === '') {
actions.push({type: AdminTypes.RECEIVED_SYSTEM_ANALYTICS, data, name});
} else {
actions.push({type: AdminTypes.RECEIVED_TEAM_ANALYTICS, data, name, teamId});
}
dispatch(batchActions(actions));
return {data};
};
}
export function getStandardAnalytics(teamId = ''): ActionFunc {
return getAnalytics('standard', teamId);
}
export function getAdvancedAnalytics(teamId = ''): ActionFunc {
return getAnalytics('extra_counts', teamId);
}
export function getPostsPerDayAnalytics(teamId = ''): ActionFunc {
return getAnalytics('post_counts_day', teamId);
}
export function getBotPostsPerDayAnalytics(teamId = ''): ActionFunc {
return getAnalytics('bot_post_counts_day', teamId);
}
export function getUsersPerDayAnalytics(teamId = ''): ActionFunc {
return getAnalytics('user_counts_with_posts_day', teamId);
}
export function uploadPlugin(fileData: File, force = false): ActionFunc {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
dispatch({type: AdminTypes.UPLOAD_PLUGIN_REQUEST, data: null});
let data;
try {
data = await Client4.uploadPlugin(fileData, force);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(batchActions([
{type: AdminTypes.UPLOAD_PLUGIN_FAILURE, error},
logError(error),
]));
return {error};
}
dispatch(batchActions([
{type: AdminTypes.UPLOAD_PLUGIN_SUCCESS, data: null},
]));
return {data};
};
}
export function installPluginFromUrl(url: string, force = false): ActionFunc {
return async (dispatch, getState) => {
dispatch({type: AdminTypes.INSTALL_PLUGIN_FROM_URL_REQUEST, data: null});
let data;
try {
data = await Client4.installPluginFromUrl(url, force);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(batchActions([
{type: AdminTypes.INSTALL_PLUGIN_FROM_URL_FAILURE, error},
logError(error),
]));
return {error};
}
dispatch({type: AdminTypes.INSTALL_PLUGIN_FROM_URL_SUCCESS, data: null});
return {data};
};
}
export function getPlugins(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getPlugins,
onRequest: AdminTypes.GET_PLUGIN_REQUEST,
onSuccess: [AdminTypes.GET_PLUGIN_SUCCESS, AdminTypes.RECEIVED_PLUGINS],
onFailure: AdminTypes.GET_PLUGIN_FAILURE,
});
}
export function getPluginStatuses(): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getPluginStatuses,
onRequest: AdminTypes.GET_PLUGIN_STATUSES_REQUEST,
onSuccess: [AdminTypes.GET_PLUGIN_STATUSES_SUCCESS, AdminTypes.RECEIVED_PLUGIN_STATUSES],
onFailure: AdminTypes.GET_PLUGIN_STATUSES_FAILURE,
});
}
export function removePlugin(pluginId: string): ActionFunc {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
dispatch({type: AdminTypes.REMOVE_PLUGIN_REQUEST, data: pluginId});
try {
await Client4.removePlugin(pluginId);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(batchActions([
{type: AdminTypes.REMOVE_PLUGIN_FAILURE, error, data: pluginId},
logError(error),
]));
return {error};
}
dispatch(batchActions([
{type: AdminTypes.REMOVE_PLUGIN_SUCCESS, data: null},
{type: AdminTypes.REMOVED_PLUGIN, data: pluginId},
]));
return {data: true};
};
}
export function enablePlugin(pluginId: string): ActionFunc {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
dispatch({type: AdminTypes.ENABLE_PLUGIN_REQUEST, data: pluginId});
try {
await Client4.enablePlugin(pluginId);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(batchActions([
{type: AdminTypes.ENABLE_PLUGIN_FAILURE, error, data: pluginId},
logError(error),
]));
return {error};
}
dispatch(batchActions([
{type: AdminTypes.ENABLE_PLUGIN_SUCCESS, data: null},
{type: AdminTypes.ENABLED_PLUGIN, data: pluginId},
]));
return {data: true};
};
}
export function disablePlugin(pluginId: string): ActionFunc {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
dispatch({type: AdminTypes.DISABLE_PLUGIN_REQUEST, data: pluginId});
try {
await Client4.disablePlugin(pluginId);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(batchActions([
{type: AdminTypes.DISABLE_PLUGIN_FAILURE, error, data: pluginId},
logError(error),
]));
return {error};
}
dispatch(batchActions([
{type: AdminTypes.DISABLE_PLUGIN_SUCCESS, data: null},
{type: AdminTypes.DISABLED_PLUGIN, data: pluginId},
]));
return {data: true};
};
}
export function getSamlMetadataFromIdp(samlMetadataURL: string): ActionFunc {
return bindClientFunc({
clientFunc: Client4.getSamlMetadataFromIdp,
onSuccess: AdminTypes.RECEIVED_SAML_METADATA_RESPONSE,
params: [
samlMetadataURL,
],
});
}
export function setSamlIdpCertificateFromMetadata(certData: string): ActionFunc {
return bindClientFunc({
clientFunc: Client4.setSamlIdpCertificateFromMetadata,
onSuccess: AdminTypes.SET_SAML_IDP_SUCCESS,
params: [
certData,
],
});
}
export function sendWarnMetricAck(warnMetricId: string, forceAck: boolean) {
return async (dispatch: DispatchFunc) => {
try {
Client4.trackEvent('api', 'api_request_send_metric_ack', {warnMetricId});
await Client4.sendWarnMetricAck(warnMetricId, forceAck);
return {data: true};
} catch (e) {
dispatch(logError(e));
return {error: e.message};
}
};
}