From a8eefcae274d2300b9a35745394842360f05ffe9 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 30 Mar 2026 11:39:09 -0600 Subject: [PATCH 01/19] [* As Code] Use PUT for upserts --- .../dashboard/server/api/create/create.ts | 4 +--- .../server/api/create/register_create_route.ts | 16 +--------------- .../dashboard/server/api/create/schemas.ts | 10 ---------- .../server/api/dashboard_state_schemas.ts | 9 --------- .../server/api/update/register_update_route.ts | 17 +---------------- .../dashboard/server/api/update/update.ts | 1 + .../server/api/create/create.ts | 4 +--- .../server/api/create/register_create_route.ts | 17 ++--------------- .../server/api/create/schemas.ts | 10 ---------- .../server/api/update/update.ts | 1 + 10 files changed, 8 insertions(+), 81 deletions(-) diff --git a/src/platform/plugins/shared/dashboard/server/api/create/create.ts b/src/platform/plugins/shared/dashboard/server/api/create/create.ts index 4c2b9990a65ef..53660e3b276d5 100644 --- a/src/platform/plugins/shared/dashboard/server/api/create/create.ts +++ b/src/platform/plugins/shared/dashboard/server/api/create/create.ts @@ -11,7 +11,7 @@ import Boom from '@hapi/boom'; import type { RequestHandlerContext } from '@kbn/core/server'; import type { DashboardSavedObjectAttributes } from '../../dashboard_saved_object'; import { DASHBOARD_SAVED_OBJECT_TYPE } from '../../../common/constants'; -import type { DashboardCreateRequestBody, DashboardCreateRequestParams } from './types'; +import type { DashboardCreateRequestBody } from './types'; import { transformDashboardIn } from '../transforms'; import { getDashboardCRUResponseBody } from '../saved_object_utils'; import type { DashboardCreateResponseBody } from './types'; @@ -21,7 +21,6 @@ export async function create( requestCtx: RequestHandlerContext, dashboardStateSchema: ReturnType, createBody: DashboardCreateRequestBody, - createParams?: DashboardCreateRequestParams, isDashboardAppRequest: boolean = false ): Promise { const { core } = await requestCtx.resolve(['core']); @@ -45,7 +44,6 @@ export async function create( soAttributes, { references: soReferences, - ...(createParams?.id && { id: createParams.id }), ...(accessControl?.access_mode && supportsAccessControl && { accessControl: { diff --git a/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts b/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts index 9befc3b08665b..f562451d659ea 100644 --- a/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts +++ b/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts @@ -12,7 +12,6 @@ import type { RequestHandlerContext } from '@kbn/core/server'; import { once } from 'lodash'; import { getRouteConfig } from '../get_route_config'; import { - createRequestParamsSchema, getCreateRequestBodySchema, getCreateResponseBodySchema, } from './schemas'; @@ -25,7 +24,7 @@ export function registerCreateRoute( ) { const { basePath, routeConfig, routeVersion } = getRouteConfig(isDashboardAppRequest); const createRoute = router.post({ - path: `${basePath}/{id?}`, + path: basePath, summary: 'Create a dashboard with an auto-generated ID or a specified ID', ...routeConfig, }); @@ -42,7 +41,6 @@ export function registerCreateRoute( version: routeVersion, validate: () => ({ request: { - params: createRequestParamsSchema, body: getCreateRequestBodySchema(isDashboardAppRequest), }, response: { @@ -56,9 +54,6 @@ export function registerCreateRoute( 403: { description: 'Indicates that this call is forbidden.', }, - 409: { - description: 'Indicates that a dashboard with the given ID already exists.', - }, }, }), }, @@ -68,19 +63,10 @@ export function registerCreateRoute( ctx, getCachedDashboardStateSchema(), req.body, - req.params, isDashboardAppRequest ); return res.created({ body: result }); } catch (e) { - if (e.isBoom && e.output.statusCode === 409) { - return res.conflict({ - body: { - message: `A dashboard with ID ${req?.params?.id} already exists.`, - }, - }); - } - if (e.isBoom && e.output.statusCode === 403) { return res.forbidden({ body: { message: e.message } }); } diff --git a/src/platform/plugins/shared/dashboard/server/api/create/schemas.ts b/src/platform/plugins/shared/dashboard/server/api/create/schemas.ts index 7fe953fb4654c..8a58b7e806e4f 100644 --- a/src/platform/plugins/shared/dashboard/server/api/create/schemas.ts +++ b/src/platform/plugins/shared/dashboard/server/api/create/schemas.ts @@ -8,19 +8,9 @@ */ import { schema } from '@kbn/config-schema'; -import { asCodeIdSchema } from '@kbn/as-code-shared-schemas'; import { getDashboardStateSchema } from '../dashboard_state_schemas'; import { baseMetaSchema, createdMetaSchema, updatedMetaSchema } from '../meta_schemas'; -export const createRequestParamsSchema = schema.maybe( - schema.object( - { - id: asCodeIdSchema, - }, - { unknowns: 'forbid' } - ) -); - export function getCreateRequestBodySchema(isDashboardAppRequest: boolean) { return getDashboardStateSchema(isDashboardAppRequest); } diff --git a/src/platform/plugins/shared/dashboard/server/api/dashboard_state_schemas.ts b/src/platform/plugins/shared/dashboard/server/api/dashboard_state_schemas.ts index 84b85335cd4c9..f1fa47fb174c9 100644 --- a/src/platform/plugins/shared/dashboard/server/api/dashboard_state_schemas.ts +++ b/src/platform/plugins/shared/dashboard/server/api/dashboard_state_schemas.ts @@ -27,15 +27,6 @@ import { const MAX_PANELS = 100; -export const allowUnmappedKeysSchema = schema.boolean({ - defaultValue: false, - meta: { - deprecated: true, - description: - 'When enabled, dashboard REST endpoints support unmapped keys. Unmapped key schemas can be changed or removed without notice and are not supported.', - }, -}); - export const panelGridSchema = schema.object({ x: schema.number({ meta: { description: 'The x coordinate of the panel in grid units' } }), y: schema.number({ meta: { description: 'The y coordinate of the panel in grid units' } }), diff --git a/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts b/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts index 2fc2f47f0efea..aef8f6f69ca97 100644 --- a/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts +++ b/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts @@ -14,7 +14,7 @@ import { once } from 'lodash'; import { getRouteConfig } from '../get_route_config'; import { getUpdateRequestBodySchema, getUpdateResponseBodySchema } from './schemas'; import { update } from './update'; -import { allowUnmappedKeysSchema, getDashboardStateSchema } from '../dashboard_state_schemas'; +import { getDashboardStateSchema } from '../dashboard_state_schemas'; export function registerUpdateRoute( router: VersionedRouter, @@ -44,11 +44,6 @@ export function registerUpdateRoute( meta: { description: 'A unique identifier for the dashboard.' }, }), }), - query: schema.maybe( - schema.object({ - allowUnmappedKeys: schema.maybe(allowUnmappedKeysSchema), - }) - ), body: getUpdateRequestBodySchema(isDashboardAppRequest), }, response: { @@ -59,9 +54,6 @@ export function registerUpdateRoute( 403: { description: 'Indicates that this call is forbidden.', }, - 404: { - description: 'Indicates that the dashboard with the given ID is not found.', - }, }, }), }, @@ -76,13 +68,6 @@ export function registerUpdateRoute( ); return res.ok({ body: result }); } catch (e) { - if (e.isBoom && e.output.statusCode === 404) { - return res.notFound({ - body: { - message: `A dashboard with ID [${req.params.id}] was not found.`, - }, - }); - } if (e.isBoom && e.output.statusCode === 403) { return res.forbidden({ body: { message: e.message } }); } diff --git a/src/platform/plugins/shared/dashboard/server/api/update/update.ts b/src/platform/plugins/shared/dashboard/server/api/update/update.ts index 9b3db70966858..f042782198802 100644 --- a/src/platform/plugins/shared/dashboard/server/api/update/update.ts +++ b/src/platform/plugins/shared/dashboard/server/api/update/update.ts @@ -41,6 +41,7 @@ export async function update( soAttributes, { references: soReferences, + upsert: soAttributes, /** perform a "full" update instead, where the provided attributes will fully replace the existing ones */ mergeAttributes: false, } diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts index 02e713fb1d2ab..ad890a0db5e67 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts @@ -9,7 +9,7 @@ import type { RequestHandlerContext } from '@kbn/core/server'; import { MARKDOWN_SAVED_OBJECT_TYPE } from '../../../common/constants'; -import type { MarkdownCreateRequestBody, MarkdownCreateRequestParams } from './types'; +import type { MarkdownCreateRequestBody } from './types'; import { getMarkdownCRUResponseBody } from '../../saved_object_utils'; import type { MarkdownCreateResponseBody } from './types'; import type { MarkdownAttributes } from '../../markdown_saved_object'; @@ -17,14 +17,12 @@ import type { MarkdownAttributes } from '../../markdown_saved_object'; export async function create( requestCtx: RequestHandlerContext, createBody: MarkdownCreateRequestBody, - createParams?: MarkdownCreateRequestParams ): Promise { const { core } = await requestCtx.resolve(['core']); const savedObject = await core.savedObjects.client.create( MARKDOWN_SAVED_OBJECT_TYPE, createBody, - { ...(createParams?.id && { id: createParams.id }) } ); return getMarkdownCRUResponseBody(savedObject, 'create'); diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts index e52124dafb6eb..07decac3f665e 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts @@ -13,7 +13,6 @@ import type { RequestHandlerContext } from '@kbn/core/server'; import { commonRouteConfig, INTERNAL_API_VERSION } from '../constants'; import { createRequestBodySchema, - createRequestParamsSchema, createResponseBodySchema, } from './schemas'; import { create } from './create'; @@ -21,7 +20,7 @@ import { MARKDOWN_API_PATH } from '../../../common/constants'; export function registerCreateRoute(router: VersionedRouter) { const createRoute = router.post({ - path: `${MARKDOWN_API_PATH}/{id?}`, + path: MARKDOWN_API_PATH, summary: 'Create a markdown panel', ...commonRouteConfig, }); @@ -31,7 +30,6 @@ export function registerCreateRoute(router: VersionedRouter { try { - const result = await create(ctx, req.body, req.params); + const result = await create(ctx, req.body); return res.created({ body: result }); } catch (e) { - if (e.isBoom && e.output.statusCode === 409) { - return res.conflict({ - body: { - message: `A markdown panel with ID ${req?.params?.id} already exists.`, - }, - }); - } - if (e.isBoom && e.output.statusCode === 403) { return res.forbidden({ body: { message: e.message } }); } diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/create/schemas.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/create/schemas.ts index bbdc78f4c37b9..84f66c11a7ab3 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/create/schemas.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/create/schemas.ts @@ -8,19 +8,9 @@ */ import { schema } from '@kbn/config-schema'; -import { asCodeIdSchema } from '@kbn/as-code-shared-schemas'; import { baseMetaSchema, createdMetaSchema, updatedMetaSchema } from '../meta_schemas'; import { markdownAttributesSchema } from '../../markdown_saved_object/schema/v1'; -export const createRequestParamsSchema = schema.maybe( - schema.object( - { - id: asCodeIdSchema, - }, - { unknowns: 'forbid' } - ) -); - export const createRequestBodySchema = markdownAttributesSchema; export const createResponseBodySchema = schema.object({ diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/update/update.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/update/update.ts index 063b7635b4019..dbecbac1740dd 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/update/update.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/update/update.ts @@ -25,6 +25,7 @@ export async function update( id, updateBody, { + upsert: updateBody, /** perform a "full" update instead, where the provided attributes will fully replace the existing ones */ mergeAttributes: false, } From e5e507fdd6f0dcdf2f9120e1814e1028e79f993b Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 30 Mar 2026 11:41:11 -0600 Subject: [PATCH 02/19] clean up --- .../server/api/update/register_update_route.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts index 20c1505d50c08..3154cd4173a2a 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts @@ -45,9 +45,6 @@ export function registerUpdateRoute(router: VersionedRouter Date: Mon, 30 Mar 2026 12:12:31 -0600 Subject: [PATCH 03/19] use as code for id in update route --- .../dashboard/server/api/update/register_update_route.ts | 5 ++--- .../server/api/update/register_update_route.ts | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts b/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts index aef8f6f69ca97..8f842e26d9c26 100644 --- a/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts +++ b/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts @@ -15,6 +15,7 @@ import { getRouteConfig } from '../get_route_config'; import { getUpdateRequestBodySchema, getUpdateResponseBodySchema } from './schemas'; import { update } from './update'; import { getDashboardStateSchema } from '../dashboard_state_schemas'; +import { asCodeIdSchema } from 'src/platform/packages/shared/as-code/shared-schemas'; export function registerUpdateRoute( router: VersionedRouter, @@ -40,9 +41,7 @@ export function registerUpdateRoute( validate: () => ({ request: { params: schema.object({ - id: schema.string({ - meta: { description: 'A unique identifier for the dashboard.' }, - }), + id: asCodeIdSchema, }), body: getUpdateRequestBodySchema(isDashboardAppRequest), }, diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts index 3154cd4173a2a..ddef00ba53de9 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts @@ -14,6 +14,7 @@ import { INTERNAL_API_VERSION, commonRouteConfig } from '../constants'; import { updateRequestBodySchema, updateResponseBodySchema } from './schemas'; import { update } from './update'; import { MARKDOWN_API_PATH } from '../../../common/constants'; +import { asCodeIdSchema } from 'src/platform/packages/shared/as-code/shared-schemas'; export function registerUpdateRoute(router: VersionedRouter) { const updateRoute = router.put({ @@ -28,9 +29,7 @@ export function registerUpdateRoute(router: VersionedRouter Date: Mon, 30 Mar 2026 12:18:04 -0600 Subject: [PATCH 04/19] clean AsCodeId --- .../shared/as-code/shared-schemas/README.md | 4 --- .../shared/as-code/shared-schemas/index.ts | 2 -- .../shared-schemas/src/schemas/id/id.ts | 30 ++++++++----------- .../shared-schemas/src/schemas/id/index.ts | 1 - .../shared-schemas/src/schemas/types.ts | 10 ------- .../routes/visualizations/schema/create.ts | 2 +- 6 files changed, 14 insertions(+), 35 deletions(-) delete mode 100644 src/platform/packages/shared/as-code/shared-schemas/src/schemas/types.ts diff --git a/src/platform/packages/shared/as-code/shared-schemas/README.md b/src/platform/packages/shared/as-code/shared-schemas/README.md index 1fb5fd8adf753..2c4d96a8605ca 100644 --- a/src/platform/packages/shared/as-code/shared-schemas/README.md +++ b/src/platform/packages/shared/as-code/shared-schemas/README.md @@ -20,7 +20,3 @@ const result = idSchema.validate('dashboard_abc123'); // throws if invalid ## Exported Schemas - `asCodeIdSchema` — Validates As Code identifiers according to platform requirements. - -## Exported Types - -- `AsCodeId` - ID type diff --git a/src/platform/packages/shared/as-code/shared-schemas/index.ts b/src/platform/packages/shared/as-code/shared-schemas/index.ts index e99ebb441efee..9eadb6e73157c 100644 --- a/src/platform/packages/shared/as-code/shared-schemas/index.ts +++ b/src/platform/packages/shared/as-code/shared-schemas/index.ts @@ -8,5 +8,3 @@ */ export { asCodeIdSchema } from './src/schemas'; - -export type { AsCodeId } from './src/schemas/types'; diff --git a/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/id.ts b/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/id.ts index c9cfda6208a5e..6cd03c073ec6a 100644 --- a/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/id.ts +++ b/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/id.ts @@ -11,20 +11,16 @@ import type { TypeOf } from '@kbn/config-schema'; import { schema } from '@kbn/config-schema'; import { isValidId } from './is_valid_id'; -export const asCodeIdSchema = schema.maybe( - schema.string({ - meta: { - description: - 'A unique identifier. Must contain only lowercase letters, numbers, hyphens, and underscores.', - }, - validate: (value) => { - if (!isValidId(value)) { - return 'ID must contain only lowercase letters, numbers, hyphens, and underscores.'; - } - }, - minLength: 1, - maxLength: 250, - }) -); - -export type AsCodeId = TypeOf; +export const asCodeIdSchema = schema.string({ + meta: { + description: + 'A unique identifier. Must contain only lowercase letters, numbers, hyphens, and underscores.', + }, + validate: (value) => { + if (!isValidId(value)) { + return 'ID must contain only lowercase letters, numbers, hyphens, and underscores.'; + } + }, + minLength: 1, + maxLength: 250, +}); diff --git a/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/index.ts b/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/index.ts index 019c114537433..4140e62d1ca8b 100644 --- a/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/index.ts +++ b/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/index.ts @@ -8,4 +8,3 @@ */ export { asCodeIdSchema } from './id'; -export type { AsCodeId } from './id'; diff --git a/src/platform/packages/shared/as-code/shared-schemas/src/schemas/types.ts b/src/platform/packages/shared/as-code/shared-schemas/src/schemas/types.ts deleted file mode 100644 index 3bb34c2907cdb..0000000000000 --- a/src/platform/packages/shared/as-code/shared-schemas/src/schemas/types.ts +++ /dev/null @@ -1,10 +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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -export type { AsCodeId } from './id'; diff --git a/x-pack/platform/plugins/shared/lens/server/api/routes/visualizations/schema/create.ts b/x-pack/platform/plugins/shared/lens/server/api/routes/visualizations/schema/create.ts index 443bb507b2570..a6a10b1281fd8 100644 --- a/x-pack/platform/plugins/shared/lens/server/api/routes/visualizations/schema/create.ts +++ b/x-pack/platform/plugins/shared/lens/server/api/routes/visualizations/schema/create.ts @@ -15,7 +15,7 @@ import { lensResponseItemSchema } from './common'; export const lensCreateRequestParamsSchema = schema.object( { - id: asCodeIdSchema, + id: schema.maybe(asCodeIdSchema), }, { unknowns: 'forbid' } ); From 7dc96311d7d9913c46dbe9b672f4f618a2c0e097 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 30 Mar 2026 12:34:57 -0600 Subject: [PATCH 05/19] fix imports --- .../shared/dashboard/server/api/update/register_update_route.ts | 2 +- .../server/api/update/register_update_route.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts b/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts index 8f842e26d9c26..37b92e4cfbae2 100644 --- a/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts +++ b/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts @@ -11,11 +11,11 @@ import type { VersionedRouter } from '@kbn/core-http-server'; import type { RequestHandlerContext } from '@kbn/core/server'; import { schema } from '@kbn/config-schema'; import { once } from 'lodash'; +import { asCodeIdSchema } from '@kbn/as-code-shared-schemas'; import { getRouteConfig } from '../get_route_config'; import { getUpdateRequestBodySchema, getUpdateResponseBodySchema } from './schemas'; import { update } from './update'; import { getDashboardStateSchema } from '../dashboard_state_schemas'; -import { asCodeIdSchema } from 'src/platform/packages/shared/as-code/shared-schemas'; export function registerUpdateRoute( router: VersionedRouter, diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts index ddef00ba53de9..de0bd23345d96 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts @@ -10,11 +10,11 @@ import type { VersionedRouter } from '@kbn/core-http-server'; import type { RequestHandlerContext } from '@kbn/core/server'; import { schema } from '@kbn/config-schema'; +import { asCodeIdSchema } from '@kbn/as-code-shared-schemas'; import { INTERNAL_API_VERSION, commonRouteConfig } from '../constants'; import { updateRequestBodySchema, updateResponseBodySchema } from './schemas'; import { update } from './update'; import { MARKDOWN_API_PATH } from '../../../common/constants'; -import { asCodeIdSchema } from 'src/platform/packages/shared/as-code/shared-schemas'; export function registerUpdateRoute(router: VersionedRouter) { const updateRoute = router.put({ From 6ba3109d6b6f62efa00d5366e75a50ec6704b4a1 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 30 Mar 2026 12:50:57 -0600 Subject: [PATCH 06/19] clean up copy --- .../server/api/update/register_update_route.ts | 6 +++--- .../server/api/create/register_create_route.ts | 4 ++-- .../server/api/delete/register_delete_route.ts | 10 +++++----- .../server/api/read/register_read_route.ts | 11 ++++------- .../server/api/search/register_search_route.ts | 4 ++-- .../dashboard_markdown/server/api/search/schemas.ts | 6 +++--- .../server/api/update/register_update_route.ts | 6 +++--- .../server/markdown_saved_object/schema/v1/v1.ts | 4 ++-- 8 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts b/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts index 37b92e4cfbae2..f5c1613323e00 100644 --- a/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts +++ b/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts @@ -24,7 +24,7 @@ export function registerUpdateRoute( const { basePath, routeConfig, routeVersion } = getRouteConfig(isDashboardAppRequest); const updateRoute = router.put({ path: `${basePath}/{id}`, - summary: `Replace current dashboard state with the dashboard state from request body.`, + summary: `Upsert dashboard`, ...routeConfig, }); @@ -48,10 +48,10 @@ export function registerUpdateRoute( response: { 200: { body: () => getUpdateResponseBodySchema(isDashboardAppRequest), - description: 'Indicates the dashboard is updated successfully', + description: 'Indicates the dashboard is upserted successfully', }, 403: { - description: 'Indicates that this call is forbidden.', + description: 'Indicates that upsert is forbidden.', }, }, }), diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts index 07decac3f665e..2481d4c3fa16b 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts @@ -21,7 +21,7 @@ import { MARKDOWN_API_PATH } from '../../../common/constants'; export function registerCreateRoute(router: VersionedRouter) { const createRoute = router.post({ path: MARKDOWN_API_PATH, - summary: 'Create a markdown panel', + summary: 'Create a markdown library item', ...commonRouteConfig, }); @@ -35,7 +35,7 @@ export function registerCreateRoute(router: VersionedRouter createResponseBodySchema, - description: 'Indicates that a markdown panel is created successfully.', + description: 'Indicates that a markdown library item is created successfully.', }, 400: { description: 'Indicates an invalid schema or parameters.', diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/delete/register_delete_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/delete/register_delete_route.ts index 3bb087dbabb6a..1702b3d3bcc72 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/delete/register_delete_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/delete/register_delete_route.ts @@ -17,7 +17,7 @@ import { MARKDOWN_API_PATH } from '../../../common/constants'; export function registerDeleteRoute(router: VersionedRouter) { const deleteRoute = router.delete({ path: `${MARKDOWN_API_PATH}/{id}`, - summary: `Delete a markdown panel by ID.`, + summary: `Delete a markdown library item.`, ...commonRouteConfig, }); @@ -29,20 +29,20 @@ export function registerDeleteRoute(router: VersionedRouter) { const readRoute = router.get({ path: `${MARKDOWN_API_PATH}/{id}`, - summary: `Get a markdown panel by ID`, + summary: `Get a markdown library item by ID`, ...commonRouteConfig, }); @@ -30,7 +30,7 @@ export function registerReadRoute(router: VersionedRouter params: schema.object({ id: schema.string({ meta: { - description: 'A unique identifier for the markdown panel.', + description: 'A unique identifier for the markdown library item.', }, }), }), @@ -38,14 +38,11 @@ export function registerReadRoute(router: VersionedRouter response: { 200: { body: () => readResponseBodySchema, - description: 'Indicates that the markdown panel is retrieved successfully.', + description: 'Indicates that the markdown library item is retrieved successfully.', }, 403: { description: 'Indicates that this call is forbidden.', }, - 404: { - description: 'Indicates that the markdown panel with the given ID is not found.', - }, }, }, }, @@ -59,7 +56,7 @@ export function registerReadRoute(router: VersionedRouter if (e.isBoom && e.output.statusCode === 404) { return res.notFound({ body: { - message: `A markdown panel with ID ${req.params.id} was not found.`, + message: `A markdown library item with ID ${req.params.id} was not found.`, }, }); } diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/search/register_search_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/search/register_search_route.ts index a113a087f5f2c..9ad56c894cdbc 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/search/register_search_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/search/register_search_route.ts @@ -17,7 +17,7 @@ import { MARKDOWN_API_PATH } from '../../../common/constants'; export function registerSearchRoute(router: VersionedRouter) { const searchRoute = router.get({ path: MARKDOWN_API_PATH, - summary: `List markdown panels`, + summary: `List markdown library items`, ...commonRouteConfig, }); @@ -31,7 +31,7 @@ export function registerSearchRoute(router: VersionedRouter searchResponseBodySchema, - description: 'Indicates that the markdown panels is retrieved successfully.', + description: 'Indicates that the search is successful.', }, 403: { description: 'Indicates that this call is forbidden.', diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/search/schemas.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/search/schemas.ts index e4fc241f63e80..adb564515963a 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/search/schemas.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/search/schemas.ts @@ -17,21 +17,21 @@ export const searchRequestQuerySchema = schema.object({ schema.string({ meta: { description: - 'An Elasticsearch simple_query_string query that filters the markdown panels in the response by "title" and "description"', + 'An Elasticsearch simple_query_string query that filters markdown library items by "title" and "description"', }, }) ), page: schema.maybe( schema.number({ meta: { - description: 'The page of markdown panels to return', + description: 'The search page to return', }, }) ), per_page: schema.maybe( schema.number({ meta: { - description: 'The number of markdown panels to return per page', + description: 'The number of items to return per page', }, max: MAX_PER_PAGE, }) diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts index de0bd23345d96..162d73a734748 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts @@ -19,7 +19,7 @@ import { MARKDOWN_API_PATH } from '../../../common/constants'; export function registerUpdateRoute(router: VersionedRouter) { const updateRoute = router.put({ path: `${MARKDOWN_API_PATH}/{id}`, - summary: `Replace current markdown panel state with the markdown panel state from request body.`, + summary: `Upsert markdown library item`, ...commonRouteConfig, }); @@ -36,13 +36,13 @@ export function registerUpdateRoute(router: VersionedRouter updateResponseBodySchema, - description: 'Indicates that the markdown panel is updated successfully.', + description: 'Indicates the markdown library item is upserted successfully', }, 400: { description: 'Indicates an invalid schema or parameters.', }, 403: { - description: 'Indicates that this call is forbidden.', + description: 'Indicates that upsert is forbidden.', }, }, }, diff --git a/src/platform/plugins/shared/dashboard_markdown/server/markdown_saved_object/schema/v1/v1.ts b/src/platform/plugins/shared/dashboard_markdown/server/markdown_saved_object/schema/v1/v1.ts index 1fec0ea6c19bd..e16a6687aeb88 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/markdown_saved_object/schema/v1/v1.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/markdown_saved_object/schema/v1/v1.ts @@ -12,10 +12,10 @@ import { schema } from '@kbn/config-schema'; export const markdownAttributesSchema = schema.object( { title: schema.string({ - meta: { description: 'A human-readable title for the markdown panel' }, + meta: { description: 'A human-readable title' }, }), description: schema.maybe( - schema.string({ meta: { description: 'A short description of the markdown panel.' } }) + schema.string({ meta: { description: 'A short description.' } }) ), content: schema.string({ meta: { description: 'Markdown enriched text content' }, From 83b08d32087f4b5aefec5d85272725e11ae2bbd8 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 30 Mar 2026 13:21:13 -0600 Subject: [PATCH 07/19] tslint --- .../shared/as-code/shared-schemas/src/schemas/id/id.ts | 1 - .../plugins/shared/dashboard/server/api/create/types.ts | 3 --- .../shared/dashboard_markdown/server/api/create/types.ts | 2 -- 3 files changed, 6 deletions(-) diff --git a/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/id.ts b/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/id.ts index 6cd03c073ec6a..ce81ef860574b 100644 --- a/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/id.ts +++ b/src/platform/packages/shared/as-code/shared-schemas/src/schemas/id/id.ts @@ -7,7 +7,6 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { TypeOf } from '@kbn/config-schema'; import { schema } from '@kbn/config-schema'; import { isValidId } from './is_valid_id'; diff --git a/src/platform/plugins/shared/dashboard/server/api/create/types.ts b/src/platform/plugins/shared/dashboard/server/api/create/types.ts index 1d41949f03dc7..20cf90f185c83 100644 --- a/src/platform/plugins/shared/dashboard/server/api/create/types.ts +++ b/src/platform/plugins/shared/dashboard/server/api/create/types.ts @@ -9,13 +9,10 @@ import type { TypeOf } from '@kbn/config-schema'; import type { - createRequestParamsSchema, getCreateRequestBodySchema, getCreateResponseBodySchema, } from './schemas'; -/** The request params type for creating a dashboard. */ -export type DashboardCreateRequestParams = TypeOf; /** The request body type for creating a dashboard. */ export type DashboardCreateRequestBody = TypeOf>; /** The response body type for creating a dashboard. */ diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/create/types.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/create/types.ts index 84dd41161b030..397edaf2e1aa3 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/create/types.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/create/types.ts @@ -10,10 +10,8 @@ import type { TypeOf } from '@kbn/config-schema'; import type { createRequestBodySchema, - createRequestParamsSchema, createResponseBodySchema, } from './schemas'; -export type MarkdownCreateRequestParams = TypeOf; export type MarkdownCreateRequestBody = TypeOf; export type MarkdownCreateResponseBody = TypeOf; From b706b71d36c781e9d5460db7a0014dc240824d21 Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Mon, 30 Mar 2026 19:44:13 +0000 Subject: [PATCH 08/19] Changes from node scripts/jest_integration -u src/core/server/integration_tests/ci_checks --- .../ci_checks/saved_objects/check_registered_types.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index ac6b5788c10ee..7ec6c00e43a0b 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -147,7 +147,7 @@ describe('checking migration metadata changes on all registered SO types', () => "links": "5fb928a940af4360d4e84f55121aeebfd089c372896073875de8a9fb5b0d1e02", "maintenance-window": "666d3ec4bb27f84efe14aa17e9257f4c0eeee315b500de6b3b0b3b4ffeb71d04", "map": "7660b8b519a9a56f0f48af65d7a6fa103c1eb00009c1eb8827c6997c98791001", - "markdown": "e5f35bb7f64f1666a02919f95e22a7620cccc01933413c3a2986a16fcb42b9a2", + "markdown": "4942b33287c8a084d2b298a3d0ee23246fad29d37e354ea6cecd0d281e0f8eaf", "metrics-data-source": "26cff6bfde01fe7e798ae716d3786f5c165f6342050ca436d3b122cb010815d9", "metrics-explorer-view": "c75ae4b97007820e62cffc0a37b407bbb4f9222e1857cfac8fba1575889f5b2a", "ml-job": "c76b6c50ff95a890cd0991777f51ef98bae140a699d58ac2a64ead6c157cd914", @@ -1000,7 +1000,7 @@ describe('checking migration metadata changes on all registered SO types', () => "markdown|global: 02a5c250e23734d356cd7fd36b1d8bb44a97030f", "markdown|mappings: 16e53f65d58da76131a981a0f1bc10e7ead10ee9", "markdown|schemas: da39a3ee5e6b4b0d3255bfef95601890afd80709", - "markdown|10.1.0: 9edd32ab95c52a31924622c5a13a42f9ed4355bb0780b9c3b024bd57ff9445d4", + "markdown|10.1.0: 6a24188816fe1b9caf37fd4ab5337a8e62e5ab64219898dcf072842109692eb7", "=================================================================================", "metrics-data-source|global: 356d897223d1b613dbcc230d73ef4d4399f29ede", "metrics-data-source|mappings: e1b10e5bec060a176469a5e9a4f80c94e23abcd7", From d1cd5d6d64eda6775568a390c362c50b8594be90 Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Mon, 30 Mar 2026 19:49:38 +0000 Subject: [PATCH 09/19] Changes from node scripts/eslint_all_files --no-cache --fix --- .../dashboard/server/api/create/register_create_route.ts | 5 +---- .../plugins/shared/dashboard/server/api/create/types.ts | 5 +---- .../shared/dashboard_markdown/server/api/create/create.ts | 4 ++-- .../server/api/create/register_create_route.ts | 5 +---- .../shared/dashboard_markdown/server/api/create/types.ts | 5 +---- .../server/markdown_saved_object/schema/v1/v1.ts | 4 +--- 6 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts b/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts index f562451d659ea..ed6131d3dd8e1 100644 --- a/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts +++ b/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts @@ -11,10 +11,7 @@ import type { VersionedRouter } from '@kbn/core-http-server'; import type { RequestHandlerContext } from '@kbn/core/server'; import { once } from 'lodash'; import { getRouteConfig } from '../get_route_config'; -import { - getCreateRequestBodySchema, - getCreateResponseBodySchema, -} from './schemas'; +import { getCreateRequestBodySchema, getCreateResponseBodySchema } from './schemas'; import { create } from './create'; import { getDashboardStateSchema } from '../dashboard_state_schemas'; diff --git a/src/platform/plugins/shared/dashboard/server/api/create/types.ts b/src/platform/plugins/shared/dashboard/server/api/create/types.ts index 20cf90f185c83..1e1af90292acf 100644 --- a/src/platform/plugins/shared/dashboard/server/api/create/types.ts +++ b/src/platform/plugins/shared/dashboard/server/api/create/types.ts @@ -8,10 +8,7 @@ */ import type { TypeOf } from '@kbn/config-schema'; -import type { - getCreateRequestBodySchema, - getCreateResponseBodySchema, -} from './schemas'; +import type { getCreateRequestBodySchema, getCreateResponseBodySchema } from './schemas'; /** The request body type for creating a dashboard. */ export type DashboardCreateRequestBody = TypeOf>; diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts index ad890a0db5e67..c0c9f774171ac 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts @@ -16,13 +16,13 @@ import type { MarkdownAttributes } from '../../markdown_saved_object'; export async function create( requestCtx: RequestHandlerContext, - createBody: MarkdownCreateRequestBody, + createBody: MarkdownCreateRequestBody ): Promise { const { core } = await requestCtx.resolve(['core']); const savedObject = await core.savedObjects.client.create( MARKDOWN_SAVED_OBJECT_TYPE, - createBody, + createBody ); return getMarkdownCRUResponseBody(savedObject, 'create'); diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts index 2481d4c3fa16b..e1145972b839b 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts @@ -11,10 +11,7 @@ import type { VersionedRouter } from '@kbn/core-http-server'; import type { RequestHandlerContext } from '@kbn/core/server'; import { commonRouteConfig, INTERNAL_API_VERSION } from '../constants'; -import { - createRequestBodySchema, - createResponseBodySchema, -} from './schemas'; +import { createRequestBodySchema, createResponseBodySchema } from './schemas'; import { create } from './create'; import { MARKDOWN_API_PATH } from '../../../common/constants'; diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/create/types.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/create/types.ts index 397edaf2e1aa3..335d80555d7af 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/create/types.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/create/types.ts @@ -8,10 +8,7 @@ */ import type { TypeOf } from '@kbn/config-schema'; -import type { - createRequestBodySchema, - createResponseBodySchema, -} from './schemas'; +import type { createRequestBodySchema, createResponseBodySchema } from './schemas'; export type MarkdownCreateRequestBody = TypeOf; export type MarkdownCreateResponseBody = TypeOf; diff --git a/src/platform/plugins/shared/dashboard_markdown/server/markdown_saved_object/schema/v1/v1.ts b/src/platform/plugins/shared/dashboard_markdown/server/markdown_saved_object/schema/v1/v1.ts index e16a6687aeb88..438f919606937 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/markdown_saved_object/schema/v1/v1.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/markdown_saved_object/schema/v1/v1.ts @@ -14,9 +14,7 @@ export const markdownAttributesSchema = schema.object( title: schema.string({ meta: { description: 'A human-readable title' }, }), - description: schema.maybe( - schema.string({ meta: { description: 'A short description.' } }) - ), + description: schema.maybe(schema.string({ meta: { description: 'A short description.' } })), content: schema.string({ meta: { description: 'Markdown enriched text content' }, }), From 2fa04ef2455f688adc5d2739c361d95303a46a9d Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 30 Mar 2026 14:54:48 -0600 Subject: [PATCH 10/19] update API tests --- .../scout/api/tests/create_dashboard.spec.ts | 81 -------------- .../scout/api/tests/update_dashboard.spec.ts | 20 ++-- .../scout/api/tests/create_markdown.spec.ts | 102 ------------------ .../scout/api/tests/update_markdown.spec.ts | 23 ++-- 4 files changed, 24 insertions(+), 202 deletions(-) diff --git a/src/platform/plugins/shared/dashboard/test/scout/api/tests/create_dashboard.spec.ts b/src/platform/plugins/shared/dashboard/test/scout/api/tests/create_dashboard.spec.ts index 8af8993a500df..8752daea885c2 100644 --- a/src/platform/plugins/shared/dashboard/test/scout/api/tests/create_dashboard.spec.ts +++ b/src/platform/plugins/shared/dashboard/test/scout/api/tests/create_dashboard.spec.ts @@ -15,7 +15,6 @@ import { COMMON_HEADERS, DASHBOARD_API_PATH, KBN_ARCHIVES, - TEST_DASHBOARD_ID, } from '../fixtures'; apiTest.describe('dashboards - create', { tag: tags.deploymentAgnostic }, () => { @@ -52,25 +51,6 @@ apiTest.describe('dashboards - create', { tag: tags.deploymentAgnostic }, () => expect(response.body.data.title).toStrictEqual(title); }); - apiTest('can create a dashboard with a specific id', async ({ apiClient }) => { - const title = `foo-${Date.now()}-${Math.random()}`; - const id = `bar-${Date.now()}`; - - const response = await apiClient.post(`${DASHBOARD_API_PATH}/${id}`, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - title, - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(201); - expect(response.body.id).toBe(id); - }); - // TODO Maybe move this test to x-pack/platform/test/api_integration/dashboards apiTest('can create a dashboard in a defined space', async ({ apiClient }) => { const title = `foo-${Date.now()}-${Math.random()}`; @@ -90,67 +70,6 @@ apiTest.describe('dashboards - create', { tag: tags.deploymentAgnostic }, () => expect(response).toHaveStatusCode(201); }); - apiTest('return error if provided id already exists', async ({ apiClient }) => { - const title = `foo-${Date.now()}-${Math.random()}`; - - const response = await apiClient.post(`${DASHBOARD_API_PATH}/${TEST_DASHBOARD_ID}`, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - title, - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(409); - expect(response.body.message).toBe(`A dashboard with ID ${TEST_DASHBOARD_ID} already exists.`); - }); - - apiTest('validation - returns error when id is too long', async ({ apiClient }) => { - const id = `this-is-my-test-dashboard-with-specific-identifier-that-is-way-more-than-two-hundred-and-fifty-characters-and-should-fail-validation-because-it-is-much-too-long-and-should-be-two-hundred-and-fifty-characters-or-less-to-be-a-valid-identifier-1234567890_`; - const response = await apiClient.post(`${DASHBOARD_API_PATH}/${id}`, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - content: '# Test', - title: 'Test title', - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(400); - expect(response.body.message).toBe( - '[request params.id]: value has length [252] but it must have a maximum length of [250].' - ); - }); - - apiTest( - 'validation - returns error when id contains invalid characters', - async ({ apiClient }) => { - const id = `test-dashboard-with-Specific-id-that.contains&invalid*characters`; - const response = await apiClient.post(`${DASHBOARD_API_PATH}/${id}`, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - content: '# Test', - title: 'Test title', - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(400); - expect(response.body.message).toBe( - '[request params.id]: ID must contain only lowercase letters, numbers, hyphens, and underscores.' - ); - } - ); - apiTest('validation - returns error when title is not provided', async ({ apiClient }) => { const response = await apiClient.post(DASHBOARD_API_PATH, { headers: { diff --git a/src/platform/plugins/shared/dashboard/test/scout/api/tests/update_dashboard.spec.ts b/src/platform/plugins/shared/dashboard/test/scout/api/tests/update_dashboard.spec.ts index 72d8b8f006b2f..969635d6022e1 100644 --- a/src/platform/plugins/shared/dashboard/test/scout/api/tests/update_dashboard.spec.ts +++ b/src/platform/plugins/shared/dashboard/test/scout/api/tests/update_dashboard.spec.ts @@ -18,7 +18,7 @@ import { TEST_DASHBOARD_ID, } from '../fixtures'; -apiTest.describe('dashboards - update', { tag: tags.deploymentAgnostic }, () => { +apiTest.describe('dashboards - upsert', { tag: tags.deploymentAgnostic }, () => { let editorCredentials: RoleApiCredentials; let viewerCredentials: RoleApiCredentials; @@ -34,7 +34,7 @@ apiTest.describe('dashboards - update', { tag: tags.deploymentAgnostic }, () => await kbnClient.savedObjects.cleanStandardList(); }); - apiTest('should return 200 with an updated dashboard', async ({ apiClient }) => { + apiTest('should update existing dashboard', async ({ apiClient }) => { const response = await apiClient.put(`${DASHBOARD_API_PATH}/${TEST_DASHBOARD_ID}`, { headers: { ...COMMON_HEADERS, @@ -51,23 +51,23 @@ apiTest.describe('dashboards - update', { tag: tags.deploymentAgnostic }, () => expect(response.body.data.title).toBe('Refresh Requests (Updated)'); }); - apiTest('should return 404 when updating a non-existent dashboard', async ({ apiClient }) => { - const response = await apiClient.put(`${DASHBOARD_API_PATH}/not-an-id`, { + apiTest('should create new dashboard', async ({ apiClient }) => { + const id = 'new-dashboard-id'; + const title = `I'm a new dashboard`; + const response = await apiClient.put(`${DASHBOARD_API_PATH}/${id}`, { headers: { ...COMMON_HEADERS, ...editorCredentials.apiKeyHeader, }, body: { - title: 'Some other dashboard (updated)', + title: `I'm a new dashboard`, }, responseType: 'json', }); - expect(response.body).toStrictEqual({ - statusCode: 404, - error: 'Not Found', - message: 'A dashboard with ID [not-an-id] was not found.', - }); + expect(response).toHaveStatusCode(200); + expect(response.body.id).toBe(id); + expect(response.body.data.title).toBe(title); }); apiTest('validation - returns error when object is not provided', async ({ apiClient }) => { diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts index a29ffcb9c1011..2b1ea403a44b7 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts @@ -50,27 +50,6 @@ apiTest.describe('markdown - create', { tag: tags.deploymentAgnostic }, () => { }); }); - apiTest('can create a markdown panel with a specific id', async ({ apiClient }) => { - const content = `Test content ${Date.now()}`; - const title = `Test title ${Date.now()}`; - const id = `test-markdown-with-specific-id`; - - const response = await apiClient.post(`${MARKDOWN_API_PATH}/${id}`, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - content, - title, - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(201); - expect(response.body.id).toBe(id); - }); - apiTest('can create a markdown panel with all attributes', async ({ apiClient }) => { const response = await apiClient.post(MARKDOWN_API_PATH, { headers: { @@ -112,26 +91,6 @@ apiTest.describe('markdown - create', { tag: tags.deploymentAgnostic }, () => { expect(response.body.data).toMatchObject({ content, title }); }); - apiTest('should create a markdown panel with a specific id in a space', async ({ apiClient }) => { - const id = `space-markdown-custom-id`; - - const response = await apiClient.post(`s/${spaceId}/${MARKDOWN_API_PATH}/${id}`, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - title: 'Space Markdown Panel', - description: 'A panel in this custom space with a custom id', - content: 'Space content with custom id', - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(201); - expect(response.body.id).toBe(id); - }); - apiTest( 'markdown created in a space should not be accessible from the default space', async ({ apiClient }) => { @@ -201,67 +160,6 @@ apiTest.describe('markdown - create', { tag: tags.deploymentAgnostic }, () => { ); }); - apiTest('validation - returns error when id already exists', async ({ apiClient }) => { - const id = `test-markdown-with-specific-id`; - const response = await apiClient.post(`${MARKDOWN_API_PATH}/${id}`, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - content: '# Test', - title: 'Test title', - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(409); - expect(response.body.message).toBe(`A markdown panel with ID ${id} already exists.`); - }); - - apiTest('validation - returns error when id is too long', async ({ apiClient }) => { - const id = `this-is-my-test-markdown-with-specific-identifier-that-is-way-more-than-two-hundred-and-fifty-characters-and-should-fail-validation-because-it-is-much-too-long-and-should-be-two-hundred-and-fifty-characters-or-less-to-be-a-valid-identifier-1234567890_`; - const response = await apiClient.post(`${MARKDOWN_API_PATH}/${id}`, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - content: '# Test', - title: 'Test title', - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(400); - expect(response.body.message).toBe( - '[request params.id]: value has length [251] but it must have a maximum length of [250].' - ); - }); - - apiTest( - 'validation - returns error when id contains invalid characters', - async ({ apiClient }) => { - const id = `test-markdown-with-Specific-id-that.contains&invalid*characters`; - const response = await apiClient.post(`${MARKDOWN_API_PATH}/${id}`, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - content: '# Test', - title: 'Test title', - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(400); - expect(response.body.message).toBe( - '[request params.id]: ID must contain only lowercase letters, numbers, hyphens, and underscores.' - ); - } - ); - apiTest( 'validation - returns error when unknown attributes are provided', async ({ apiClient }) => { diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts index f17ba8b117c8b..8bf7122326f52 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts @@ -15,7 +15,7 @@ import { apiTest, COMMON_HEADERS, MARKDOWN_API_PATH } from '../fixtures'; const TEST_MARKDOWN_ID = 'test-update-markdown'; const TEST_MARKDOWN_ID_IN_SPACE = 'test-update-markdown-in-space'; -apiTest.describe('markdown - update', { tag: tags.deploymentAgnostic }, () => { +apiTest.describe('markdown - upsert', { tag: tags.deploymentAgnostic }, () => { let editorCredentials: RoleApiCredentials; const spaceId = `markdown-update-space-id`; @@ -51,7 +51,7 @@ apiTest.describe('markdown - update', { tag: tags.deploymentAgnostic }, () => { await kbnClient.savedObjects.cleanStandardList(); }); - apiTest('should return 200 with an updated markdown panel', async ({ apiClient }) => { + apiTest('should update existing markdown library item', async ({ apiClient }) => { const response = await apiClient.put(`${MARKDOWN_API_PATH}/${TEST_MARKDOWN_ID}`, { headers: { ...COMMON_HEADERS, @@ -73,7 +73,7 @@ apiTest.describe('markdown - update', { tag: tags.deploymentAgnostic }, () => { }); apiTest( - 'should return 200 with an updated markdown panel in a specific space', + 'should update existing markdown library item in a specific space', async ({ apiClient }) => { const response = await apiClient.put( `s/${spaceId}/${MARKDOWN_API_PATH}/${TEST_MARKDOWN_ID_IN_SPACE}`, @@ -100,22 +100,27 @@ apiTest.describe('markdown - update', { tag: tags.deploymentAgnostic }, () => { ); apiTest( - 'should return 404 when updating a non-existent markdown panel', + 'should create new markdown library item', async ({ apiClient }) => { - const response = await apiClient.put(`${MARKDOWN_API_PATH}/not-an-id`, { + const id = 'new-markdown'; + const response = await apiClient.put(`${MARKDOWN_API_PATH}/${id}`, { headers: { ...COMMON_HEADERS, ...editorCredentials.apiKeyHeader, }, body: { - title: 'Does not matter', - content: '# Does not matter', + title: 'New markdown', + content: '# hello world', }, responseType: 'json', }); - expect(response).toHaveStatusCode(404); - expect(response.body.message).toBe('A markdown panel with ID not-an-id was not found.'); + expect(response).toHaveStatusCode(200); + expect(response.body.id).toBe(id); + expect(response.body.data).toMatchObject({ + title: 'New markdown', + content: '# hello world', + }); } ); From 2345c51d3f5dfd1a3f95edcbb5323956a90f48bd Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Mon, 30 Mar 2026 21:23:22 +0000 Subject: [PATCH 11/19] Changes from node scripts/eslint_all_files --no-cache --fix --- .../scout/api/tests/create_dashboard.spec.ts | 7 +--- .../scout/api/tests/update_markdown.spec.ts | 41 +++++++++---------- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/platform/plugins/shared/dashboard/test/scout/api/tests/create_dashboard.spec.ts b/src/platform/plugins/shared/dashboard/test/scout/api/tests/create_dashboard.spec.ts index 8752daea885c2..c1e14fe1a9a5b 100644 --- a/src/platform/plugins/shared/dashboard/test/scout/api/tests/create_dashboard.spec.ts +++ b/src/platform/plugins/shared/dashboard/test/scout/api/tests/create_dashboard.spec.ts @@ -10,12 +10,7 @@ import type { RoleApiCredentials } from '@kbn/scout'; import { expect } from '@kbn/scout/api'; import { tags } from '@kbn/scout'; -import { - apiTest, - COMMON_HEADERS, - DASHBOARD_API_PATH, - KBN_ARCHIVES, -} from '../fixtures'; +import { apiTest, COMMON_HEADERS, DASHBOARD_API_PATH, KBN_ARCHIVES } from '../fixtures'; apiTest.describe('dashboards - create', { tag: tags.deploymentAgnostic }, () => { let editorCredentials: RoleApiCredentials; diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts index 8bf7122326f52..fdffcd04cdaf0 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts @@ -99,30 +99,27 @@ apiTest.describe('markdown - upsert', { tag: tags.deploymentAgnostic }, () => { } ); - apiTest( - 'should create new markdown library item', - async ({ apiClient }) => { - const id = 'new-markdown'; - const response = await apiClient.put(`${MARKDOWN_API_PATH}/${id}`, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - title: 'New markdown', - content: '# hello world', - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(200); - expect(response.body.id).toBe(id); - expect(response.body.data).toMatchObject({ + apiTest('should create new markdown library item', async ({ apiClient }) => { + const id = 'new-markdown'; + const response = await apiClient.put(`${MARKDOWN_API_PATH}/${id}`, { + headers: { + ...COMMON_HEADERS, + ...editorCredentials.apiKeyHeader, + }, + body: { title: 'New markdown', content: '# hello world', - }); - } - ); + }, + responseType: 'json', + }); + + expect(response).toHaveStatusCode(200); + expect(response.body.id).toBe(id); + expect(response.body.data).toMatchObject({ + title: 'New markdown', + content: '# hello world', + }); + }); apiTest('validation - returns error when content is not provided', async ({ apiClient }) => { const response = await apiClient.put(`${MARKDOWN_API_PATH}/${TEST_MARKDOWN_ID}`, { From 907a8f4b9a7f13b7a669d80112e3426b0e5133af Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 31 Mar 2026 08:19:40 -0600 Subject: [PATCH 12/19] fix tests --- .../test/scout/api/tests/create_markdown.spec.ts | 4 ++-- .../test/scout/api/tests/delete_markdown.spec.ts | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts index 2b1ea403a44b7..e00306dee0f86 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts @@ -98,7 +98,7 @@ apiTest.describe('markdown - create', { tag: tags.deploymentAgnostic }, () => { const id = `isolated-markdown-panel`; const title = `Isolated markdown panel ${Date.now()}`; - const createResponse = await apiClient.post(`s/${spaceId}/${MARKDOWN_API_PATH}/${id}`, { + const createResponse = await apiClient.post(`s/${spaceId}/${MARKDOWN_API_PATH}`, { headers: { ...COMMON_HEADERS, ...editorCredentials.apiKeyHeader, @@ -112,7 +112,7 @@ apiTest.describe('markdown - create', { tag: tags.deploymentAgnostic }, () => { expect(createResponse).toHaveStatusCode(201); - const getResponse = await apiClient.get(`${MARKDOWN_API_PATH}/${id}`, { + const getResponse = await apiClient.get(`${MARKDOWN_API_PATH}/${createResponse.body.id}`, { headers: { ...COMMON_HEADERS, ...editorCredentials.apiKeyHeader, diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts index 668f61225a132..259b6e96e0469 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts @@ -61,9 +61,6 @@ apiTest.describe('markdown - delete', { tag: tags.deploymentAgnostic }, () => { }); expect(response).toHaveStatusCode(404); - expect(response.body.message).toBe( - 'A markdown panel with ID non-existent-markdown was not found.' - ); }); apiTest('should return 204 if the markdown panel is deleted', async ({ apiClient }) => { @@ -108,7 +105,6 @@ apiTest.describe('markdown - delete', { tag: tags.deploymentAgnostic }, () => { }); expect(response).toHaveStatusCode(403); - expect(response.body.message).toBe('Unable to delete markdown'); } ); }); From a9892e571f573e104bc8810b15676ce81abb3194 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 31 Mar 2026 08:50:15 -0600 Subject: [PATCH 13/19] tslint --- .../scout/api/tests/create_markdown.spec.ts | 33 ++++--------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts index e00306dee0f86..86b78018321e2 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/create_markdown.spec.ts @@ -28,7 +28,7 @@ apiTest.describe('markdown - create', { tag: tags.deploymentAgnostic }, () => { await kbnClient.savedObjects.clean({ types: ['markdown'] }); }); - apiTest('should create a markdown panel', async ({ apiClient }) => { + apiTest('should create a markdown library item', async ({ apiClient }) => { const content = '# Hello world'; const title = `Test title ${Date.now()}`; const response = await apiClient.post(MARKDOWN_API_PATH, { @@ -38,6 +38,7 @@ apiTest.describe('markdown - create', { tag: tags.deploymentAgnostic }, () => { }, body: { content, + description: 'some description', title, }, responseType: 'json', @@ -46,33 +47,12 @@ apiTest.describe('markdown - create', { tag: tags.deploymentAgnostic }, () => { expect(response).toHaveStatusCode(201); expect(response.body.data).toMatchObject({ content, + description: 'some description', title, }); }); - apiTest('can create a markdown panel with all attributes', async ({ apiClient }) => { - const response = await apiClient.post(MARKDOWN_API_PATH, { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - body: { - title: 'My Markdown Panel', - description: 'A description of this panel', - content: '## Heading\n\nSome **bold** text', - }, - responseType: 'json', - }); - - expect(response).toHaveStatusCode(201); - expect(response.body.data).toMatchObject({ - title: 'My Markdown Panel', - description: 'A description of this panel', - content: '## Heading\n\nSome **bold** text', - }); - }); - - apiTest('should create a markdown panel in a specific space', async ({ apiClient }) => { + apiTest('should create a markdown library item in a specific space', async ({ apiClient }) => { const content = '# Space-scoped markdown'; const title = `Space-scoped markdown ${Date.now()}`; const response = await apiClient.post(`s/${spaceId}/${MARKDOWN_API_PATH}`, { @@ -95,8 +75,7 @@ apiTest.describe('markdown - create', { tag: tags.deploymentAgnostic }, () => { 'markdown created in a space should not be accessible from the default space', async ({ apiClient }) => { const content = `Isolated content`; - const id = `isolated-markdown-panel`; - const title = `Isolated markdown panel ${Date.now()}`; + const title = 'Isolated markdown library item'; const createResponse = await apiClient.post(`s/${spaceId}/${MARKDOWN_API_PATH}`, { headers: { @@ -180,7 +159,7 @@ apiTest.describe('markdown - create', { tag: tags.deploymentAgnostic }, () => { ); apiTest( - 'authorization - returns error when user does not have permission to create markdown panels', + 'authorization - returns error when user does not have permission to create library item', async ({ apiClient }) => { const response = await apiClient.post(MARKDOWN_API_PATH, { headers: { From e8e4202caa87a62b97046c4a4fb55f5f43510b61 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 31 Mar 2026 08:54:30 -0600 Subject: [PATCH 14/19] clean up test names --- .../test/scout/api/tests/delete_markdown.spec.ts | 8 ++++---- .../test/scout/api/tests/get_markdown.spec.ts | 6 +++--- .../test/scout/api/tests/search_markdowns.spec.ts | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts index 259b6e96e0469..a4151e0b6e178 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts @@ -51,7 +51,7 @@ apiTest.describe('markdown - delete', { tag: tags.deploymentAgnostic }, () => { await kbnClient.savedObjects.cleanStandardList(); }); - apiTest('should return 404 for a non-existent markdown panel', async ({ apiClient }) => { + apiTest('should return 404 for a non-existent markdown library item', async ({ apiClient }) => { const response = await apiClient.delete(`${MARKDOWN_API_PATH}/non-existent-markdown`, { headers: { ...COMMON_HEADERS, @@ -63,7 +63,7 @@ apiTest.describe('markdown - delete', { tag: tags.deploymentAgnostic }, () => { expect(response).toHaveStatusCode(404); }); - apiTest('should return 204 if the markdown panel is deleted', async ({ apiClient }) => { + apiTest('should return 204 when a markdown library item is deleted', async ({ apiClient }) => { const response = await apiClient.delete(`${MARKDOWN_API_PATH}/${TEST_MARKDOWN_ID}`, { headers: { ...COMMON_HEADERS, @@ -76,7 +76,7 @@ apiTest.describe('markdown - delete', { tag: tags.deploymentAgnostic }, () => { }); apiTest( - 'should return 204 if the markdown panel is deleted in a specific space', + 'should return 204 when deleted in a specific space', async ({ apiClient }) => { const response = await apiClient.delete( `s/${spaceId}/${MARKDOWN_API_PATH}/${TEST_MARKDOWN_ID_IN_SPACE}`, @@ -94,7 +94,7 @@ apiTest.describe('markdown - delete', { tag: tags.deploymentAgnostic }, () => { ); apiTest( - 'authorization - returns error when user does not have permission to delete markdown panels', + 'authorization - returns error when user does not have permission to delete library item', async ({ apiClient }) => { const response = await apiClient.delete(`${MARKDOWN_API_PATH}/${TEST_MARKDOWN_ID}`, { headers: { diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/get_markdown.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/get_markdown.spec.ts index 7bdf251bd1586..39dd4992859cc 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/get_markdown.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/get_markdown.spec.ts @@ -51,7 +51,7 @@ apiTest.describe('markdown - get', { tag: tags.deploymentAgnostic }, () => { await kbnClient.savedObjects.cleanStandardList(); }); - apiTest('should return 200 with an existing markdown panel', async ({ apiClient }) => { + apiTest('should return 200 with an existing markdown library item', async ({ apiClient }) => { const response = await apiClient.get(`${MARKDOWN_API_PATH}/${TEST_MARKDOWN_ID}`, { headers: { ...COMMON_HEADERS, @@ -70,7 +70,7 @@ apiTest.describe('markdown - get', { tag: tags.deploymentAgnostic }, () => { }); apiTest( - 'should return 200 with an existing markdown panel in a specific space', + 'should return 200 with an existing markdown library in a specific space', async ({ apiClient }) => { const response = await apiClient.get( `s/${spaceId}/${MARKDOWN_API_PATH}/${TEST_MARKDOWN_ID_IN_SPACE}`, @@ -93,7 +93,7 @@ apiTest.describe('markdown - get', { tag: tags.deploymentAgnostic }, () => { } ); - apiTest('should return 404 with a non-existing markdown panel', async ({ apiClient }) => { + apiTest('should return 404 with a non-existing markdown library item', async ({ apiClient }) => { const response = await apiClient.get(`${MARKDOWN_API_PATH}/does-not-exist`, { headers: { ...COMMON_HEADERS, diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/search_markdowns.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/search_markdowns.spec.ts index 3a1786ddfd303..a0c02290e7002 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/search_markdowns.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/search_markdowns.spec.ts @@ -30,7 +30,7 @@ apiTest.describe('markdown - search', { tag: tags.deploymentAgnostic }, () => { await kbnClient.savedObjects.cleanStandardList(); }); - apiTest('should retrieve a paginated list of markdown panels', async ({ apiClient }) => { + apiTest('should retrieve a paginated list of markdown library items', async ({ apiClient }) => { const response = await apiClient.get(SEARCH_ENDPOINT, { headers: { ...COMMON_HEADERS, @@ -73,7 +73,7 @@ apiTest.describe('markdown - search', { tag: tags.deploymentAgnostic }, () => { }); apiTest( - 'should allow users to paginate through the list of markdown panels', + 'should allow users to paginate through the list of markdown library items', async ({ apiClient }) => { const response = await apiClient.get(`${SEARCH_ENDPOINT}?page=2&per_page=10`, { headers: { From e8d6286ab15e0c3ce2bab34e87e879da2cc9500b Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:56:54 +0000 Subject: [PATCH 15/19] Changes from node scripts/eslint_all_files --no-cache --fix --- .../scout/api/tests/delete_markdown.spec.ts | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts index a4151e0b6e178..0ea6c7aae88e7 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/delete_markdown.spec.ts @@ -75,23 +75,20 @@ apiTest.describe('markdown - delete', { tag: tags.deploymentAgnostic }, () => { expect(response).toHaveStatusCode(204); }); - apiTest( - 'should return 204 when deleted in a specific space', - async ({ apiClient }) => { - const response = await apiClient.delete( - `s/${spaceId}/${MARKDOWN_API_PATH}/${TEST_MARKDOWN_ID_IN_SPACE}`, - { - headers: { - ...COMMON_HEADERS, - ...editorCredentials.apiKeyHeader, - }, - responseType: 'json', - } - ); + apiTest('should return 204 when deleted in a specific space', async ({ apiClient }) => { + const response = await apiClient.delete( + `s/${spaceId}/${MARKDOWN_API_PATH}/${TEST_MARKDOWN_ID_IN_SPACE}`, + { + headers: { + ...COMMON_HEADERS, + ...editorCredentials.apiKeyHeader, + }, + responseType: 'json', + } + ); - expect(response).toHaveStatusCode(204); - } - ); + expect(response).toHaveStatusCode(204); + }); apiTest( 'authorization - returns error when user does not have permission to delete library item', From 1adf80b1812e593cdcdf705cd6b535498251b328 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 31 Mar 2026 17:10:47 -0600 Subject: [PATCH 16/19] return 201 on create --- .../server/api/create/register_create_route.ts | 6 +++--- .../server/api/delete/register_delete_route.ts | 6 +++--- .../server/api/read/register_read_route.ts | 6 +++--- .../dashboard/server/api/saved_object_utils.ts | 11 ++++------- .../server/api/search/register_search_route.ts | 4 ++-- .../server/api/update/register_update_route.ts | 12 +++++++++--- .../shared/dashboard/server/api/update/schemas.ts | 4 ++-- .../server/api/create/register_create_route.ts | 6 +++--- .../server/api/delete/register_delete_route.ts | 6 +++--- .../server/api/read/register_read_route.ts | 4 ++-- .../server/api/search/register_search_route.ts | 4 ++-- .../server/api/update/register_update_route.ts | 14 ++++++++++---- .../server/api/update/schemas.ts | 4 ++-- .../server/saved_object_utils.ts | 14 +++++--------- 14 files changed, 53 insertions(+), 48 deletions(-) diff --git a/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts b/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts index ed6131d3dd8e1..89d13d4c384ab 100644 --- a/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts +++ b/src/platform/plugins/shared/dashboard/server/api/create/register_create_route.ts @@ -43,13 +43,13 @@ export function registerCreateRoute( response: { 201: { body: () => getCreateResponseBodySchema(isDashboardAppRequest), - description: 'Indicates the dashboard is created successfully', + description: 'created', }, 400: { - description: 'Indicates an invalid schema or parameters.', + description: 'invalid request', }, 403: { - description: 'Indicates that this call is forbidden.', + description: 'forbidden', }, }, }), diff --git a/src/platform/plugins/shared/dashboard/server/api/delete/register_delete_route.ts b/src/platform/plugins/shared/dashboard/server/api/delete/register_delete_route.ts index 41adcdccae99b..03521907e56dc 100644 --- a/src/platform/plugins/shared/dashboard/server/api/delete/register_delete_route.ts +++ b/src/platform/plugins/shared/dashboard/server/api/delete/register_delete_route.ts @@ -36,13 +36,13 @@ export function registerDeleteRoute(router: VersionedRouter getReadResponseBodySchema(isDashboardAppRequest), - description: 'Indicates the dashboard with the given ID is retrieved successfully', + description: 'success', }, 403: { - description: 'Indicates that this call is forbidden.', + description: 'forbidden', }, 404: { - description: 'Indicates that the dashboard with the given ID is not found.', + description: 'not found', }, }, }), diff --git a/src/platform/plugins/shared/dashboard/server/api/saved_object_utils.ts b/src/platform/plugins/shared/dashboard/server/api/saved_object_utils.ts index 642d51d071baf..1b7a8f2ceda2d 100644 --- a/src/platform/plugins/shared/dashboard/server/api/saved_object_utils.ts +++ b/src/platform/plugins/shared/dashboard/server/api/saved_object_utils.ts @@ -19,20 +19,17 @@ import type { Warnings } from './types'; export function getDashboardMeta( savedObject: | SavedObject - | SavedObjectsUpdateResponse, - operation: 'create' | 'read' | 'update' | 'search' + | SavedObjectsUpdateResponse ) { return { error: savedObject.error, + ...(savedObject.created_at && { created_at: savedObject.created_at }), + ...(savedObject.created_at && { created_at: savedObject.created_at }), managed: savedObject.managed, owner: savedObject.accessControl?.owner, updated_at: savedObject.updated_at, updated_by: savedObject.updated_by, version: savedObject.version ?? '', - ...(['create', 'read', 'search'].includes(operation) && { - created_at: savedObject.created_at, - created_by: savedObject.created_by, - }), }; } @@ -80,7 +77,7 @@ export function getDashboardCRUResponseBody( }, }), }, - meta: getDashboardMeta(savedObject, operation), + meta: getDashboardMeta(savedObject), ...(operation === 'read' && warnings?.length && { warnings }), }; } diff --git a/src/platform/plugins/shared/dashboard/server/api/search/register_search_route.ts b/src/platform/plugins/shared/dashboard/server/api/search/register_search_route.ts index 8639c700ab5c0..f3432ea47410d 100644 --- a/src/platform/plugins/shared/dashboard/server/api/search/register_search_route.ts +++ b/src/platform/plugins/shared/dashboard/server/api/search/register_search_route.ts @@ -31,10 +31,10 @@ export function registerSearchRoute(router: VersionedRouter searchResponseBodySchema, - description: 'Indicates the search is successful and the dashboards are retrieved', + description: 'success', }, 403: { - description: 'Indicates that this call is forbidden.', + description: 'forbidden', }, }, }, diff --git a/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts b/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts index f5c1613323e00..1cc8ac13631ca 100644 --- a/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts +++ b/src/platform/plugins/shared/dashboard/server/api/update/register_update_route.ts @@ -48,10 +48,14 @@ export function registerUpdateRoute( response: { 200: { body: () => getUpdateResponseBodySchema(isDashboardAppRequest), - description: 'Indicates the dashboard is upserted successfully', + description: 'updated', + }, + 201: { + body: () => getUpdateResponseBodySchema(isDashboardAppRequest), + description: 'created', }, 403: { - description: 'Indicates that upsert is forbidden.', + description: 'forbidden', }, }, }), @@ -65,7 +69,9 @@ export function registerUpdateRoute( req.body, isDashboardAppRequest ); - return res.ok({ body: result }); + return result.meta.updated_at === result.meta.created_at + ? res.created({ body: result }) + : res.ok({ body: result }); } catch (e) { if (e.isBoom && e.output.statusCode === 403) { return res.forbidden({ body: { message: e.message } }); diff --git a/src/platform/plugins/shared/dashboard/server/api/update/schemas.ts b/src/platform/plugins/shared/dashboard/server/api/update/schemas.ts index 916e24b7a5658..3eb6266cefcd4 100644 --- a/src/platform/plugins/shared/dashboard/server/api/update/schemas.ts +++ b/src/platform/plugins/shared/dashboard/server/api/update/schemas.ts @@ -9,7 +9,7 @@ import { schema } from '@kbn/config-schema'; import { getDashboardStateSchema } from '../dashboard_state_schemas'; -import { baseMetaSchema, updatedMetaSchema } from '../meta_schemas'; +import { baseMetaSchema, createdMetaSchema, updatedMetaSchema } from '../meta_schemas'; export function getUpdateRequestBodySchema(isDashboardAppRequest: boolean) { // changing access control is not allowed through update endpoint @@ -20,6 +20,6 @@ export function getUpdateResponseBodySchema(isDashboardAppRequest: boolean) { return schema.object({ id: schema.string(), data: getDashboardStateSchema(isDashboardAppRequest), - meta: schema.allOf([baseMetaSchema, updatedMetaSchema]), + meta: schema.allOf([baseMetaSchema, createdMetaSchema, updatedMetaSchema]), }); } diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts index e1145972b839b..3684fed1d5540 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/create/register_create_route.ts @@ -32,13 +32,13 @@ export function registerCreateRoute(router: VersionedRouter createResponseBodySchema, - description: 'Indicates that a markdown library item is created successfully.', + description: 'created', }, 400: { - description: 'Indicates an invalid schema or parameters.', + description: 'invalid request', }, 403: { - description: 'Indicates that this call is forbidden.', + description: 'forbidden', }, }, }, diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/delete/register_delete_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/delete/register_delete_route.ts index 1702b3d3bcc72..05b54f85e255e 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/delete/register_delete_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/delete/register_delete_route.ts @@ -36,13 +36,13 @@ export function registerDeleteRoute(router: VersionedRouter response: { 200: { body: () => readResponseBodySchema, - description: 'Indicates that the markdown library item is retrieved successfully.', + description: 'success', }, 403: { - description: 'Indicates that this call is forbidden.', + description: 'forbidden', }, }, }, diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/search/register_search_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/search/register_search_route.ts index 9ad56c894cdbc..ea45e3c7249e0 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/search/register_search_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/search/register_search_route.ts @@ -31,10 +31,10 @@ export function registerSearchRoute(router: VersionedRouter searchResponseBodySchema, - description: 'Indicates that the search is successful.', + description: 'success', }, 403: { - description: 'Indicates that this call is forbidden.', + description: 'forbidden', }, }, }, diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts index 162d73a734748..c30d066af696f 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/update/register_update_route.ts @@ -36,13 +36,17 @@ export function registerUpdateRoute(router: VersionedRouter updateResponseBodySchema, - description: 'Indicates the markdown library item is upserted successfully', + description: 'updated', + }, + 201: { + body: () => updateResponseBodySchema, + description: 'created', }, 400: { - description: 'Indicates an invalid schema or parameters.', + description: 'invalid request', }, 403: { - description: 'Indicates that upsert is forbidden.', + description: 'forbidden', }, }, }, @@ -50,7 +54,9 @@ export function registerUpdateRoute(router: VersionedRouter { try { const result = await update(ctx, req.params.id, req.body); - return res.ok({ body: result }); + return result.meta.created_at === result.meta.updated_at + ? res.created({ body: result }) + : res.ok({ body: result }); } catch (e) { if (e.isBoom && e.output.statusCode === 403) { return res.forbidden({ body: { message: e.message } }); diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/update/schemas.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/update/schemas.ts index 8e741c6e7c35c..5e4d45bba21a3 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/update/schemas.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/update/schemas.ts @@ -8,7 +8,7 @@ */ import { schema } from '@kbn/config-schema'; -import { baseMetaSchema, updatedMetaSchema } from '../meta_schemas'; +import { baseMetaSchema, createdMetaSchema, updatedMetaSchema } from '../meta_schemas'; import { markdownAttributesSchema } from '../../markdown_saved_object/schema/v1'; export const updateRequestBodySchema = markdownAttributesSchema; @@ -16,5 +16,5 @@ export const updateRequestBodySchema = markdownAttributesSchema; export const updateResponseBodySchema = schema.object({ id: schema.string(), data: markdownAttributesSchema, - meta: schema.allOf([baseMetaSchema, updatedMetaSchema]), + meta: schema.allOf([baseMetaSchema, createdMetaSchema, updatedMetaSchema]), }); diff --git a/src/platform/plugins/shared/dashboard_markdown/server/saved_object_utils.ts b/src/platform/plugins/shared/dashboard_markdown/server/saved_object_utils.ts index 9586ea258c934..a22496fea07a1 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/saved_object_utils.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/saved_object_utils.ts @@ -11,29 +11,25 @@ import type { SavedObject, SavedObjectsUpdateResponse } from '@kbn/core/server'; import type { MarkdownAttributes } from './markdown_saved_object'; export function getMarkdownMeta( - savedObject: SavedObject | SavedObjectsUpdateResponse, - operation: 'create' | 'read' | 'update' | 'search' + savedObject: SavedObject | SavedObjectsUpdateResponse ) { return { error: savedObject.error, + ...(savedObject.created_at && { created_at: savedObject.created_at }), + ...(savedObject.created_at && { created_at: savedObject.created_at }), updated_at: savedObject.updated_at, updated_by: savedObject.updated_by, version: savedObject.version ?? '', - ...(['create', 'read', 'search'].includes(operation) && { - created_at: savedObject.created_at, - created_by: savedObject.created_by, - }), }; } // CRU is Create, Read, Update export function getMarkdownCRUResponseBody( - savedObject: SavedObject | SavedObjectsUpdateResponse, - operation: 'create' | 'read' | 'update' | 'search' + savedObject: SavedObject | SavedObjectsUpdateResponse ) { return { id: savedObject.id, data: savedObject.attributes as MarkdownAttributes, - meta: getMarkdownMeta(savedObject, operation), + meta: getMarkdownMeta(savedObject), }; } From f4581f0a3b95b3315742e43d5baf788243ba2f5e Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 31 Mar 2026 18:54:00 -0600 Subject: [PATCH 17/19] clean up --- .../plugins/shared/dashboard/server/api/saved_object_utils.ts | 2 +- .../plugins/shared/dashboard/server/api/search/search.ts | 2 +- .../dashboard_markdown/server/api/read/register_read_route.ts | 3 +++ .../shared/dashboard_markdown/server/saved_object_utils.ts | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/platform/plugins/shared/dashboard/server/api/saved_object_utils.ts b/src/platform/plugins/shared/dashboard/server/api/saved_object_utils.ts index 1b7a8f2ceda2d..aef89b841e982 100644 --- a/src/platform/plugins/shared/dashboard/server/api/saved_object_utils.ts +++ b/src/platform/plugins/shared/dashboard/server/api/saved_object_utils.ts @@ -24,7 +24,7 @@ export function getDashboardMeta( return { error: savedObject.error, ...(savedObject.created_at && { created_at: savedObject.created_at }), - ...(savedObject.created_at && { created_at: savedObject.created_at }), + ...(savedObject.created_by && { created_by: savedObject.created_by }), managed: savedObject.managed, owner: savedObject.accessControl?.owner, updated_at: savedObject.updated_at, diff --git a/src/platform/plugins/shared/dashboard/server/api/search/search.ts b/src/platform/plugins/shared/dashboard/server/api/search/search.ts index 6cc83ecec169c..8a18a75b15e26 100644 --- a/src/platform/plugins/shared/dashboard/server/api/search/search.ts +++ b/src/platform/plugins/shared/dashboard/server/api/search/search.ts @@ -65,7 +65,7 @@ export async function search( }), title: title ?? '', }, - meta: getDashboardMeta(so, 'search'), + meta: getDashboardMeta(so), }; }), page: soResponse.page, diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/read/register_read_route.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/read/register_read_route.ts index 9bb676587ac23..5f3f9e2876da5 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/read/register_read_route.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/read/register_read_route.ts @@ -43,6 +43,9 @@ export function registerReadRoute(router: VersionedRouter 403: { description: 'forbidden', }, + 404: { + description: 'not found', + }, }, }, }, diff --git a/src/platform/plugins/shared/dashboard_markdown/server/saved_object_utils.ts b/src/platform/plugins/shared/dashboard_markdown/server/saved_object_utils.ts index a22496fea07a1..d8175681fff47 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/saved_object_utils.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/saved_object_utils.ts @@ -16,7 +16,7 @@ export function getMarkdownMeta( return { error: savedObject.error, ...(savedObject.created_at && { created_at: savedObject.created_at }), - ...(savedObject.created_at && { created_at: savedObject.created_at }), + ...(savedObject.created_by && { created_by: savedObject.created_by }), updated_at: savedObject.updated_at, updated_by: savedObject.updated_by, version: savedObject.version ?? '', From e507940c114012479ebfe19cc33d86cf0d1d88d5 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 31 Mar 2026 19:00:00 -0600 Subject: [PATCH 18/19] tslint --- .../shared/dashboard_markdown/server/api/create/create.ts | 2 +- .../plugins/shared/dashboard_markdown/server/api/read/read.ts | 2 +- .../shared/dashboard_markdown/server/api/search/search.ts | 2 +- .../shared/dashboard_markdown/server/api/update/update.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts index c0c9f774171ac..fb8935018a748 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/create/create.ts @@ -25,5 +25,5 @@ export async function create( createBody ); - return getMarkdownCRUResponseBody(savedObject, 'create'); + return getMarkdownCRUResponseBody(savedObject); } diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/read/read.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/read/read.ts index 9376d0be6328c..9427916d9f779 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/read/read.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/read/read.ts @@ -23,5 +23,5 @@ export async function read( id ); - return getMarkdownCRUResponseBody(savedObject, 'read'); + return getMarkdownCRUResponseBody(savedObject); } diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/search/search.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/search/search.ts index ebc28d01c7f47..9deb6de62babd 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/search/search.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/search/search.ts @@ -38,7 +38,7 @@ export async function search( ...(description && { description }), title: title ?? '', }, - meta: getMarkdownMeta(so, 'search'), + meta: getMarkdownMeta(so), }; }), page: soResponse.page, diff --git a/src/platform/plugins/shared/dashboard_markdown/server/api/update/update.ts b/src/platform/plugins/shared/dashboard_markdown/server/api/update/update.ts index dbecbac1740dd..b92c13810b974 100644 --- a/src/platform/plugins/shared/dashboard_markdown/server/api/update/update.ts +++ b/src/platform/plugins/shared/dashboard_markdown/server/api/update/update.ts @@ -31,5 +31,5 @@ export async function update( } ); - return getMarkdownCRUResponseBody(savedObject, 'update'); + return getMarkdownCRUResponseBody(savedObject); } From e6051dc87d432d70ea6768c0b27b47a399e9beee Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 31 Mar 2026 20:58:01 -0600 Subject: [PATCH 19/19] fix tests --- .../dashboard/test/scout/api/tests/update_dashboard.spec.ts | 2 +- .../test/scout/api/tests/update_markdown.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/plugins/shared/dashboard/test/scout/api/tests/update_dashboard.spec.ts b/src/platform/plugins/shared/dashboard/test/scout/api/tests/update_dashboard.spec.ts index 969635d6022e1..9e4462a96216c 100644 --- a/src/platform/plugins/shared/dashboard/test/scout/api/tests/update_dashboard.spec.ts +++ b/src/platform/plugins/shared/dashboard/test/scout/api/tests/update_dashboard.spec.ts @@ -65,7 +65,7 @@ apiTest.describe('dashboards - upsert', { tag: tags.deploymentAgnostic }, () => responseType: 'json', }); - expect(response).toHaveStatusCode(200); + expect(response).toHaveStatusCode(201); expect(response.body.id).toBe(id); expect(response.body.data.title).toBe(title); }); diff --git a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts index fdffcd04cdaf0..24fe0b03f4d02 100644 --- a/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts +++ b/src/platform/plugins/shared/dashboard_markdown/test/scout/api/tests/update_markdown.spec.ts @@ -113,7 +113,7 @@ apiTest.describe('markdown - upsert', { tag: tags.deploymentAgnostic }, () => { responseType: 'json', }); - expect(response).toHaveStatusCode(200); + expect(response).toHaveStatusCode(201); expect(response.body.id).toBe(id); expect(response.body.data).toMatchObject({ title: 'New markdown',