[Security Solution] [Cases] rename case dir/plugin/context/i18n to cases (#94149) (#94318)

This commit is contained in:
Steph Milovic 2021-03-10 11:17:20 -07:00 committed by GitHub
parent 648c40646b
commit 0c1d56217d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
340 changed files with 1256 additions and 1248 deletions

View file

@ -21,28 +21,28 @@
"children": [ "children": [
{ {
"tags": [], "tags": [],
"id": "def-server.CaseRequestContext.getCaseClient", "id": "def-server.CaseRequestContext.getCasesClient",
"type": "Function", "type": "Function",
"label": "getCaseClient", "label": "getCasesClient",
"description": [], "description": [],
"source": { "source": {
"path": "x-pack/plugins/case/server/types.ts", "path": "x-pack/plugins/cases/server/types.ts",
"lineNumber": 14 "lineNumber": 14
}, },
"signature": [ "signature": [
"() => ", "() => ",
{ {
"pluginId": "case", "pluginId": "cases",
"scope": "server", "scope": "server",
"docId": "kibCasePluginApi", "docId": "kibCasePluginApi",
"section": "def-server.CaseClient", "section": "def-server.CasesClient",
"text": "CaseClient" "text": "CasesClient"
} }
] ]
} }
], ],
"source": { "source": {
"path": "x-pack/plugins/case/server/types.ts", "path": "x-pack/plugins/cases/server/types.ts",
"lineNumber": 13 "lineNumber": 13
}, },
"initialIsOpen": false "initialIsOpen": false
@ -60,4 +60,4 @@
"misc": [], "misc": [],
"objects": [] "objects": []
} }
} }

View file

@ -316,7 +316,7 @@ Failure to have auth enabled in Kibana will make for a broken UI. UI-based error
|"Never look back. The past is done. The future is a blank canvas." ― Suzy Kassem, Rise Up and Salute the Sun |"Never look back. The past is done. The future is a blank canvas." ― Suzy Kassem, Rise Up and Salute the Sun
|{kib-repo}blob/{branch}/x-pack/plugins/case/README.md[case] |{kib-repo}blob/{branch}/x-pack/plugins/cases/README.md[cases]
|Experimental Feature |Experimental Feature

View file

