Skip to content

Commit fe0d7e0

Browse files
[Reporting] Define shims of legacy dependencies (elastic#54082)
* simplify serverfacade definition * simplify requestfacade definition * use the shim * makeRequestFacade * requestFacade * import sorting * originalServer * reduce loc change * remove consolelog * hacks to fix tests * ServerFacade in index * Cosmetic * remove field from serverfacade * add raw to the request * fix types * add fieldFormatServiceFactory to legacy * Pass the complete request object to sec plugin * Fix test * fix test 2 * getUser takes a legacy request * add unit test for new lib * add getRawRequest to pass to saved objects method * update test snapshot * leave a TODO comment for type import * variable rename for legacy id Co-authored-by: Elastic Machine <[email protected]>
1 parent 62a1a4a commit fe0d7e0

File tree

15 files changed

+221
-74
lines changed

15 files changed

+221
-74
lines changed

x-pack/legacy/plugins/reporting/export_types/csv/server/execute_job.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ export const executeJobFactory: ExecuteJobFactory<ESQueueWorkerExecuteFn<
8686

8787
const [formatsMap, uiSettings] = await Promise.all([
8888
(async () => {
89-
// @ts-ignore fieldFormatServiceFactory' does not exist on type 'ServerFacade TODO
9089
const fieldFormats = await server.fieldFormatServiceFactory(uiConfig);
9190
return fieldFormatMapFactory(indexPatternSavedObject, fieldFormats);
9291
})(),

x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/server/lib/generate_csv_search.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export async function generateCsvSearch(
5757
jobParams: JobParamsDiscoverCsv
5858
): Promise<CsvResultFromSearch> {
5959
const { savedObjects, uiSettingsServiceFactory } = server;
60-
const savedObjectsClient = savedObjects.getScopedSavedObjectsClient(req);
60+
const savedObjectsClient = savedObjects.getScopedSavedObjectsClient(req.getRawRequest());
6161
const { indexPatternSavedObjectId, timerange } = searchPanel;
6262
const savedSearchObjectAttr = searchPanel.attributes as SavedSearchObjectAttributes;
6363
const { indexPatternSavedObject } = await getDataSource(

x-pack/legacy/plugins/reporting/index.ts

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
import { resolve } from 'path';
88
import { i18n } from '@kbn/i18n';
9+
import { Legacy } from 'kibana';
10+
import { IUiSettingsClient } from 'src/core/server';
11+
import { XPackMainPlugin } from '../xpack_main/server/xpack_main';
912
import { PLUGIN_ID, UI_SETTINGS_CUSTOM_PDF_LOGO } from './common/constants';
1013
// @ts-ignore untyped module defintition
1114
import { mirrorPluginStatus } from '../../server/lib/mirror_plugin_status';
@@ -16,16 +19,35 @@ import {
1619
getExportTypesRegistry,
1720
runValidations,
1821
} from './server/lib';
19-
import { config as reportingConfig } from './config';
20-
import { logConfiguration } from './log_configuration';
2122
import { createBrowserDriverFactory } from './server/browsers';
2223
import { registerReportingUsageCollector } from './server/usage';
23-
import { ReportingConfigOptions, ReportingPluginSpecOptions, ServerFacade } from './types.d';
24+
import { ReportingConfigOptions, ReportingPluginSpecOptions } from './types.d';
25+
import { config as reportingConfig } from './config';
26+
import { logConfiguration } from './log_configuration';
2427

2528
const kbToBase64Length = (kb: number) => {
2629
return Math.floor((kb * 1024 * 8) / 6);
2730
};
2831

32+
type LegacyPlugins = Legacy.Server['plugins'];
33+
34+
export interface ServerFacade {
35+
config: Legacy.Server['config'];
36+
info: Legacy.Server['info'];
37+
log: Legacy.Server['log'];
38+
plugins: {
39+
elasticsearch: LegacyPlugins['elasticsearch'];
40+
security: LegacyPlugins['security'];
41+
xpack_main: XPackMainPlugin & {
42+
status?: any;
43+
};
44+
};
45+
route: Legacy.Server['route'];
46+
savedObjects: Legacy.Server['savedObjects'];
47+
uiSettingsServiceFactory: Legacy.Server['uiSettingsServiceFactory'];
48+
fieldFormatServiceFactory: (uiConfig: IUiSettingsClient) => unknown;
49+
}
50+
2951
export const reporting = (kibana: any) => {
3052
return new kibana.Plugin({
3153
id: PLUGIN_ID,
@@ -42,7 +64,7 @@ export const reporting = (kibana: any) => {
4264
embeddableActions: ['plugins/reporting/panel_actions/get_csv_panel_action'],
4365
home: ['plugins/reporting/register_feature'],
4466
managementSections: ['plugins/reporting/views/management'],
45-
injectDefaultVars(server: ServerFacade, options?: ReportingConfigOptions) {
67+
injectDefaultVars(server: Legacy.Server, options?: ReportingConfigOptions) {
4668
const config = server.config();
4769
return {
4870
reportingPollConfig: options ? options.poll : {},
@@ -70,28 +92,41 @@ export const reporting = (kibana: any) => {
7092
},
7193
},
7294

73-
// TODO: Decouple Hapi: Build a server facade object based on the server to
74-
// pass through to the libs. Do not pass server directly
75-
async init(server: ServerFacade) {
95+
async init(server: Legacy.Server) {
96+
const serverFacade: ServerFacade = {
97+
config: server.config,
98+
info: server.info,
99+
route: server.route.bind(server),
100+
plugins: {
101+
elasticsearch: server.plugins.elasticsearch,
102+
xpack_main: server.plugins.xpack_main,
103+
security: server.plugins.security,
104+
},
105+
savedObjects: server.savedObjects,
106+
uiSettingsServiceFactory: server.uiSettingsServiceFactory,
107+
// @ts-ignore Property 'fieldFormatServiceFactory' does not exist on type 'Server'.
108+
fieldFormatServiceFactory: server.fieldFormatServiceFactory,
109+
log: server.log.bind(server),
110+
};
76111
const exportTypesRegistry = getExportTypesRegistry();
77112

78113
let isCollectorReady = false;
79114
// Register a function with server to manage the collection of usage stats
80115
const { usageCollection } = server.newPlatform.setup.plugins;
81116
registerReportingUsageCollector(
82117
usageCollection,
83-
server,
118+
serverFacade,
84119
() => isCollectorReady,
85120
exportTypesRegistry
86121
);
87122

88-
const logger = LevelLogger.createForServer(server, [PLUGIN_ID]);
89-
const browserDriverFactory = await createBrowserDriverFactory(server);
123+
const logger = LevelLogger.createForServer(serverFacade, [PLUGIN_ID]);
124+
const browserDriverFactory = await createBrowserDriverFactory(serverFacade);
90125

91-
logConfiguration(server, logger);
92-
runValidations(server, logger, browserDriverFactory);
126+
logConfiguration(serverFacade, logger);
127+
runValidations(serverFacade, logger, browserDriverFactory);
93128

94-
const { xpack_main: xpackMainPlugin } = server.plugins;
129+
const { xpack_main: xpackMainPlugin } = serverFacade.plugins;
95130
mirrorPluginStatus(xpackMainPlugin, this);
96131
const checkLicense = checkLicenseFactory(exportTypesRegistry);
97132
(xpackMainPlugin as any).status.once('green', () => {
@@ -104,7 +139,7 @@ export const reporting = (kibana: any) => {
104139
isCollectorReady = true;
105140

106141
// Reporting routes
107-
registerRoutes(server, exportTypesRegistry, browserDriverFactory, logger);
142+
registerRoutes(serverFacade, exportTypesRegistry, browserDriverFactory, logger);
108143
},
109144

110145
deprecations({ unused }: any) {

x-pack/legacy/plugins/reporting/server/lib/get_user.js renamed to x-pack/legacy/plugins/reporting/server/lib/get_user.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,22 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
export function getUserFactory(server) {
8-
return async request => {
7+
import { Legacy } from 'kibana';
8+
import { ServerFacade } from '../../types';
9+
10+
export function getUserFactory(server: ServerFacade) {
11+
/*
12+
* Legacy.Request because this is called from routing middleware
13+
*/
14+
return async (request: Legacy.Request) => {
915
if (!server.plugins.security) {
1016
return null;
1117
}
1218

1319
try {
1420
return await server.plugins.security.getUser(request);
1521
} catch (err) {
16-
server.log(['reporting', 'getUser', 'debug'], err);
22+
server.log(['reporting', 'getUser', 'error'], err);
1723
return null;
1824
}
1925
};

x-pack/legacy/plugins/reporting/server/lib/level_logger.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
type ServerLog = (tags: string[], msg: string) => void;
7+
import { ServerFacade } from '../../types';
88

99
const trimStr = (toTrim: string) => {
1010
return typeof toTrim === 'string' ? toTrim.trim() : toTrim;
@@ -16,12 +16,12 @@ export class LevelLogger {
1616

1717
public warn: (msg: string, tags?: string[]) => void;
1818

19-
static createForServer(server: any, tags: string[]) {
20-
const serverLog: ServerLog = (tgs: string[], msg: string) => server.log(tgs, msg);
19+
static createForServer(server: ServerFacade, tags: string[]) {
20+
const serverLog: ServerFacade['log'] = (tgs: string[], msg: string) => server.log(tgs, msg);
2121
return new LevelLogger(serverLog, tags);
2222
}
2323

24-
constructor(logger: ServerLog, tags: string[]) {
24+
constructor(logger: ServerFacade['log'], tags: string[]) {
2525
this._logger = logger;
2626
this._tags = tags;
2727

x-pack/legacy/plugins/reporting/server/lib/once_per_server.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ export function oncePerServer(fn: ServerFn) {
2727
throw new TypeError('This function expects to be called with a single argument');
2828
}
2929

30-
if (!server || typeof server.expose !== 'function') {
31-
throw new TypeError('This function expects to be passed the server');
32-
}
33-
3430
// @ts-ignore
3531
return fn.call(this, server);
3632
});

x-pack/legacy/plugins/reporting/server/routes/generate_from_jobparams.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,18 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7+
import { Legacy } from 'kibana';
78
import boom from 'boom';
89
import Joi from 'joi';
910
import rison from 'rison-node';
1011
import { API_BASE_URL } from '../../common/constants';
11-
import { ServerFacade, RequestFacade, ReportingResponseToolkit } from '../../types';
12+
import { ServerFacade, ReportingResponseToolkit } from '../../types';
1213
import {
1314
getRouteConfigFactoryReportingPre,
1415
GetRouteConfigFactoryFn,
1516
RouteConfigFactory,
1617
} from './lib/route_config_factories';
18+
import { makeRequestFacade } from './lib/make_request_facade';
1719
import { HandlerErrorFunction, HandlerFunction } from './types';
1820

1921
const BASE_GENERATE = `${API_BASE_URL}/generate`;
@@ -54,7 +56,8 @@ export function registerGenerateFromJobParams(
5456
path: `${BASE_GENERATE}/{exportType}`,
5557
method: 'POST',
5658
options: getRouteConfig(),
57-
handler: async (request: RequestFacade, h: ReportingResponseToolkit) => {
59+
handler: async (legacyRequest: Legacy.Request, h: ReportingResponseToolkit) => {
60+
const request = makeRequestFacade(legacyRequest);
5861
let jobParamsRison: string | null;
5962

6063
if (request.payload) {
@@ -80,7 +83,7 @@ export function registerGenerateFromJobParams(
8083
if (!jobParams) {
8184
throw new Error('missing jobParams!');
8285
}
83-
response = await handler(exportType, jobParams, request, h);
86+
response = await handler(exportType, jobParams, legacyRequest, h);
8487
} catch (err) {
8588
throw boom.badRequest(`invalid rison: ${jobParamsRison}`);
8689
}

x-pack/legacy/plugins/reporting/server/routes/generate_from_savedobject.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7+
import { Legacy } from 'kibana';
78
import { get } from 'lodash';
89
import { API_BASE_GENERATE_V1, CSV_FROM_SAVEDOBJECT_JOB_TYPE } from '../../common/constants';
9-
import { ServerFacade, RequestFacade, ReportingResponseToolkit } from '../../types';
10+
import { ServerFacade, ReportingResponseToolkit } from '../../types';
1011
import { HandlerErrorFunction, HandlerFunction, QueuedJobPayload } from './types';
1112
import { getRouteOptionsCsv } from './lib/route_config_factories';
13+
import { makeRequestFacade } from './lib/make_request_facade';
1214
import { getJobParamsFromRequest } from '../../export_types/csv_from_savedobject/server/lib/get_job_params_from_request';
1315

1416
/*
@@ -31,17 +33,18 @@ export function registerGenerateCsvFromSavedObject(
3133
path: `${API_BASE_GENERATE_V1}/csv/saved-object/{savedObjectType}:{savedObjectId}`,
3234
method: 'POST',
3335
options: routeOptions,
34-
handler: async (request: RequestFacade, h: ReportingResponseToolkit) => {
36+
handler: async (legacyRequest: Legacy.Request, h: ReportingResponseToolkit) => {
37+
const requestFacade = makeRequestFacade(legacyRequest);
38+
3539
/*
3640
* 1. Build `jobParams` object: job data that execution will need to reference in various parts of the lifecycle
3741
* 2. Pass the jobParams and other common params to `handleRoute`, a shared function to enqueue the job with the params
3842
* 3. Ensure that details for a queued job were returned
3943
*/
40-
4144
let result: QueuedJobPayload<any>;
4245
try {
43-
const jobParams = getJobParamsFromRequest(request, { isImmediate: false });
44-
result = await handleRoute(CSV_FROM_SAVEDOBJECT_JOB_TYPE, jobParams, request, h);
46+
const jobParams = getJobParamsFromRequest(requestFacade, { isImmediate: false });
47+
result = await handleRoute(CSV_FROM_SAVEDOBJECT_JOB_TYPE, jobParams, legacyRequest, h); // pass the original request because the handler will make the request facade on its own
4548
} catch (err) {
4649
throw handleRouteError(CSV_FROM_SAVEDOBJECT_JOB_TYPE, err);
4750
}

x-pack/legacy/plugins/reporting/server/routes/generate_from_savedobject_immediate.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,21 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7+
import { Legacy } from 'kibana';
78
import { API_BASE_GENERATE_V1 } from '../../common/constants';
89
import { createJobFactory, executeJobFactory } from '../../export_types/csv_from_savedobject';
910
import {
1011
ServerFacade,
11-
RequestFacade,
1212
ResponseFacade,
1313
HeadlessChromiumDriverFactory,
1414
ReportingResponseToolkit,
1515
Logger,
1616
JobDocOutputExecuted,
1717
} from '../../types';
1818
import { JobDocPayloadPanelCsv } from '../../export_types/csv_from_savedobject/types';
19-
import { getRouteOptionsCsv } from './lib/route_config_factories';
2019
import { getJobParamsFromRequest } from '../../export_types/csv_from_savedobject/server/lib/get_job_params_from_request';
20+
import { getRouteOptionsCsv } from './lib/route_config_factories';
21+
import { makeRequestFacade } from './lib/make_request_facade';
2122

2223
/*
2324
* This function registers API Endpoints for immediate Reporting jobs. The API inputs are:
@@ -43,7 +44,8 @@ export function registerGenerateCsvFromSavedObjectImmediate(
4344
path: `${API_BASE_GENERATE_V1}/immediate/csv/saved-object/{savedObjectType}:{savedObjectId}`,
4445
method: 'POST',
4546
options: routeOptions,
46-
handler: async (request: RequestFacade, h: ReportingResponseToolkit) => {
47+
handler: async (legacyRequest: Legacy.Request, h: ReportingResponseToolkit) => {
48+
const request = makeRequestFacade(legacyRequest);
4749
const logger = parentLogger.clone(['savedobject-csv']);
4850
const jobParams = getJobParamsFromRequest(request, { isImmediate: true });
4951

x-pack/legacy/plugins/reporting/server/routes/generation.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
*/
66

77
import boom from 'boom';
8+
import { Legacy } from 'kibana';
89
import { API_BASE_URL } from '../../common/constants';
910
import {
1011
ServerFacade,
1112
ExportTypesRegistry,
1213
HeadlessChromiumDriverFactory,
13-
RequestFacade,
1414
ReportingResponseToolkit,
1515
Logger,
1616
} from '../../types';
@@ -19,6 +19,7 @@ import { registerGenerateCsvFromSavedObject } from './generate_from_savedobject'
1919
import { registerGenerateCsvFromSavedObjectImmediate } from './generate_from_savedobject_immediate';
2020
import { registerLegacy } from './legacy';
2121
import { createQueueFactory, enqueueJobFactory } from '../lib';
22+
import { makeRequestFacade } from './lib/make_request_facade';
2223

2324
export function registerJobGenerationRoutes(
2425
server: ServerFacade,
@@ -40,9 +41,10 @@ export function registerJobGenerationRoutes(
4041
async function handler(
4142
exportTypeId: string,
4243
jobParams: object,
43-
request: RequestFacade,
44+
legacyRequest: Legacy.Request,
4445
h: ReportingResponseToolkit
4546
) {
47+
const request = makeRequestFacade(legacyRequest);
4648
const user = request.pre.user;
4749
const headers = request.headers;
4850

0 commit comments

Comments
 (0)