From b427c2035f973d2b4a6a2e4ad0fab9a188e3f57d Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 13 Jan 2023 15:42:58 +0100 Subject: [PATCH 01/33] STEP 1: refactor to not use the public SO HTTP APIs! --- .../public/lib/index.ts | 1 + .../saved_objects_table.test.tsx | 1 + .../objects_table/saved_objects_table.tsx | 1 + .../server/routes/delete.ts | 35 +++++++++++++++++++ 4 files changed, 38 insertions(+) create mode 100644 src/plugins/saved_objects_management/server/routes/delete.ts diff --git a/src/plugins/saved_objects_management/public/lib/index.ts b/src/plugins/saved_objects_management/public/lib/index.ts index 1833e4e75f327..c4eb74267759a 100644 --- a/src/plugins/saved_objects_management/public/lib/index.ts +++ b/src/plugins/saved_objects_management/public/lib/index.ts @@ -20,6 +20,7 @@ export { getDefaultTitle } from './get_default_title'; export { findObjects } from './find_objects'; export { bulkDeleteObjects } from './bulk_delete_objects'; export { bulkGetObjects } from './bulk_get_objects'; +export { deleteObject } from './delete'; export type { SavedObjectsExportResultDetails } from './extract_export_details'; export { extractExportDetails } from './extract_export_details'; export { getAllowedTypes } from './get_allowed_types'; diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx index 69ced5010c560..203941928b055 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx @@ -121,6 +121,7 @@ describe('SavedObjectsTable', () => { }; http.post.mockResolvedValue([]); + http.delete.mockResolvedValue({ id: 'test' }); getSavedObjectCountsMock.mockReturnValue({ 'index-pattern': 0, diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx index 1762ccafe698e..c6c608e32c4dd 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx @@ -34,6 +34,7 @@ import { SavedObjectsExportResultDetails, getTagFindReferences, } from '../../lib'; + import { SavedObjectWithMetadata } from '../../types'; import { SavedObjectsManagementActionServiceStart, diff --git a/src/plugins/saved_objects_management/server/routes/delete.ts b/src/plugins/saved_objects_management/server/routes/delete.ts new file mode 100644 index 0000000000000..e2d5a1deb3f76 --- /dev/null +++ b/src/plugins/saved_objects_management/server/routes/delete.ts @@ -0,0 +1,35 @@ +/* + * 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 { schema } from '@kbn/config-schema'; +import { IRouter } from '@kbn/core/server'; +import { ISavedObjectsManagement } from '../services'; + +export const registerDeleteRoute = ( + router: IRouter, + managementServicePromise: Promise +) => { + router.delete( + { + path: '/api/kibana/management/saved_objects/_delete', + validate: { + body: schema.object({ + type: schema.string(), + id: schema.string(), + }), + }, + }, + router.handleLegacyErrors(async (context, req, res) => { + const { getClient } = (await context.core).savedObjects; + const { type, id } = req.body; + const client = getClient(); + await client.delete(type, id, { force: true }); + return res.ok({ body: { id } }); + }) + ); +}; From 3d1901d1e65ee20d6a9cfd6233dc97df4e8f6847 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 13 Jan 2023 15:44:03 +0100 Subject: [PATCH 02/33] STEP 2: Build a versionable type layer for your domain types AND your HTTP API endpoint interfaces --- .../saved_objects_management/common/index.ts | 13 ++ .../saved_objects_management/common/types.ts | 61 ------- .../common/types/index.ts | 33 ++++ .../common/types/types.ts | 44 +++++ .../common/types/v1.ts | 152 ++++++++++++++++++ 5 files changed, 242 insertions(+), 61 deletions(-) delete mode 100644 src/plugins/saved_objects_management/common/types.ts create mode 100644 src/plugins/saved_objects_management/common/types/index.ts create mode 100644 src/plugins/saved_objects_management/common/types/types.ts create mode 100644 src/plugins/saved_objects_management/common/types/v1.ts diff --git a/src/plugins/saved_objects_management/common/index.ts b/src/plugins/saved_objects_management/common/index.ts index bc4631d2c8e61..46b2b48e914f6 100644 --- a/src/plugins/saved_objects_management/common/index.ts +++ b/src/plugins/saved_objects_management/common/index.ts @@ -14,4 +14,17 @@ export type { SavedObjectInvalidRelation, SavedObjectGetRelationshipsResponse, SavedObjectManagementTypeInfo, + BulkGetHTTPBodyV1, + BulkGetHTTPResponseV1, + FindBodyHTTPV1, + FindResponseHTTPV1, + FindSearchOperatorHTTPV1, + FindSortOrderHTTPV1, + GetAllowedTypesResponseHTTPV1, + ReferenceHTTPV1, + RelationshipsParamsHTTPV1, + RelationshipsQueryHTTPV1, + RelationshipsResponseHTTPV1, + ScrollCountBodyHTTPV1, + ScrollCountResponseHTTPV1, } from './types'; diff --git a/src/plugins/saved_objects_management/common/types.ts b/src/plugins/saved_objects_management/common/types.ts deleted file mode 100644 index 957fec6a87e53..0000000000000 --- a/src/plugins/saved_objects_management/common/types.ts +++ /dev/null @@ -1,61 +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 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 type { SavedObject } from '@kbn/core/types'; -import type { SavedObjectsNamespaceType } from '@kbn/core/public'; - -/** - * The metadata injected into a {@link SavedObject | saved object} when returning - * {@link SavedObjectWithMetadata | enhanced objects} from the plugin API endpoints. - */ -export interface SavedObjectMetadata { - icon?: string; - title?: string; - editUrl?: string; - inAppUrl?: { path: string; uiCapabilitiesPath: string }; - namespaceType?: SavedObjectsNamespaceType; - hiddenType?: boolean; -} - -/** - * A {@link SavedObject | saved object} enhanced with meta properties used by the client-side plugin. - */ -export type SavedObjectWithMetadata = SavedObject & { - meta: SavedObjectMetadata; -}; - -export type SavedObjectRelationKind = 'child' | 'parent'; - -/** - * Represents a relation between two {@link SavedObject | saved object} - */ -export interface SavedObjectRelation { - id: string; - type: string; - relationship: SavedObjectRelationKind; - meta: SavedObjectMetadata; -} - -export interface SavedObjectInvalidRelation { - id: string; - type: string; - relationship: SavedObjectRelationKind; - error: string; -} - -export interface SavedObjectGetRelationshipsResponse { - relations: SavedObjectRelation[]; - invalidRelations: SavedObjectInvalidRelation[]; -} - -export interface SavedObjectManagementTypeInfo { - name: string; - namespaceType: SavedObjectsNamespaceType; - hidden: boolean; - displayName: string; -} diff --git a/src/plugins/saved_objects_management/common/types/index.ts b/src/plugins/saved_objects_management/common/types/index.ts new file mode 100644 index 0000000000000..788bab3d7fd23 --- /dev/null +++ b/src/plugins/saved_objects_management/common/types/index.ts @@ -0,0 +1,33 @@ +/* + * 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 type { + SavedObjectGetRelationshipsResponse, + SavedObjectInvalidRelation, + SavedObjectManagementTypeInfo, + SavedObjectMetadata, + SavedObjectRelation, + SavedObjectRelationKind, + SavedObjectWithMetadata, +} from './types'; + +export type { + BulkGetHTTPBodyV1, + BulkGetHTTPResponseV1, + FindBodyHTTPV1, + FindResponseHTTPV1, + FindSearchOperatorHTTPV1, + ReferenceHTTPV1, + FindSortOrderHTTPV1, + ScrollCountBodyHTTPV1, + RelationshipsQueryHTTPV1, + RelationshipsParamsHTTPV1, + ScrollCountResponseHTTPV1, + RelationshipsResponseHTTPV1, + GetAllowedTypesResponseHTTPV1, +} from './v1'; diff --git a/src/plugins/saved_objects_management/common/types/types.ts b/src/plugins/saved_objects_management/common/types/types.ts new file mode 100644 index 0000000000000..c4b25e292b95d --- /dev/null +++ b/src/plugins/saved_objects_management/common/types/types.ts @@ -0,0 +1,44 @@ +/* + * 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 type { SavedObject } from '@kbn/core/types'; + +import type { + SavedObjectGetRelationshipsResponseV1, + SavedObjectInvalidRelationV1, + SavedObjectManagementTypeInfoV1, + SavedObjectRelationV1, + SavedObjectRelationKindV1, + SavedObjectMetadataV1, +} from './v1'; + +/** + * The metadata injected into a {@link SavedObject | saved object} when returning + * {@link SavedObjectWithMetadata | enhanced objects} from the plugin API endpoints. + */ +export type SavedObjectMetadata = SavedObjectMetadataV1; + +/** + * A {@link SavedObject | saved object} enhanced with meta properties used by the client-side plugin. + */ +export type SavedObjectWithMetadata = SavedObject & { + meta: SavedObjectMetadata; +}; + +export type SavedObjectRelationKind = SavedObjectRelationKindV1; + +/** + * Represents a relation between two {@link SavedObject | saved object} + */ +export type SavedObjectRelation = SavedObjectRelationV1; +/** + * Represents a relation between two {@link SavedObject | saved object} + */ +export type SavedObjectInvalidRelation = SavedObjectInvalidRelationV1; +export type SavedObjectGetRelationshipsResponse = SavedObjectGetRelationshipsResponseV1; +export type SavedObjectManagementTypeInfo = SavedObjectManagementTypeInfoV1; diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts new file mode 100644 index 0000000000000..c0fd3e40e72bb --- /dev/null +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -0,0 +1,152 @@ +/* + * 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 type { SavedObject } from '@kbn/core/types'; +import type { SavedObjectsNamespaceType } from '@kbn/core/public'; +import type { SavedObjectsFindResponse } from '@kbn/core-saved-objects-api-server'; + +/** Domain interfaces */ + +/** + * The metadata injected into a {@link SavedObject | saved object} when returning + * {@link SavedObjectWithMetadata | enhanced objects} from the plugin API endpoints. + */ +export interface SavedObjectMetadataV1 { + icon?: string; + title?: string; + editUrl?: string; + inAppUrl?: { path: string; uiCapabilitiesPath: string }; + namespaceType?: SavedObjectsNamespaceType; + hiddenType?: boolean; +} + +/** + * A {@link SavedObject | saved object} enhanced with meta properties used by the client-side plugin. + */ +export type SavedObjectWithMetadata = SavedObject & { + meta: SavedObjectMetadataV1; +}; + +export type SavedObjectRelationKindV1 = 'child' | 'parent'; + +/** + * {@inheritdoc SavedObjectRelation} + */ +export interface SavedObjectRelationV1 { + id: string; + type: string; + relationship: SavedObjectRelationKindV1; + meta: SavedObjectMetadataV1; +} + +/** + * Represents a relation between two {@link SavedObject | saved object} + */ +export type SavedObjectRelation = SavedObjectRelationV1; + +/** + * {@inheritdoc SavedObjectInvalidRelation} + */ +export interface SavedObjectInvalidRelationV1 { + id: string; + type: string; + relationship: SavedObjectRelationKindV1; + error: string; +} + +/** + * Represents a relation between two {@link SavedObject | saved object} + */ +export type SavedObjectInvalidRelation = SavedObjectInvalidRelationV1; + +export type SavedObjectGetRelationshipsResponseV1 = RelationshipsResponseHTTPV1; + +export interface SavedObjectManagementTypeInfoV1 { + name: string; + // TODO: Fix. We should not directly expose these values to public code. + namespaceType: SavedObjectsNamespaceType; + hidden: boolean; + displayName: string; +} +export type SavedObjectManagementTypeInfo = SavedObjectManagementTypeInfoV1; + +/** HTTP API interfaces */ + +export type BulkGetHTTPBodyV1 = Array<{ + id: string; + type: string; +}>; + +/** + * We assume that the "SavedObject" interface is itself versioned and so safe to expose to public code. + * + * However, we can better control the output of this API if we used our own, domain-specific type. + */ +export type BulkGetHTTPResponseV1 = Array>; + +export type FindSearchOperatorHTTPV1 = 'AND' | 'OR'; +export type FindSortOrderHTTPV1 = 'asc' | 'desc'; + +export interface ReferenceHTTPV1 { + type: string; + id: string; +} + +export interface FindBodyHTTPV1 { + query: { + perPage: number; + page: number; + type: string | string[]; + // TODO: Fix. this API allows writing an arbitrary query that is passed straight to our persistence layer, thus leaking SO attributes to the public... + search?: string; + defaultSearchOperator: FindSearchOperatorHTTPV1; + // TODO: Fix. this API allows sorting by any field, thus leaking SO attributes to the public... + sortField: string; + sortOrder: FindSortOrderHTTPV1; + hasReference?: ReferenceHTTPV1 | ReferenceHTTPV1[]; + hasReferenceOperator: FindSearchOperatorHTTPV1; + fields: string | string[]; + }; +} + +/** + * TODO: Fix, we are directly expose server-only types to the client. This should + * be wrapped in something that can be versioned. + */ +export type FindResponseHTTPV1 = SavedObjectsFindResponse; + +export interface GetAllowedTypesResponseHTTPV1 { + types: SavedObjectManagementTypeInfoV1; +} + +export interface RelationshipsParamsHTTPV1 { + type: string; + id: string; +} + +export interface RelationshipsQueryHTTPV1 { + size: number; + savedObjectTypes: string | string[]; +} + +export interface RelationshipsResponseHTTPV1 { + relations: SavedObjectRelation[]; + invalidRelations: SavedObjectInvalidRelation[]; +} + +export interface ScrollCountBodyHTTPV1 { + typesToInclude: string[]; + // TODO: Fix. this API allows writing an arbitrary query that is passed straight to our persistence layer, thus leaking SO attributes to the public... + searchString?: string; + references?: Array<{ type: string; id: string }>; +} + +/** + * In this case "string" is a direct mapping from "typesToInlcude" in {@link ScrollCountBodyHTTPV1['typesToInclude']']} + */ +export type ScrollCountResponseHTTPV1 = Record; From 849971c0a89a0d9ddce2b01209ee21a861dcb349 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 13 Jan 2023 16:12:20 +0100 Subject: [PATCH 03/33] body type -> query type --- .../common/types/v1.ts | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index c0fd3e40e72bb..501470db8b08d 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -97,21 +97,19 @@ export interface ReferenceHTTPV1 { id: string; } -export interface FindBodyHTTPV1 { - query: { - perPage: number; - page: number; - type: string | string[]; - // TODO: Fix. this API allows writing an arbitrary query that is passed straight to our persistence layer, thus leaking SO attributes to the public... - search?: string; - defaultSearchOperator: FindSearchOperatorHTTPV1; - // TODO: Fix. this API allows sorting by any field, thus leaking SO attributes to the public... - sortField: string; - sortOrder: FindSortOrderHTTPV1; - hasReference?: ReferenceHTTPV1 | ReferenceHTTPV1[]; - hasReferenceOperator: FindSearchOperatorHTTPV1; - fields: string | string[]; - }; +export interface FindQueryHTTPV1 { + perPage: number; + page: number; + type: string | string[]; + // TODO: Fix. this API allows writing an arbitrary query that is passed straight to our persistence layer, thus leaking SO attributes to the public... + search?: string; + defaultSearchOperator: FindSearchOperatorHTTPV1; + // TODO: Fix. this API allows sorting by any field, thus leaking SO attributes to the public... + sortField: string; + sortOrder: FindSortOrderHTTPV1; + hasReference?: ReferenceHTTPV1 | ReferenceHTTPV1[]; + hasReferenceOperator: FindSearchOperatorHTTPV1; + fields: string | string[]; } /** From b2374bd38fefdf2238ef2780be81356b5ed26025 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 13 Jan 2023 16:51:41 +0100 Subject: [PATCH 04/33] update public code to use HTTP API interfaces --- .../public/lib/bulk_get_objects.ts | 8 ++++---- .../public/lib/find_objects.ts | 17 +++++------------ .../public/lib/get_allowed_types.ts | 12 +++++------- .../public/lib/get_relationships.ts | 6 +++--- .../public/lib/get_saved_object_counts.ts | 5 +++-- 5 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts index 370939d62e1d2..8c5598767d08a 100644 --- a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts @@ -7,13 +7,13 @@ */ import { HttpStart } from '@kbn/core/public'; -import { SavedObjectWithMetadata } from '../types'; +import { BulkGetHTTPBodyV1, BulkGetHTTPResponseV1 } from '../../common/types'; export async function bulkGetObjects( http: HttpStart, - objects: Array<{ type: string; id: string }> -): Promise { - return await http.post( + objects: BulkGetHTTPBodyV1 +): Promise { + return await http.post( `/api/kibana/management/saved_objects/_bulk_get`, { body: JSON.stringify(objects) } ); diff --git a/src/plugins/saved_objects_management/public/lib/find_objects.ts b/src/plugins/saved_objects_management/public/lib/find_objects.ts index aff66e0a08cc6..54a62d6181a1d 100644 --- a/src/plugins/saved_objects_management/public/lib/find_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/find_objects.ts @@ -6,21 +6,14 @@ * Side Public License, v 1. */ -import { HttpStart, SavedObjectsFindOptions } from '@kbn/core/public'; +import { HttpStart } from '@kbn/core/public'; import { keysToCamelCaseShallow } from './case_conversion'; -import { SavedObjectWithMetadata } from '../types'; - -interface SavedObjectsFindResponse { - total: number; - page: number; - perPage: number; - savedObjects: SavedObjectWithMetadata[]; -} +import { FindQueryHTTPV1, FindResponseHTTPV1 } from '../../common/types'; export async function findObjects( http: HttpStart, - findOptions: SavedObjectsFindOptions -): Promise { + findOptions: FindQueryHTTPV1 +): Promise { const response = await http.get>( '/api/kibana/management/saved_objects/_find', { @@ -33,5 +26,5 @@ export async function findObjects( } ); - return keysToCamelCaseShallow(response) as SavedObjectsFindResponse; + return keysToCamelCaseShallow(response) as FindResponseHTTPV1; } diff --git a/src/plugins/saved_objects_management/public/lib/get_allowed_types.ts b/src/plugins/saved_objects_management/public/lib/get_allowed_types.ts index 7e68dbc6be37d..3ca5bd01e5253 100644 --- a/src/plugins/saved_objects_management/public/lib/get_allowed_types.ts +++ b/src/plugins/saved_objects_management/public/lib/get_allowed_types.ts @@ -7,14 +7,12 @@ */ import type { HttpStart } from '@kbn/core/public'; -import type { SavedObjectManagementTypeInfo } from '../../common/types'; +import type { GetAllowedTypesResponseHTTPV1 } from '../../common/types'; -interface GetAllowedTypesResponse { - types: SavedObjectManagementTypeInfo[]; -} - -export async function getAllowedTypes(http: HttpStart): Promise { - const response = await http.get( +export async function getAllowedTypes( + http: HttpStart +): Promise { + const response = await http.get( '/api/kibana/management/saved_objects/_allowed_types' ); return response.types; diff --git a/src/plugins/saved_objects_management/public/lib/get_relationships.ts b/src/plugins/saved_objects_management/public/lib/get_relationships.ts index f0431144573d4..c7ca65dea1cb7 100644 --- a/src/plugins/saved_objects_management/public/lib/get_relationships.ts +++ b/src/plugins/saved_objects_management/public/lib/get_relationships.ts @@ -8,19 +8,19 @@ import { HttpStart } from '@kbn/core/public'; import { get } from 'lodash'; -import { SavedObjectGetRelationshipsResponse } from '../types'; +import type { RelationshipsResponseHTTPV1 } from '../../common/types'; export async function getRelationships( http: HttpStart, type: string, id: string, savedObjectTypes: string[] -): Promise { +): Promise { const url = `/api/kibana/management/saved_objects/relationships/${encodeURIComponent( type )}/${encodeURIComponent(id)}`; try { - return await http.get(url, { + return await http.get(url, { query: { savedObjectTypes, }, diff --git a/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts b/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts index 6d31d7085606a..a99dbdceca0ce 100644 --- a/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts +++ b/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts @@ -7,6 +7,7 @@ */ import { HttpStart, SavedObjectsFindOptionsReference } from '@kbn/core/public'; +import type { ScrollCountResponseHTTPV1 } from '../../common/types'; export async function getSavedObjectCounts({ http, @@ -18,8 +19,8 @@ export async function getSavedObjectCounts({ typesToInclude: string[]; searchString?: string; references?: SavedObjectsFindOptionsReference[]; -}): Promise> { - return await http.post>( +}): Promise { + return await http.post( `/api/kibana/management/saved_objects/scroll/counts`, { body: JSON.stringify({ typesToInclude, searchString, references }) } ); From adeb24eac499ff972006947c30b02bf860ad993f Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 13 Jan 2023 16:52:07 +0100 Subject: [PATCH 05/33] added delete route types --- .../saved_objects_management/common/index.ts | 2 +- .../saved_objects_management/common/types/index.ts | 4 +++- .../saved_objects_management/common/types/types.ts | 9 ++++----- .../saved_objects_management/common/types/v1.ts | 13 +++++++++++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/plugins/saved_objects_management/common/index.ts b/src/plugins/saved_objects_management/common/index.ts index 46b2b48e914f6..0e070cd13111a 100644 --- a/src/plugins/saved_objects_management/common/index.ts +++ b/src/plugins/saved_objects_management/common/index.ts @@ -16,7 +16,7 @@ export type { SavedObjectManagementTypeInfo, BulkGetHTTPBodyV1, BulkGetHTTPResponseV1, - FindBodyHTTPV1, + FindQueryHTTPV1, FindResponseHTTPV1, FindSearchOperatorHTTPV1, FindSortOrderHTTPV1, diff --git a/src/plugins/saved_objects_management/common/types/index.ts b/src/plugins/saved_objects_management/common/types/index.ts index 788bab3d7fd23..dfc07b6196851 100644 --- a/src/plugins/saved_objects_management/common/types/index.ts +++ b/src/plugins/saved_objects_management/common/types/index.ts @@ -19,7 +19,7 @@ export type { export type { BulkGetHTTPBodyV1, BulkGetHTTPResponseV1, - FindBodyHTTPV1, + FindQueryHTTPV1, FindResponseHTTPV1, FindSearchOperatorHTTPV1, ReferenceHTTPV1, @@ -30,4 +30,6 @@ export type { ScrollCountResponseHTTPV1, RelationshipsResponseHTTPV1, GetAllowedTypesResponseHTTPV1, + DeleteObjectBodyHTTPV1, + DeleteObjectResponseHTTPV1, } from './v1'; diff --git a/src/plugins/saved_objects_management/common/types/types.ts b/src/plugins/saved_objects_management/common/types/types.ts index c4b25e292b95d..68e470bb29560 100644 --- a/src/plugins/saved_objects_management/common/types/types.ts +++ b/src/plugins/saved_objects_management/common/types/types.ts @@ -6,8 +6,6 @@ * Side Public License, v 1. */ -import type { SavedObject } from '@kbn/core/types'; - import type { SavedObjectGetRelationshipsResponseV1, SavedObjectInvalidRelationV1, @@ -15,6 +13,7 @@ import type { SavedObjectRelationV1, SavedObjectRelationKindV1, SavedObjectMetadataV1, + SavedObjectWithMetadataV1, } from './v1'; /** @@ -25,10 +24,10 @@ export type SavedObjectMetadata = SavedObjectMetadataV1; /** * A {@link SavedObject | saved object} enhanced with meta properties used by the client-side plugin. + * + * Directly using "SavedObject" interface. Assume that this is versionable interface. */ -export type SavedObjectWithMetadata = SavedObject & { - meta: SavedObjectMetadata; -}; +export type SavedObjectWithMetadata = SavedObjectWithMetadataV1; export type SavedObjectRelationKind = SavedObjectRelationKindV1; diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index 501470db8b08d..2fe8f2f0a23eb 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -28,7 +28,7 @@ export interface SavedObjectMetadataV1 { /** * A {@link SavedObject | saved object} enhanced with meta properties used by the client-side plugin. */ -export type SavedObjectWithMetadata = SavedObject & { +export type SavedObjectWithMetadataV1 = SavedObject & { meta: SavedObjectMetadataV1; }; @@ -87,7 +87,7 @@ export type BulkGetHTTPBodyV1 = Array<{ * * However, we can better control the output of this API if we used our own, domain-specific type. */ -export type BulkGetHTTPResponseV1 = Array>; +export type BulkGetHTTPResponseV1 = SavedObjectWithMetadataV1[]; export type FindSearchOperatorHTTPV1 = 'AND' | 'OR'; export type FindSortOrderHTTPV1 = 'asc' | 'desc'; @@ -144,6 +144,15 @@ export interface ScrollCountBodyHTTPV1 { references?: Array<{ type: string; id: string }>; } +export interface DeleteObjectBodyHTTPV1 { + id: string; + type: string; +} + +export interface DeleteObjectResponseHTTPV1 { + id: string; +} + /** * In this case "string" is a direct mapping from "typesToInlcude" in {@link ScrollCountBodyHTTPV1['typesToInclude']']} */ From cf775570fa9320b11947cbde527e3e8eb6dfc99d Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 13 Jan 2023 16:59:21 +0100 Subject: [PATCH 06/33] actually register the delete route --- src/plugins/saved_objects_management/server/routes/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/saved_objects_management/server/routes/index.ts b/src/plugins/saved_objects_management/server/routes/index.ts index 019cc4cc26db0..63f4b2f501036 100644 --- a/src/plugins/saved_objects_management/server/routes/index.ts +++ b/src/plugins/saved_objects_management/server/routes/index.ts @@ -11,6 +11,7 @@ import { ISavedObjectsManagement } from '../services'; import { registerFindRoute } from './find'; import { registerBulkDeleteRoute } from './bulk_delete'; import { registerBulkGetRoute } from './bulk_get'; +import { registerDeleteRoute } from './delete'; import { registerScrollForCountRoute } from './scroll_count'; import { registerRelationshipsRoute } from './relationships'; import { registerGetAllowedTypesRoute } from './get_allowed_types'; @@ -25,6 +26,7 @@ export function registerRoutes({ http, managementServicePromise }: RegisterRoute registerFindRoute(router, managementServicePromise); registerBulkDeleteRoute(router); registerBulkGetRoute(router, managementServicePromise); + registerDeleteRoute(router, managementServicePromise); registerScrollForCountRoute(router); registerRelationshipsRoute(router, managementServicePromise); registerGetAllowedTypesRoute(router); From 935ad21662acacf46dd87214eabd931c0233d019 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 26 Jan 2023 15:39:51 +0100 Subject: [PATCH 07/33] remove unused route --- .../public/lib/index.ts | 1 - .../server/routes/delete.ts | 35 ------------------- .../server/routes/index.ts | 2 -- 3 files changed, 38 deletions(-) delete mode 100644 src/plugins/saved_objects_management/server/routes/delete.ts diff --git a/src/plugins/saved_objects_management/public/lib/index.ts b/src/plugins/saved_objects_management/public/lib/index.ts index c4eb74267759a..1833e4e75f327 100644 --- a/src/plugins/saved_objects_management/public/lib/index.ts +++ b/src/plugins/saved_objects_management/public/lib/index.ts @@ -20,7 +20,6 @@ export { getDefaultTitle } from './get_default_title'; export { findObjects } from './find_objects'; export { bulkDeleteObjects } from './bulk_delete_objects'; export { bulkGetObjects } from './bulk_get_objects'; -export { deleteObject } from './delete'; export type { SavedObjectsExportResultDetails } from './extract_export_details'; export { extractExportDetails } from './extract_export_details'; export { getAllowedTypes } from './get_allowed_types'; diff --git a/src/plugins/saved_objects_management/server/routes/delete.ts b/src/plugins/saved_objects_management/server/routes/delete.ts deleted file mode 100644 index e2d5a1deb3f76..0000000000000 --- a/src/plugins/saved_objects_management/server/routes/delete.ts +++ /dev/null @@ -1,35 +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 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 { schema } from '@kbn/config-schema'; -import { IRouter } from '@kbn/core/server'; -import { ISavedObjectsManagement } from '../services'; - -export const registerDeleteRoute = ( - router: IRouter, - managementServicePromise: Promise -) => { - router.delete( - { - path: '/api/kibana/management/saved_objects/_delete', - validate: { - body: schema.object({ - type: schema.string(), - id: schema.string(), - }), - }, - }, - router.handleLegacyErrors(async (context, req, res) => { - const { getClient } = (await context.core).savedObjects; - const { type, id } = req.body; - const client = getClient(); - await client.delete(type, id, { force: true }); - return res.ok({ body: { id } }); - }) - ); -}; diff --git a/src/plugins/saved_objects_management/server/routes/index.ts b/src/plugins/saved_objects_management/server/routes/index.ts index 63f4b2f501036..019cc4cc26db0 100644 --- a/src/plugins/saved_objects_management/server/routes/index.ts +++ b/src/plugins/saved_objects_management/server/routes/index.ts @@ -11,7 +11,6 @@ import { ISavedObjectsManagement } from '../services'; import { registerFindRoute } from './find'; import { registerBulkDeleteRoute } from './bulk_delete'; import { registerBulkGetRoute } from './bulk_get'; -import { registerDeleteRoute } from './delete'; import { registerScrollForCountRoute } from './scroll_count'; import { registerRelationshipsRoute } from './relationships'; import { registerGetAllowedTypesRoute } from './get_allowed_types'; @@ -26,7 +25,6 @@ export function registerRoutes({ http, managementServicePromise }: RegisterRoute registerFindRoute(router, managementServicePromise); registerBulkDeleteRoute(router); registerBulkGetRoute(router, managementServicePromise); - registerDeleteRoute(router, managementServicePromise); registerScrollForCountRoute(router); registerRelationshipsRoute(router, managementServicePromise); registerGetAllowedTypesRoute(router); From 225ec1da98297449f1fb07c68762777c0bc5dc52 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 26 Jan 2023 15:45:53 +0100 Subject: [PATCH 08/33] fix usage of bulk response v1 --- .../public/lib/bulk_get_objects.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts index 8c5598767d08a..70ce097337aaa 100644 --- a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts @@ -12,9 +12,8 @@ import { BulkGetHTTPBodyV1, BulkGetHTTPResponseV1 } from '../../common/types'; export async function bulkGetObjects( http: HttpStart, objects: BulkGetHTTPBodyV1 -): Promise { - return await http.post( - `/api/kibana/management/saved_objects/_bulk_get`, - { body: JSON.stringify(objects) } - ); +): Promise { + return await http.post(`/api/kibana/management/saved_objects/_bulk_get`, { + body: JSON.stringify(objects), + }); } From 04fe02d8a00df7683700461bf3e0e5bacdf1be12 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 26 Jan 2023 15:55:02 +0100 Subject: [PATCH 09/33] update find related types --- .../common/types/v1.ts | 24 +++++++++---------- .../server/routes/find.ts | 14 ++++++----- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index 2fe8f2f0a23eb..9ab0cb569619b 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -8,7 +8,6 @@ import type { SavedObject } from '@kbn/core/types'; import type { SavedObjectsNamespaceType } from '@kbn/core/public'; -import type { SavedObjectsFindResponse } from '@kbn/core-saved-objects-api-server'; /** Domain interfaces */ @@ -98,25 +97,24 @@ export interface ReferenceHTTPV1 { } export interface FindQueryHTTPV1 { - perPage: number; - page: number; + perPage?: number; + page?: number; type: string | string[]; // TODO: Fix. this API allows writing an arbitrary query that is passed straight to our persistence layer, thus leaking SO attributes to the public... search?: string; - defaultSearchOperator: FindSearchOperatorHTTPV1; + defaultSearchOperator?: FindSearchOperatorHTTPV1; // TODO: Fix. this API allows sorting by any field, thus leaking SO attributes to the public... - sortField: string; - sortOrder: FindSortOrderHTTPV1; + sortField?: string; + sortOrder?: FindSortOrderHTTPV1; hasReference?: ReferenceHTTPV1 | ReferenceHTTPV1[]; - hasReferenceOperator: FindSearchOperatorHTTPV1; - fields: string | string[]; + hasReferenceOperator?: FindSearchOperatorHTTPV1; + fields?: string | string[]; } -/** - * TODO: Fix, we are directly expose server-only types to the client. This should - * be wrapped in something that can be versioned. - */ -export type FindResponseHTTPV1 = SavedObjectsFindResponse; +export interface FindResponseHTTPV1 { + savedObjects: SavedObjectWithMetadataV1[]; + total: number; +} export interface GetAllowedTypesResponseHTTPV1 { types: SavedObjectManagementTypeInfoV1; diff --git a/src/plugins/saved_objects_management/server/routes/find.ts b/src/plugins/saved_objects_management/server/routes/find.ts index 7b9e8b7c0ddc1..1698cb854c13e 100644 --- a/src/plugins/saved_objects_management/server/routes/find.ts +++ b/src/plugins/saved_objects_management/server/routes/find.ts @@ -8,6 +8,8 @@ import { schema } from '@kbn/config-schema'; import { IRouter } from '@kbn/core/server'; + +import type { FindResponseHTTPV1 } from '../../common'; import { injectMetaAttributes } from '../lib'; import { ISavedObjectsManagement } from '../services'; @@ -87,12 +89,12 @@ export const registerFindRoute = ( return result; }); - return res.ok({ - body: { - ...findResponse, - saved_objects: enhancedSavedObjects, - }, - }); + const response: FindResponseHTTPV1 = { + savedObjects: enhancedSavedObjects, + total: findResponse.total, + }; + + return res.ok({ body: response }); }) ); }; From 0782ba853dea36375ea5e7a64c2b943ccba0d9c6 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 26 Jan 2023 16:22:24 +0100 Subject: [PATCH 10/33] remove dependence on public SavedObject type --- .../saved_objects_management/common/types/v1.ts | 16 ++++++++++++---- .../server/routes/relationships.ts | 3 ++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index 9ab0cb569619b..bfb55d831a659 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { SavedObject } from '@kbn/core/types'; +import type { SavedObjectError } from '@kbn/core/types'; import type { SavedObjectsNamespaceType } from '@kbn/core/public'; /** Domain interfaces */ @@ -25,11 +25,19 @@ export interface SavedObjectMetadataV1 { } /** - * A {@link SavedObject | saved object} enhanced with meta properties used by the client-side plugin. + * A saved object. + * + * @note This is intended as a domain-specific representation of a SavedObject + * which is intended for server-side only use. */ -export type SavedObjectWithMetadataV1 = SavedObject & { +export interface SavedObjectWithMetadataV1 { + id: string; + type: string; meta: SavedObjectMetadataV1; -}; + error?: SavedObjectError; + updated_at: string; + attributes: T; +} export type SavedObjectRelationKindV1 = 'child' | 'parent'; diff --git a/src/plugins/saved_objects_management/server/routes/relationships.ts b/src/plugins/saved_objects_management/server/routes/relationships.ts index 8900987a645fe..a829366f74859 100644 --- a/src/plugins/saved_objects_management/server/routes/relationships.ts +++ b/src/plugins/saved_objects_management/server/routes/relationships.ts @@ -11,6 +11,7 @@ import { IRouter } from '@kbn/core/server'; import { chain } from 'lodash'; import { findRelationships } from '../lib'; import { ISavedObjectsManagement } from '../services'; +import type { RelationshipsResponseHTTPV1 } from '../../common'; export const registerRelationshipsRoute = ( router: IRouter, @@ -48,7 +49,7 @@ export const registerRelationshipsRoute = ( const client = getClient({ includedHiddenTypes }); - const findRelationsResponse = await findRelationships({ + const findRelationsResponse: RelationshipsResponseHTTPV1 = await findRelationships({ type, id, client, From 7ffd75ac9fec34b540619592322823c8ca2db4ab Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 26 Jan 2023 16:29:40 +0100 Subject: [PATCH 11/33] added versioned types for bulk delete body and response --- .../saved_objects_management/common/index.ts | 2 ++ .../common/types/index.ts | 2 ++ .../common/types/v1.ts | 21 ++++++++++++++----- .../public/lib/bulk_delete_objects.ts | 15 ++++--------- .../server/routes/bulk_delete.ts | 4 +++- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/plugins/saved_objects_management/common/index.ts b/src/plugins/saved_objects_management/common/index.ts index 0e070cd13111a..d4165d53321aa 100644 --- a/src/plugins/saved_objects_management/common/index.ts +++ b/src/plugins/saved_objects_management/common/index.ts @@ -16,6 +16,8 @@ export type { SavedObjectManagementTypeInfo, BulkGetHTTPBodyV1, BulkGetHTTPResponseV1, + BulkDeleteHTTPBodyV1, + BulkDeleteHTTPResponseV1, FindQueryHTTPV1, FindResponseHTTPV1, FindSearchOperatorHTTPV1, diff --git a/src/plugins/saved_objects_management/common/types/index.ts b/src/plugins/saved_objects_management/common/types/index.ts index dfc07b6196851..215c1e3b2140f 100644 --- a/src/plugins/saved_objects_management/common/types/index.ts +++ b/src/plugins/saved_objects_management/common/types/index.ts @@ -19,6 +19,8 @@ export type { export type { BulkGetHTTPBodyV1, BulkGetHTTPResponseV1, + BulkDeleteHTTPBodyV1, + BulkDeleteHTTPResponseV1, FindQueryHTTPV1, FindResponseHTTPV1, FindSearchOperatorHTTPV1, diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index bfb55d831a659..a34e545e8e1dd 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -89,13 +89,24 @@ export type BulkGetHTTPBodyV1 = Array<{ type: string; }>; -/** - * We assume that the "SavedObject" interface is itself versioned and so safe to expose to public code. - * - * However, we can better control the output of this API if we used our own, domain-specific type. - */ export type BulkGetHTTPResponseV1 = SavedObjectWithMetadataV1[]; +export type BulkDeleteHTTPBodyV1 = Array<{ + type: string; + id: string; +}>; + +export type BulkDeleteHTTPResponseV1 = Array<{ + /** The ID of the saved object */ + id: string; + /** The type of the saved object */ + type: string; + /** The status of deleting the object: true for deleted, false for error */ + success: boolean; + /** Reason the object could not be deleted (success is false) */ + error?: SavedObjectError; +}>; + export type FindSearchOperatorHTTPV1 = 'AND' | 'OR'; export type FindSortOrderHTTPV1 = 'asc' | 'desc'; diff --git a/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts b/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts index 30a02f8fa42aa..342c8c6e676f8 100644 --- a/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts @@ -7,20 +7,13 @@ */ import { HttpStart } from '@kbn/core/public'; -import { SavedObjectError, SavedObjectTypeIdTuple } from '@kbn/core-saved-objects-common'; - -interface SavedObjectDeleteStatus { - id: string; - success: boolean; - type: string; - error?: SavedObjectError; -} +import { BulkDeleteHTTPBodyV1, BulkDeleteHTTPResponseV1 } from '../../common'; export function bulkDeleteObjects( http: HttpStart, - objects: SavedObjectTypeIdTuple[] -): Promise { - return http.post( + objects: BulkDeleteHTTPBodyV1 +): Promise { + return http.post( '/internal/kibana/management/saved_objects/_bulk_delete', { body: JSON.stringify(objects), diff --git a/src/plugins/saved_objects_management/server/routes/bulk_delete.ts b/src/plugins/saved_objects_management/server/routes/bulk_delete.ts index e3f4db044ef2f..9865e6fc90464 100644 --- a/src/plugins/saved_objects_management/server/routes/bulk_delete.ts +++ b/src/plugins/saved_objects_management/server/routes/bulk_delete.ts @@ -8,6 +8,7 @@ import { schema } from '@kbn/config-schema'; import { IRouter } from '@kbn/core/server'; +import type { BulkDeleteHTTPResponseV1 } from '../../common'; export const registerBulkDeleteRoute = (router: IRouter) => { router.post( @@ -29,7 +30,8 @@ export const registerBulkDeleteRoute = (router: IRouter) => { const client = getClient(); const response = await client.bulkDelete(objects, { force: true }); - return res.ok({ body: response.statuses }); + const body: BulkDeleteHTTPResponseV1 = response.statuses; + return res.ok({ body }); }) ); }; From c35b10436609f8a09904de7966e20a8f06f44f1d Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 26 Jan 2023 16:33:02 +0100 Subject: [PATCH 12/33] use bulk response type server side --- .../saved_objects_management/server/routes/bulk_get.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/saved_objects_management/server/routes/bulk_get.ts b/src/plugins/saved_objects_management/server/routes/bulk_get.ts index 9e31b1c24b0b8..444d294164f43 100644 --- a/src/plugins/saved_objects_management/server/routes/bulk_get.ts +++ b/src/plugins/saved_objects_management/server/routes/bulk_get.ts @@ -10,6 +10,7 @@ import { schema } from '@kbn/config-schema'; import { IRouter } from '@kbn/core/server'; import { injectMetaAttributes } from '../lib'; import { ISavedObjectsManagement } from '../services'; +import type { BulkGetHTTPResponseV1 } from '../../common'; export const registerBulkGetRoute = ( router: IRouter, @@ -39,14 +40,15 @@ export const registerBulkGetRoute = ( const client = getClient({ includedHiddenTypes }); const response = await client.bulkGet(objects); - const enhancedObjects = response.saved_objects.map((obj) => { + + const body = response.saved_objects.map((obj) => { if (!obj.error) { return injectMetaAttributes(obj, managementService); } return obj; - }); + }) as BulkGetHTTPResponseV1; - return res.ok({ body: enhancedObjects }); + return res.ok({ body }); }) ); }; From 969507f4b453b3512f0ca981e4e35a802f11509d Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 26 Jan 2023 16:35:01 +0100 Subject: [PATCH 13/33] type the scroll body response --- .../saved_objects_management/server/routes/scroll_count.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/plugins/saved_objects_management/server/routes/scroll_count.ts b/src/plugins/saved_objects_management/server/routes/scroll_count.ts index 26dd1d57b4cf9..cebd380319662 100644 --- a/src/plugins/saved_objects_management/server/routes/scroll_count.ts +++ b/src/plugins/saved_objects_management/server/routes/scroll_count.ts @@ -9,6 +9,7 @@ import { schema } from '@kbn/config-schema'; import { IRouter, SavedObjectsCreatePointInTimeFinderOptions } from '@kbn/core/server'; import { chain } from 'lodash'; +import type { ScrollCountResponseHTTPV1 } from '../../common'; import { findAll } from '../lib'; export const registerScrollForCountRoute = (router: IRouter) => { @@ -70,8 +71,10 @@ export const registerScrollForCountRoute = (router: IRouter) => { } } + const body: ScrollCountResponseHTTPV1 = counts; + return res.ok({ - body: counts, + body, }); }) ); From 8806c50e264d5d37dc8b40a6aafe2593ac05a8df Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 26 Jan 2023 16:36:14 +0100 Subject: [PATCH 14/33] use the TS type keyword where appropriate in server routes --- .../saved_objects_management/server/routes/bulk_get.ts | 4 ++-- src/plugins/saved_objects_management/server/routes/find.ts | 4 ++-- .../server/routes/get_allowed_types.ts | 4 ++-- .../saved_objects_management/server/routes/relationships.ts | 4 ++-- .../saved_objects_management/server/routes/scroll_count.ts | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/plugins/saved_objects_management/server/routes/bulk_get.ts b/src/plugins/saved_objects_management/server/routes/bulk_get.ts index 444d294164f43..d5a6b97394cd7 100644 --- a/src/plugins/saved_objects_management/server/routes/bulk_get.ts +++ b/src/plugins/saved_objects_management/server/routes/bulk_get.ts @@ -7,9 +7,9 @@ */ import { schema } from '@kbn/config-schema'; -import { IRouter } from '@kbn/core/server'; +import type { IRouter } from '@kbn/core/server'; import { injectMetaAttributes } from '../lib'; -import { ISavedObjectsManagement } from '../services'; +import type { ISavedObjectsManagement } from '../services'; import type { BulkGetHTTPResponseV1 } from '../../common'; export const registerBulkGetRoute = ( diff --git a/src/plugins/saved_objects_management/server/routes/find.ts b/src/plugins/saved_objects_management/server/routes/find.ts index 1698cb854c13e..27740c69820a9 100644 --- a/src/plugins/saved_objects_management/server/routes/find.ts +++ b/src/plugins/saved_objects_management/server/routes/find.ts @@ -7,11 +7,11 @@ */ import { schema } from '@kbn/config-schema'; -import { IRouter } from '@kbn/core/server'; +import type { IRouter } from '@kbn/core/server'; import type { FindResponseHTTPV1 } from '../../common'; import { injectMetaAttributes } from '../lib'; -import { ISavedObjectsManagement } from '../services'; +import type { ISavedObjectsManagement } from '../services'; export const registerFindRoute = ( router: IRouter, diff --git a/src/plugins/saved_objects_management/server/routes/get_allowed_types.ts b/src/plugins/saved_objects_management/server/routes/get_allowed_types.ts index cdd6dc215d69b..3a6b0e5809d13 100644 --- a/src/plugins/saved_objects_management/server/routes/get_allowed_types.ts +++ b/src/plugins/saved_objects_management/server/routes/get_allowed_types.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import { IRouter, SavedObjectsType } from '@kbn/core/server'; -import { SavedObjectManagementTypeInfo } from '../../common'; +import type { IRouter, SavedObjectsType } from '@kbn/core/server'; +import type { SavedObjectManagementTypeInfo } from '../../common'; const convertType = (sot: SavedObjectsType): SavedObjectManagementTypeInfo => { return { diff --git a/src/plugins/saved_objects_management/server/routes/relationships.ts b/src/plugins/saved_objects_management/server/routes/relationships.ts index a829366f74859..b6746cd19ee70 100644 --- a/src/plugins/saved_objects_management/server/routes/relationships.ts +++ b/src/plugins/saved_objects_management/server/routes/relationships.ts @@ -7,10 +7,10 @@ */ import { schema } from '@kbn/config-schema'; -import { IRouter } from '@kbn/core/server'; +import type { IRouter } from '@kbn/core/server'; import { chain } from 'lodash'; import { findRelationships } from '../lib'; -import { ISavedObjectsManagement } from '../services'; +import type { ISavedObjectsManagement } from '../services'; import type { RelationshipsResponseHTTPV1 } from '../../common'; export const registerRelationshipsRoute = ( diff --git a/src/plugins/saved_objects_management/server/routes/scroll_count.ts b/src/plugins/saved_objects_management/server/routes/scroll_count.ts index cebd380319662..930e1f9af33a4 100644 --- a/src/plugins/saved_objects_management/server/routes/scroll_count.ts +++ b/src/plugins/saved_objects_management/server/routes/scroll_count.ts @@ -7,7 +7,7 @@ */ import { schema } from '@kbn/config-schema'; -import { IRouter, SavedObjectsCreatePointInTimeFinderOptions } from '@kbn/core/server'; +import type { IRouter, SavedObjectsCreatePointInTimeFinderOptions } from '@kbn/core/server'; import { chain } from 'lodash'; import type { ScrollCountResponseHTTPV1 } from '../../common'; import { findAll } from '../lib'; From bff8a0f5a06247a2fc9a86a0aebb5874c1a46884 Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 26 Jan 2023 15:42:44 +0000 Subject: [PATCH 15/33] [CI] Auto-commit changed files from 'node scripts/lint_ts_projects --fix' --- src/plugins/saved_objects_management/tsconfig.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/saved_objects_management/tsconfig.json b/src/plugins/saved_objects_management/tsconfig.json index 98dcb8c303170..0ed7eee5b2036 100644 --- a/src/plugins/saved_objects_management/tsconfig.json +++ b/src/plugins/saved_objects_management/tsconfig.json @@ -22,7 +22,6 @@ "@kbn/i18n-react", "@kbn/test-jest-helpers", "@kbn/core-saved-objects-api-server", - "@kbn/core-saved-objects-common", "@kbn/monaco", "@kbn/config-schema", "@kbn/core-custom-branding-browser-mocks", From ba2df2e1193a1c097d18b5d074b7956750941452 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 27 Jan 2023 11:03:37 +0100 Subject: [PATCH 16/33] Find API: savedObjects -> saved_objects --- src/plugins/saved_objects_management/common/types/v1.ts | 2 +- .../management_section/objects_table/saved_objects_table.tsx | 2 +- src/plugins/saved_objects_management/server/routes/find.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index a34e545e8e1dd..7991a40e7983b 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -131,7 +131,7 @@ export interface FindQueryHTTPV1 { } export interface FindResponseHTTPV1 { - savedObjects: SavedObjectWithMetadataV1[]; + saved_objects: SavedObjectWithMetadataV1[]; total: number; } diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx index c6c608e32c4dd..9f6bf01f46cad 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx @@ -258,7 +258,7 @@ export class SavedObjectsTable extends Component Date: Fri, 27 Jan 2023 11:47:16 +0100 Subject: [PATCH 17/33] fix another deprecated import and update the domain-specific types --- .../common/types/v1.ts | 20 +++++++++++++++---- .../visible_in_management.ts | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index 7991a40e7983b..abe6e656bf08e 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -12,8 +12,8 @@ import type { SavedObjectsNamespaceType } from '@kbn/core/public'; /** Domain interfaces */ /** - * The metadata injected into a {@link SavedObject | saved object} when returning - * {@link SavedObjectWithMetadata | enhanced objects} from the plugin API endpoints. + * Saved Object Management metadata associated with a saved object. See + * {@link SavedObjectWithMetadataV1}. */ export interface SavedObjectMetadataV1 { icon?: string; @@ -24,6 +24,15 @@ export interface SavedObjectMetadataV1 { hiddenType?: boolean; } +/** + * One saved object's reference to another saved object. + */ +export interface SavedObjectReferenceV1 { + name: string; + type: string; + id: string; +} + /** * A saved object. * @@ -35,8 +44,11 @@ export interface SavedObjectWithMetadataV1 { type: string; meta: SavedObjectMetadataV1; error?: SavedObjectError; - updated_at: string; + created_at?: string; + updated_at?: string; attributes: T; + namespaces?: string[]; + references: SavedObjectReferenceV1[]; } export type SavedObjectRelationKindV1 = 'child' | 'parent'; @@ -136,7 +148,7 @@ export interface FindResponseHTTPV1 { } export interface GetAllowedTypesResponseHTTPV1 { - types: SavedObjectManagementTypeInfoV1; + types: SavedObjectManagementTypeInfoV1[]; } export interface RelationshipsParamsHTTPV1 { diff --git a/test/plugin_functional/test_suites/saved_objects_management/visible_in_management.ts b/test/plugin_functional/test_suites/saved_objects_management/visible_in_management.ts index 9e154ddde153c..c4cbd575dc064 100644 --- a/test/plugin_functional/test_suites/saved_objects_management/visible_in_management.ts +++ b/test/plugin_functional/test_suites/saved_objects_management/visible_in_management.ts @@ -9,7 +9,7 @@ import { join } from 'path'; import expect from '@kbn/expect'; import type { Response } from 'supertest'; -import { SavedObject } from '@kbn/core/types'; +import { SavedObject } from '@kbn/core/server'; import type { SavedObjectManagementTypeInfo } from '@kbn/saved-objects-management-plugin/common/types'; import type { PluginFunctionalProviderContext } from '../../services'; From 05c586ed70e66f7e89933ea543df007d3a624a85 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 27 Jan 2023 12:12:00 +0100 Subject: [PATCH 18/33] only send the necessary values over the wire --- .../common/types/v1.ts | 1 + .../server/lib/index.ts | 1 + .../server/lib/to_saved_object_with_meta.ts | 24 +++++++++++++++++++ .../server/routes/bulk_get.ts | 11 +++++---- .../server/routes/find.ts | 17 +++++++------ 5 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 src/plugins/saved_objects_management/server/lib/to_saved_object_with_meta.ts diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index abe6e656bf08e..495964aadc62a 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -139,6 +139,7 @@ export interface FindQueryHTTPV1 { sortOrder?: FindSortOrderHTTPV1; hasReference?: ReferenceHTTPV1 | ReferenceHTTPV1[]; hasReferenceOperator?: FindSearchOperatorHTTPV1; + // TODO: Fix. This exposes attribute schemas to clients. fields?: string | string[]; } diff --git a/src/plugins/saved_objects_management/server/lib/index.ts b/src/plugins/saved_objects_management/server/lib/index.ts index cfb5a124bea59..9ee181246075c 100644 --- a/src/plugins/saved_objects_management/server/lib/index.ts +++ b/src/plugins/saved_objects_management/server/lib/index.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +export { toSavedObjectWithMeta } from './to_saved_object_with_meta'; export { injectMetaAttributes } from './inject_meta_attributes'; export { findAll } from './find_all'; export { findRelationships } from './find_relationships'; diff --git a/src/plugins/saved_objects_management/server/lib/to_saved_object_with_meta.ts b/src/plugins/saved_objects_management/server/lib/to_saved_object_with_meta.ts new file mode 100644 index 0000000000000..be8fc38dbeda7 --- /dev/null +++ b/src/plugins/saved_objects_management/server/lib/to_saved_object_with_meta.ts @@ -0,0 +1,24 @@ +/* + * 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 { SavedObject } from '@kbn/core/server'; +import { SavedObjectWithMetadataV1 } from '../../common/types/v1'; + +export function toSavedObjectWithMeta(so: SavedObject): SavedObjectWithMetadataV1 { + return { + id: so.id, + type: so.type, + namespaces: so.namespaces, + references: so.references, + updated_at: so.updated_at, + attributes: so.attributes, + created_at: so.created_at, + error: so.error, + meta: {}, + }; +} diff --git a/src/plugins/saved_objects_management/server/routes/bulk_get.ts b/src/plugins/saved_objects_management/server/routes/bulk_get.ts index d5a6b97394cd7..bffb0d2228078 100644 --- a/src/plugins/saved_objects_management/server/routes/bulk_get.ts +++ b/src/plugins/saved_objects_management/server/routes/bulk_get.ts @@ -8,7 +8,7 @@ import { schema } from '@kbn/config-schema'; import type { IRouter } from '@kbn/core/server'; -import { injectMetaAttributes } from '../lib'; +import { injectMetaAttributes, toSavedObjectWithMeta } from '../lib'; import type { ISavedObjectsManagement } from '../services'; import type { BulkGetHTTPResponseV1 } from '../../common'; @@ -41,12 +41,13 @@ export const registerBulkGetRoute = ( const client = getClient({ includedHiddenTypes }); const response = await client.bulkGet(objects); - const body = response.saved_objects.map((obj) => { - if (!obj.error) { + const body: BulkGetHTTPResponseV1 = response.saved_objects.map((obj) => { + const so = toSavedObjectWithMeta(obj); + if (!so.error) { return injectMetaAttributes(obj, managementService); } - return obj; - }) as BulkGetHTTPResponseV1; + return so; + }); return res.ok({ body }); }) diff --git a/src/plugins/saved_objects_management/server/routes/find.ts b/src/plugins/saved_objects_management/server/routes/find.ts index a133f092b2cb9..741639956f063 100644 --- a/src/plugins/saved_objects_management/server/routes/find.ts +++ b/src/plugins/saved_objects_management/server/routes/find.ts @@ -10,7 +10,7 @@ import { schema } from '@kbn/config-schema'; import type { IRouter } from '@kbn/core/server'; import type { FindResponseHTTPV1 } from '../../common'; -import { injectMetaAttributes } from '../lib'; +import { injectMetaAttributes, toSavedObjectWithMeta } from '../lib'; import type { ISavedObjectsManagement } from '../services'; export const registerFindRoute = ( @@ -79,18 +79,17 @@ export const registerFindRoute = ( searchFields: [...searchFields], }); - const enhancedSavedObjects = findResponse.saved_objects - .map((so) => injectMetaAttributes(so, managementService)) - .map((obj) => { + const savedObjects = findResponse.saved_objects.map(toSavedObjectWithMeta); + + const response: FindResponseHTTPV1 = { + saved_objects: savedObjects.map((so) => { + const obj = injectMetaAttributes(so, managementService); const result = { ...obj, attributes: {} as Record }; for (const field of includedFields) { - result.attributes[field] = obj.attributes[field]; + result.attributes[field] = (obj.attributes as Record)[field]; } return result; - }); - - const response: FindResponseHTTPV1 = { - saved_objects: enhancedSavedObjects, + }), total: findResponse.total, }; From 697f6caef6cc30a899fe447c9ce390e413fcc2a6 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 27 Jan 2023 12:15:38 +0100 Subject: [PATCH 19/33] added per_page and page values --- src/plugins/saved_objects_management/common/types/v1.ts | 2 ++ src/plugins/saved_objects_management/server/routes/find.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index 495964aadc62a..ca89e457151a6 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -146,6 +146,8 @@ export interface FindQueryHTTPV1 { export interface FindResponseHTTPV1 { saved_objects: SavedObjectWithMetadataV1[]; total: number; + page: number; + per_page: number; } export interface GetAllowedTypesResponseHTTPV1 { diff --git a/src/plugins/saved_objects_management/server/routes/find.ts b/src/plugins/saved_objects_management/server/routes/find.ts index 741639956f063..93206dba2ce73 100644 --- a/src/plugins/saved_objects_management/server/routes/find.ts +++ b/src/plugins/saved_objects_management/server/routes/find.ts @@ -91,6 +91,8 @@ export const registerFindRoute = ( return result; }), total: findResponse.total, + per_page: findResponse.per_page, + page: findResponse.page, }; return res.ok({ body: response }); From f9b5bcb2c96e65cfb92f565c0862e93474484dcc Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 27 Jan 2023 12:46:19 +0100 Subject: [PATCH 20/33] remove keys to camelcase conversion --- .../public/lib/case_conversion.test.ts | 25 ------------------- .../public/lib/case_conversion.ts | 13 ---------- .../public/lib/find_objects.ts | 20 +++++---------- 3 files changed, 6 insertions(+), 52 deletions(-) delete mode 100644 src/plugins/saved_objects_management/public/lib/case_conversion.test.ts delete mode 100644 src/plugins/saved_objects_management/public/lib/case_conversion.ts diff --git a/src/plugins/saved_objects_management/public/lib/case_conversion.test.ts b/src/plugins/saved_objects_management/public/lib/case_conversion.test.ts deleted file mode 100644 index 111a62a1c5b98..0000000000000 --- a/src/plugins/saved_objects_management/public/lib/case_conversion.test.ts +++ /dev/null @@ -1,25 +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 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 { keysToCamelCaseShallow } from './case_conversion'; - -describe('keysToCamelCaseShallow', () => { - test("should convert all of an object's keys to camel case", () => { - const data = { - camelCase: 'camelCase', - 'kebab-case': 'kebabCase', - snake_case: 'snakeCase', - }; - - const result = keysToCamelCaseShallow(data); - - expect(result.camelCase).toBe('camelCase'); - expect(result.kebabCase).toBe('kebabCase'); - expect(result.snakeCase).toBe('snakeCase'); - }); -}); diff --git a/src/plugins/saved_objects_management/public/lib/case_conversion.ts b/src/plugins/saved_objects_management/public/lib/case_conversion.ts deleted file mode 100644 index d05955cc7c77a..0000000000000 --- a/src/plugins/saved_objects_management/public/lib/case_conversion.ts +++ /dev/null @@ -1,13 +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 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 { mapKeys, camelCase } from 'lodash'; - -export function keysToCamelCaseShallow(object: Record) { - return mapKeys(object, (value, key) => camelCase(key)); -} diff --git a/src/plugins/saved_objects_management/public/lib/find_objects.ts b/src/plugins/saved_objects_management/public/lib/find_objects.ts index 54a62d6181a1d..2e780216b7304 100644 --- a/src/plugins/saved_objects_management/public/lib/find_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/find_objects.ts @@ -7,24 +7,16 @@ */ import { HttpStart } from '@kbn/core/public'; -import { keysToCamelCaseShallow } from './case_conversion'; import { FindQueryHTTPV1, FindResponseHTTPV1 } from '../../common/types'; export async function findObjects( http: HttpStart, findOptions: FindQueryHTTPV1 ): Promise { - const response = await http.get>( - '/api/kibana/management/saved_objects/_find', - { - query: { - ...findOptions, - hasReference: findOptions.hasReference - ? JSON.stringify(findOptions.hasReference) - : undefined, - } as Record, - } - ); - - return keysToCamelCaseShallow(response) as FindResponseHTTPV1; + return http.get('/api/kibana/management/saved_objects/_find', { + query: { + ...findOptions, + hasReference: findOptions.hasReference ? JSON.stringify(findOptions.hasReference) : undefined, + } as Record, + }); } From 8f706f1cfd6ab0c674651fd53dc0cd779dcf7b51 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 27 Jan 2023 14:08:08 +0100 Subject: [PATCH 21/33] refactor savedObjects -> saved_objects in Jest test --- .../objects_table/saved_objects_table.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx index 203941928b055..c4ec166799f3e 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx @@ -148,7 +148,7 @@ describe('SavedObjectsTable', () => { findObjectsMock.mockImplementation(() => ({ total: 4, - savedObjects: [ + saved_objects: [ { id: '1', type: 'index-pattern', From 70967c90056076b7ef3f5ad2adb96f7be075a083 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 27 Jan 2023 15:17:43 +0100 Subject: [PATCH 22/33] consistent naming --- src/plugins/saved_objects_management/common/index.ts | 6 +++--- .../saved_objects_management/common/types/index.ts | 6 +++--- src/plugins/saved_objects_management/common/types/v1.ts | 6 +++--- .../public/lib/bulk_delete_objects.ts | 8 ++++---- .../public/lib/bulk_get_objects.ts | 6 +++--- .../saved_objects_management/server/routes/bulk_delete.ts | 4 ++-- .../saved_objects_management/server/routes/bulk_get.ts | 4 ++-- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/plugins/saved_objects_management/common/index.ts b/src/plugins/saved_objects_management/common/index.ts index d4165d53321aa..9952fefbad298 100644 --- a/src/plugins/saved_objects_management/common/index.ts +++ b/src/plugins/saved_objects_management/common/index.ts @@ -15,9 +15,9 @@ export type { SavedObjectGetRelationshipsResponse, SavedObjectManagementTypeInfo, BulkGetHTTPBodyV1, - BulkGetHTTPResponseV1, - BulkDeleteHTTPBodyV1, - BulkDeleteHTTPResponseV1, + BulkGetResponseHTTPV1, + BulkDeleteBodyHTTPV1, + BulkDeleteResponseHTTPV1, FindQueryHTTPV1, FindResponseHTTPV1, FindSearchOperatorHTTPV1, diff --git a/src/plugins/saved_objects_management/common/types/index.ts b/src/plugins/saved_objects_management/common/types/index.ts index 215c1e3b2140f..4ba9a57b8984a 100644 --- a/src/plugins/saved_objects_management/common/types/index.ts +++ b/src/plugins/saved_objects_management/common/types/index.ts @@ -18,9 +18,9 @@ export type { export type { BulkGetHTTPBodyV1, - BulkGetHTTPResponseV1, - BulkDeleteHTTPBodyV1, - BulkDeleteHTTPResponseV1, + BulkGetResponseHTTPV1, + BulkDeleteBodyHTTPV1, + BulkDeleteResponseHTTPV1, FindQueryHTTPV1, FindResponseHTTPV1, FindSearchOperatorHTTPV1, diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index ca89e457151a6..4513cf2f63fa3 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -101,14 +101,14 @@ export type BulkGetHTTPBodyV1 = Array<{ type: string; }>; -export type BulkGetHTTPResponseV1 = SavedObjectWithMetadataV1[]; +export type BulkGetResponseHTTPV1 = SavedObjectWithMetadataV1[]; -export type BulkDeleteHTTPBodyV1 = Array<{ +export type BulkDeleteBodyHTTPV1 = Array<{ type: string; id: string; }>; -export type BulkDeleteHTTPResponseV1 = Array<{ +export type BulkDeleteResponseHTTPV1 = Array<{ /** The ID of the saved object */ id: string; /** The type of the saved object */ diff --git a/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts b/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts index 342c8c6e676f8..e860900b1c400 100644 --- a/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts @@ -7,13 +7,13 @@ */ import { HttpStart } from '@kbn/core/public'; -import { BulkDeleteHTTPBodyV1, BulkDeleteHTTPResponseV1 } from '../../common'; +import { BulkDeleteBodyHTTPV1, BulkDeleteResponseHTTPV1 } from '../../common'; export function bulkDeleteObjects( http: HttpStart, - objects: BulkDeleteHTTPBodyV1 -): Promise { - return http.post( + objects: BulkDeleteBodyHTTPV1 +): Promise { + return http.post( '/internal/kibana/management/saved_objects/_bulk_delete', { body: JSON.stringify(objects), diff --git a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts index 70ce097337aaa..2ebc857f0428a 100644 --- a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts @@ -7,13 +7,13 @@ */ import { HttpStart } from '@kbn/core/public'; -import { BulkGetHTTPBodyV1, BulkGetHTTPResponseV1 } from '../../common/types'; +import { BulkGetHTTPBodyV1, BulkGetResponseHTTPV1 } from '../../common/types'; export async function bulkGetObjects( http: HttpStart, objects: BulkGetHTTPBodyV1 -): Promise { - return await http.post(`/api/kibana/management/saved_objects/_bulk_get`, { +): Promise { + return await http.post(`/api/kibana/management/saved_objects/_bulk_get`, { body: JSON.stringify(objects), }); } diff --git a/src/plugins/saved_objects_management/server/routes/bulk_delete.ts b/src/plugins/saved_objects_management/server/routes/bulk_delete.ts index 9865e6fc90464..93c5dc1e8a030 100644 --- a/src/plugins/saved_objects_management/server/routes/bulk_delete.ts +++ b/src/plugins/saved_objects_management/server/routes/bulk_delete.ts @@ -8,7 +8,7 @@ import { schema } from '@kbn/config-schema'; import { IRouter } from '@kbn/core/server'; -import type { BulkDeleteHTTPResponseV1 } from '../../common'; +import type { BulkDeleteResponseHTTPV1 } from '../../common'; export const registerBulkDeleteRoute = (router: IRouter) => { router.post( @@ -30,7 +30,7 @@ export const registerBulkDeleteRoute = (router: IRouter) => { const client = getClient(); const response = await client.bulkDelete(objects, { force: true }); - const body: BulkDeleteHTTPResponseV1 = response.statuses; + const body: BulkDeleteResponseHTTPV1 = response.statuses; return res.ok({ body }); }) ); diff --git a/src/plugins/saved_objects_management/server/routes/bulk_get.ts b/src/plugins/saved_objects_management/server/routes/bulk_get.ts index bffb0d2228078..fda246b16d2b2 100644 --- a/src/plugins/saved_objects_management/server/routes/bulk_get.ts +++ b/src/plugins/saved_objects_management/server/routes/bulk_get.ts @@ -10,7 +10,7 @@ import { schema } from '@kbn/config-schema'; import type { IRouter } from '@kbn/core/server'; import { injectMetaAttributes, toSavedObjectWithMeta } from '../lib'; import type { ISavedObjectsManagement } from '../services'; -import type { BulkGetHTTPResponseV1 } from '../../common'; +import type { BulkGetResponseHTTPV1 } from '../../common'; export const registerBulkGetRoute = ( router: IRouter, @@ -41,7 +41,7 @@ export const registerBulkGetRoute = ( const client = getClient({ includedHiddenTypes }); const response = await client.bulkGet(objects); - const body: BulkGetHTTPResponseV1 = response.saved_objects.map((obj) => { + const body: BulkGetResponseHTTPV1 = response.saved_objects.map((obj) => { const so = toSavedObjectWithMeta(obj); if (!so.error) { return injectMetaAttributes(obj, managementService); From 2b347fc3bf3eb5768793c1ad079f372bb097d168 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 27 Jan 2023 15:18:55 +0100 Subject: [PATCH 23/33] consistent naming; missed one --- src/plugins/saved_objects_management/common/index.ts | 2 +- src/plugins/saved_objects_management/common/types/index.ts | 2 +- src/plugins/saved_objects_management/common/types/v1.ts | 2 +- .../saved_objects_management/public/lib/bulk_get_objects.ts | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugins/saved_objects_management/common/index.ts b/src/plugins/saved_objects_management/common/index.ts index 9952fefbad298..66a93882120b4 100644 --- a/src/plugins/saved_objects_management/common/index.ts +++ b/src/plugins/saved_objects_management/common/index.ts @@ -14,7 +14,7 @@ export type { SavedObjectInvalidRelation, SavedObjectGetRelationshipsResponse, SavedObjectManagementTypeInfo, - BulkGetHTTPBodyV1, + BulkGetBodyHTTPV1, BulkGetResponseHTTPV1, BulkDeleteBodyHTTPV1, BulkDeleteResponseHTTPV1, diff --git a/src/plugins/saved_objects_management/common/types/index.ts b/src/plugins/saved_objects_management/common/types/index.ts index 4ba9a57b8984a..d5500c7c98e02 100644 --- a/src/plugins/saved_objects_management/common/types/index.ts +++ b/src/plugins/saved_objects_management/common/types/index.ts @@ -17,7 +17,7 @@ export type { } from './types'; export type { - BulkGetHTTPBodyV1, + BulkGetBodyHTTPV1, BulkGetResponseHTTPV1, BulkDeleteBodyHTTPV1, BulkDeleteResponseHTTPV1, diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index 4513cf2f63fa3..8eb44f05264eb 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -96,7 +96,7 @@ export type SavedObjectManagementTypeInfo = SavedObjectManagementTypeInfoV1; /** HTTP API interfaces */ -export type BulkGetHTTPBodyV1 = Array<{ +export type BulkGetBodyHTTPV1 = Array<{ id: string; type: string; }>; diff --git a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts index 2ebc857f0428a..23cb714119af3 100644 --- a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts @@ -7,11 +7,11 @@ */ import { HttpStart } from '@kbn/core/public'; -import { BulkGetHTTPBodyV1, BulkGetResponseHTTPV1 } from '../../common/types'; +import { BulkGetBodyHTTPV1, BulkGetResponseHTTPV1 } from '../../common/types'; export async function bulkGetObjects( http: HttpStart, - objects: BulkGetHTTPBodyV1 + objects: BulkGetBodyHTTPV1 ): Promise { return await http.post(`/api/kibana/management/saved_objects/_bulk_get`, { body: JSON.stringify(objects), From f1074aa24b6d0246e25dab04c8c4d5cc5b669404 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 27 Jan 2023 15:22:24 +0100 Subject: [PATCH 24/33] simplify use of generics --- .../public/lib/bulk_delete_objects.ts | 9 +++------ .../public/lib/bulk_get_objects.ts | 2 +- .../saved_objects_management/public/lib/find_objects.ts | 2 +- .../public/lib/get_relationships.ts | 2 +- .../public/lib/get_saved_object_counts.ts | 7 +++---- 5 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts b/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts index e860900b1c400..abca64840d69b 100644 --- a/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts @@ -13,10 +13,7 @@ export function bulkDeleteObjects( http: HttpStart, objects: BulkDeleteBodyHTTPV1 ): Promise { - return http.post( - '/internal/kibana/management/saved_objects/_bulk_delete', - { - body: JSON.stringify(objects), - } - ); + return http.post('/internal/kibana/management/saved_objects/_bulk_delete', { + body: JSON.stringify(objects), + }); } diff --git a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts index 23cb714119af3..bed3f10a0a8f6 100644 --- a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts @@ -13,7 +13,7 @@ export async function bulkGetObjects( http: HttpStart, objects: BulkGetBodyHTTPV1 ): Promise { - return await http.post(`/api/kibana/management/saved_objects/_bulk_get`, { + return await http.post(`/api/kibana/management/saved_objects/_bulk_get`, { body: JSON.stringify(objects), }); } diff --git a/src/plugins/saved_objects_management/public/lib/find_objects.ts b/src/plugins/saved_objects_management/public/lib/find_objects.ts index 2e780216b7304..443c77a55f515 100644 --- a/src/plugins/saved_objects_management/public/lib/find_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/find_objects.ts @@ -13,7 +13,7 @@ export async function findObjects( http: HttpStart, findOptions: FindQueryHTTPV1 ): Promise { - return http.get('/api/kibana/management/saved_objects/_find', { + return http.get('/api/kibana/management/saved_objects/_find', { query: { ...findOptions, hasReference: findOptions.hasReference ? JSON.stringify(findOptions.hasReference) : undefined, diff --git a/src/plugins/saved_objects_management/public/lib/get_relationships.ts b/src/plugins/saved_objects_management/public/lib/get_relationships.ts index c7ca65dea1cb7..0e97b8f7962c2 100644 --- a/src/plugins/saved_objects_management/public/lib/get_relationships.ts +++ b/src/plugins/saved_objects_management/public/lib/get_relationships.ts @@ -20,7 +20,7 @@ export async function getRelationships( type )}/${encodeURIComponent(id)}`; try { - return await http.get(url, { + return await http.get(url, { query: { savedObjectTypes, }, diff --git a/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts b/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts index a99dbdceca0ce..59940271f5af7 100644 --- a/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts +++ b/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts @@ -20,8 +20,7 @@ export async function getSavedObjectCounts({ searchString?: string; references?: SavedObjectsFindOptionsReference[]; }): Promise { - return await http.post( - `/api/kibana/management/saved_objects/scroll/counts`, - { body: JSON.stringify({ typesToInclude, searchString, references }) } - ); + return await http.post(`/api/kibana/management/saved_objects/scroll/counts`, { + body: JSON.stringify({ typesToInclude, searchString, references }), + }); } From 7db7f77460111b8047e3b4574a9a9133288454de Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 31 Jan 2023 12:30:42 +0100 Subject: [PATCH 25/33] use v1 type container --- .../saved_objects_management/common/index.ts | 17 +--- .../common/types/index.ts | 23 +---- .../common/types/types.ts | 43 --------- .../common/types/v1.ts | 87 ++++++++----------- .../public/lib/bulk_delete_objects.ts | 8 +- .../public/lib/bulk_get_objects.ts | 8 +- .../lib/fetch_export_by_type_and_search.ts | 2 +- .../public/lib/find_objects.ts | 6 +- .../public/lib/get_allowed_types.ts | 6 +- .../public/lib/get_relationships.ts | 6 +- .../public/lib/get_saved_object_counts.ts | 6 +- .../lib/process_import_response.test.ts | 2 +- .../public/lib/process_import_response.ts | 2 +- .../public/lib/resolve_import_errors.ts | 2 +- .../server/lib/to_saved_object_with_meta.ts | 4 +- .../server/routes/bulk_delete.ts | 4 +- .../server/routes/bulk_get.ts | 4 +- .../server/routes/find.ts | 4 +- .../server/routes/relationships.ts | 4 +- .../server/routes/scroll_count.ts | 4 +- 20 files changed, 76 insertions(+), 166 deletions(-) delete mode 100644 src/plugins/saved_objects_management/common/types/types.ts diff --git a/src/plugins/saved_objects_management/common/index.ts b/src/plugins/saved_objects_management/common/index.ts index 66a93882120b4..895d21610d88f 100644 --- a/src/plugins/saved_objects_management/common/index.ts +++ b/src/plugins/saved_objects_management/common/index.ts @@ -12,21 +12,6 @@ export type { SavedObjectRelation, SavedObjectRelationKind, SavedObjectInvalidRelation, - SavedObjectGetRelationshipsResponse, SavedObjectManagementTypeInfo, - BulkGetBodyHTTPV1, - BulkGetResponseHTTPV1, - BulkDeleteBodyHTTPV1, - BulkDeleteResponseHTTPV1, - FindQueryHTTPV1, - FindResponseHTTPV1, - FindSearchOperatorHTTPV1, - FindSortOrderHTTPV1, - GetAllowedTypesResponseHTTPV1, - ReferenceHTTPV1, - RelationshipsParamsHTTPV1, - RelationshipsQueryHTTPV1, - RelationshipsResponseHTTPV1, - ScrollCountBodyHTTPV1, - ScrollCountResponseHTTPV1, + v1, } from './types'; diff --git a/src/plugins/saved_objects_management/common/types/index.ts b/src/plugins/saved_objects_management/common/types/index.ts index d5500c7c98e02..53944a96d7774 100644 --- a/src/plugins/saved_objects_management/common/types/index.ts +++ b/src/plugins/saved_objects_management/common/types/index.ts @@ -7,31 +7,12 @@ */ export type { - SavedObjectGetRelationshipsResponse, SavedObjectInvalidRelation, SavedObjectManagementTypeInfo, SavedObjectMetadata, SavedObjectRelation, SavedObjectRelationKind, SavedObjectWithMetadata, -} from './types'; +} from './latest'; -export type { - BulkGetBodyHTTPV1, - BulkGetResponseHTTPV1, - BulkDeleteBodyHTTPV1, - BulkDeleteResponseHTTPV1, - FindQueryHTTPV1, - FindResponseHTTPV1, - FindSearchOperatorHTTPV1, - ReferenceHTTPV1, - FindSortOrderHTTPV1, - ScrollCountBodyHTTPV1, - RelationshipsQueryHTTPV1, - RelationshipsParamsHTTPV1, - ScrollCountResponseHTTPV1, - RelationshipsResponseHTTPV1, - GetAllowedTypesResponseHTTPV1, - DeleteObjectBodyHTTPV1, - DeleteObjectResponseHTTPV1, -} from './v1'; +export type * as v1 from './v1'; diff --git a/src/plugins/saved_objects_management/common/types/types.ts b/src/plugins/saved_objects_management/common/types/types.ts deleted file mode 100644 index 68e470bb29560..0000000000000 --- a/src/plugins/saved_objects_management/common/types/types.ts +++ /dev/null @@ -1,43 +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 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 type { - SavedObjectGetRelationshipsResponseV1, - SavedObjectInvalidRelationV1, - SavedObjectManagementTypeInfoV1, - SavedObjectRelationV1, - SavedObjectRelationKindV1, - SavedObjectMetadataV1, - SavedObjectWithMetadataV1, -} from './v1'; - -/** - * The metadata injected into a {@link SavedObject | saved object} when returning - * {@link SavedObjectWithMetadata | enhanced objects} from the plugin API endpoints. - */ -export type SavedObjectMetadata = SavedObjectMetadataV1; - -/** - * A {@link SavedObject | saved object} enhanced with meta properties used by the client-side plugin. - * - * Directly using "SavedObject" interface. Assume that this is versionable interface. - */ -export type SavedObjectWithMetadata = SavedObjectWithMetadataV1; - -export type SavedObjectRelationKind = SavedObjectRelationKindV1; - -/** - * Represents a relation between two {@link SavedObject | saved object} - */ -export type SavedObjectRelation = SavedObjectRelationV1; -/** - * Represents a relation between two {@link SavedObject | saved object} - */ -export type SavedObjectInvalidRelation = SavedObjectInvalidRelationV1; -export type SavedObjectGetRelationshipsResponse = SavedObjectGetRelationshipsResponseV1; -export type SavedObjectManagementTypeInfo = SavedObjectManagementTypeInfoV1; diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index 8eb44f05264eb..efe50b2d6732f 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -13,9 +13,9 @@ import type { SavedObjectsNamespaceType } from '@kbn/core/public'; /** * Saved Object Management metadata associated with a saved object. See - * {@link SavedObjectWithMetadataV1}. + * {@link SavedObjectWithMetadata}. */ -export interface SavedObjectMetadataV1 { +export interface SavedObjectMetadata { icon?: string; title?: string; editUrl?: string; @@ -39,10 +39,10 @@ export interface SavedObjectReferenceV1 { * @note This is intended as a domain-specific representation of a SavedObject * which is intended for server-side only use. */ -export interface SavedObjectWithMetadataV1 { +export interface SavedObjectWithMetadata { id: string; type: string; - meta: SavedObjectMetadataV1; + meta: SavedObjectMetadata; error?: SavedObjectError; created_at?: string; updated_at?: string; @@ -51,64 +51,51 @@ export interface SavedObjectWithMetadataV1 { references: SavedObjectReferenceV1[]; } -export type SavedObjectRelationKindV1 = 'child' | 'parent'; +export type SavedObjectRelationKind = 'child' | 'parent'; /** - * {@inheritdoc SavedObjectRelation} + * Represents a relation between two {@link SavedObjectWithMetadata | saved objects}. */ -export interface SavedObjectRelationV1 { +export interface SavedObjectRelation { id: string; type: string; - relationship: SavedObjectRelationKindV1; - meta: SavedObjectMetadataV1; + relationship: SavedObjectRelationKind; + meta: SavedObjectMetadata; } /** - * Represents a relation between two {@link SavedObject | saved object} + * Represents a relation between two {@link SavedObjectWithMetadata | saved objects}. */ -export type SavedObjectRelation = SavedObjectRelationV1; - -/** - * {@inheritdoc SavedObjectInvalidRelation} - */ -export interface SavedObjectInvalidRelationV1 { +export interface SavedObjectInvalidRelation { id: string; type: string; - relationship: SavedObjectRelationKindV1; + relationship: SavedObjectRelationKind; error: string; } -/** - * Represents a relation between two {@link SavedObject | saved object} - */ -export type SavedObjectInvalidRelation = SavedObjectInvalidRelationV1; - -export type SavedObjectGetRelationshipsResponseV1 = RelationshipsResponseHTTPV1; - -export interface SavedObjectManagementTypeInfoV1 { +export interface SavedObjectManagementTypeInfo { name: string; // TODO: Fix. We should not directly expose these values to public code. namespaceType: SavedObjectsNamespaceType; hidden: boolean; displayName: string; } -export type SavedObjectManagementTypeInfo = SavedObjectManagementTypeInfoV1; /** HTTP API interfaces */ -export type BulkGetBodyHTTPV1 = Array<{ +export type BulkGetBodyHTTP = Array<{ id: string; type: string; }>; -export type BulkGetResponseHTTPV1 = SavedObjectWithMetadataV1[]; +export type BulkGetResponseHTTP = SavedObjectWithMetadata[]; -export type BulkDeleteBodyHTTPV1 = Array<{ +export type BulkDeleteBodyHTTP = Array<{ type: string; id: string; }>; -export type BulkDeleteResponseHTTPV1 = Array<{ +export type BulkDeleteResponseHTTP = Array<{ /** The ID of the saved object */ id: string; /** The type of the saved object */ @@ -119,73 +106,73 @@ export type BulkDeleteResponseHTTPV1 = Array<{ error?: SavedObjectError; }>; -export type FindSearchOperatorHTTPV1 = 'AND' | 'OR'; -export type FindSortOrderHTTPV1 = 'asc' | 'desc'; +export type FindSearchOperatorHTTP = 'AND' | 'OR'; +export type FindSortOrderHTTP = 'asc' | 'desc'; -export interface ReferenceHTTPV1 { +export interface ReferenceHTTP { type: string; id: string; } -export interface FindQueryHTTPV1 { +export interface FindQueryHTTP { perPage?: number; page?: number; type: string | string[]; // TODO: Fix. this API allows writing an arbitrary query that is passed straight to our persistence layer, thus leaking SO attributes to the public... search?: string; - defaultSearchOperator?: FindSearchOperatorHTTPV1; + defaultSearchOperator?: FindSearchOperatorHTTP; // TODO: Fix. this API allows sorting by any field, thus leaking SO attributes to the public... sortField?: string; - sortOrder?: FindSortOrderHTTPV1; - hasReference?: ReferenceHTTPV1 | ReferenceHTTPV1[]; - hasReferenceOperator?: FindSearchOperatorHTTPV1; + sortOrder?: FindSortOrderHTTP; + hasReference?: ReferenceHTTP | ReferenceHTTP[]; + hasReferenceOperator?: FindSearchOperatorHTTP; // TODO: Fix. This exposes attribute schemas to clients. fields?: string | string[]; } -export interface FindResponseHTTPV1 { - saved_objects: SavedObjectWithMetadataV1[]; +export interface FindResponseHTTP { + saved_objects: SavedObjectWithMetadata[]; total: number; page: number; per_page: number; } -export interface GetAllowedTypesResponseHTTPV1 { - types: SavedObjectManagementTypeInfoV1[]; +export interface GetAllowedTypesResponseHTTP { + types: SavedObjectManagementTypeInfo[]; } -export interface RelationshipsParamsHTTPV1 { +export interface RelationshipsParamsHTTP { type: string; id: string; } -export interface RelationshipsQueryHTTPV1 { +export interface RelationshipsQueryHTTP { size: number; savedObjectTypes: string | string[]; } -export interface RelationshipsResponseHTTPV1 { +export interface RelationshipsResponseHTTP { relations: SavedObjectRelation[]; invalidRelations: SavedObjectInvalidRelation[]; } -export interface ScrollCountBodyHTTPV1 { +export interface ScrollCountBodyHTTP { typesToInclude: string[]; // TODO: Fix. this API allows writing an arbitrary query that is passed straight to our persistence layer, thus leaking SO attributes to the public... searchString?: string; references?: Array<{ type: string; id: string }>; } -export interface DeleteObjectBodyHTTPV1 { +export interface DeleteObjectBodyHTTP { id: string; type: string; } -export interface DeleteObjectResponseHTTPV1 { +export interface DeleteObjectResponseHTTP { id: string; } /** - * In this case "string" is a direct mapping from "typesToInlcude" in {@link ScrollCountBodyHTTPV1['typesToInclude']']} + * In this case "string" is a direct mapping from "typesToInlcude" in {@link ScrollCountBodyHTTP['typesToInclude']']} */ -export type ScrollCountResponseHTTPV1 = Record; +export type ScrollCountResponseHTTP = Record; diff --git a/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts b/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts index abca64840d69b..3f98f1fc3955f 100644 --- a/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/bulk_delete_objects.ts @@ -6,13 +6,13 @@ * Side Public License, v 1. */ -import { HttpStart } from '@kbn/core/public'; -import { BulkDeleteBodyHTTPV1, BulkDeleteResponseHTTPV1 } from '../../common'; +import type { HttpStart } from '@kbn/core/public'; +import type { v1 } from '../../common'; export function bulkDeleteObjects( http: HttpStart, - objects: BulkDeleteBodyHTTPV1 -): Promise { + objects: v1.BulkDeleteBodyHTTP +): Promise { return http.post('/internal/kibana/management/saved_objects/_bulk_delete', { body: JSON.stringify(objects), }); diff --git a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts index bed3f10a0a8f6..61d4ca8bb934b 100644 --- a/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/bulk_get_objects.ts @@ -6,13 +6,13 @@ * Side Public License, v 1. */ -import { HttpStart } from '@kbn/core/public'; -import { BulkGetBodyHTTPV1, BulkGetResponseHTTPV1 } from '../../common/types'; +import type { HttpStart } from '@kbn/core/public'; +import type { v1 } from '../../common'; export async function bulkGetObjects( http: HttpStart, - objects: BulkGetBodyHTTPV1 -): Promise { + objects: v1.BulkGetBodyHTTP +): Promise { return await http.post(`/api/kibana/management/saved_objects/_bulk_get`, { body: JSON.stringify(objects), }); diff --git a/src/plugins/saved_objects_management/public/lib/fetch_export_by_type_and_search.ts b/src/plugins/saved_objects_management/public/lib/fetch_export_by_type_and_search.ts index eb14f96c700ec..161d9034bcb74 100644 --- a/src/plugins/saved_objects_management/public/lib/fetch_export_by_type_and_search.ts +++ b/src/plugins/saved_objects_management/public/lib/fetch_export_by_type_and_search.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { HttpStart, SavedObjectsFindOptionsReference } from '@kbn/core/public'; +import type { HttpStart, SavedObjectsFindOptionsReference } from '@kbn/core/public'; export async function fetchExportByTypeAndSearch({ http, diff --git a/src/plugins/saved_objects_management/public/lib/find_objects.ts b/src/plugins/saved_objects_management/public/lib/find_objects.ts index 443c77a55f515..658bb64800a31 100644 --- a/src/plugins/saved_objects_management/public/lib/find_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/find_objects.ts @@ -7,12 +7,12 @@ */ import { HttpStart } from '@kbn/core/public'; -import { FindQueryHTTPV1, FindResponseHTTPV1 } from '../../common/types'; +import type { v1 } from '../../common'; export async function findObjects( http: HttpStart, - findOptions: FindQueryHTTPV1 -): Promise { + findOptions: v1.FindQueryHTTP +): Promise { return http.get('/api/kibana/management/saved_objects/_find', { query: { ...findOptions, diff --git a/src/plugins/saved_objects_management/public/lib/get_allowed_types.ts b/src/plugins/saved_objects_management/public/lib/get_allowed_types.ts index 3ca5bd01e5253..3bf9c0f44d2cf 100644 --- a/src/plugins/saved_objects_management/public/lib/get_allowed_types.ts +++ b/src/plugins/saved_objects_management/public/lib/get_allowed_types.ts @@ -7,12 +7,12 @@ */ import type { HttpStart } from '@kbn/core/public'; -import type { GetAllowedTypesResponseHTTPV1 } from '../../common/types'; +import type { v1 } from '../../common'; export async function getAllowedTypes( http: HttpStart -): Promise { - const response = await http.get( +): Promise { + const response = await http.get( '/api/kibana/management/saved_objects/_allowed_types' ); return response.types; diff --git a/src/plugins/saved_objects_management/public/lib/get_relationships.ts b/src/plugins/saved_objects_management/public/lib/get_relationships.ts index 0e97b8f7962c2..7647da05029dc 100644 --- a/src/plugins/saved_objects_management/public/lib/get_relationships.ts +++ b/src/plugins/saved_objects_management/public/lib/get_relationships.ts @@ -6,16 +6,16 @@ * Side Public License, v 1. */ -import { HttpStart } from '@kbn/core/public'; +import type { HttpStart } from '@kbn/core/public'; import { get } from 'lodash'; -import type { RelationshipsResponseHTTPV1 } from '../../common/types'; +import type { v1 } from '../../common'; export async function getRelationships( http: HttpStart, type: string, id: string, savedObjectTypes: string[] -): Promise { +): Promise { const url = `/api/kibana/management/saved_objects/relationships/${encodeURIComponent( type )}/${encodeURIComponent(id)}`; diff --git a/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts b/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts index 59940271f5af7..23d2818257be2 100644 --- a/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts +++ b/src/plugins/saved_objects_management/public/lib/get_saved_object_counts.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import { HttpStart, SavedObjectsFindOptionsReference } from '@kbn/core/public'; -import type { ScrollCountResponseHTTPV1 } from '../../common/types'; +import type { HttpStart, SavedObjectsFindOptionsReference } from '@kbn/core/public'; +import type { v1 } from '../../common'; export async function getSavedObjectCounts({ http, @@ -19,7 +19,7 @@ export async function getSavedObjectCounts({ typesToInclude: string[]; searchString?: string; references?: SavedObjectsFindOptionsReference[]; -}): Promise { +}): Promise { return await http.post(`/api/kibana/management/saved_objects/scroll/counts`, { body: JSON.stringify({ typesToInclude, searchString, references }), }); diff --git a/src/plugins/saved_objects_management/public/lib/process_import_response.test.ts b/src/plugins/saved_objects_management/public/lib/process_import_response.test.ts index 6e354d994220b..6b54e7cc617f7 100644 --- a/src/plugins/saved_objects_management/public/lib/process_import_response.test.ts +++ b/src/plugins/saved_objects_management/public/lib/process_import_response.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { +import type { SavedObjectsImportConflictError, SavedObjectsImportAmbiguousConflictError, SavedObjectsImportUnknownError, diff --git a/src/plugins/saved_objects_management/public/lib/process_import_response.ts b/src/plugins/saved_objects_management/public/lib/process_import_response.ts index 4f2624c73ed1e..480c10a345cd0 100644 --- a/src/plugins/saved_objects_management/public/lib/process_import_response.ts +++ b/src/plugins/saved_objects_management/public/lib/process_import_response.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { +import type { SavedObjectsImportResponse, SavedObjectsImportConflictError, SavedObjectsImportAmbiguousConflictError, diff --git a/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts b/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts index 9e90627096742..7558af02cd2a3 100644 --- a/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts +++ b/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { +import type { HttpStart, SavedObjectsImportConflictError, SavedObjectsImportRetry, diff --git a/src/plugins/saved_objects_management/server/lib/to_saved_object_with_meta.ts b/src/plugins/saved_objects_management/server/lib/to_saved_object_with_meta.ts index be8fc38dbeda7..03a900b0ddc97 100644 --- a/src/plugins/saved_objects_management/server/lib/to_saved_object_with_meta.ts +++ b/src/plugins/saved_objects_management/server/lib/to_saved_object_with_meta.ts @@ -7,9 +7,9 @@ */ import { SavedObject } from '@kbn/core/server'; -import { SavedObjectWithMetadataV1 } from '../../common/types/v1'; +import { SavedObjectWithMetadata } from '../../common/types/v1'; -export function toSavedObjectWithMeta(so: SavedObject): SavedObjectWithMetadataV1 { +export function toSavedObjectWithMeta(so: SavedObject): SavedObjectWithMetadata { return { id: so.id, type: so.type, diff --git a/src/plugins/saved_objects_management/server/routes/bulk_delete.ts b/src/plugins/saved_objects_management/server/routes/bulk_delete.ts index 93c5dc1e8a030..1776a73a75042 100644 --- a/src/plugins/saved_objects_management/server/routes/bulk_delete.ts +++ b/src/plugins/saved_objects_management/server/routes/bulk_delete.ts @@ -8,7 +8,7 @@ import { schema } from '@kbn/config-schema'; import { IRouter } from '@kbn/core/server'; -import type { BulkDeleteResponseHTTPV1 } from '../../common'; +import type { v1 } from '../../common'; export const registerBulkDeleteRoute = (router: IRouter) => { router.post( @@ -30,7 +30,7 @@ export const registerBulkDeleteRoute = (router: IRouter) => { const client = getClient(); const response = await client.bulkDelete(objects, { force: true }); - const body: BulkDeleteResponseHTTPV1 = response.statuses; + const body: v1.BulkDeleteResponseHTTP = response.statuses; return res.ok({ body }); }) ); diff --git a/src/plugins/saved_objects_management/server/routes/bulk_get.ts b/src/plugins/saved_objects_management/server/routes/bulk_get.ts index fda246b16d2b2..c93645cef6505 100644 --- a/src/plugins/saved_objects_management/server/routes/bulk_get.ts +++ b/src/plugins/saved_objects_management/server/routes/bulk_get.ts @@ -9,8 +9,8 @@ import { schema } from '@kbn/config-schema'; import type { IRouter } from '@kbn/core/server'; import { injectMetaAttributes, toSavedObjectWithMeta } from '../lib'; +import type { v1 } from '../../common'; import type { ISavedObjectsManagement } from '../services'; -import type { BulkGetResponseHTTPV1 } from '../../common'; export const registerBulkGetRoute = ( router: IRouter, @@ -41,7 +41,7 @@ export const registerBulkGetRoute = ( const client = getClient({ includedHiddenTypes }); const response = await client.bulkGet(objects); - const body: BulkGetResponseHTTPV1 = response.saved_objects.map((obj) => { + const body: v1.BulkGetResponseHTTP = response.saved_objects.map((obj) => { const so = toSavedObjectWithMeta(obj); if (!so.error) { return injectMetaAttributes(obj, managementService); diff --git a/src/plugins/saved_objects_management/server/routes/find.ts b/src/plugins/saved_objects_management/server/routes/find.ts index 93206dba2ce73..1dffca14a0b24 100644 --- a/src/plugins/saved_objects_management/server/routes/find.ts +++ b/src/plugins/saved_objects_management/server/routes/find.ts @@ -9,7 +9,7 @@ import { schema } from '@kbn/config-schema'; import type { IRouter } from '@kbn/core/server'; -import type { FindResponseHTTPV1 } from '../../common'; +import type { v1 } from '../../common'; import { injectMetaAttributes, toSavedObjectWithMeta } from '../lib'; import type { ISavedObjectsManagement } from '../services'; @@ -81,7 +81,7 @@ export const registerFindRoute = ( const savedObjects = findResponse.saved_objects.map(toSavedObjectWithMeta); - const response: FindResponseHTTPV1 = { + const response: v1.FindResponseHTTP = { saved_objects: savedObjects.map((so) => { const obj = injectMetaAttributes(so, managementService); const result = { ...obj, attributes: {} as Record }; diff --git a/src/plugins/saved_objects_management/server/routes/relationships.ts b/src/plugins/saved_objects_management/server/routes/relationships.ts index b6746cd19ee70..91cbbbabb6de0 100644 --- a/src/plugins/saved_objects_management/server/routes/relationships.ts +++ b/src/plugins/saved_objects_management/server/routes/relationships.ts @@ -11,7 +11,7 @@ import type { IRouter } from '@kbn/core/server'; import { chain } from 'lodash'; import { findRelationships } from '../lib'; import type { ISavedObjectsManagement } from '../services'; -import type { RelationshipsResponseHTTPV1 } from '../../common'; +import type { v1 } from '../../common'; export const registerRelationshipsRoute = ( router: IRouter, @@ -49,7 +49,7 @@ export const registerRelationshipsRoute = ( const client = getClient({ includedHiddenTypes }); - const findRelationsResponse: RelationshipsResponseHTTPV1 = await findRelationships({ + const findRelationsResponse: v1.RelationshipsResponseHTTP = await findRelationships({ type, id, client, diff --git a/src/plugins/saved_objects_management/server/routes/scroll_count.ts b/src/plugins/saved_objects_management/server/routes/scroll_count.ts index 930e1f9af33a4..210bb3b27c67f 100644 --- a/src/plugins/saved_objects_management/server/routes/scroll_count.ts +++ b/src/plugins/saved_objects_management/server/routes/scroll_count.ts @@ -9,7 +9,7 @@ import { schema } from '@kbn/config-schema'; import type { IRouter, SavedObjectsCreatePointInTimeFinderOptions } from '@kbn/core/server'; import { chain } from 'lodash'; -import type { ScrollCountResponseHTTPV1 } from '../../common'; +import type { v1 } from '../../common'; import { findAll } from '../lib'; export const registerScrollForCountRoute = (router: IRouter) => { @@ -71,7 +71,7 @@ export const registerScrollForCountRoute = (router: IRouter) => { } } - const body: ScrollCountResponseHTTPV1 = counts; + const body: v1.ScrollCountResponseHTTP = counts; return res.ok({ body, From d950e25a31f9a404b8f92844bc9fc58f680b31d4 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 31 Jan 2023 12:35:47 +0100 Subject: [PATCH 26/33] finish refactor of using v1 container --- .../common/types/index.ts | 3 ++- .../common/types/latest.ts | 16 ++++++++++++++++ .../public/lib/get_relationships.test.ts | 4 ++-- .../objects_table/components/relationships.tsx | 4 ++-- .../saved_objects_management/public/plugin.ts | 6 ++++-- .../saved_objects_management/public/types.ts | 1 - 6 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 src/plugins/saved_objects_management/common/types/latest.ts diff --git a/src/plugins/saved_objects_management/common/types/index.ts b/src/plugins/saved_objects_management/common/types/index.ts index 53944a96d7774..41d69f0d7a79f 100644 --- a/src/plugins/saved_objects_management/common/types/index.ts +++ b/src/plugins/saved_objects_management/common/types/index.ts @@ -15,4 +15,5 @@ export type { SavedObjectWithMetadata, } from './latest'; -export type * as v1 from './v1'; +import type * as v1 from './v1'; +export { v1 }; diff --git a/src/plugins/saved_objects_management/common/types/latest.ts b/src/plugins/saved_objects_management/common/types/latest.ts new file mode 100644 index 0000000000000..717736fbb7775 --- /dev/null +++ b/src/plugins/saved_objects_management/common/types/latest.ts @@ -0,0 +1,16 @@ +/* + * 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 type { + SavedObjectInvalidRelation, + SavedObjectManagementTypeInfo, + SavedObjectRelation, + SavedObjectRelationKind, + SavedObjectMetadata, + SavedObjectWithMetadata, +} from './v1'; diff --git a/src/plugins/saved_objects_management/public/lib/get_relationships.test.ts b/src/plugins/saved_objects_management/public/lib/get_relationships.test.ts index c52ce26e96a39..c3e001588802d 100644 --- a/src/plugins/saved_objects_management/public/lib/get_relationships.test.ts +++ b/src/plugins/saved_objects_management/public/lib/get_relationships.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { SavedObjectGetRelationshipsResponse } from '../types'; +import { v1 } from '../../common'; import { httpServiceMock } from '@kbn/core/public/mocks'; import { getRelationships } from './get_relationships'; @@ -23,7 +23,7 @@ describe('getRelationships', () => { }); it('should handle successful responses', async () => { - const serverResponse: SavedObjectGetRelationshipsResponse = { + const serverResponse: v1.RelationshipsResponseHTTP = { relations: [], invalidRelations: [], }; diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/components/relationships.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/components/relationships.tsx index bb097f64c4438..825e661979136 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/components/relationships.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/components/relationships.tsx @@ -28,17 +28,17 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { IBasePath } from '@kbn/core/public'; import type { SavedObjectManagementTypeInfo } from '../../../../common/types'; import { getDefaultTitle, getSavedObjectLabel } from '../../../lib'; +import type { v1 } from '../../../../common'; import { SavedObjectWithMetadata, SavedObjectRelationKind, SavedObjectRelation, SavedObjectInvalidRelation, - SavedObjectGetRelationshipsResponse, } from '../../../types'; export interface RelationshipsProps { basePath: IBasePath; - getRelationships: (type: string, id: string) => Promise; + getRelationships: (type: string, id: string) => Promise; savedObject: SavedObjectWithMetadata; close: () => void; goInspectObject: (obj: SavedObjectWithMetadata) => void; diff --git a/src/plugins/saved_objects_management/public/plugin.ts b/src/plugins/saved_objects_management/public/plugin.ts index 6eb79d6ff7542..5e074e68b392b 100644 --- a/src/plugins/saved_objects_management/public/plugin.ts +++ b/src/plugins/saved_objects_management/public/plugin.ts @@ -23,7 +23,9 @@ import { SavedObjectsManagementColumnServiceStart, } from './services'; -import { SavedObjectManagementTypeInfo, SavedObjectGetRelationshipsResponse } from './types'; +import { v1 } from '../common'; + +import { SavedObjectManagementTypeInfo } from './types'; import { getAllowedTypes, getRelationships, @@ -46,7 +48,7 @@ export interface SavedObjectsManagementPluginStart { type: string, id: string, savedObjectTypes: string[] - ) => Promise; + ) => Promise; getSavedObjectLabel: typeof getSavedObjectLabel; getDefaultTitle: typeof getDefaultTitle; parseQuery: typeof parseQuery; diff --git a/src/plugins/saved_objects_management/public/types.ts b/src/plugins/saved_objects_management/public/types.ts index 91e6e58e3dd0c..fbe8a0cac894d 100644 --- a/src/plugins/saved_objects_management/public/types.ts +++ b/src/plugins/saved_objects_management/public/types.ts @@ -12,6 +12,5 @@ export type { SavedObjectRelationKind, SavedObjectRelation, SavedObjectInvalidRelation, - SavedObjectGetRelationshipsResponse, SavedObjectManagementTypeInfo, } from '../common'; From 84ba11f34bb05d493dc6796f962eccc8c58f362e Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 31 Jan 2023 12:42:23 +0100 Subject: [PATCH 27/33] remove non-existent type --- src/plugins/saved_objects_management/server/types.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/saved_objects_management/server/types.ts b/src/plugins/saved_objects_management/server/types.ts index 93f6f3d09547a..00cef5f0dbea9 100644 --- a/src/plugins/saved_objects_management/server/types.ts +++ b/src/plugins/saved_objects_management/server/types.ts @@ -18,5 +18,4 @@ export type { SavedObjectRelationKind, SavedObjectRelation, SavedObjectInvalidRelation, - SavedObjectGetRelationshipsResponse, } from '../common'; From 88d03c1a969b7b86f806a9c3eedb6d355fc64c7e Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 31 Jan 2023 12:42:44 +0100 Subject: [PATCH 28/33] use type keyword --- src/plugins/saved_objects_management/public/plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/saved_objects_management/public/plugin.ts b/src/plugins/saved_objects_management/public/plugin.ts index 5e074e68b392b..eaefe96a0916a 100644 --- a/src/plugins/saved_objects_management/public/plugin.ts +++ b/src/plugins/saved_objects_management/public/plugin.ts @@ -23,7 +23,7 @@ import { SavedObjectsManagementColumnServiceStart, } from './services'; -import { v1 } from '../common'; +import type { v1 } from '../common'; import { SavedObjectManagementTypeInfo } from './types'; import { From fba896406671910f77a6db06c91e42efb9619490 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 31 Jan 2023 13:04:43 +0100 Subject: [PATCH 29/33] use unknown instead of any --- src/plugins/saved_objects_management/server/routes/find.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/saved_objects_management/server/routes/find.ts b/src/plugins/saved_objects_management/server/routes/find.ts index 1dffca14a0b24..bf5810c4beb97 100644 --- a/src/plugins/saved_objects_management/server/routes/find.ts +++ b/src/plugins/saved_objects_management/server/routes/find.ts @@ -84,9 +84,9 @@ export const registerFindRoute = ( const response: v1.FindResponseHTTP = { saved_objects: savedObjects.map((so) => { const obj = injectMetaAttributes(so, managementService); - const result = { ...obj, attributes: {} as Record }; + const result = { ...obj, attributes: {} as Record }; for (const field of includedFields) { - result.attributes[field] = (obj.attributes as Record)[field]; + result.attributes[field] = (obj.attributes as Record)[field]; } return result; }), From 4aa045947b16af54cdf0c5ff2dc6d0acb91fa824 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 31 Jan 2023 13:52:44 +0100 Subject: [PATCH 30/33] remove use of non-existing type --- .../server/lib/find_relationships.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/plugins/saved_objects_management/server/lib/find_relationships.ts b/src/plugins/saved_objects_management/server/lib/find_relationships.ts index 329d985b0b266..00fae0b24ab43 100644 --- a/src/plugins/saved_objects_management/server/lib/find_relationships.ts +++ b/src/plugins/saved_objects_management/server/lib/find_relationships.ts @@ -9,11 +9,8 @@ import { SavedObjectsClientContract } from '@kbn/core/server'; import { injectMetaAttributes } from './inject_meta_attributes'; import { ISavedObjectsManagement } from '../services'; -import { - SavedObjectInvalidRelation, - SavedObjectWithMetadata, - SavedObjectGetRelationshipsResponse, -} from '../types'; +import { v1 } from '../../common'; +import { SavedObjectInvalidRelation, SavedObjectWithMetadata } from '../types'; export async function findRelationships({ type, @@ -29,7 +26,7 @@ export async function findRelationships({ client: SavedObjectsClientContract; referenceTypes: string[]; savedObjectsManagement: ISavedObjectsManagement; -}): Promise { +}): Promise { const { references = [] } = await client.get(type, id); // Use a map to avoid duplicates, it does happen but have a different "name" in the reference From 542b448ffc6a9ffd81e1068cf23e8cd0391ab7f7 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 31 Jan 2023 13:56:59 +0100 Subject: [PATCH 31/33] added README.md --- .../common/types/README.md | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/plugins/saved_objects_management/common/types/README.md diff --git a/src/plugins/saved_objects_management/common/types/README.md b/src/plugins/saved_objects_management/common/types/README.md new file mode 100644 index 0000000000000..46819fce621b5 --- /dev/null +++ b/src/plugins/saved_objects_management/common/types/README.md @@ -0,0 +1,39 @@ +## Versioned interfaces + +This folder contains types that are shared between the server and client: + +```ts +// v1.ts +export interface SavedObjectWithMetadata { name: string } +``` + +This type is _versioned_ because it lives in the file `v1.ts`. Thus it is "v1" +of this type. + +**Do not alter a versioned type**. Types may be in use by clients. Alterations +must be made on a new version of the TS interface. Versions are determined +using monotonically increasing numbers: 1, 2, 3, etc. + +## Create a new version + +1. Find the latest version of your type, e.g: v3. +2. Create a new file, e.g., "v3.ts" in this folder if it does not exist. +3. Copy the interface you want to alter from the previous version, "v2.ts" +4. Alter the interface as needed +5. Ensure that all documentation is inherited from prior interfaces using + the @inheritdoc directive +6. Export your new file from index.ts as `v3`. + + +## The `latest.ts` file + +The `latest.ts` file is a container for all "latest" versions of types. This is useful +for app code that always needs the latest version of your interfaces. E.g.: + +```ts +import type { SavedObjectWithMetadata } from '../common'; +``` + +Notice that there is no version number mentioned. Either in the interface name +or import path. To update the "latest" type you must re-export the new version +from the appropriate versioned path. \ No newline at end of file From bf02a749dc46ef54c65be6b864b912d477aa2eb2 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 2 Feb 2023 15:41:59 +0100 Subject: [PATCH 32/33] version all types together --- .../common/types/README.md | 45 +++++++++++++------ .../common/types/index.ts | 2 +- .../common/types/latest.ts | 9 +--- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/plugins/saved_objects_management/common/types/README.md b/src/plugins/saved_objects_management/common/types/README.md index 46819fce621b5..bb8ccccaa3f27 100644 --- a/src/plugins/saved_objects_management/common/types/README.md +++ b/src/plugins/saved_objects_management/common/types/README.md @@ -5,24 +5,43 @@ This folder contains types that are shared between the server and client: ```ts // v1.ts export interface SavedObjectWithMetadata { name: string } -``` -This type is _versioned_ because it lives in the file `v1.ts`. Thus it is "v1" -of this type. +// index.ts +import * as v1 from './v1'; +export type { v1 }; + +// Used elsewhere +import type { v1 } from '../common'; +const myObject: v1.SavedObjectWithMetadata = { name: 'my object' }; +``` -**Do not alter a versioned type**. Types may be in use by clients. Alterations -must be made on a new version of the TS interface. Versions are determined -using monotonically increasing numbers: 1, 2, 3, etc. +**Do not alter a versioned type**. Types may be in use by clients (if the code is released). +Alterations must be made on a new version of the TS interface. ## Create a new version -1. Find the latest version of your type, e.g: v3. -2. Create a new file, e.g., "v3.ts" in this folder if it does not exist. -3. Copy the interface you want to alter from the previous version, "v2.ts" +Versions in this plugin are determined using monotonically increasing numbers: 1, 2, 3, etc. + +1. Find the latest version, e.g: `v2`. +2. Create a new file, e.g., `v3.ts` if it does not exist. +3. Copy the type(s) to change from previous version. E.g. `v2.ts`'s `SavedObjectWithMetadata`. 4. Alter the interface as needed -5. Ensure that all documentation is inherited from prior interfaces using - the @inheritdoc directive -6. Export your new file from index.ts as `v3`. +5. Re-export `v2` types to "inherit" the entire previous version's types: `export * from './v2';` +6. Export your new version from latest: `export * from './v3';`. This may result in TS errors + to be fixed. +7. Export your new file from index.ts as `v3`. + +Your `v3.ts` file should look something like: + +```ts +export * from './v3'; +export interface SavedObjectWithMetadata { name: string; a_new_field: string; } +``` + +In this way the entire API is accessible from `v3` including types that may +not have changed. + +Any alterations post-release must be in a new version (start at step 1). ## The `latest.ts` file @@ -36,4 +55,4 @@ import type { SavedObjectWithMetadata } from '../common'; Notice that there is no version number mentioned. Either in the interface name or import path. To update the "latest" type you must re-export the new version -from the appropriate versioned path. \ No newline at end of file +from the appropriate versioned path. diff --git a/src/plugins/saved_objects_management/common/types/index.ts b/src/plugins/saved_objects_management/common/types/index.ts index 41d69f0d7a79f..8e6e27b97715c 100644 --- a/src/plugins/saved_objects_management/common/types/index.ts +++ b/src/plugins/saved_objects_management/common/types/index.ts @@ -16,4 +16,4 @@ export type { } from './latest'; import type * as v1 from './v1'; -export { v1 }; +export type { v1 }; diff --git a/src/plugins/saved_objects_management/common/types/latest.ts b/src/plugins/saved_objects_management/common/types/latest.ts index 717736fbb7775..e9c79f0f50f93 100644 --- a/src/plugins/saved_objects_management/common/types/latest.ts +++ b/src/plugins/saved_objects_management/common/types/latest.ts @@ -6,11 +6,4 @@ * Side Public License, v 1. */ -export type { - SavedObjectInvalidRelation, - SavedObjectManagementTypeInfo, - SavedObjectRelation, - SavedObjectRelationKind, - SavedObjectMetadata, - SavedObjectWithMetadata, -} from './v1'; +export * from './v1'; From 026665e1ae92e6cc6ce1a17f6aa6c9e7c77b3adb Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 2 Feb 2023 15:46:53 +0100 Subject: [PATCH 33/33] remove V1 --- src/plugins/saved_objects_management/common/types/v1.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/saved_objects_management/common/types/v1.ts b/src/plugins/saved_objects_management/common/types/v1.ts index efe50b2d6732f..86b2486c08726 100644 --- a/src/plugins/saved_objects_management/common/types/v1.ts +++ b/src/plugins/saved_objects_management/common/types/v1.ts @@ -27,7 +27,7 @@ export interface SavedObjectMetadata { /** * One saved object's reference to another saved object. */ -export interface SavedObjectReferenceV1 { +export interface SavedObjectReference { name: string; type: string; id: string; @@ -48,7 +48,7 @@ export interface SavedObjectWithMetadata { updated_at?: string; attributes: T; namespaces?: string[]; - references: SavedObjectReferenceV1[]; + references: SavedObjectReference[]; } export type SavedObjectRelationKind = 'child' | 'parent';