@webiny/api-headless-cms-ddb-es
Version:
DynamoDB and Elasticsearch storage operations plugin for Headless CMS API.
225 lines (223 loc) • 8.23 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _exportNames = {
createStorageOperations: true
};
exports.createStorageOperations = void 0;
var _filters = _interopRequireDefault(require("@webiny/db-dynamodb/plugins/filters"));
var _elasticsearch = _interopRequireDefault(require("./elasticsearch"));
var _dynamoDb = _interopRequireDefault(require("./dynamoDb"));
var _system = require("./operations/system");
var _model = require("./operations/model");
var _entry = require("./operations/entry");
var _types = require("./types");
var _table = require("./definitions/table");
var _tableElasticsearch = require("./definitions/tableElasticsearch");
var _group = require("./definitions/group");
var _model2 = require("./definitions/model");
var _entry2 = require("./definitions/entry");
var _entryElasticsearch = require("./definitions/entryElasticsearch");
var _system2 = require("./definitions/system");
var _createElasticsearchIndex = require("./elasticsearch/createElasticsearchIndex");
var _plugins = require("@webiny/plugins");
var _group2 = require("./operations/group");
var _apiElasticsearch = require("@webiny/api-elasticsearch");
var _indices = require("./elasticsearch/indices");
var _deleteElasticsearchIndex = require("./elasticsearch/deleteElasticsearchIndex");
var _plugins2 = require("./plugins");
Object.keys(_plugins2).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
if (key in exports && exports[key] === _plugins2[key]) return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {
return _plugins2[key];
}
});
});
var _plugins3 = require("./operations/entry/elasticsearch/filtering/plugins");
var _CmsEntryFilterPlugin = require("./plugins/CmsEntryFilterPlugin");
var _apiHeadlessCms = require("@webiny/api-headless-cms");
var _indexes = require("./operations/system/indexes");
var _createIndexTaskPlugin = require("./tasks/createIndexTaskPlugin");
var _api = require("@webiny/api");
const createStorageOperations = params => {
const {
attributes,
table,
esTable,
documentClient,
elasticsearch,
plugins: userPlugins
} = params;
const tableInstance = (0, _table.createTable)({
table,
documentClient
});
const tableElasticsearchInstance = (0, _tableElasticsearch.createElasticsearchTable)({
table: esTable,
documentClient
});
const entities = {
system: (0, _system2.createSystemEntity)({
entityName: _types.ENTITIES.SYSTEM,
table: tableInstance,
attributes: attributes ? attributes[_types.ENTITIES.SYSTEM] : {}
}),
groups: (0, _group.createGroupEntity)({
entityName: _types.ENTITIES.GROUPS,
table: tableInstance,
attributes: attributes ? attributes[_types.ENTITIES.GROUPS] : {}
}),
models: (0, _model2.createModelEntity)({
entityName: _types.ENTITIES.MODELS,
table: tableInstance,
attributes: attributes ? attributes[_types.ENTITIES.MODELS] : {}
}),
entries: (0, _entry2.createEntryEntity)({
entityName: _types.ENTITIES.ENTRIES,
table: tableInstance,
attributes: attributes ? attributes[_types.ENTITIES.ENTRIES] : {}
}),
entriesEs: (0, _entryElasticsearch.createEntryElasticsearchEntity)({
entityName: _types.ENTITIES.ENTRIES_ES,
table: tableElasticsearchInstance,
attributes: attributes ? attributes[_types.ENTITIES.ENTRIES_ES] : {}
})
};
const plugins = new _plugins.PluginsContainer([
/**
* DynamoDB filter plugins for the where conditions.
*/
(0, _filters.default)(),
/**
* Field plugins for DynamoDB.
*/
(0, _dynamoDb.default)(),
/**
* Field plugins for Elasticsearch.
*/
(0, _elasticsearch.default)(),
/**
* Built-in Elasticsearch index templates.
*/
(0, _indices.elasticsearchIndexPlugins)(),
/**
* Filter plugins used to apply filtering from where conditions to Elasticsearch query.
*/
(0, _plugins3.createFilterPlugins)(),
/**
* User defined custom plugins.
* They are at the end because we can then override existing plugins.
*/
...(userPlugins || [])]);
const entries = (0, _entry.createEntriesStorageOperations)({
entity: entities.entries,
esEntity: entities.entriesEs,
plugins,
elasticsearch
});
return {
name: "dynamodb:elasticsearch",
beforeInit: async context => {
context.db.registry.register({
item: entities.entries,
app: "cms",
tags: ["regular", entities.entries.name]
});
context.db.registry.register({
item: entities.entriesEs,
app: "cms",
tags: ["es", entities.entriesEs.name]
});
/**
* Attach the elasticsearch into context if it is not already attached.
*/
if (!context.elasticsearch) {
context.elasticsearch = elasticsearch;
}
/**
* Pass the plugins to the parent context.
*/
context.plugins.register([(0, _dynamoDb.default)(), (0, _createIndexTaskPlugin.createIndexTaskPluginTest)(), (0, _indices.elasticsearchIndexPlugins)()]);
/**
* We need to fetch all the plugin types in the list from the main container.
* This way we do not need to register plugins in the storage plugins contains.
*/
const types = [_apiElasticsearch.ElasticsearchQueryBuilderOperatorPlugin.type,
// Headless CMS
"cms-model-field-to-graphql", _CmsEntryFilterPlugin.CmsEntryFilterPlugin.type, _plugins2.CmsEntryElasticsearchBodyModifierPlugin.type, _plugins2.CmsEntryElasticsearchFullTextSearchPlugin.type, _plugins2.CmsEntryElasticsearchIndexPlugin.type, _plugins2.CmsEntryElasticsearchQueryBuilderValueSearchPlugin.type, _plugins2.CmsEntryElasticsearchQueryModifierPlugin.type, _plugins2.CmsEntryElasticsearchSortModifierPlugin.type, _plugins2.CmsElasticsearchModelFieldPlugin.type, _apiHeadlessCms.StorageOperationsCmsModelPlugin.type, _apiHeadlessCms.StorageTransformPlugin.type, _plugins2.CmsEntryElasticsearchValuesModifier.type, _api.CompressorPlugin.type];
for (const type of types) {
plugins.mergeByType(context.plugins, type);
}
entries.dataLoaders.clearAll();
},
init: async context => {
/**
* We need to create indexes on before model create and on clone (create from).
* Other apps create indexes on locale creation.
*/
await (0, _indexes.createElasticsearchIndexesOnLocaleAfterCreate)({
context,
client: elasticsearch,
plugins
});
context.cms.onModelBeforeCreate.subscribe(async ({
model
}) => {
await (0, _createElasticsearchIndex.createElasticsearchIndex)({
client: elasticsearch,
model,
plugins
});
});
context.cms.onModelBeforeCreateFrom.subscribe(async ({
model
}) => {
await (0, _createElasticsearchIndex.createElasticsearchIndex)({
client: elasticsearch,
model,
plugins
});
});
context.cms.onModelAfterDelete.subscribe(async ({
model
}) => {
await (0, _deleteElasticsearchIndex.deleteElasticsearchIndex)({
client: elasticsearch,
model
});
});
context.cms.onModelInitialize.subscribe(async ({
model
}) => {
await (0, _createElasticsearchIndex.createElasticsearchIndex)({
client: elasticsearch,
model,
plugins
});
});
},
getEntities: () => entities,
getTable: () => tableInstance,
getEsTable: () => tableElasticsearchInstance,
system: (0, _system.createSystemStorageOperations)({
entity: entities.system
}),
groups: (0, _group2.createGroupsStorageOperations)({
entity: entities.groups,
plugins
}),
models: (0, _model.createModelsStorageOperations)({
entity: entities.models,
elasticsearch
}),
entries
};
};
exports.createStorageOperations = createStorageOperations;
//# sourceMappingURL=index.js.map