@ -69,7 +69,7 @@ it('produces the right watch and ignore list', () => {
<absolute path>/x-pack/plugins/apm/e2e, <absolute path>/x-pack/plugins/apm/e2e,
<absolute path>/x-pack/plugins/apm/scripts, <absolute path>/x-pack/plugins/apm/scripts,
<absolute path>/x-pack/plugins/canvas/canvas_plugin_src, <absolute path>/x-pack/plugins/canvas/canvas_plugin_src,
<absolute path>/x-pack/plugins/case/server/scripts, <absolute path>/x-pack/plugins/cases/server/scripts,
<absolute path>/x-pack/plugins/lists/scripts, <absolute path>/x-pack/plugins/lists/scripts,
<absolute path>/x-pack/plugins/lists/server/scripts, <absolute path>/x-pack/plugins/lists/server/scripts,
<absolute path>/x-pack/plugins/security_solution/scripts, <absolute path>/x-pack/plugins/security_solution/scripts,

View file

@ -69,7 +69,7 @@ export function getServerWatchPaths({ pluginPaths, pluginScanDirs }: Options) {
fromRoot('x-pack/plugins/apm/e2e'), fromRoot('x-pack/plugins/apm/e2e'),
fromRoot('x-pack/plugins/apm/scripts'), fromRoot('x-pack/plugins/apm/scripts'),
fromRoot('x-pack/plugins/canvas/canvas_plugin_src'), // prevents server from restarting twice for Canvas plugin changes, fromRoot('x-pack/plugins/canvas/canvas_plugin_src'), // prevents server from restarting twice for Canvas plugin changes,
fromRoot('x-pack/plugins/case/server/scripts'), fromRoot('x-pack/plugins/cases/server/scripts'),
fromRoot('x-pack/plugins/lists/scripts'), fromRoot('x-pack/plugins/lists/scripts'),
fromRoot('x-pack/plugins/lists/server/scripts'), fromRoot('x-pack/plugins/lists/server/scripts'),
fromRoot('x-pack/plugins/security_solution/scripts'), fromRoot('x-pack/plugins/security_solution/scripts'),

View file

@ -9,7 +9,7 @@
"xpack.apm": "plugins/apm", "xpack.apm": "plugins/apm",
"xpack.beatsManagement": "plugins/beats_management", "xpack.beatsManagement": "plugins/beats_management",
"xpack.canvas": "plugins/canvas", "xpack.canvas": "plugins/canvas",
"xpack.case": "plugins/case", "xpack.cases": "plugins/cases",
"xpack.cloud": "plugins/cloud", "xpack.cloud": "plugins/cloud",
"xpack.dashboard": "plugins/dashboard_enhanced", "xpack.dashboard": "plugins/dashboard_enhanced",
"xpack.discover": "plugins/discover_enhanced", "xpack.discover": "plugins/discover_enhanced",

View file

@ -7,7 +7,7 @@
import { i18n } from '@kbn/i18n'; import { i18n } from '@kbn/i18n';
export const NAME = i18n.translate('xpack.actions.builtin.case.jiraTitle', { export const NAME = i18n.translate('xpack.actions.builtin.cases.jiraTitle', {
defaultMessage: 'Jira', defaultMessage: 'Jira',
}); });

View file

@ -7,7 +7,7 @@
import { i18n } from '@kbn/i18n'; import { i18n } from '@kbn/i18n';
export const NAME = i18n.translate('xpack.actions.builtin.case.resilientTitle', { export const NAME = i18n.translate('xpack.actions.builtin.cases.resilientTitle', {
defaultMessage: 'IBM Resilient', defaultMessage: 'IBM Resilient',
}); });

View file

@ -1,20 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { CaseClientFactoryArguments, CaseClient } from './types';
import { CaseClientHandler } from './client';
export { CaseClientHandler } from './client';
export { CaseClient } from './types';
/**
* Create a CaseClientHandler to external services (other plugins).
*/
export const createExternalCaseClient = (clientArgs: CaseClientFactoryArguments): CaseClient => {
const client = new CaseClientHandler(clientArgs);
return client;
};

View file

@ -83,7 +83,7 @@ const CasePostRequestNoTypeRt = rt.type({
/** /**
* This type is used for validating a create case request. It requires that the type field be defined. * This type is used for validating a create case request. It requires that the type field be defined.
*/ */
export const CaseClientPostRequestRt = rt.type({ export const CasesClientPostRequestRt = rt.type({
...CasePostRequestNoTypeRt.props, ...CasePostRequestNoTypeRt.props,
[caseTypeField]: CaseTypeRt, [caseTypeField]: CaseTypeRt,
}); });
@ -92,7 +92,7 @@ export const CaseClientPostRequestRt = rt.type({
* This type is not used for validation when decoding a request because intersection does not have props defined which * This type is not used for validation when decoding a request because intersection does not have props defined which
* required for the excess function. Instead we use this as the type used by the UI. This allows the type field to be * required for the excess function. Instead we use this as the type used by the UI. This allows the type field to be
* optional and the server will handle setting it to a default value before validating that the request * optional and the server will handle setting it to a default value before validating that the request
* has all the necessary fields. CaseClientPostRequestRt is used for validation. * has all the necessary fields. CasesClientPostRequestRt is used for validation.
*/ */
export const CasePostRequestRt = rt.intersection([ export const CasePostRequestRt = rt.intersection([
rt.partial({ type: CaseTypeRt }), rt.partial({ type: CaseTypeRt }),
@ -178,7 +178,7 @@ export type CaseAttributes = rt.TypeOf<typeof CaseAttributesRt>;
* that the type field be defined. The CasePostRequest should be used in most places (the UI etc). This type is really * that the type field be defined. The CasePostRequest should be used in most places (the UI etc). This type is really
* only necessary for validation. * only necessary for validation.
*/ */
export type CaseClientPostRequest = rt.TypeOf<typeof CaseClientPostRequestRt>; export type CasesClientPostRequest = rt.TypeOf<typeof CasesClientPostRequestRt>;
export type CasePostRequest = rt.TypeOf<typeof CasePostRequestRt>; export type CasePostRequest = rt.TypeOf<typeof CasePostRequestRt>;
export type CaseResponse = rt.TypeOf<typeof CaseResponseRt>; export type CaseResponse = rt.TypeOf<typeof CaseResponseRt>;
export type CasesResponse = rt.TypeOf<typeof CasesResponseRt>; export type CasesResponse = rt.TypeOf<typeof CasesResponseRt>;

View file

@ -10,7 +10,7 @@ import * as rt from 'io-ts';
import { UserRT } from '../user'; import { UserRT } from '../user';
/* To the next developer, if you add/removed fields here /* To the next developer, if you add/removed fields here
* make sure to check this file (x-pack/plugins/case/server/services/user_actions/helpers.ts) too * make sure to check this file (x-pack/plugins/cases/server/services/user_actions/helpers.ts) too
*/ */
const UserActionFieldTypeRt = rt.union([ const UserActionFieldTypeRt = rt.union([
rt.literal('comment'), rt.literal('comment'),

View file

@ -7,7 +7,7 @@
import * as rt from 'io-ts'; import * as rt from 'io-ts';
// New fields should also be added at: x-pack/plugins/case/server/connectors/case/schema.ts // New fields should also be added at: x-pack/plugins/cases/server/connectors/case/schema.ts
export const JiraFieldsRT = rt.type({ export const JiraFieldsRT = rt.type({
issueType: rt.union([rt.string, rt.null]), issueType: rt.union([rt.string, rt.null]),
priority: rt.union([rt.string, rt.null]), priority: rt.union([rt.string, rt.null]),

View file

@ -7,7 +7,7 @@
import * as rt from 'io-ts'; import * as rt from 'io-ts';
// New fields should also be added at: x-pack/plugins/case/server/connectors/case/schema.ts // New fields should also be added at: x-pack/plugins/cases/server/connectors/case/schema.ts
export const ResilientFieldsRT = rt.type({ export const ResilientFieldsRT = rt.type({
incidentTypes: rt.union([rt.array(rt.string), rt.null]), incidentTypes: rt.union([rt.array(rt.string), rt.null]),
severityCode: rt.union([rt.string, rt.null]), severityCode: rt.union([rt.string, rt.null]),

View file

@ -7,7 +7,7 @@
import * as rt from 'io-ts'; import * as rt from 'io-ts';
// New fields should also be added at: x-pack/plugins/case/server/connectors/case/schema.ts // New fields should also be added at: x-pack/plugins/cases/server/connectors/case/schema.ts
export const ServiceNowITSMFieldsRT = rt.type({ export const ServiceNowITSMFieldsRT = rt.type({
impact: rt.union([rt.string, rt.null]), impact: rt.union([rt.string, rt.null]),
severity: rt.union([rt.string, rt.null]), severity: rt.union([rt.string, rt.null]),

View file

@ -7,7 +7,7 @@
import * as rt from 'io-ts'; import * as rt from 'io-ts';
// New fields should also be added at: x-pack/plugins/case/server/connectors/case/schema.ts // New fields should also be added at: x-pack/plugins/cases/server/connectors/case/schema.ts
export const ServiceNowSIRFieldsRT = rt.type({ export const ServiceNowSIRFieldsRT = rt.type({
category: rt.union([rt.string, rt.null]), category: rt.union([rt.string, rt.null]),
destIp: rt.union([rt.boolean, rt.null]), destIp: rt.union([rt.boolean, rt.null]),

View file

@ -7,7 +7,7 @@
import { DEFAULT_MAX_SIGNALS } from '../../security_solution/common/constants'; import { DEFAULT_MAX_SIGNALS } from '../../security_solution/common/constants';
export const APP_ID = 'case'; export const APP_ID = 'cases';
/** /**
* Case routes * Case routes

View file

@ -8,5 +8,5 @@
module.exports = { module.exports = {
preset: '@kbn/test', preset: '@kbn/test',
rootDir: '../../..', rootDir: '../../..',
roots: ['<rootDir>/x-pack/plugins/case'], roots: ['<rootDir>/x-pack/plugins/cases'],
}; };

View file

@ -1,6 +1,6 @@
{ {
"configPath": ["xpack", "case"], "configPath": ["xpack", "cases"],
"id": "case", "id": "cases",
"kibanaVersion": "kibana", "kibanaVersion": "kibana",
"requiredPlugins": ["actions", "securitySolution"], "requiredPlugins": ["actions", "securitySolution"],
"optionalPlugins": [ "optionalPlugins": [

View file

@ -1,6 +1,6 @@
{ {
"author": "Elastic", "author": "Elastic",
"name": "case", "name": "cases",
"version": "8.0.0", "version": "8.0.0",
"private": true, "private": true,
"license": "Elastic-License", "license": "Elastic-License",

View file

@ -8,7 +8,7 @@
import { ElasticsearchClient, Logger } from 'kibana/server'; import { ElasticsearchClient, Logger } from 'kibana/server';
import { AlertInfo } from '../../common'; import { AlertInfo } from '../../common';
import { AlertServiceContract } from '../../services'; import { AlertServiceContract } from '../../services';
import { CaseClientGetAlertsResponse } from './types'; import { CasesClientGetAlertsResponse } from './types';
interface GetParams { interface GetParams {
alertsService: AlertServiceContract; alertsService: AlertServiceContract;
@ -22,7 +22,7 @@ export const get = async ({
alertsInfo, alertsInfo,
scopedClusterClient, scopedClusterClient,
logger, logger,
}: GetParams): Promise<CaseClientGetAlertsResponse> => { }: GetParams): Promise<CasesClientGetAlertsResponse> => {
if (alertsInfo.length === 0) { if (alertsInfo.length === 0) {
return []; return [];
} }

View file

@ -16,4 +16,4 @@ interface Alert {
}; };
} }
export type CaseClientGetAlertsResponse = Alert[]; export type CasesClientGetAlertsResponse = Alert[];

View file

@ -7,18 +7,18 @@
import { CaseStatuses } from '../../../common/api'; import { CaseStatuses } from '../../../common/api';
import { createMockSavedObjectsRepository } from '../../routes/api/__fixtures__'; import { createMockSavedObjectsRepository } from '../../routes/api/__fixtures__';
import { createCaseClientWithMockSavedObjectsClient } from '../mocks'; import { createCasesClientWithMockSavedObjectsClient } from '../mocks';
describe('updateAlertsStatus', () => { describe('updateAlertsStatus', () => {
it('updates the status of the alert correctly', async () => { it('updates the status of the alert correctly', async () => {
const savedObjectsClient = createMockSavedObjectsRepository(); const savedObjectsClient = createMockSavedObjectsRepository();
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
await caseClient.client.updateAlertsStatus({ await casesClient.client.updateAlertsStatus({
alerts: [{ id: 'alert-id-1', index: '.siem-signals', status: CaseStatuses.closed }], alerts: [{ id: 'alert-id-1', index: '.siem-signals', status: CaseStatuses.closed }],
}); });
expect(caseClient.services.alertsService.updateAlertsStatus).toHaveBeenCalledWith({ expect(casesClient.services.alertsService.updateAlertsStatus).toHaveBeenCalledWith({
logger: expect.anything(), logger: expect.anything(),
scopedClusterClient: expect.anything(), scopedClusterClient: expect.anything(),
alerts: [{ id: 'alert-id-1', index: '.siem-signals', status: CaseStatuses.closed }], alerts: [{ id: 'alert-id-1', index: '.siem-signals', status: CaseStatuses.closed }],

View file

@ -5,7 +5,12 @@
* 2.0. * 2.0.
*/ */
import { ConnectorTypes, CaseStatuses, CaseType, CaseClientPostRequest } from '../../../common/api'; import {
ConnectorTypes,
CaseStatuses,
CaseType,
CasesClientPostRequest,
} from '../../../common/api';
import { isCaseError } from '../../common/error'; import { isCaseError } from '../../common/error';
import { import {
@ -13,7 +18,7 @@ import {
mockCaseConfigure, mockCaseConfigure,
mockCases, mockCases,
} from '../../routes/api/__fixtures__'; } from '../../routes/api/__fixtures__';
import { createCaseClientWithMockSavedObjectsClient } from '../mocks'; import { createCasesClientWithMockSavedObjectsClient } from '../mocks';
describe('create', () => { describe('create', () => {
beforeEach(async () => { beforeEach(async () => {
@ -26,7 +31,7 @@ describe('create', () => {
describe('happy path', () => { describe('happy path', () => {
test('it creates the case correctly', async () => { test('it creates the case correctly', async () => {
const postCase: CaseClientPostRequest = { const postCase: CasesClientPostRequest = {
description: 'This is a brand new case of a bad meanie defacing data', description: 'This is a brand new case of a bad meanie defacing data',
title: 'Super Bad Security Issue', title: 'Super Bad Security Issue',
tags: ['defacement'], tags: ['defacement'],
@ -46,8 +51,8 @@ describe('create', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
caseConfigureSavedObject: mockCaseConfigure, caseConfigureSavedObject: mockCaseConfigure,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.create(postCase); const res = await casesClient.client.create(postCase);
expect(res).toMatchInlineSnapshot(` expect(res).toMatchInlineSnapshot(`
Object { Object {
@ -93,7 +98,7 @@ describe('create', () => {
`); `);
expect( expect(
caseClient.services.userActionService.postUserActions.mock.calls[0][0].actions casesClient.services.userActionService.postUserActions.mock.calls[0][0].actions
// using a snapshot here so we don't have to update the text field manually each time it changes // using a snapshot here so we don't have to update the text field manually each time it changes
).toMatchInlineSnapshot(` ).toMatchInlineSnapshot(`
Array [ Array [
@ -130,7 +135,7 @@ describe('create', () => {
}); });
test('it creates the case without connector in the configuration', async () => { test('it creates the case without connector in the configuration', async () => {
const postCase: CaseClientPostRequest = { const postCase: CasesClientPostRequest = {
description: 'This is a brand new case of a bad meanie defacing data', description: 'This is a brand new case of a bad meanie defacing data',
title: 'Super Bad Security Issue', title: 'Super Bad Security Issue',
tags: ['defacement'], tags: ['defacement'],
@ -149,8 +154,8 @@ describe('create', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.create(postCase); const res = await casesClient.client.create(postCase);
expect(res).toMatchInlineSnapshot(` expect(res).toMatchInlineSnapshot(`
Object { Object {
@ -193,7 +198,7 @@ describe('create', () => {
}); });
test('Allow user to create case without authentication', async () => { test('Allow user to create case without authentication', async () => {
const postCase: CaseClientPostRequest = { const postCase: CasesClientPostRequest = {
description: 'This is a brand new case of a bad meanie defacing data', description: 'This is a brand new case of a bad meanie defacing data',
title: 'Super Bad Security Issue', title: 'Super Bad Security Issue',
tags: ['defacement'], tags: ['defacement'],
@ -212,11 +217,11 @@ describe('create', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ const casesClient = await createCasesClientWithMockSavedObjectsClient({
savedObjectsClient, savedObjectsClient,
badAuth: true, badAuth: true,
}); });
const res = await caseClient.client.create(postCase); const res = await casesClient.client.create(postCase);
expect(res).toMatchInlineSnapshot(` expect(res).toMatchInlineSnapshot(`
Object { Object {
@ -276,9 +281,9 @@ describe('create', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return ( return (
caseClient.client casesClient.client
// @ts-expect-error // @ts-expect-error
.create({ theCase: postCase }) .create({ theCase: postCase })
.catch((e) => { .catch((e) => {
@ -305,9 +310,9 @@ describe('create', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return ( return (
caseClient.client casesClient.client
// @ts-expect-error // @ts-expect-error
.create({ theCase: postCase }) .create({ theCase: postCase })
.catch((e) => { .catch((e) => {
@ -334,9 +339,9 @@ describe('create', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return ( return (
caseClient.client casesClient.client
// @ts-expect-error // @ts-expect-error
.create({ theCase: postCase }) .create({ theCase: postCase })
.catch((e) => { .catch((e) => {
@ -358,9 +363,9 @@ describe('create', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return ( return (
caseClient.client casesClient.client
// @ts-expect-error // @ts-expect-error
.create({ theCase: postCase }) .create({ theCase: postCase })
.catch((e) => { .catch((e) => {
@ -388,9 +393,9 @@ describe('create', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return ( return (
caseClient.client casesClient.client
// @ts-expect-error // @ts-expect-error
.create({ theCase: postCase }) .create({ theCase: postCase })
.catch((e) => { .catch((e) => {
@ -423,8 +428,8 @@ describe('create', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return caseClient.client.create(postCase).catch((e) => { return casesClient.client.create(postCase).catch((e) => {
expect(e).not.toBeNull(); expect(e).not.toBeNull();
expect(e.isBoom).toBe(true); expect(e.isBoom).toBe(true);
expect(e.output.statusCode).toBe(400); expect(e.output.statusCode).toBe(400);
@ -432,7 +437,7 @@ describe('create', () => {
}); });
it(`Returns an error if postNewCase throws`, async () => { it(`Returns an error if postNewCase throws`, async () => {
const postCase: CaseClientPostRequest = { const postCase: CasesClientPostRequest = {
description: 'Throw an error', description: 'Throw an error',
title: 'Super Bad Security Issue', title: 'Super Bad Security Issue',
tags: ['error'], tags: ['error'],
@ -450,9 +455,9 @@ describe('create', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return caseClient.client.create(postCase).catch((e) => { return casesClient.client.create(postCase).catch((e) => {
expect(e).not.toBeNull(); expect(e).not.toBeNull();
expect(isCaseError(e)).toBeTruthy(); expect(isCaseError(e)).toBeTruthy();
const boomErr = e.boomify(); const boomErr = e.boomify();

View file

@ -18,7 +18,7 @@ import {
excess, excess,
CaseResponseRt, CaseResponseRt,
CaseResponse, CaseResponse,
CaseClientPostRequestRt, CasesClientPostRequestRt,
CasePostRequest, CasePostRequest,
CaseType, CaseType,
User, User,
@ -62,7 +62,7 @@ export const create = async ({
const { type = CaseType.individual, ...nonTypeCaseFields } = theCase; const { type = CaseType.individual, ...nonTypeCaseFields } = theCase;
const query = pipe( const query = pipe(
// decode with the defaulted type field // decode with the defaulted type field
excess(CaseClientPostRequestRt).decode({ type, ...nonTypeCaseFields }), excess(CasesClientPostRequestRt).decode({ type, ...nonTypeCaseFields }),
fold(throwErrors(Boom.badRequest), identity) fold(throwErrors(Boom.badRequest), identity)
); );

View file

@ -38,7 +38,7 @@ import {
CaseServiceSetup, CaseServiceSetup,
CaseUserActionServiceSetup, CaseUserActionServiceSetup,
} from '../../services'; } from '../../services';
import { CaseClientHandler } from '../client'; import { CasesClientHandler } from '../client';
import { createCaseError } from '../../common/error'; import { createCaseError } from '../../common/error';
/** /**
@ -65,7 +65,7 @@ interface PushParams {
user: User; user: User;
caseId: string; caseId: string;
connectorId: string; connectorId: string;
caseClient: CaseClientHandler; casesClient: CasesClientHandler;
actionsClient: ActionsClient; actionsClient: ActionsClient;
logger: Logger; logger: Logger;
} }
@ -75,7 +75,7 @@ export const push = async ({
caseService, caseService,
caseConfigureService, caseConfigureService,
userActionService, userActionService,
caseClient, casesClient,
actionsClient, actionsClient,
connectorId, connectorId,
caseId, caseId,
@ -92,9 +92,9 @@ export const push = async ({
try { try {
[theCase, connector, userActions] = await Promise.all([ [theCase, connector, userActions] = await Promise.all([
caseClient.get({ id: caseId, includeComments: true, includeSubCaseComments: true }), casesClient.get({ id: caseId, includeComments: true, includeSubCaseComments: true }),
actionsClient.get({ id: connectorId }), actionsClient.get({ id: connectorId }),
caseClient.getUserActions({ caseId }), casesClient.getUserActions({ caseId }),
]); ]);
} catch (e) { } catch (e) {
const message = `Error getting case and/or connector and/or user actions: ${e.message}`; const message = `Error getting case and/or connector and/or user actions: ${e.message}`;
@ -111,7 +111,7 @@ export const push = async ({
const alertsInfo = getAlertInfoFromComments(theCase?.comments); const alertsInfo = getAlertInfoFromComments(theCase?.comments);
try { try {
alerts = await caseClient.getAlerts({ alerts = await casesClient.getAlerts({
alertsInfo, alertsInfo,
}); });
} catch (e) { } catch (e) {
@ -123,7 +123,7 @@ export const push = async ({
} }
try { try {
connectorMappings = await caseClient.getMappings({ connectorMappings = await casesClient.getMappings({
actionsClient, actionsClient,
connectorId: connector.id, connectorId: connector.id,
connectorType: connector.actionTypeId, connectorType: connector.actionTypeId,

View file

@ -13,7 +13,7 @@ import {
mockCases, mockCases,
mockCaseComments, mockCaseComments,
} from '../../routes/api/__fixtures__'; } from '../../routes/api/__fixtures__';
import { createCaseClientWithMockSavedObjectsClient } from '../mocks'; import { createCasesClientWithMockSavedObjectsClient } from '../mocks';
describe('update', () => { describe('update', () => {
beforeEach(async () => { beforeEach(async () => {
@ -40,8 +40,8 @@ describe('update', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.update(patchCases); const res = await casesClient.client.update(patchCases);
expect(res).toMatchInlineSnapshot(` expect(res).toMatchInlineSnapshot(`
Array [ Array [
@ -93,7 +93,7 @@ describe('update', () => {
`); `);
expect( expect(
caseClient.services.userActionService.postUserActions.mock.calls[0][0].actions casesClient.services.userActionService.postUserActions.mock.calls[0][0].actions
).toEqual([ ).toEqual([
{ {
attributes: { attributes: {
@ -140,8 +140,8 @@ describe('update', () => {
], ],
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.update(patchCases); const res = await casesClient.client.update(patchCases);
expect(res).toMatchInlineSnapshot(` expect(res).toMatchInlineSnapshot(`
Array [ Array [
@ -204,8 +204,8 @@ describe('update', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.update(patchCases); const res = await casesClient.client.update(patchCases);
expect(res).toMatchInlineSnapshot(` expect(res).toMatchInlineSnapshot(`
Array [ Array [
@ -272,8 +272,8 @@ describe('update', () => {
caseSavedObject: [mockCaseNoConnectorId], caseSavedObject: [mockCaseNoConnectorId],
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.update(patchCases); const res = await casesClient.client.update(patchCases);
expect(res).toMatchInlineSnapshot(` expect(res).toMatchInlineSnapshot(`
Array [ Array [
@ -344,8 +344,8 @@ describe('update', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.update(patchCases); const res = await casesClient.client.update(patchCases);
expect(res).toMatchInlineSnapshot(` expect(res).toMatchInlineSnapshot(`
Array [ Array [
@ -424,12 +424,12 @@ describe('update', () => {
], ],
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
caseClient.client.updateAlertsStatus = jest.fn(); casesClient.client.updateAlertsStatus = jest.fn();
await caseClient.client.update(patchCases); await casesClient.client.update(patchCases);
expect(caseClient.client.updateAlertsStatus).toHaveBeenCalledWith({ expect(casesClient.client.updateAlertsStatus).toHaveBeenCalledWith({
alerts: [ alerts: [
{ {
id: 'test-id', id: 'test-id',
@ -461,11 +461,11 @@ describe('update', () => {
caseCommentSavedObject: [{ ...mockCaseComments[3] }], caseCommentSavedObject: [{ ...mockCaseComments[3] }],
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
await caseClient.client.update(patchCases); await casesClient.client.update(patchCases);
expect(caseClient.esClient.bulk).not.toHaveBeenCalled(); expect(casesClient.esClient.bulk).not.toHaveBeenCalled();
}); });
test('it updates alert status when syncAlerts is turned on', async () => { test('it updates alert status when syncAlerts is turned on', async () => {
@ -489,12 +489,12 @@ describe('update', () => {
caseCommentSavedObject: [{ ...mockCaseComments[3] }], caseCommentSavedObject: [{ ...mockCaseComments[3] }],
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
caseClient.client.updateAlertsStatus = jest.fn(); casesClient.client.updateAlertsStatus = jest.fn();
await caseClient.client.update(patchCases); await casesClient.client.update(patchCases);
expect(caseClient.client.updateAlertsStatus).toHaveBeenCalledWith({ expect(casesClient.client.updateAlertsStatus).toHaveBeenCalledWith({
alerts: [{ id: 'test-id', index: 'test-index', status: 'open' }], alerts: [{ id: 'test-id', index: 'test-index', status: 'open' }],
}); });
}); });
@ -515,11 +515,11 @@ describe('update', () => {
caseCommentSavedObject: [{ ...mockCaseComments[3] }], caseCommentSavedObject: [{ ...mockCaseComments[3] }],
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
await caseClient.client.update(patchCases); await casesClient.client.update(patchCases);
expect(caseClient.esClient.bulk).not.toHaveBeenCalled(); expect(casesClient.esClient.bulk).not.toHaveBeenCalled();
}); });
test('it updates alert status for multiple cases', async () => { test('it updates alert status for multiple cases', async () => {
@ -572,12 +572,12 @@ describe('update', () => {
], ],
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
caseClient.client.updateAlertsStatus = jest.fn(); casesClient.client.updateAlertsStatus = jest.fn();
await caseClient.client.update(patchCases); await casesClient.client.update(patchCases);
expect(caseClient.client.updateAlertsStatus).toHaveBeenCalledWith({ expect(casesClient.client.updateAlertsStatus).toHaveBeenCalledWith({
alerts: [ alerts: [
{ id: 'test-id', index: 'test-index', status: 'open' }, { id: 'test-id', index: 'test-index', status: 'open' },
{ id: 'test-id-2', index: 'test-index-2', status: 'closed' }, { id: 'test-id-2', index: 'test-index-2', status: 'closed' },
@ -600,11 +600,11 @@ describe('update', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
await caseClient.client.update(patchCases); await casesClient.client.update(patchCases);
expect(caseClient.esClient.bulk).not.toHaveBeenCalled(); expect(casesClient.esClient.bulk).not.toHaveBeenCalled();
}); });
}); });
@ -629,9 +629,9 @@ describe('update', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return ( return (
caseClient.client casesClient.client
// @ts-expect-error // @ts-expect-error
.update({ cases: patchCases }) .update({ cases: patchCases })
.catch((e) => { .catch((e) => {
@ -662,9 +662,9 @@ describe('update', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return ( return (
caseClient.client casesClient.client
// @ts-expect-error // @ts-expect-error
.update({ cases: patchCases }) .update({ cases: patchCases })
.catch((e) => { .catch((e) => {
@ -691,8 +691,8 @@ describe('update', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return caseClient.client.update(patchCases).catch((e) => { return casesClient.client.update(patchCases).catch((e) => {
expect(e).not.toBeNull(); expect(e).not.toBeNull();
expect(isCaseError(e)).toBeTruthy(); expect(isCaseError(e)).toBeTruthy();
const boomErr = e.boomify(); const boomErr = e.boomify();
@ -723,8 +723,8 @@ describe('update', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return caseClient.client.update(patchCases).catch((e) => { return casesClient.client.update(patchCases).catch((e) => {
expect(e).not.toBeNull(); expect(e).not.toBeNull();
expect(isCaseError(e)).toBeTruthy(); expect(isCaseError(e)).toBeTruthy();
const boomErr = e.boomify(); const boomErr = e.boomify();
@ -752,8 +752,8 @@ describe('update', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return caseClient.client.update(patchCases).catch((e) => { return casesClient.client.update(patchCases).catch((e) => {
expect(e).not.toBeNull(); expect(e).not.toBeNull();
expect(isCaseError(e)).toBeTruthy(); expect(isCaseError(e)).toBeTruthy();
const boomErr = e.boomify(); const boomErr = e.boomify();

View file

@ -51,7 +51,7 @@ import {
CASE_SAVED_OBJECT, CASE_SAVED_OBJECT,
SUB_CASE_SAVED_OBJECT, SUB_CASE_SAVED_OBJECT,
} from '../../saved_object_types'; } from '../../saved_object_types';
import { CaseClientHandler } from '..'; import { CasesClientHandler } from '..';
import { createAlertUpdateRequest } from '../../common'; import { createAlertUpdateRequest } from '../../common';
import { UpdateAlertRequest } from '../types'; import { UpdateAlertRequest } from '../types';
import { createCaseError } from '../../common/error'; import { createCaseError } from '../../common/error';
@ -254,14 +254,14 @@ async function updateAlerts({
casesMap, casesMap,
caseService, caseService,
client, client,
caseClient, casesClient,
}: { }: {
casesWithSyncSettingChangedToOn: ESCasePatchRequest[]; casesWithSyncSettingChangedToOn: ESCasePatchRequest[];
casesWithStatusChangedAndSynced: ESCasePatchRequest[]; casesWithStatusChangedAndSynced: ESCasePatchRequest[];
casesMap: Map<string, SavedObject<ESCaseAttributes>>; casesMap: Map<string, SavedObject<ESCaseAttributes>>;
caseService: CaseServiceSetup; caseService: CaseServiceSetup;
client: SavedObjectsClientContract; client: SavedObjectsClientContract;
caseClient: CaseClientHandler; casesClient: CasesClientHandler;
}) { }) {
/** /**
* It's possible that a case ID can appear multiple times in each array. I'm intentionally placing the status changes * It's possible that a case ID can appear multiple times in each array. I'm intentionally placing the status changes
@ -309,7 +309,7 @@ async function updateAlerts({
[] []
); );
await caseClient.updateAlertsStatus({ alerts: alertsToUpdate }); await casesClient.updateAlertsStatus({ alerts: alertsToUpdate });
} }
interface UpdateArgs { interface UpdateArgs {
@ -317,7 +317,7 @@ interface UpdateArgs {
caseService: CaseServiceSetup; caseService: CaseServiceSetup;
userActionService: CaseUserActionServiceSetup; userActionService: CaseUserActionServiceSetup;
user: User; user: User;
caseClient: CaseClientHandler; casesClient: CasesClientHandler;
cases: CasesPatchRequest; cases: CasesPatchRequest;
logger: Logger; logger: Logger;
} }
@ -327,7 +327,7 @@ export const update = async ({
caseService, caseService,
userActionService, userActionService,
user, user,
caseClient, casesClient,
cases, cases,
logger, logger,
}: UpdateArgs): Promise<CasesResponse> => { }: UpdateArgs): Promise<CasesResponse> => {
@ -470,7 +470,7 @@ export const update = async ({
casesWithSyncSettingChangedToOn, casesWithSyncSettingChangedToOn,
caseService, caseService,
client: savedObjectsClient, client: savedObjectsClient,
caseClient, casesClient,
casesMap, casesMap,
}); });

View file

@ -23,7 +23,7 @@ import {
} from '../../../common/api'; } from '../../../common/api';
import { ActionsClient } from '../../../../actions/server'; import { ActionsClient } from '../../../../actions/server';
import { externalServiceFormatters, FormatterConnectorTypes } from '../../connectors'; import { externalServiceFormatters, FormatterConnectorTypes } from '../../connectors';
import { CaseClientGetAlertsResponse } from '../../client/alerts/types'; import { CasesClientGetAlertsResponse } from '../../client/alerts/types';
import { import {
BasicParams, BasicParams,
EntityInformation, EntityInformation,
@ -46,7 +46,7 @@ interface CreateIncidentArgs {
userActions: CaseUserActionsResponse; userActions: CaseUserActionsResponse;
connector: ActionConnector; connector: ActionConnector;
mappings: ConnectorMappingsAttributes[]; mappings: ConnectorMappingsAttributes[];
alerts: CaseClientGetAlertsResponse; alerts: CasesClientGetAlertsResponse;
} }
export const getLatestPushInfo = ( export const getLatestPushInfo = (
@ -210,22 +210,22 @@ export const FIELD_INFORMATION = (
) => { ) => {
switch (mode) { switch (mode) {
case 'create': case 'create':
return i18n.translate('xpack.case.connectors.case.externalIncidentCreated', { return i18n.translate('xpack.cases.connectors.cases.externalIncidentCreated', {
values: { date, user }, values: { date, user },
defaultMessage: '(created at {date} by {user})', defaultMessage: '(created at {date} by {user})',
}); });
case 'update': case 'update':
return i18n.translate('xpack.case.connectors.case.externalIncidentUpdated', { return i18n.translate('xpack.cases.connectors.cases.externalIncidentUpdated', {
values: { date, user }, values: { date, user },
defaultMessage: '(updated at {date} by {user})', defaultMessage: '(updated at {date} by {user})',
}); });
case 'add': case 'add':
return i18n.translate('xpack.case.connectors.case.externalIncidentAdded', { return i18n.translate('xpack.cases.connectors.cases.externalIncidentAdded', {
values: { date, user }, values: { date, user },
defaultMessage: '(added at {date} by {user})', defaultMessage: '(added at {date} by {user})',
}); });
default: default:
return i18n.translate('xpack.case.connectors.case.externalIncidentDefault', { return i18n.translate('xpack.cases.connectors.cases.externalIncidentDefault', {
values: { date, user }, values: { date, user },
defaultMessage: '(created at {date} by {user})', defaultMessage: '(created at {date} by {user})',
}); });

View file

@ -7,16 +7,16 @@
import { ElasticsearchClient, SavedObjectsClientContract, Logger } from 'src/core/server'; import { ElasticsearchClient, SavedObjectsClientContract, Logger } from 'src/core/server';
import { import {
CaseClientFactoryArguments, CasesClientFactoryArguments,
CaseClient, CasesClient,
ConfigureFields, ConfigureFields,
MappingsClient, MappingsClient,
CaseClientUpdateAlertsStatus, CasesClientUpdateAlertsStatus,
CaseClientAddComment, CasesClientAddComment,
CaseClientGet, CasesClientGet,
CaseClientGetUserActions, CasesClientGetUserActions,
CaseClientGetAlerts, CasesClientGetAlerts,
CaseClientPush, CasesClientPush,
} from './types'; } from './types';
import { create } from './cases/create'; import { create } from './cases/create';
import { update } from './cases/update'; import { update } from './cases/update';
@ -41,7 +41,7 @@ import { createCaseError } from '../common/error';
/** /**
* This class is a pass through for common case functionality (like creating, get a case). * This class is a pass through for common case functionality (like creating, get a case).
*/ */
export class CaseClientHandler implements CaseClient { export class CasesClientHandler implements CasesClient {
private readonly _scopedClusterClient: ElasticsearchClient; private readonly _scopedClusterClient: ElasticsearchClient;
private readonly _caseConfigureService: CaseConfigureServiceSetup; private readonly _caseConfigureService: CaseConfigureServiceSetup;
private readonly _caseService: CaseServiceSetup; private readonly _caseService: CaseServiceSetup;
@ -52,7 +52,7 @@ export class CaseClientHandler implements CaseClient {
private readonly _alertsService: AlertServiceContract; private readonly _alertsService: AlertServiceContract;
private readonly logger: Logger; private readonly logger: Logger;
constructor(clientArgs: CaseClientFactoryArguments) { constructor(clientArgs: CasesClientFactoryArguments) {
this._scopedClusterClient = clientArgs.scopedClusterClient; this._scopedClusterClient = clientArgs.scopedClusterClient;
this._caseConfigureService = clientArgs.caseConfigureService; this._caseConfigureService = clientArgs.caseConfigureService;
this._caseService = clientArgs.caseService; this._caseService = clientArgs.caseService;
@ -92,7 +92,7 @@ export class CaseClientHandler implements CaseClient {
userActionService: this._userActionService, userActionService: this._userActionService,
user: this.user, user: this.user,
cases, cases,
caseClient: this, casesClient: this,
logger: this.logger, logger: this.logger,
}); });
} catch (error) { } catch (error) {
@ -108,13 +108,13 @@ export class CaseClientHandler implements CaseClient {
} }
} }
public async addComment({ caseId, comment }: CaseClientAddComment) { public async addComment({ caseId, comment }: CasesClientAddComment) {
try { try {
return addComment({ return addComment({
savedObjectsClient: this._savedObjectsClient, savedObjectsClient: this._savedObjectsClient,
caseService: this._caseService, caseService: this._caseService,
userActionService: this._userActionService, userActionService: this._userActionService,
caseClient: this, casesClient: this,
caseId, caseId,
comment, comment,
user: this.user, user: this.user,
@ -147,7 +147,7 @@ export class CaseClientHandler implements CaseClient {
...args, ...args,
savedObjectsClient: this._savedObjectsClient, savedObjectsClient: this._savedObjectsClient,
connectorMappingsService: this._connectorMappingsService, connectorMappingsService: this._connectorMappingsService,
caseClient: this, casesClient: this,
logger: this.logger, logger: this.logger,
}); });
} catch (error) { } catch (error) {
@ -159,7 +159,7 @@ export class CaseClientHandler implements CaseClient {
} }
} }
public async updateAlertsStatus(args: CaseClientUpdateAlertsStatus) { public async updateAlertsStatus(args: CasesClientUpdateAlertsStatus) {
try { try {
return updateAlertsStatus({ return updateAlertsStatus({
...args, ...args,
@ -178,7 +178,7 @@ export class CaseClientHandler implements CaseClient {
} }
} }
public async get(args: CaseClientGet) { public async get(args: CasesClientGet) {
try { try {
return get({ return get({
...args, ...args,
@ -192,7 +192,7 @@ export class CaseClientHandler implements CaseClient {
} }
} }
public async getUserActions(args: CaseClientGetUserActions) { public async getUserActions(args: CasesClientGetUserActions) {
try { try {
return getUserActions({ return getUserActions({
...args, ...args,
@ -208,7 +208,7 @@ export class CaseClientHandler implements CaseClient {
} }
} }
public async getAlerts(args: CaseClientGetAlerts) { public async getAlerts(args: CasesClientGetAlerts) {
try { try {
return getAlerts({ return getAlerts({
...args, ...args,
@ -227,7 +227,7 @@ export class CaseClientHandler implements CaseClient {
} }
} }
public async push(args: CaseClientPush) { public async push(args: CasesClientPush) {
try { try {
return push({ return push({
...args, ...args,
@ -235,7 +235,7 @@ export class CaseClientHandler implements CaseClient {
caseService: this._caseService, caseService: this._caseService,
userActionService: this._userActionService, userActionService: this._userActionService,
user: this.user, user: this.user,
caseClient: this, casesClient: this,
caseConfigureService: this._caseConfigureService, caseConfigureService: this._caseConfigureService,
logger: this.logger, logger: this.logger,
}); });

View file

@ -13,7 +13,7 @@ import {
mockCaseComments, mockCaseComments,
mockCases, mockCases,
} from '../../routes/api/__fixtures__'; } from '../../routes/api/__fixtures__';
import { createCaseClientWithMockSavedObjectsClient } from '../mocks'; import { createCasesClientWithMockSavedObjectsClient } from '../mocks';
type AlertComment = CommentType.alert | CommentType.generatedAlert; type AlertComment = CommentType.alert | CommentType.generatedAlert;
@ -33,8 +33,8 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.addComment({ const res = await casesClient.client.addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
comment: 'Wow, good luck catching that bad meanie!', comment: 'Wow, good luck catching that bad meanie!',
@ -71,8 +71,8 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.addComment({ const res = await casesClient.client.addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
type: CommentType.alert, type: CommentType.alert,
@ -119,8 +119,8 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.addComment({ const res = await casesClient.client.addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
comment: 'Wow, good luck catching that bad meanie!', comment: 'Wow, good luck catching that bad meanie!',
@ -142,8 +142,8 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
await caseClient.client.addComment({ await casesClient.client.addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
comment: 'Wow, good luck catching that bad meanie!', comment: 'Wow, good luck catching that bad meanie!',
@ -152,7 +152,7 @@ describe('addComment', () => {
}); });
expect( expect(
caseClient.services.userActionService.postUserActions.mock.calls[0][0].actions casesClient.services.userActionService.postUserActions.mock.calls[0][0].actions
).toEqual([ ).toEqual([
{ {
attributes: { attributes: {
@ -189,11 +189,11 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ const casesClient = await createCasesClientWithMockSavedObjectsClient({
savedObjectsClient, savedObjectsClient,
badAuth: true, badAuth: true,
}); });
const res = await caseClient.client.addComment({ const res = await casesClient.client.addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
comment: 'Wow, good luck catching that bad meanie!', comment: 'Wow, good luck catching that bad meanie!',
@ -229,14 +229,14 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ const casesClient = await createCasesClientWithMockSavedObjectsClient({
savedObjectsClient, savedObjectsClient,
badAuth: true, badAuth: true,
}); });
caseClient.client.updateAlertsStatus = jest.fn(); casesClient.client.updateAlertsStatus = jest.fn();
await caseClient.client.addComment({ await casesClient.client.addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
type: CommentType.alert, type: CommentType.alert,
@ -249,7 +249,7 @@ describe('addComment', () => {
}, },
}); });
expect(caseClient.client.updateAlertsStatus).toHaveBeenCalledWith({ expect(casesClient.client.updateAlertsStatus).toHaveBeenCalledWith({
alerts: [{ id: 'test-alert', index: 'test-index', status: 'open' }], alerts: [{ id: 'test-alert', index: 'test-index', status: 'open' }],
}); });
}); });
@ -265,14 +265,14 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ const casesClient = await createCasesClientWithMockSavedObjectsClient({
savedObjectsClient, savedObjectsClient,
badAuth: true, badAuth: true,
}); });
caseClient.client.updateAlertsStatus = jest.fn(); casesClient.client.updateAlertsStatus = jest.fn();
await caseClient.client.addComment({ await casesClient.client.addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
type: CommentType.alert, type: CommentType.alert,
@ -285,7 +285,7 @@ describe('addComment', () => {
}, },
}); });
expect(caseClient.client.updateAlertsStatus).not.toHaveBeenCalled(); expect(casesClient.client.updateAlertsStatus).not.toHaveBeenCalled();
}); });
}); });
@ -297,8 +297,8 @@ describe('addComment', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return caseClient.client return casesClient.client
.addComment({ .addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
// @ts-expect-error // @ts-expect-error
@ -319,7 +319,7 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const allRequestAttributes = { const allRequestAttributes = {
type: CommentType.user, type: CommentType.user,
comment: 'a comment', comment: 'a comment',
@ -327,7 +327,7 @@ describe('addComment', () => {
['comment'].forEach((attribute) => { ['comment'].forEach((attribute) => {
const requestAttributes = omit(attribute, allRequestAttributes); const requestAttributes = omit(attribute, allRequestAttributes);
return caseClient.client return casesClient.client
.addComment({ .addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
// @ts-expect-error // @ts-expect-error
@ -351,10 +351,10 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
['alertId', 'index'].forEach((attribute) => { ['alertId', 'index'].forEach((attribute) => {
return caseClient.client return casesClient.client
.addComment({ .addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
@ -379,7 +379,7 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const allRequestAttributes = { const allRequestAttributes = {
type: CommentType.alert, type: CommentType.alert,
index: 'test-index', index: 'test-index',
@ -388,7 +388,7 @@ describe('addComment', () => {
['alertId', 'index'].forEach((attribute) => { ['alertId', 'index'].forEach((attribute) => {
const requestAttributes = omit(attribute, allRequestAttributes); const requestAttributes = omit(attribute, allRequestAttributes);
return caseClient.client return casesClient.client
.addComment({ .addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
// @ts-expect-error // @ts-expect-error
@ -412,10 +412,10 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
['comment'].forEach((attribute) => { ['comment'].forEach((attribute) => {
return caseClient.client return casesClient.client
.addComment({ .addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
@ -444,8 +444,8 @@ describe('addComment', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return caseClient.client return casesClient.client
.addComment({ .addComment({
caseId: 'not-exists', caseId: 'not-exists',
comment: { comment: {
@ -469,8 +469,8 @@ describe('addComment', () => {
caseSavedObject: mockCases, caseSavedObject: mockCases,
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return caseClient.client return casesClient.client
.addComment({ .addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
@ -495,8 +495,8 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
return caseClient.client return casesClient.client
.addComment({ .addComment({
caseId: 'mock-id-4', caseId: 'mock-id-4',
comment: { comment: {
@ -534,11 +534,11 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ const casesClient = await createCasesClientWithMockSavedObjectsClient({
savedObjectsClient, savedObjectsClient,
}); });
await expect( await expect(
caseClient.client.addComment({ casesClient.client.addComment({
caseId: 'mock-id-4', caseId: 'mock-id-4',
comment: { comment: {
// casting because type must be either alert or generatedAlert but type is CommentType // casting because type must be either alert or generatedAlert but type is CommentType
@ -568,11 +568,11 @@ describe('addComment', () => {
caseCommentSavedObject: mockCaseComments, caseCommentSavedObject: mockCaseComments,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ const casesClient = await createCasesClientWithMockSavedObjectsClient({
savedObjectsClient, savedObjectsClient,
}); });
await expect( await expect(
caseClient.client.addComment({ casesClient.client.addComment({
caseId: 'mock-id-1', caseId: 'mock-id-1',
comment: { comment: {
// casting because type must be either alert or generatedAlert but type is CommentType // casting because type must be either alert or generatedAlert but type is CommentType

View file

@ -33,7 +33,7 @@ import {
import { CaseServiceSetup, CaseUserActionServiceSetup } from '../../services'; import { CaseServiceSetup, CaseUserActionServiceSetup } from '../../services';
import { CommentableCase, createAlertUpdateRequest } from '../../common'; import { CommentableCase, createAlertUpdateRequest } from '../../common';
import { CaseClientHandler } from '..'; import { CasesClientHandler } from '..';
import { createCaseError } from '../../common/error'; import { createCaseError } from '../../common/error';
import { CASE_COMMENT_SAVED_OBJECT } from '../../saved_object_types'; import { CASE_COMMENT_SAVED_OBJECT } from '../../saved_object_types';
import { MAX_GENERATED_ALERTS_PER_SUB_CASE } from '../../../common/constants'; import { MAX_GENERATED_ALERTS_PER_SUB_CASE } from '../../../common/constants';
@ -95,7 +95,7 @@ async function getSubCase({
} }
interface AddCommentFromRuleArgs { interface AddCommentFromRuleArgs {
caseClient: CaseClientHandler; casesClient: CasesClientHandler;
caseId: string; caseId: string;
comment: CommentRequestAlertType; comment: CommentRequestAlertType;
savedObjectsClient: SavedObjectsClientContract; savedObjectsClient: SavedObjectsClientContract;
@ -108,7 +108,7 @@ const addGeneratedAlerts = async ({
savedObjectsClient, savedObjectsClient,
caseService, caseService,
userActionService, userActionService,
caseClient, casesClient,
caseId, caseId,
comment, comment,
logger, logger,
@ -177,7 +177,7 @@ const addGeneratedAlerts = async ({
comment: query, comment: query,
status: subCase.attributes.status, status: subCase.attributes.status,
}); });
await caseClient.updateAlertsStatus({ await casesClient.updateAlertsStatus({
alerts: alertsToUpdate, alerts: alertsToUpdate,
}); });
} }
@ -261,7 +261,7 @@ async function getCombinedCase({
} }
interface AddCommentArgs { interface AddCommentArgs {
caseClient: CaseClientHandler; casesClient: CasesClientHandler;
caseId: string; caseId: string;
comment: CommentRequest; comment: CommentRequest;
savedObjectsClient: SavedObjectsClientContract; savedObjectsClient: SavedObjectsClientContract;
@ -275,7 +275,7 @@ export const addComment = async ({
savedObjectsClient, savedObjectsClient,
caseService, caseService,
userActionService, userActionService,
caseClient, casesClient,
caseId, caseId,
comment, comment,
user, user,
@ -290,7 +290,7 @@ export const addComment = async ({
return addGeneratedAlerts({ return addGeneratedAlerts({
caseId, caseId,
comment, comment,
caseClient, casesClient,
savedObjectsClient, savedObjectsClient,
userActionService, userActionService,
caseService, caseService,
@ -329,7 +329,7 @@ export const addComment = async ({
status: updatedCase.status, status: updatedCase.status,
}); });
await caseClient.updateAlertsStatus({ await casesClient.updateAlertsStatus({
alerts: alertsToUpdate, alerts: alertsToUpdate,
}); });
} }

View file

@ -8,7 +8,7 @@
import { ConnectorTypes } from '../../../common/api'; import { ConnectorTypes } from '../../../common/api';
import { createMockSavedObjectsRepository, mockCaseMappings } from '../../routes/api/__fixtures__'; import { createMockSavedObjectsRepository, mockCaseMappings } from '../../routes/api/__fixtures__';
import { createCaseClientWithMockSavedObjectsClient } from '../mocks'; import { createCasesClientWithMockSavedObjectsClient } from '../mocks';
import { actionsClientMock } from '../../../../actions/server/actions_client.mock'; import { actionsClientMock } from '../../../../actions/server/actions_client.mock';
import { actionsErrResponse, mappings, mockGetFieldsResponse } from './mock'; import { actionsErrResponse, mappings, mockGetFieldsResponse } from './mock';
describe('get_fields', () => { describe('get_fields', () => {
@ -23,8 +23,8 @@ describe('get_fields', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseMappingsSavedObject: mockCaseMappings, caseMappingsSavedObject: mockCaseMappings,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.getFields({ const res = await casesClient.client.getFields({
actionsClient: actionsMock, actionsClient: actionsMock,
connectorType: ConnectorTypes.jira, connectorType: ConnectorTypes.jira,
connectorId: '123', connectorId: '123',
@ -44,8 +44,8 @@ describe('get_fields', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseMappingsSavedObject: mockCaseMappings, caseMappingsSavedObject: mockCaseMappings,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
await caseClient.client await casesClient.client
.getFields({ .getFields({
actionsClient: { ...actionsMock, execute: jest.fn().mockReturnValue(actionsErrResponse) }, actionsClient: { ...actionsMock, execute: jest.fn().mockReturnValue(actionsErrResponse) },
connectorType: ConnectorTypes.jira, connectorType: ConnectorTypes.jira,

View file

@ -8,7 +8,7 @@
import { ConnectorTypes } from '../../../common/api'; import { ConnectorTypes } from '../../../common/api';
import { createMockSavedObjectsRepository, mockCaseMappings } from '../../routes/api/__fixtures__'; import { createMockSavedObjectsRepository, mockCaseMappings } from '../../routes/api/__fixtures__';
import { createCaseClientWithMockSavedObjectsClient } from '../mocks'; import { createCasesClientWithMockSavedObjectsClient } from '../mocks';
import { actionsClientMock } from '../../../../actions/server/actions_client.mock'; import { actionsClientMock } from '../../../../actions/server/actions_client.mock';
import { mappings, mockGetFieldsResponse } from './mock'; import { mappings, mockGetFieldsResponse } from './mock';
@ -28,8 +28,8 @@ describe('get_mappings', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseMappingsSavedObject: mockCaseMappings, caseMappingsSavedObject: mockCaseMappings,
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.getMappings({ const res = await casesClient.client.getMappings({
actionsClient: actionsMock, actionsClient: actionsMock,
connectorType: ConnectorTypes.jira, connectorType: ConnectorTypes.jira,
connectorId: '123', connectorId: '123',
@ -41,8 +41,8 @@ describe('get_mappings', () => {
const savedObjectsClient = createMockSavedObjectsRepository({ const savedObjectsClient = createMockSavedObjectsRepository({
caseMappingsSavedObject: [], caseMappingsSavedObject: [],
}); });
const caseClient = await createCaseClientWithMockSavedObjectsClient({ savedObjectsClient }); const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
const res = await caseClient.client.getMappings({ const res = await casesClient.client.getMappings({
actionsClient: actionsMock, actionsClient: actionsMock,
connectorType: ConnectorTypes.jira, connectorType: ConnectorTypes.jira,
connectorId: '123', connectorId: '123',

View file

@ -11,14 +11,14 @@ import { ConnectorMappingsAttributes, ConnectorTypes } from '../../../common/api
// eslint-disable-next-line @kbn/eslint/no-restricted-paths // eslint-disable-next-line @kbn/eslint/no-restricted-paths
import { ACTION_SAVED_OBJECT_TYPE } from '../../../../actions/server/saved_objects'; import { ACTION_SAVED_OBJECT_TYPE } from '../../../../actions/server/saved_objects';
import { ConnectorMappingsServiceSetup } from '../../services'; import { ConnectorMappingsServiceSetup } from '../../services';
import { CaseClientHandler } from '..'; import { CasesClientHandler } from '..';
import { createCaseError } from '../../common/error'; import { createCaseError } from '../../common/error';
interface GetMappingsArgs { interface GetMappingsArgs {
savedObjectsClient: SavedObjectsClientContract; savedObjectsClient: SavedObjectsClientContract;
connectorMappingsService: ConnectorMappingsServiceSetup; connectorMappingsService: ConnectorMappingsServiceSetup;
actionsClient: ActionsClient; actionsClient: ActionsClient;
caseClient: CaseClientHandler; casesClient: CasesClientHandler;
connectorType: string; connectorType: string;
connectorId: string; connectorId: string;
logger: Logger; logger: Logger;
@ -28,7 +28,7 @@ export const getMappings = async ({
savedObjectsClient, savedObjectsClient,
connectorMappingsService, connectorMappingsService,
actionsClient, actionsClient,
caseClient, casesClient,
connectorType, connectorType,
connectorId, connectorId,
logger, logger,
@ -49,7 +49,7 @@ export const getMappings = async ({
let theMapping; let theMapping;
// Create connector mappings if there are none // Create connector mappings if there are none
if (myConnectorMappings.total === 0) { if (myConnectorMappings.total === 0) {
const res = await caseClient.getFields({ const res = await casesClient.getFields({
actionsClient, actionsClient,
connectorId, connectorId,
connectorType, connectorType,

View file

@ -20,8 +20,8 @@ import {
} from '../services/mocks'; } from '../services/mocks';
jest.mock('./client'); jest.mock('./client');
import { CaseClientHandler } from './client'; import { CasesClientHandler } from './client';
import { createExternalCaseClient } from './index'; import { createExternalCasesClient } from './index';
const logger = loggingSystemMock.create().get('case'); const logger = loggingSystemMock.create().get('case');
const esClient = elasticsearchServiceMock.createElasticsearchClient(); const esClient = elasticsearchServiceMock.createElasticsearchClient();
@ -32,9 +32,9 @@ const connectorMappingsService = connectorMappingsServiceMock();
const savedObjectsClient = savedObjectsClientMock.create(); const savedObjectsClient = savedObjectsClientMock.create();
const userActionService = createUserActionServiceMock(); const userActionService = createUserActionServiceMock();
describe('createExternalCaseClient()', () => { describe('createExternalCasesClient()', () => {
test('it creates the client correctly', async () => { test('it creates the client correctly', async () => {
createExternalCaseClient({ createExternalCasesClient({
scopedClusterClient: esClient, scopedClusterClient: esClient,
alertsService, alertsService,
caseConfigureService, caseConfigureService,
@ -45,6 +45,6 @@ describe('createExternalCaseClient()', () => {
userActionService, userActionService,
logger, logger,
}); });
expect(CaseClientHandler).toHaveBeenCalledTimes(1); expect(CasesClientHandler).toHaveBeenCalledTimes(1);
}); });
}); });

View file

@ -0,0 +1,20 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { CasesClientFactoryArguments, CasesClient } from './types';
import { CasesClientHandler } from './client';
export { CasesClientHandler } from './client';
export { CasesClient } from './types';
/**
* Create a CasesClientHandler to external services (other plugins).
*/
export const createExternalCasesClient = (clientArgs: CasesClientFactoryArguments): CasesClient => {
const client = new CasesClientHandler(clientArgs);
return client;
};

View file

@ -15,12 +15,12 @@ import {
CaseUserActionServiceSetup, CaseUserActionServiceSetup,
ConnectorMappingsService, ConnectorMappingsService,
} from '../services'; } from '../services';
import { CaseClient } from './types'; import { CasesClient } from './types';
import { authenticationMock } from '../routes/api/__fixtures__'; import { authenticationMock } from '../routes/api/__fixtures__';
import { createExternalCaseClient } from '.'; import { createExternalCasesClient } from '.';
export type CaseClientPluginContractMock = jest.Mocked<CaseClient>; export type CasesClientPluginContractMock = jest.Mocked<CasesClient>;
export const createExternalCaseClientMock = (): CaseClientPluginContractMock => ({ export const createExternalCasesClientMock = (): CasesClientPluginContractMock => ({
addComment: jest.fn(), addComment: jest.fn(),
create: jest.fn(), create: jest.fn(),
get: jest.fn(), get: jest.fn(),
@ -33,7 +33,7 @@ export const createExternalCaseClientMock = (): CaseClientPluginContractMock =>
updateAlertsStatus: jest.fn(), updateAlertsStatus: jest.fn(),
}); });
export const createCaseClientWithMockSavedObjectsClient = async ({ export const createCasesClientWithMockSavedObjectsClient = async ({
savedObjectsClient, savedObjectsClient,
badAuth = false, badAuth = false,
omitFromContext = [], omitFromContext = [],
@ -42,7 +42,7 @@ export const createCaseClientWithMockSavedObjectsClient = async ({
badAuth?: boolean; badAuth?: boolean;
omitFromContext?: string[]; omitFromContext?: string[];
}): Promise<{ }): Promise<{
client: CaseClient; client: CasesClient;
services: { services: {
userActionService: jest.Mocked<CaseUserActionServiceSetup>; userActionService: jest.Mocked<CaseUserActionServiceSetup>;
alertsService: jest.Mocked<AlertServiceContract>; alertsService: jest.Mocked<AlertServiceContract>;
@ -71,7 +71,7 @@ export const createCaseClientWithMockSavedObjectsClient = async ({
getAlerts: jest.fn(), getAlerts: jest.fn(),
}; };
const caseClient = createExternalCaseClient({ const casesClient = createExternalCasesClient({
savedObjectsClient, savedObjectsClient,
user: auth.getCurrentUser(), user: auth.getCurrentUser(),
caseService, caseService,
@ -83,7 +83,7 @@ export const createCaseClientWithMockSavedObjectsClient = async ({
logger: log, logger: log,
}); });
return { return {
client: caseClient, client: casesClient,
services: { userActionService, alertsService }, services: { userActionService, alertsService },
esClient, esClient,
}; };

View file

@ -27,34 +27,34 @@ import {
AlertServiceContract, AlertServiceContract,
} from '../services'; } from '../services';
import { ConnectorMappingsServiceSetup } from '../services/connector_mappings'; import { ConnectorMappingsServiceSetup } from '../services/connector_mappings';
import { CaseClientGetAlertsResponse } from './alerts/types'; import { CasesClientGetAlertsResponse } from './alerts/types';
export interface CaseClientGet { export interface CasesClientGet {
id: string; id: string;
includeComments?: boolean; includeComments?: boolean;
includeSubCaseComments?: boolean; includeSubCaseComments?: boolean;
} }
export interface CaseClientPush { export interface CasesClientPush {
actionsClient: ActionsClient; actionsClient: ActionsClient;
caseId: string; caseId: string;
connectorId: string; connectorId: string;
} }
export interface CaseClientAddComment { export interface CasesClientAddComment {
caseId: string; caseId: string;
comment: CommentRequest; comment: CommentRequest;
} }
export interface CaseClientUpdateAlertsStatus { export interface CasesClientUpdateAlertsStatus {
alerts: UpdateAlertRequest[]; alerts: UpdateAlertRequest[];
} }
export interface CaseClientGetAlerts { export interface CasesClientGetAlerts {
alertsInfo: AlertInfo[]; alertsInfo: AlertInfo[];
} }
export interface CaseClientGetUserActions { export interface CasesClientGetUserActions {
caseId: string; caseId: string;
subCaseId?: string; subCaseId?: string;
} }
@ -65,7 +65,7 @@ export interface MappingsClient {
connectorType: string; connectorType: string;
} }
export interface CaseClientFactoryArguments { export interface CasesClientFactoryArguments {
scopedClusterClient: ElasticsearchClient; scopedClusterClient: ElasticsearchClient;
caseConfigureService: CaseConfigureServiceSetup; caseConfigureService: CaseConfigureServiceSetup;
caseService: CaseServiceSetup; caseService: CaseServiceSetup;
@ -95,17 +95,17 @@ export interface UpdateAlertRequest {
/** /**
* This represents the interface that other plugins can access. * This represents the interface that other plugins can access.
*/ */
export interface CaseClient { export interface CasesClient {
addComment(args: CaseClientAddComment): Promise<CaseResponse>; addComment(args: CasesClientAddComment): Promise<CaseResponse>;
create(theCase: CasePostRequest): Promise<CaseResponse>; create(theCase: CasePostRequest): Promise<CaseResponse>;
get(args: CaseClientGet): Promise<CaseResponse>; get(args: CasesClientGet): Promise<CaseResponse>;
getAlerts(args: CaseClientGetAlerts): Promise<CaseClientGetAlertsResponse>; getAlerts(args: CasesClientGetAlerts): Promise<CasesClientGetAlertsResponse>;
getFields(args: ConfigureFields): Promise<GetFieldsResponse>; getFields(args: ConfigureFields): Promise<GetFieldsResponse>;
getMappings(args: MappingsClient): Promise<ConnectorMappingsAttributes[]>; getMappings(args: MappingsClient): Promise<ConnectorMappingsAttributes[]>;
getUserActions(args: CaseClientGetUserActions): Promise<CaseUserActionsResponse>; getUserActions(args: CasesClientGetUserActions): Promise<CaseUserActionsResponse>;
push(args: CaseClientPush): Promise<CaseResponse>; push(args: CasesClientPush): Promise<CaseResponse>;
update(args: CasesPatchRequest): Promise<CasesResponse>; update(args: CasesPatchRequest): Promise<CasesResponse>;
updateAlertsStatus(args: CaseClientUpdateAlertsStatus): Promise<void>; updateAlertsStatus(args: CasesClientUpdateAlertsStatus): Promise<void>;
} }
export interface MappingsClient { export interface MappingsClient {

View file

@ -28,12 +28,12 @@ import {
} from '../../services/mocks'; } from '../../services/mocks';
import { CaseActionType, CaseActionTypeExecutorOptions, CaseExecutorParams } from './types'; import { CaseActionType, CaseActionTypeExecutorOptions, CaseExecutorParams } from './types';
import { getActionType } from '.'; import { getActionType } from '.';
import { createExternalCaseClientMock } from '../../client/mocks'; import { createExternalCasesClientMock } from '../../client/mocks';
const mockCaseClient = createExternalCaseClientMock(); const mockCasesClient = createExternalCasesClientMock();
jest.mock('../../client', () => ({ jest.mock('../../client', () => ({
createExternalCaseClient: () => mockCaseClient, createExternalCasesClient: () => mockCasesClient,
})); }));
const services = actionsMock.createServices(); const services = actionsMock.createServices();
@ -877,7 +877,7 @@ describe('case connector', () => {
}, },
}; };
mockCaseClient.create.mockReturnValue(Promise.resolve(createReturn)); mockCasesClient.create.mockReturnValue(Promise.resolve(createReturn));
const actionId = 'some-id'; const actionId = 'some-id';
const params: CaseExecutorParams = { const params: CaseExecutorParams = {
@ -913,7 +913,7 @@ describe('case connector', () => {
const result = await caseActionType.executor(executorOptions); const result = await caseActionType.executor(executorOptions);
expect(result).toEqual({ actionId, status: 'ok', data: createReturn }); expect(result).toEqual({ actionId, status: 'ok', data: createReturn });
expect(mockCaseClient.create).toHaveBeenCalledWith({ expect(mockCasesClient.create).toHaveBeenCalledWith({
...params.subActionParams, ...params.subActionParams,
connector: { connector: {
id: 'jira', id: 'jira',
@ -974,7 +974,7 @@ describe('case connector', () => {
}, },
]; ];
mockCaseClient.update.mockReturnValue(Promise.resolve(updateReturn)); mockCasesClient.update.mockReturnValue(Promise.resolve(updateReturn));
const actionId = 'some-id'; const actionId = 'some-id';
const params: CaseExecutorParams = { const params: CaseExecutorParams = {
@ -1002,7 +1002,7 @@ describe('case connector', () => {
const result = await caseActionType.executor(executorOptions); const result = await caseActionType.executor(executorOptions);
expect(result).toEqual({ actionId, status: 'ok', data: updateReturn }); expect(result).toEqual({ actionId, status: 'ok', data: updateReturn });
expect(mockCaseClient.update).toHaveBeenCalledWith({ expect(mockCasesClient.update).toHaveBeenCalledWith({
// Null values have been striped out. // Null values have been striped out.
cases: [ cases: [
{ {
@ -1064,7 +1064,7 @@ describe('case connector', () => {
}, },
}; };
mockCaseClient.addComment.mockReturnValue(Promise.resolve(commentReturn)); mockCasesClient.addComment.mockReturnValue(Promise.resolve(commentReturn));
const actionId = 'some-id'; const actionId = 'some-id';
const params: CaseExecutorParams = { const params: CaseExecutorParams = {
@ -1089,7 +1089,7 @@ describe('case connector', () => {
const result = await caseActionType.executor(executorOptions); const result = await caseActionType.executor(executorOptions);
expect(result).toEqual({ actionId, status: 'ok', data: commentReturn }); expect(result).toEqual({ actionId, status: 'ok', data: commentReturn });
expect(mockCaseClient.addComment).toHaveBeenCalledWith({ expect(mockCasesClient.addComment).toHaveBeenCalledWith({
caseId: 'case-id', caseId: 'case-id',
comment: { comment: {
comment: 'a comment', comment: 'a comment',

View file

@ -14,7 +14,7 @@ import {
CommentRequest, CommentRequest,
CommentType, CommentType,
} from '../../../common/api'; } from '../../../common/api';
import { createExternalCaseClient } from '../../client'; import { createExternalCasesClient } from '../../client';
import { CaseExecutorParamsSchema, CaseConfigurationSchema, CommentSchemaType } from './schema'; import { CaseExecutorParamsSchema, CaseConfigurationSchema, CommentSchemaType } from './schema';
import { import {
CaseExecutorResponse, CaseExecutorResponse,
@ -75,7 +75,7 @@ async function executor(
let data: CaseExecutorResponse | null = null; let data: CaseExecutorResponse | null = null;
const { savedObjectsClient, scopedClusterClient } = services; const { savedObjectsClient, scopedClusterClient } = services;
const caseClient = createExternalCaseClient({ const casesClient = createExternalCasesClient({
savedObjectsClient, savedObjectsClient,
scopedClusterClient, scopedClusterClient,
// we might want the user information to be passed as part of the action request // we might want the user information to be passed as part of the action request
@ -96,7 +96,7 @@ async function executor(
if (subAction === 'create') { if (subAction === 'create') {
try { try {
data = await caseClient.create({ data = await casesClient.create({
...(subActionParams as CasePostRequest), ...(subActionParams as CasePostRequest),
}); });
} catch (error) { } catch (error) {
@ -118,7 +118,7 @@ async function executor(
); );
try { try {
data = await caseClient.update({ cases: [updateParamsWithoutNullValues] }); data = await casesClient.update({ cases: [updateParamsWithoutNullValues] });
} catch (error) { } catch (error) {
throw createCaseError({ throw createCaseError({
message: `Failed to update case using connector id: ${updateParamsWithoutNullValues?.id} version: ${updateParamsWithoutNullValues?.version}: ${error}`, message: `Failed to update case using connector id: ${updateParamsWithoutNullValues?.id} version: ${updateParamsWithoutNullValues?.version}: ${error}`,
@ -132,7 +132,7 @@ async function executor(
const { caseId, comment } = subActionParams as ExecutorSubActionAddCommentParams; const { caseId, comment } = subActionParams as ExecutorSubActionAddCommentParams;
try { try {
const formattedComment = transformConnectorComment(comment, logger); const formattedComment = transformConnectorComment(comment, logger);
data = await caseClient.addComment({ caseId, comment: formattedComment }); data = await casesClient.addComment({ caseId, comment: formattedComment });
} catch (error) { } catch (error) {
throw createCaseError({ throw createCaseError({
message: `Failed to create comment using connector case id: ${caseId}: ${error}`, message: `Failed to create comment using connector case id: ${caseId}: ${error}`,

View file

@ -7,6 +7,6 @@
import { i18n } from '@kbn/i18n'; import { i18n } from '@kbn/i18n';
export const NAME = i18n.translate('xpack.case.connectors.case.title', { export const NAME = i18n.translate('xpack.cases.connectors.cases.title', {
defaultMessage: 'Case', defaultMessage: 'Case',
}); });

View file

@ -14,7 +14,7 @@ import {
// eslint-disable-next-line @kbn/eslint/no-restricted-paths // eslint-disable-next-line @kbn/eslint/no-restricted-paths
} from '../../../actions/server/types'; } from '../../../actions/server/types';
import { CaseResponse, ConnectorTypes } from '../../common/api'; import { CaseResponse, ConnectorTypes } from '../../common/api';
import { CaseClientGetAlertsResponse } from '../client/alerts/types'; import { CasesClientGetAlertsResponse } from '../client/alerts/types';
import { import {
CaseServiceSetup, CaseServiceSetup,
CaseConfigureServiceSetup, CaseConfigureServiceSetup,
@ -52,7 +52,7 @@ export interface RegisterConnectorsArgs extends GetActionTypeParams {
export type FormatterConnectorTypes = Exclude<ConnectorTypes, ConnectorTypes.none>; export type FormatterConnectorTypes = Exclude<ConnectorTypes, ConnectorTypes.none>;
export interface ExternalServiceFormatter<TExternalServiceParams = {}> { export interface ExternalServiceFormatter<TExternalServiceParams = {}> {
format: (theCase: CaseResponse, alerts: CaseClientGetAlertsResponse) => TExternalServiceParams; format: (theCase: CaseResponse, alerts: CasesClientGetAlertsResponse) => TExternalServiceParams;
} }
export type ExternalServiceFormatterMapper = { export type ExternalServiceFormatterMapper = {

View file

@ -34,7 +34,7 @@ import {
AlertService, AlertService,
AlertServiceContract, AlertServiceContract,
} from './services'; } from './services';
import { CaseClientHandler, createExternalCaseClient } from './client'; import { CasesClientHandler, createExternalCasesClient } from './client';
import { registerConnectors } from './connectors'; import { registerConnectors } from './connectors';
import type { CasesRequestHandlerContext } from './types'; import type { CasesRequestHandlerContext } from './types';
@ -88,7 +88,7 @@ export class CasePlugin {
this.userActionService = await new CaseUserActionService(this.log).setup(); this.userActionService = await new CaseUserActionService(this.log).setup();
this.alertsService = new AlertService(); this.alertsService = new AlertService();
core.http.registerRouteHandlerContext<CasesRequestHandlerContext, 'case'>( core.http.registerRouteHandlerContext<CasesRequestHandlerContext, 'cases'>(
APP_ID, APP_ID,
this.createRouteHandlerContext({ this.createRouteHandlerContext({
core, core,
@ -125,12 +125,12 @@ export class CasePlugin {
public start(core: CoreStart) { public start(core: CoreStart) {
this.log.debug(`Starting Case Workflow`); this.log.debug(`Starting Case Workflow`);
const getCaseClientWithRequestAndContext = async ( const getCasesClientWithRequestAndContext = async (
context: CasesRequestHandlerContext, context: CasesRequestHandlerContext,
request: KibanaRequest request: KibanaRequest
) => { ) => {
const user = await this.caseService!.getUser({ request }); const user = await this.caseService!.getUser({ request });
return createExternalCaseClient({ return createExternalCasesClient({
scopedClusterClient: context.core.elasticsearch.client.asCurrentUser, scopedClusterClient: context.core.elasticsearch.client.asCurrentUser,
savedObjectsClient: core.savedObjects.getScopedClient(request), savedObjectsClient: core.savedObjects.getScopedClient(request),
user, user,
@ -144,7 +144,7 @@ export class CasePlugin {
}; };
return { return {
getCaseClientWithRequestAndContext, getCasesClientWithRequestAndContext,
}; };
} }
@ -168,13 +168,13 @@ export class CasePlugin {
userActionService: CaseUserActionServiceSetup; userActionService: CaseUserActionServiceSetup;
alertsService: AlertServiceContract; alertsService: AlertServiceContract;
logger: Logger; logger: Logger;
}): IContextProvider<CasesRequestHandlerContext, 'case'> => { }): IContextProvider<CasesRequestHandlerContext, 'cases'> => {
return async (context, request, response) => { return async (context, request, response) => {
const [{ savedObjects }] = await core.getStartServices(); const [{ savedObjects }] = await core.getStartServices();
const user = await caseService.getUser({ request }); const user = await caseService.getUser({ request });
return { return {
getCaseClient: () => { getCasesClient: () => {
return new CaseClientHandler({ return new CasesClientHandler({
scopedClusterClient: context.core.elasticsearch.client.asCurrentUser, scopedClusterClient: context.core.elasticsearch.client.asCurrentUser,
savedObjectsClient: savedObjects.getScopedClient(request), savedObjectsClient: savedObjects.getScopedClient(request),
caseService, caseService,

View file

@ -18,7 +18,7 @@ export const createRoute = async (
const httpService = httpServiceMock.createSetupContract(); const httpService = httpServiceMock.createSetupContract();
const router = httpService.createRouter(); const router = httpService.createRouter();
const log = loggingSystemMock.create().get('case'); const log = loggingSystemMock.create().get('cases');
const auth = badAuth ? authenticationMock.createInvalid() : authenticationMock.create(); const auth = badAuth ? authenticationMock.createInvalid() : authenticationMock.create();
const caseService = new CaseService(log, auth); const caseService = new CaseService(log, auth);
const caseConfigureServicePlugin = new CaseConfigureService(log); const caseConfigureServicePlugin = new CaseConfigureService(log);

View file

@ -6,7 +6,7 @@
*/ */
import { elasticsearchServiceMock, loggingSystemMock } from 'src/core/server/mocks'; import { elasticsearchServiceMock, loggingSystemMock } from 'src/core/server/mocks';
import { createExternalCaseClient } from '../../../client'; import { createExternalCasesClient } from '../../../client';
import { import {
AlertService, AlertService,
CaseService, CaseService,
@ -42,13 +42,13 @@ export const createRouteContext = async (client: any, badAuth = false) => {
}, },
}, },
actions: { getActionsClient: () => actionsMock }, actions: { getActionsClient: () => actionsMock },
case: { cases: {
getCaseClient: () => caseClient, getCasesClient: () => casesClient,
}, },
} as unknown) as CasesRequestHandlerContext; } as unknown) as CasesRequestHandlerContext;
const connectorMappingsService = await connectorMappingsServicePlugin.setup(); const connectorMappingsService = await connectorMappingsServicePlugin.setup();
const caseClient = createExternalCaseClient({ const casesClient = createExternalCasesClient({
savedObjectsClient: client, savedObjectsClient: client,
user: authc.getCurrentUser(), user: authc.getCurrentUser(),
caseService, caseService,

Some files were not shown because too many files have changed in this diff Show more