Data views - saved object client use resolve instead of get (#108637)

* so client - use resolve instead of get

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Matthew Kime 2021-09-21 09:41:47 -05:00 committed by GitHub
parent b1d6779d43
commit 119c742185
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 139 additions and 4 deletions

View file

@ -0,0 +1,14 @@
/*
* 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 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
export class DataViewSavedObjectConflictError extends Error {
constructor(savedObjectId: string) {
super(`Conflict loading DataView saved object, id: ${savedObjectId}`);
this.name = 'DataViewSavedObjectConflictError';
}
}

View file

@ -7,3 +7,4 @@
*/
export * from './duplicate_index_pattern';
export * from './data_view_saved_object_conflict';

View file

@ -0,0 +1,55 @@
/*
* 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 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import { SavedObjectsClientPublicToCommon } from './saved_objects_client_wrapper';
import { savedObjectsServiceMock } from 'src/core/public/mocks';
import { DataViewSavedObjectConflictError } from '../../common/data_views';
describe('SavedObjectsClientPublicToCommon', () => {
const soClient = savedObjectsServiceMock.createStartContract().client;
test('get saved object - exactMatch', async () => {
const mockedSavedObject = {
version: 'abc',
};
soClient.resolve = jest
.fn()
.mockResolvedValue({ outcome: 'exactMatch', saved_object: mockedSavedObject });
const service = new SavedObjectsClientPublicToCommon(soClient);
const result = await service.get('index-pattern', '1');
expect(result).toStrictEqual(mockedSavedObject);
});
test('get saved object - aliasMatch', async () => {
const mockedSavedObject = {
version: 'def',
};
soClient.resolve = jest
.fn()
.mockResolvedValue({ outcome: 'aliasMatch', saved_object: mockedSavedObject });
const service = new SavedObjectsClientPublicToCommon(soClient);
const result = await service.get('index-pattern', '1');
expect(result).toStrictEqual(mockedSavedObject);
});
test('get saved object - conflict', async () => {
const mockedSavedObject = {
version: 'ghi',
};
soClient.resolve = jest
.fn()
.mockResolvedValue({ outcome: 'conflict', saved_object: mockedSavedObject });
const service = new SavedObjectsClientPublicToCommon(soClient);
await expect(service.get('index-pattern', '1')).rejects.toThrow(
DataViewSavedObjectConflictError
);
});
});

View file

@ -12,9 +12,10 @@ import {
SavedObjectsClientCommon,
SavedObjectsClientCommonFindArgs,
SavedObject,
DataViewSavedObjectConflictError,
} from '../../common/data_views';
type SOClient = Pick<SavedObjectsClient, 'find' | 'get' | 'update' | 'create' | 'delete'>;
type SOClient = Pick<SavedObjectsClient, 'find' | 'resolve' | 'update' | 'create' | 'delete'>;
const simpleSavedObjectToSavedObject = <T>(simpleSavedObject: SimpleSavedObject): SavedObject<T> =>
({
@ -33,8 +34,11 @@ export class SavedObjectsClientPublicToCommon implements SavedObjectsClientCommo
}
async get<T = unknown>(type: string, id: string) {
const response = await this.savedObjectClient.get<T>(type, id);
return simpleSavedObjectToSavedObject<T>(response);
const response = await this.savedObjectClient.resolve<T>(type, id);
if (response.outcome === 'conflict') {
throw new DataViewSavedObjectConflictError(id);
}
return simpleSavedObjectToSavedObject<T>(response.saved_object);
}
async update(
type: string,

View file

@ -0,0 +1,55 @@
/*
* 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 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import { SavedObjectsClientServerToCommon } from './saved_objects_client_wrapper';
import { SavedObjectsClientContract } from 'src/core/server';
import { DataViewSavedObjectConflictError } from '../../common/data_views';
describe('SavedObjectsClientPublicToCommon', () => {
const soClient = ({ resolve: jest.fn() } as unknown) as SavedObjectsClientContract;
test('get saved object - exactMatch', async () => {
const mockedSavedObject = {
version: 'abc',
};
soClient.resolve = jest
.fn()
.mockResolvedValue({ outcome: 'exactMatch', saved_object: mockedSavedObject });
const service = new SavedObjectsClientServerToCommon(soClient);
const result = await service.get('index-pattern', '1');
expect(result).toStrictEqual(mockedSavedObject);
});
test('get saved object - aliasMatch', async () => {
const mockedSavedObject = {
version: 'def',
};
soClient.resolve = jest
.fn()
.mockResolvedValue({ outcome: 'aliasMatch', saved_object: mockedSavedObject });
const service = new SavedObjectsClientServerToCommon(soClient);
const result = await service.get('index-pattern', '1');
expect(result).toStrictEqual(mockedSavedObject);
});
test('get saved object - conflict', async () => {
const mockedSavedObject = {
version: 'ghi',
};
soClient.resolve = jest
.fn()
.mockResolvedValue({ outcome: 'conflict', saved_object: mockedSavedObject });
const service = new SavedObjectsClientServerToCommon(soClient);
await expect(service.get('index-pattern', '1')).rejects.toThrow(
DataViewSavedObjectConflictError
);
});
});

View file

@ -10,6 +10,7 @@ import { SavedObjectsClientContract, SavedObject } from 'src/core/server';
import {
SavedObjectsClientCommon,
SavedObjectsClientCommonFindArgs,
DataViewSavedObjectConflictError,
} from '../../common/data_views';
export class SavedObjectsClientServerToCommon implements SavedObjectsClientCommon {
@ -23,7 +24,11 @@ export class SavedObjectsClientServerToCommon implements SavedObjectsClientCommo
}
async get<T = unknown>(type: string, id: string) {
return await this.savedObjectClient.get<T>(type, id);
const response = await this.savedObjectClient.resolve<T>(type, id);
if (response.outcome === 'conflict') {
throw new DataViewSavedObjectConflictError(id);
}
return response.saved_object;
}
async update(
type: string,

View file

@ -54,6 +54,7 @@ export {
IndexPattern,
IndexPatternsService,
IndexPatternsService as IndexPatternsCommonService,
DataView,
} from '../common';
/**