UNPKG

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

Version:

DynamoDB and Elasticsearch storage operations plugin for Headless CMS API.

183 lines (181 loc) 4.39 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.createModelsStorageOperations = void 0; var _error = _interopRequireDefault(require("@webiny/error")); var _configurations = require("../../configurations"); var _cleanup = require("@webiny/db-dynamodb/utils/cleanup"); var _query = require("@webiny/db-dynamodb/utils/query"); var _dbDynamodb = require("@webiny/db-dynamodb"); const createPartitionKey = params => { const { tenant, locale } = params; return `T#${tenant}#L#${locale}#CMS#CM`; }; const createSortKey = params => { return params.modelId; }; const createKeys = params => { return { PK: createPartitionKey(params), SK: createSortKey(params) }; }; const createType = () => { return "cms.model"; }; const createModelsStorageOperations = params => { const { entity, elasticsearch } = params; const create = async params => { const { model } = params; const { index } = _configurations.configurations.es({ model }); const keys = createKeys(model); let error; try { await (0, _dbDynamodb.put)({ entity, item: { ...(0, _cleanup.cleanupItem)(entity, model), ...keys, TYPE: createType() } }); return model; } catch (ex) { error = ex; } /** * In case of DynamoDB error we need to remove the index we created. */ try { await elasticsearch.indices.delete({ index, ignore_unavailable: true }); } catch (ex) { throw new _error.default(`Could not delete elasticsearch index "${index}" after model record failed to be created.`, "DELETE_MODEL_INDEX_ERROR", { dynamodbError: error, elasticsearchError: ex }); } throw error; }; const update = async params => { const { model } = params; const keys = createKeys(model); try { await (0, _dbDynamodb.put)({ entity, item: { ...(0, _cleanup.cleanupItem)(entity, model), ...keys, TYPE: createType() } }); return model; } catch (ex) { throw new _error.default(ex.message || "Could not update model.", ex.code || "MODEL_UPDATE_ERROR", { error: ex, model, keys }); } }; const deleteModel = async params => { const { model } = params; const keys = createKeys(model); const { index } = _configurations.configurations.es({ model }); try { await (0, _dbDynamodb.deleteItem)({ entity, keys }); } catch (ex) { throw new _error.default(ex.message || "Could not delete model.", ex.code || "MODEL_DELETE_ERROR", { error: ex, model, keys }); } /** * Always delete the model index after deleting the model. */ try { await elasticsearch.indices.delete({ index, ignore_unavailable: true }); } catch (ex) { throw new _error.default(`Could not delete elasticsearch index "${index}" after model record delete.`, "DELETE_MODEL_INDEX_ERROR", { error: ex, index, model }); } return model; }; const get = async params => { const keys = createKeys(params); try { return await (0, _dbDynamodb.getClean)({ entity, keys }); } catch (ex) { throw new _error.default(ex.message || "Could not get model.", ex.code || "MODEL_GET_ERROR", { error: ex, keys }); } }; const list = async params => { const { where } = params; const queryAllParams = { entity, partitionKey: createPartitionKey(where), options: { gte: " " } }; try { return await (0, _query.queryAllClean)(queryAllParams); } catch (ex) { throw new _error.default(ex.message || "Could not list models.", ex.code || "MODEL_LIST_ERROR", { error: ex, partitionKey: queryAllParams.partitionKey }); } }; return { create, update, delete: deleteModel, get, list }; }; exports.createModelsStorageOperations = createModelsStorageOperations; //# sourceMappingURL=index.js.map