Skip to content

Commit

Permalink
Data views - saved object client use resolve instead of get (#108637
Browse files Browse the repository at this point in the history
)

* so client - use resolve instead of get

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
  • Loading branch information
mattkime and kibanamachine committed Sep 21, 2021
1 parent b1d6779 commit 119c742
Show file tree
Hide file tree
Showing 7 changed files with 139 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -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';
}
}
1 change: 1 addition & 0 deletions src/plugins/data/common/data_views/errors/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@
*/

export * from './duplicate_index_pattern';
export * from './data_view_saved_object_conflict';
Original file line number Diff line number Diff line change
@@ -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
);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -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> =>
({
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { SavedObjectsClientContract, SavedObject } from 'src/core/server';
import {
SavedObjectsClientCommon,
SavedObjectsClientCommonFindArgs,
DataViewSavedObjectConflictError,
} from '../../common/data_views';

export class SavedObjectsClientServerToCommon implements SavedObjectsClientCommon {
Expand All @@ -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,
Expand Down
1 change: 1 addition & 0 deletions src/plugins/data/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ export {
IndexPattern,
IndexPatternsService,
IndexPatternsService as IndexPatternsCommonService,
DataView,
} from '../common';

/**
Expand Down

0 comments on commit 119c742

Please sign in to comment.