-
Notifications
You must be signed in to change notification settings - Fork 8.3k
/
Copy pathsaved_objects_mixin.js
113 lines (99 loc) · 4.46 KB
/
saved_objects_mixin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// Disable lint errors for imports from src/core/server/saved_objects until SavedObjects migration is complete
/* eslint-disable @kbn/eslint/no-restricted-paths */
import { SavedObjectsSchema } from '../../../core/server/saved_objects/schema';
import {
SavedObjectsClient,
SavedObjectsRepository,
exportSavedObjectsToStream,
importSavedObjectsFromStream,
resolveSavedObjectsImportErrors,
} from '../../../core/server/saved_objects';
import { getRootPropertiesObjects } from '../../../core/server/saved_objects/mappings';
import { convertTypesToLegacySchema } from '../../../core/server/saved_objects/utils';
export function savedObjectsMixin(kbnServer, server) {
const migrator = kbnServer.newPlatform.__internals.kibanaMigrator;
const typeRegistry = kbnServer.newPlatform.start.core.savedObjects.getTypeRegistry();
const mappings = migrator.getActiveMappings();
const allTypes = Object.keys(getRootPropertiesObjects(mappings));
const schema = new SavedObjectsSchema(convertTypesToLegacySchema(typeRegistry.getAllTypes()));
const visibleTypes = allTypes.filter(type => !schema.isHiddenType(type));
server.decorate('server', 'kibanaMigrator', migrator);
const warn = message => server.log(['warning', 'saved-objects'], message);
// we use kibana.index which is technically defined in the kibana plugin, so if
// we don't have the plugin (mainly tests) we can't initialize the saved objects
if (!kbnServer.pluginSpecs.some(p => p.getId() === 'kibana')) {
warn('Saved Objects uninitialized because the Kibana plugin is disabled.');
return;
}
const serializer = kbnServer.newPlatform.start.core.savedObjects.createSerializer();
const createRepository = (callCluster, extraTypes = []) => {
if (typeof callCluster !== 'function') {
throw new TypeError('Repository requires a "callCluster" function to be provided.');
}
// throw an exception if an extraType is not defined.
extraTypes.forEach(type => {
if (!allTypes.includes(type)) {
throw new Error(`Missing mappings for saved objects type '${type}'`);
}
});
const combinedTypes = visibleTypes.concat(extraTypes);
const allowedTypes = [...new Set(combinedTypes)];
const config = server.config();
return new SavedObjectsRepository({
index: config.get('kibana.index'),
migrator,
mappings,
typeRegistry,
serializer,
allowedTypes,
callCluster,
});
};
const provider = kbnServer.newPlatform.__internals.savedObjectsClientProvider;
const service = {
types: visibleTypes,
SavedObjectsClient,
SavedObjectsRepository,
getSavedObjectsRepository: createRepository,
getScopedSavedObjectsClient: (...args) => provider.getClient(...args),
setScopedSavedObjectsClientFactory: (...args) => provider.setClientFactory(...args),
addScopedSavedObjectsClientWrapperFactory: (...args) =>
provider.addClientWrapperFactory(...args),
importExport: {
objectLimit: server.config().get('savedObjects.maxImportExportSize'),
importSavedObjects: importSavedObjectsFromStream,
resolveImportErrors: resolveSavedObjectsImportErrors,
getSortedObjectsForExport: exportSavedObjectsToStream,
},
schema,
};
server.decorate('server', 'savedObjects', service);
const savedObjectsClientCache = new WeakMap();
server.decorate('request', 'getSavedObjectsClient', function(options) {
const request = this;
if (savedObjectsClientCache.has(request)) {
return savedObjectsClientCache.get(request);
}
const savedObjectsClient = server.savedObjects.getScopedSavedObjectsClient(request, options);
savedObjectsClientCache.set(request, savedObjectsClient);
return savedObjectsClient;
});
}