UNPKG

@webiny/api-headless-cms-ddb-es

Version:

DynamoDB and Elasticsearch storage operations plugin for Headless CMS API.

225 lines (223 loc) 8.23 kB
"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