Skip to content

Commit 01b5cb5

Browse files
committed
Improving types, extracting another function
1 parent e0cc901 commit 01b5cb5

File tree

9 files changed

+141
-106
lines changed

9 files changed

+141
-106
lines changed

src/legacy/ui/public/saved_objects/helpers/build_saved_object.ts

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,13 @@ import { hydrateIndexPattern } from 'ui/saved_objects/helpers/hydrate_index_patt
2323
import { intializeSavedObject } from 'ui/saved_objects/helpers/initialize_saved_object';
2424
import { serializeSavedObject } from 'ui/saved_objects/helpers/serialize_saved_object';
2525
import { SavedObjectsClient } from 'kibana/public';
26-
import { EsResponse, SavedObject, SavedObjectConfig } from 'ui/saved_objects/types';
26+
import {
27+
ConfirmModalPromise,
28+
EsResponse,
29+
SavedObject,
30+
SavedObjectConfig,
31+
SaveOptions,
32+
} from 'ui/saved_objects/types';
2733
import { applyEsResp } from 'ui/saved_objects/helpers/apply_es_resp';
2834
import { saveSavedObject } from 'ui/saved_objects/helpers/save_saved_object';
2935
import { IndexPatterns } from '../../../../core_plugins/data/public';
@@ -33,7 +39,7 @@ export function buildSavedObject(
3339
config: SavedObjectConfig = {},
3440
indexPatterns: IndexPatterns,
3541
savedObjectsClient: SavedObjectsClient,
36-
confirmModalPromise: Promise<unknown>,
42+
confirmModalPromise: ConfirmModalPromise,
3743
AngularPromise: PromiseService
3844
) {
3945
// type name for this object, used as the ES-type
@@ -69,7 +75,7 @@ export function buildSavedObject(
6975
* @return {Promise<IndexPattern | null>}
7076
*/
7177
savedObject.hydrateIndexPattern = (id?: string) =>
72-
hydrateIndexPattern(id || '', savedObject, indexPatterns, config, Promise);
78+
hydrateIndexPattern(id || '', savedObject, indexPatterns, config);
7379
/**
7480
* Asynchronously initialize this object - will only run
7581
* once even if called multiple times.
@@ -78,7 +84,7 @@ export function buildSavedObject(
7884
* @resolved {SavedObject}
7985
*/
8086
savedObject.init = _.once(() =>
81-
intializeSavedObject(savedObject, savedObjectsClient, config, Promise)
87+
AngularPromise.resolve(intializeSavedObject(savedObject, savedObjectsClient, config))
8288
);
8389

8490
savedObject.applyESResp = (resp: EsResponse) =>
@@ -94,31 +100,41 @@ export function buildSavedObject(
94100
* Returns true if the object's original title has been changed. New objects return false.
95101
* @return {boolean}
96102
*/
97-
savedObject.isTitleChanged = () => {
98-
return savedObject._source && savedObject._source.title !== savedObject.title;
99-
};
103+
savedObject.isTitleChanged = () =>
104+
savedObject._source && savedObject._source.title !== savedObject.title;
100105

101106
savedObject.creationOpts = (opts: Record<string, any> = {}) => ({
102107
id: savedObject.id,
103108
migrationVersion: savedObject.migrationVersion,
104109
...opts,
105110
});
106111

107-
savedObject.save = (opts: any) => {
108-
return saveSavedObject(savedObject, savedObjectsClient, config, confirmModalPromise, Promise, {
109-
...opts,
110-
});
112+
savedObject.save = async (opts: SaveOptions) => {
113+
try {
114+
const result = await saveSavedObject(
115+
savedObject,
116+
savedObjectsClient,
117+
config,
118+
opts,
119+
confirmModalPromise
120+
);
121+
return AngularPromise.resolve(result);
122+
} catch (e) {
123+
return AngularPromise.reject(e);
124+
}
111125
};
112126

113127
savedObject.destroy = () => {};
114128

129+
savedObject.getFullPath = () => config.path + '/' + config.id;
130+
115131
/**
116132
* Delete this object from Elasticsearch
117133
* @return {promise}
118134
*/
119135
savedObject.delete = () => {
120136
if (!savedObject.id) {
121-
return Promise.reject(new Error('Deleting a saved Object requires type and id'));
137+
return AngularPromise.reject(new Error('Deleting a saved Object requires type and id'));
122138
}
123139
return savedObjectsClient.delete(esType, savedObject.id);
124140
};
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Licensed to Elasticsearch B.V. under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch B.V. licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
import { ConfirmModalPromise, SavedObject } from 'ui/saved_objects/types';
20+
import { SavedObjectsClient, SimpleSavedObject } from 'kibana/public';
21+
import { findObjectByTitle } from 'ui/saved_objects';
22+
import { SAVE_DUPLICATE_REJECTED } from 'ui/saved_objects/constants';
23+
import { displayDuplicateTitleConfirmModal } from 'ui/saved_objects/helpers/display_duplicate_title_confirm_modal';
24+
25+
export const checkForDuplicateTitle = (
26+
savedObject: SavedObject,
27+
savedObjectsClient: SavedObjectsClient,
28+
isTitleDuplicateConfirmed: boolean,
29+
onTitleDuplicate: (() => void) | undefined,
30+
confirmModalPromise: ConfirmModalPromise
31+
) => {
32+
// Don't check for duplicates if user has already confirmed save with duplicate title
33+
if (isTitleDuplicateConfirmed) {
34+
return Promise.resolve(true);
35+
}
36+
37+
// Don't check if the user isn't updating the title, otherwise that would become very annoying to have
38+
// to confirm the save every time, except when copyOnSave is true, then we do want to check.
39+
if (savedObject.title === savedObject.lastSavedTitle && !savedObject.copyOnSave) {
40+
return Promise.resolve(true);
41+
}
42+
43+
return findObjectByTitle(savedObjectsClient, savedObject.getEsType(), savedObject.title).then(
44+
(duplicate: SimpleSavedObject<any> | void) => {
45+
if (!duplicate) return true;
46+
if (duplicate.id === savedObject.id) return true;
47+
48+
if (onTitleDuplicate) {
49+
onTitleDuplicate();
50+
return Promise.reject(new Error(SAVE_DUPLICATE_REJECTED));
51+
}
52+
53+
// TODO: make onTitleDuplicate a required prop and remove UI components from this class
54+
// Need to leave here until all users pass onTitleDuplicate.
55+
return displayDuplicateTitleConfirmModal(savedObject, confirmModalPromise);
56+
}
57+
);
58+
};

src/legacy/ui/public/saved_objects/helpers/create_source.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
import _ from 'lodash';
2020
import { i18n } from '@kbn/i18n';
21-
import { SavedObject } from 'ui/saved_objects/types';
21+
import { ConfirmModalPromise, SavedObject } from 'ui/saved_objects/types';
2222
import { SavedObjectAttributes, SavedObjectsClient } from 'kibana/public';
2323
import { OVERWRITE_REJECTED } from 'ui/saved_objects/constants';
2424

@@ -39,8 +39,7 @@ export function createSource(
3939
savedObject: SavedObject,
4040
savedObjectsClient: SavedObjectsClient,
4141
esType: string,
42-
AngularPromise: any,
43-
confirmModalPromise: any,
42+
confirmModalPromise: ConfirmModalPromise,
4443
options = {}
4544
) {
4645
return savedObjectsClient.create(esType, source, options).catch(err => {

src/legacy/ui/public/saved_objects/helpers/display_duplicate_title_confirm_modal.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,11 @@
1818
*/
1919
import { i18n } from '@kbn/i18n';
2020
import { SAVE_DUPLICATE_REJECTED } from 'ui/saved_objects/constants';
21-
import { SavedObject } from '../types';
21+
import { ConfirmModalPromise, SavedObject } from '../types';
2222

2323
export function displayDuplicateTitleConfirmModal(
2424
savedObject: SavedObject,
25-
confirmModalPromise: (
26-
message: string,
27-
options: { confirmButtonText: string }
28-
) => Promise<React.Component>
25+
confirmModalPromise: ConfirmModalPromise
2926
) {
3027
const confirmMessage = i18n.translate(
3128
'common.ui.savedObjects.confirmModal.saveDuplicateConfirmationMessage',

src/legacy/ui/public/saved_objects/helpers/hydrate_index_pattern.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
import { PromiseService } from 'ui/promises';
2019
import { SavedObject, SavedObjectConfig } from 'ui/saved_objects/types';
2120
import { IIndexPattern } from '../../../../../plugins/data/common/index_patterns';
2221
import { IndexPatterns } from '../../../../core_plugins/data/public/index_patterns/index_patterns';
@@ -31,25 +30,24 @@ export function hydrateIndexPattern(
3130
id: string,
3231
savedObject: SavedObject,
3332
indexPatterns: IndexPatterns,
34-
config: SavedObjectConfig,
35-
AngularPromise: PromiseService
33+
config: SavedObjectConfig
3634
) {
3735
const clearSavedIndexPattern = !!config.clearSavedIndexPattern;
3836
const indexPattern = config.indexPattern;
3937

4038
if (!savedObject.searchSource) {
41-
return AngularPromise.resolve(null);
39+
return Promise.resolve(null);
4240
}
4341

4442
if (clearSavedIndexPattern) {
4543
savedObject.searchSource!.setField('index', null);
46-
return AngularPromise.resolve(null);
44+
return Promise.resolve(null);
4745
}
4846

4947
let index = id || indexPattern || savedObject.searchSource!.getOwnField('index');
5048

5149
if (!index) {
52-
return AngularPromise.resolve(null);
50+
return Promise.resolve(null);
5351
}
5452

5553
// If index is not an IndexPattern object at savedObject point, then it's a string id of an index.
@@ -59,7 +57,7 @@ export function hydrateIndexPattern(
5957

6058
// At savedObject point index will either be an IndexPattern, if cached, or a promise that
6159
// will return an IndexPattern, if not cached.
62-
return AngularPromise.resolve(index).then((ip: IIndexPattern) => {
60+
return Promise.resolve(index).then((ip: IIndexPattern) => {
6361
savedObject.searchSource!.setField('index', ip);
6462
});
6563
}

src/legacy/ui/public/saved_objects/helpers/initialize_saved_object.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,22 @@
2020
import _ from 'lodash';
2121
import { SavedObject, SavedObjectConfig } from 'ui/saved_objects/types';
2222
import { SavedObjectsClient } from 'kibana/public';
23-
import { PromiseService } from 'ui/promises';
2423

24+
/**
25+
* Initialize saved object
26+
*/
2527
export function intializeSavedObject(
2628
savedObject: SavedObject,
2729
savedObjectsClient: SavedObjectsClient,
28-
config: SavedObjectConfig,
29-
AngularPromise: PromiseService
30+
config: SavedObjectConfig
3031
) {
3132
const esType = config.type;
3233
// ensure that the esType is defined
3334
if (!esType) throw new Error('You must define a type name to use SavedObject objects.');
3435
const customInit = config.init || _.noop;
3536
const afterESResp = config.afterESResp || _.noop;
3637

37-
return AngularPromise.resolve(true)
38+
return Promise.resolve()
3839
.then(() => {
3940
// If there is not id, then there is no document to fetch from elasticsearch
4041
if (!savedObject.id) {

src/legacy/ui/public/saved_objects/helpers/save_saved_object.ts

Lines changed: 15 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,18 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
import { SavedObject, SavedObjectConfig } from 'ui/saved_objects/types';
19+
import {
20+
ConfirmModalPromise,
21+
SavedObject,
22+
SavedObjectConfig,
23+
SaveOptions,
24+
} from 'ui/saved_objects/types';
2025
import { npStart } from 'ui/new_platform';
21-
import { findObjectByTitle } from 'ui/saved_objects';
22-
import { displayDuplicateTitleConfirmModal } from 'ui/saved_objects/helpers/display_duplicate_title_confirm_modal';
23-
import { SavedObjectsClient, SimpleSavedObject } from 'kibana/public';
26+
import { SavedObjectsClient } from 'kibana/public';
2427
import { OVERWRITE_REJECTED, SAVE_DUPLICATE_REJECTED } from 'ui/saved_objects/constants';
2528

2629
import { createSource } from 'ui/saved_objects/helpers/create_source';
27-
import { PromiseService } from 'ui/promises';
30+
import { checkForDuplicateTitle } from 'ui/saved_objects/helpers/check_for_duplicate_title';
2831

2932
/**
3033
* @param error {Error} the error
@@ -35,72 +38,33 @@ function isErrorNonFatal(error: { message: string }) {
3538
return error.message === OVERWRITE_REJECTED || error.message === SAVE_DUPLICATE_REJECTED;
3639
}
3740

38-
const checkForDuplicateTitle = (
39-
savedObject: SavedObject,
40-
savedObjectsClient: SavedObjectsClient,
41-
isTitleDuplicateConfirmed: boolean,
42-
onTitleDuplicate: (() => void) | undefined,
43-
Promise: any,
44-
confirmModalPromise: any
45-
) => {
46-
// Don't check for duplicates if user has already confirmed save with duplicate title
47-
if (isTitleDuplicateConfirmed) {
48-
return Promise.resolve();
49-
}
50-
51-
// Don't check if the user isn't updating the title, otherwise that would become very annoying to have
52-
// to confirm the save every time, except when copyOnSave is true, then we do want to check.
53-
if (savedObject.title === savedObject.lastSavedTitle && !savedObject.copyOnSave) {
54-
return Promise.resolve();
55-
}
56-
57-
return findObjectByTitle(savedObjectsClient, savedObject.getEsType(), savedObject.title).then(
58-
(duplicate: SimpleSavedObject<any> | void) => {
59-
if (!duplicate) return true;
60-
if (duplicate.id === savedObject.id) return true;
61-
62-
if (onTitleDuplicate) {
63-
onTitleDuplicate();
64-
return Promise.reject(new Error(SAVE_DUPLICATE_REJECTED));
65-
}
66-
67-
// TODO: make onTitleDuplicate a required prop and remove UI components from this class
68-
// Need to leave here until all users pass onTitleDuplicate.
69-
return displayDuplicateTitleConfirmModal(savedObject, confirmModalPromise);
70-
}
71-
);
72-
};
73-
74-
interface SaveOptions {
75-
confirmOverwrite?: boolean;
76-
isTitleDuplicateConfirmed?: boolean;
77-
onTitleDuplicate?: () => void | undefined;
78-
}
7941
/**
8042
* Saves this object.
8143
*
8244
* @param {string} [esType]
83-
* @param {savedObject} [savedObject]
45+
* @param {SavedObject} [savedObject]
46+
* @param {SavedObjectsClient} [savedObjectsClient]
47+
* @param {SavedObjectConfig} [config]
8448
* @param {object} [options={}]
8549
* @property {boolean} [options.confirmOverwrite=false] - If true, attempts to create the source so it
8650
* can confirm an overwrite if a document with the id already exists.
8751
* @property {boolean} [options.isTitleDuplicateConfirmed=false] - If true, save allowed with duplicate title
8852
* @property {func} [options.onTitleDuplicate] - function called if duplicate title exists.
8953
* When not provided, confirm modal will be displayed asking user to confirm or cancel save.
54+
* @param {ConfirmModalPromise} [confirmModalPromise]
9055
* @return {Promise}
9156
* @resolved {String} - The id of the doc
9257
*/
93-
export function saveSavedObject(
58+
export async function saveSavedObject(
9459
savedObject: SavedObject,
9560
savedObjectsClient: SavedObjectsClient,
9661
config: SavedObjectConfig,
97-
confirmModalPromise: Promise<any>,
98-
AngularPromise: PromiseService,
9962
{
10063
confirmOverwrite = false,
10164
isTitleDuplicateConfirmed = false,
10265
onTitleDuplicate,
103-
}: SaveOptions = {}
66+
}: SaveOptions = {},
67+
confirmModalPromise: ConfirmModalPromise
10468
) {
10569
const esType = config.type || '';
10670
const extractReferences = config.extractReferences;
@@ -130,7 +94,6 @@ export function saveSavedObject(
13094
savedObjectsClient,
13195
isTitleDuplicateConfirmed,
13296
onTitleDuplicate,
133-
AngularPromise,
13497
confirmModalPromise
13598
)
13699
.then(() => {
@@ -140,7 +103,6 @@ export function saveSavedObject(
140103
savedObject,
141104
savedObjectsClient,
142105
esType,
143-
Promise,
144106
confirmModalPromise,
145107
savedObject.creationOpts({ references })
146108
);

0 commit comments

Comments
 (0)