UNPKG

@webiny/api-form-builder-so-ddb

Version:

[![](https://img.shields.io/npm/dw/@webiny/api-form-builder-so-ddb.svg)](https://www.npmjs.com/package/@webiny/api-form-builder-so-ddb) [![](https://img.shields.io/npm/v/@webiny/api-form-builder-so-ddb.svg)](https://www.npmjs.com/package/@webiny/api-form

224 lines (222 loc) 5.92 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.createSubmissionStorageOperations = void 0; var _error = _interopRequireDefault(require("@webiny/error")); var _utils = require("@webiny/utils"); var _query = require("@webiny/db-dynamodb/utils/query"); var _cursor = require("@webiny/db-dynamodb/utils/cursor"); var _sort = require("@webiny/db-dynamodb/utils/sort"); var _filter = require("@webiny/db-dynamodb/utils/filter"); var _FormSubmissionDynamoDbFieldPlugin = require("../../plugins/FormSubmissionDynamoDbFieldPlugin"); var _get = require("@webiny/db-dynamodb/utils/get"); var _dbDynamodb = require("@webiny/db-dynamodb"); const createSubmissionStorageOperations = params => { const { entity, plugins } = params; const createSubmissionPartitionKey = params => { const { tenant, locale, formId } = params; const { id } = (0, _utils.parseIdentifier)(formId); return `T#${tenant}#L#${locale}#FB#FS#${id}`; }; const createSubmissionSortKey = id => { return id; }; const createSubmissionType = () => { return "fb.formSubmission"; }; const createSubmission = async params => { const { submission, form } = params; const keys = { PK: createSubmissionPartitionKey(form), SK: createSubmissionSortKey(submission.id) }; try { await (0, _dbDynamodb.put)({ entity, item: { ...submission, ...keys, TYPE: createSubmissionType() } }); } catch (ex) { throw new _error.default(ex.message || "Could not create form submission in the DynamoDB.", ex.code || "UPDATE_FORM_SUBMISSION_ERROR", { submission, form, keys }); } return submission; }; const updateSubmission = async params => { const { submission, form, original } = params; const keys = { PK: createSubmissionPartitionKey(form), SK: createSubmissionSortKey(submission.id) }; try { await (0, _dbDynamodb.put)({ entity, item: { ...submission, ...keys, TYPE: createSubmissionType() } }); return submission; } catch (ex) { throw new _error.default(ex.message || "Could not update form submission in the DynamoDB.", ex.code || "UPDATE_FORM_SUBMISSION_ERROR", { submission, original, form, keys }); } }; const deleteSubmission = async params => { const { submission, form } = params; const keys = { PK: createSubmissionPartitionKey(form), SK: createSubmissionSortKey(submission.id) }; try { await (0, _dbDynamodb.deleteItem)({ entity, keys }); } catch (ex) { throw new _error.default(ex.message || "Could not delete form submission from DynamoDB.", ex.code || "DELETE_FORM_SUBMISSION_ERROR", { submission, form, keys }); } return submission; }; const listSubmissions = async params => { const { where: initialWhere, sort, limit = 100000, after } = params; const { tenant, locale, formId } = initialWhere; const where = { ...initialWhere }; /** * We need to remove conditions so we do not filter by them again. */ delete where.tenant; delete where.locale; delete where.formId; const queryAllParams = { entity, partitionKey: createSubmissionPartitionKey({ tenant, locale, formId }), options: { gte: " ", reverse: true } }; let results; try { results = await (0, _query.queryAll)(queryAllParams); } catch (ex) { throw new _error.default(ex.message || "Could list form submissions.", ex.code || "LIST_SUBMISSIONS_ERROR", { where: initialWhere, partitionKey: queryAllParams.partitionKey }); } const fields = plugins.byType(_FormSubmissionDynamoDbFieldPlugin.FormSubmissionDynamoDbFieldPlugin.type); const filteredSubmissions = (0, _filter.filterItems)({ plugins, items: results, where, fields }); const sortedSubmissions = (0, _sort.sortItems)({ items: filteredSubmissions, sort, fields }); const totalCount = sortedSubmissions.length; const start = parseInt((0, _cursor.decodeCursor)(after) || "0") || 0; const hasMoreItems = totalCount > start + limit; const end = limit > totalCount + start + limit ? undefined : start + limit; const items = sortedSubmissions.slice(start, end); /** * Although we do not need a cursor here, we will use it as such to keep it standardized. * Number is simply encoded. */ const cursor = items.length > 0 ? (0, _cursor.encodeCursor)(start + limit) : null; const meta = { hasMoreItems, totalCount, cursor }; return { items, meta }; }; const getSubmission = async params => { const { where } = params; const keys = { PK: createSubmissionPartitionKey(where), SK: createSubmissionSortKey(where.id) }; try { return await (0, _get.getClean)({ entity, keys }); } catch (ex) { throw new _error.default(ex.message || "Could not oad submission.", ex.code || "GET_SUBMISSION_ERROR", { where, keys }); } }; return { createSubmission, deleteSubmission, updateSubmission, listSubmissions, getSubmission, createSubmissionPartitionKey, createSubmissionSortKey }; }; exports.createSubmissionStorageOperations = createSubmissionStorageOperations; //# sourceMappingURL=index.js.map