mirror of
https://github.com/elastic/kibana.git
synced 2025-06-27 18:51:07 -04:00
## Summary Updating the ES client to 9.0. Resolves #116102 ## What changes? **Breaking change**: `body` has been removed. Most of the changes are about bringing all the content inside the body as a root attribute to the API params: ```diff const response = await client.search({ index: 'test', - body: { query: { match_all: {} } - } }) ``` For this reason, enabling the "Hide whitespace changes" option when reviewing is recommended. Some exceptions to this rule: * Bulk APIs replace the `body` array with `operations` array (direct replacement) * Index Put Settings API replace `body` array with `settings` (direct replacement) * Msearch replaces the `body` array with `searches` array (direct replacement) * Document Index API replaces `body` with `document` (direct replacement) * Create Repository replaces `body` with `repository` (direct replacement) Because of a known issue in the client (https://github.com/elastic/elasticsearch-js/issues/2584), there's still an escape hatch to send data in the body in case the specific use case requires it via `// @ts-expect-error elasticsearch@9.0.0 https://github.com/elastic/elasticsearch-js/issues/2584`, but it shouldn't be abused because we lose types. In this PR we've used it in those scenarios where we reuse the response of a GET as the body of a PUT/POST. ### Other changes * `estypes` can be imported from the root of the library as `import type { estypes } from '@elastic/elasticsearch';` * `estypesWithBody` have been removed * `requestTimeout`'s 30s default has been removed in the client. This PR explicitly adds the setting in all client usages. ### Identify risks - [x] The client places unknown properties as querystring, risking body params leaking there, and causing 400 errors from ES => Solved by forcing `body` usage there via `// @ts-expect-error elasticsearch@9.0.0 https://github.com/elastic/elasticsearch-js/issues/2584`. The next version of the client will address this. - [x] We need to run the MKI tests to make sure that we're not breaking anything there => https://elastic.slack.com/archives/C04HT4P1YS3/p1739528112482629?thread_ts=1739480136.231439&cid=C04HT4P1YS3 --------- Co-authored-by: Gloria Hornero <gloria.hornero@elastic.co>
71 lines
2.3 KiB
TypeScript
71 lines
2.3 KiB
TypeScript
/*
|
|
* 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".
|
|
*/
|
|
|
|
import React, { useEffect, useState } from 'react';
|
|
import ReactDOM from 'react-dom';
|
|
import type { AppMountParameters, CoreStart } from '@kbn/core/public';
|
|
import { buildDataTableRecord } from '@kbn/discover-utils';
|
|
import type { DataTableRecord } from '@kbn/discover-utils/types';
|
|
import type { DataView } from '@kbn/data-views-plugin/common';
|
|
import { UnifiedDocViewer } from '@kbn/unified-doc-viewer-plugin/public';
|
|
import { DataPublicPluginStart } from '@kbn/data-plugin/public';
|
|
import type { StartDeps } from './plugin';
|
|
|
|
export const renderApp = (
|
|
core: CoreStart,
|
|
{ data }: StartDeps,
|
|
{ element }: AppMountParameters
|
|
) => {
|
|
ReactDOM.render(<UnifiedDocViewerExamplesApp data={data} />, element);
|
|
|
|
return () => {
|
|
ReactDOM.unmountComponentAtNode(element);
|
|
};
|
|
};
|
|
|
|
function UnifiedDocViewerExamplesApp({ data }: { data: DataPublicPluginStart }) {
|
|
const [dataView, setDataView] = useState<DataView | null>();
|
|
const [hit, setHit] = useState<DataTableRecord | null>();
|
|
|
|
useEffect(() => {
|
|
data.dataViews.getDefault().then((defaultDataView) => setDataView(defaultDataView));
|
|
}, [data]);
|
|
|
|
useEffect(() => {
|
|
const setDefaultHit = async () => {
|
|
if (!dataView?.id) return;
|
|
const response = await data.search
|
|
.search({
|
|
params: {
|
|
index: dataView?.getIndexPattern(),
|
|
fields: ['*'],
|
|
_source: false,
|
|
},
|
|
})
|
|
.toPromise();
|
|
const docs = response?.rawResponse?.hits?.hits ?? [];
|
|
if (docs.length > 0) {
|
|
const record = buildDataTableRecord(docs[0], dataView);
|
|
setHit(record);
|
|
}
|
|
};
|
|
|
|
setDefaultHit();
|
|
}, [data, dataView]);
|
|
|
|
return (
|
|
<>
|
|
{dataView?.id && hit ? (
|
|
<UnifiedDocViewer hit={hit} dataView={dataView} />
|
|
) : (
|
|
'Loading... (make sure you have a default data view and at least one matching document)'
|
|
)}
|
|
</>
|
|
);
|
|
}
|