diff --git a/src/core/server/saved_objects/import/extract_errors.ts b/src/core/server/saved_objects/import/extract_errors.ts index 725e935f6e21d..d381a790b141e 100644 --- a/src/core/server/saved_objects/import/extract_errors.ts +++ b/src/core/server/saved_objects/import/extract_errors.ts @@ -16,12 +16,14 @@ * specific language governing permissions and limitations * under the License. */ +import { SavedObjectsClientContract } from 'src/core/server'; import { SavedObject } from '../types'; import { SavedObjectsImportError } from './types'; -export function extractErrors( +export async function extractErrors( savedObjectResults: SavedObject[], - savedObjectsToImport: SavedObject[] + savedObjectsToImport: SavedObject[], + savedObjectsClient?: SavedObjectsClientContract ) { const errors: SavedObjectsImportError[] = []; const originalSavedObjectsMap = new Map(); @@ -37,11 +39,23 @@ export function extractErrors( originalSavedObject && originalSavedObject.attributes && originalSavedObject.attributes.title; + if (savedObject.error.statusCode === 409) { + // find the correct title of the saved object that conflicts, in order to use it in the message box + let realTitle = title; + + if (savedObjectsClient) { + try { + const resp = await savedObjectsClient.get(savedObject.type, savedObject.id); + realTitle = resp.attributes.title; + } catch (e) { + // if something goes wrong, just use the "title" (new title of the object that is going to be imported) + } + } errors.push({ id: savedObject.id, type: savedObject.type, - title, + title: realTitle, error: { type: 'conflict', }, diff --git a/src/core/server/saved_objects/import/import_saved_objects.ts b/src/core/server/saved_objects/import/import_saved_objects.ts index ef3b4a214c2c2..249e85e225409 100644 --- a/src/core/server/saved_objects/import/import_saved_objects.ts +++ b/src/core/server/saved_objects/import/import_saved_objects.ts @@ -65,11 +65,12 @@ export async function importSavedObjects({ overwrite, namespace, }); - errorAccumulator = [ - ...errorAccumulator, - ...extractErrors(bulkCreateResult.saved_objects, filteredObjects), - ]; - + const soErrors = await extractErrors( + bulkCreateResult.saved_objects, + filteredObjects, + savedObjectsClient + ); + errorAccumulator = [...errorAccumulator, ...soErrors]; return { success: errorAccumulator.length === 0, successCount: bulkCreateResult.saved_objects.filter(obj => !obj.error).length, diff --git a/src/core/server/saved_objects/import/resolve_import_errors.ts b/src/core/server/saved_objects/import/resolve_import_errors.ts index 6f56f283b4aec..3d763d1c246c6 100644 --- a/src/core/server/saved_objects/import/resolve_import_errors.ts +++ b/src/core/server/saved_objects/import/resolve_import_errors.ts @@ -89,20 +89,18 @@ export async function resolveImportErrors({ overwrite: true, namespace, }); - errorAccumulator = [ - ...errorAccumulator, - ...extractErrors(bulkCreateResult.saved_objects, objectsToOverwrite), - ]; + + const extractErrs = await extractErrors(bulkCreateResult.saved_objects, objectsToOverwrite); + errorAccumulator = [...errorAccumulator, ...extractErrs]; successCount += bulkCreateResult.saved_objects.filter(obj => !obj.error).length; } if (objectsToNotOverwrite.length) { const bulkCreateResult = await savedObjectsClient.bulkCreate(objectsToNotOverwrite, { namespace, }); - errorAccumulator = [ - ...errorAccumulator, - ...extractErrors(bulkCreateResult.saved_objects, objectsToNotOverwrite), - ]; + + const extractErrs = await extractErrors(bulkCreateResult.saved_objects, objectsToNotOverwrite); + errorAccumulator = [...errorAccumulator, ...extractErrs]; successCount += bulkCreateResult.saved_objects.filter(obj => !obj.error).length; }