55 * 2.0.
66 */
77
8- import { RequestHandler , SavedObjectsClientContract } from 'src/core/server' ;
8+ import { RequestHandler , SavedObjectsBulkGetObject } from 'src/core/server' ;
99import { keyBy , keys , merge } from 'lodash' ;
1010import { DataStream } from '../../types' ;
11- import { GetDataStreamsResponse , KibanaAssetType , KibanaSavedObjectType } from '../../../common' ;
12- import { getPackageSavedObjects , getKibanaSavedObject } from '../../services/epm/packages/get' ;
11+ import { GetDataStreamsResponse , KibanaSavedObjectType } from '../../../common' ;
12+ import { getPackageSavedObjects } from '../../services/epm/packages/get' ;
13+
1314import { defaultIngestErrorHandler } from '../../errors' ;
1415
1516const DATA_STREAM_INDEX_PATTERN = 'logs-*-*,metrics-*-*,traces-*-*' ;
@@ -80,6 +81,40 @@ export const getListHandler: RequestHandler = async (context, request, response)
8081 const packageSavedObjectsByName = keyBy ( packageSavedObjects . saved_objects , 'id' ) ;
8182 const packageMetadata : any = { } ;
8283
84+ // Get dashboard information for all packages
85+ const dashboardIdsByPackageName = packageSavedObjects . saved_objects . reduce <
86+ Record < string , string [ ] >
87+ > ( ( allDashboards , pkgSavedObject ) => {
88+ const dashboards : string [ ] = [ ] ;
89+ ( pkgSavedObject . attributes ?. installed_kibana || [ ] ) . forEach ( ( o ) => {
90+ if ( o . type === KibanaSavedObjectType . dashboard ) {
91+ dashboards . push ( o . id ) ;
92+ }
93+ } ) ;
94+ allDashboards [ pkgSavedObject . id ] = dashboards ;
95+ return allDashboards ;
96+ } , { } ) ;
97+ const allDashboardSavedObjects = await context . core . savedObjects . client . bulkGet < {
98+ title ?: string ;
99+ } > (
100+ Object . values ( dashboardIdsByPackageName ) . reduce < SavedObjectsBulkGetObject [ ] > (
101+ ( allDashboards , dashboardIds ) => {
102+ return allDashboards . concat (
103+ dashboardIds . map ( ( id ) => ( {
104+ id,
105+ type : KibanaSavedObjectType . dashboard ,
106+ fields : [ 'title' ] ,
107+ } ) )
108+ ) ;
109+ } ,
110+ [ ]
111+ )
112+ ) ;
113+ const allDashboardSavedObjectsById = keyBy (
114+ allDashboardSavedObjects . saved_objects ,
115+ ( dashboardSavedObject ) => dashboardSavedObject . id
116+ ) ;
117+
83118 // Query additional information for each data stream
84119 const dataStreamPromises = dataStreamNames . map ( async ( dataStreamName ) => {
85120 const dataStream = dataStreams [ dataStreamName ] ;
@@ -157,19 +192,23 @@ export const getListHandler: RequestHandler = async (context, request, response)
157192 // - and we didn't pick the metadata in an earlier iteration of this map()
158193 if ( ! packageMetadata [ pkgName ] ) {
159194 // then pick the dashboards from the package saved object
160- const dashboards =
161- pkgSavedObject . attributes ?. installed_kibana ?. filter (
162- ( o ) => o . type === KibanaSavedObjectType . dashboard
163- ) || [ ] ;
164- // and then pick the human-readable titles from the dashboard saved objects
165- const enhancedDashboards = await getEnhancedDashboards (
166- context . core . savedObjects . client ,
167- dashboards
168- ) ;
195+ const packageDashboardIds = dashboardIdsByPackageName [ pkgName ] || [ ] ;
196+ const packageDashboards = packageDashboardIds . reduce <
197+ Array < { id : string ; title : string } >
198+ > ( ( dashboards , dashboardId ) => {
199+ const dashboard = allDashboardSavedObjectsById [ dashboardId ] ;
200+ if ( dashboard ) {
201+ dashboards . push ( {
202+ id : dashboard . id ,
203+ title : dashboard . attributes . title || dashboard . id ,
204+ } ) ;
205+ }
206+ return dashboards ;
207+ } , [ ] ) ;
169208
170209 packageMetadata [ pkgName ] = {
171210 version : pkgSavedObject . attributes ?. version || '' ,
172- dashboards : enhancedDashboards ,
211+ dashboards : packageDashboards ,
173212 } ;
174213 }
175214
@@ -194,21 +233,3 @@ export const getListHandler: RequestHandler = async (context, request, response)
194233 return defaultIngestErrorHandler ( { error, response } ) ;
195234 }
196235} ;
197-
198- const getEnhancedDashboards = async (
199- savedObjectsClient : SavedObjectsClientContract ,
200- dashboards : any [ ]
201- ) => {
202- const dashboardsPromises = dashboards . map ( async ( db ) => {
203- const dbSavedObject : any = await getKibanaSavedObject (
204- savedObjectsClient ,
205- KibanaAssetType . dashboard ,
206- db . id
207- ) ;
208- return {
209- id : db . id ,
210- title : dbSavedObject . attributes ?. title || db . id ,
211- } ;
212- } ) ;
213- return await Promise . all ( dashboardsPromises ) ;
214- } ;
0 commit comments