UNPKG

@aws-amplify/datastore

Version:

AppSyncLocal support for aws-amplify

1 lines • 21.4 kB
{"version":3,"file":"StorageAdapterBase.mjs","sources":["../../../../src/storage/adapter/StorageAdapterBase.ts"],"sourcesContent":["import { ConsoleLogger } from '@aws-amplify/core';\nimport { ModelPredicateCreator } from '../../predicates';\nimport { isPredicateObj, } from '../../types';\nimport { extractPrimaryKeyFieldNames, extractPrimaryKeyValues, getIndexKeys, getStorename, isModelConstructor, traverseModel, validatePredicate, } from '../../util';\nimport { ModelRelationship } from '../relationship';\nconst logger = new ConsoleLogger('DataStore');\nconst DB_NAME = 'amplify-datastore';\nexport class StorageAdapterBase {\n constructor() {\n this.dbName = DB_NAME;\n }\n /**\n * Initializes local DB\n *\n * @param theSchema\n * @param namespaceResolver\n * @param modelInstanceCreator\n * @param getModelConstructorByModelName\n * @param sessionId\n */\n async setUp(theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName, sessionId) {\n await this.preSetUpChecks();\n if (!this.initPromise) {\n this.initPromise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n else {\n await this.initPromise;\n return;\n }\n if (sessionId) {\n this.dbName = `${DB_NAME}-${sessionId}`;\n }\n this.schema = theSchema;\n this.namespaceResolver = namespaceResolver;\n this.modelInstanceCreator = modelInstanceCreator;\n this.getModelConstructorByModelName = getModelConstructorByModelName;\n try {\n if (!this.db) {\n this.db = await this.initDb();\n this.resolve();\n }\n }\n catch (error) {\n this.reject(error);\n }\n }\n /**\n * @param modelConstructor\n * @returns local DB table name\n */\n getStorenameForModel(modelConstructor) {\n const namespace = this.namespaceResolver(modelConstructor);\n const { name: modelName } = modelConstructor;\n return getStorename(namespace, modelName);\n }\n /**\n *\n * @param model - instantiated model record\n * @returns the record's primary key values\n */\n getIndexKeyValuesFromModel(model) {\n const modelConstructor = Object.getPrototypeOf(model)\n .constructor;\n const namespaceName = this.namespaceResolver(modelConstructor);\n const keys = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);\n return extractPrimaryKeyValues(model, keys);\n }\n /**\n * Common metadata for `save` operation\n * used by individual storage adapters\n *\n * @param model\n */\n saveMetadata(model) {\n const modelConstructor = Object.getPrototypeOf(model)\n .constructor;\n const storeName = this.getStorenameForModel(modelConstructor);\n const namespaceName = this.namespaceResolver(modelConstructor);\n const connectedModels = traverseModel(modelConstructor.name, model, this.schema.namespaces[namespaceName], this.modelInstanceCreator, this.getModelConstructorByModelName);\n const set = new Set();\n const connectionStoreNames = Object.values(connectedModels).map(({ modelName, item, instance }) => {\n const resolvedStoreName = getStorename(namespaceName, modelName);\n set.add(resolvedStoreName);\n const keys = getIndexKeys(this.schema.namespaces[namespaceName], modelName);\n return { storeName: resolvedStoreName, item, instance, keys };\n });\n const modelKeyValues = this.getIndexKeyValuesFromModel(model);\n return { storeName, set, connectionStoreNames, modelKeyValues };\n }\n /**\n * Enforces conditional save. Throws if condition is not met.\n * used by individual storage adapters\n *\n * @param model\n */\n validateSaveCondition(condition, fromDB) {\n if (!(condition && fromDB)) {\n return;\n }\n const predicates = ModelPredicateCreator.getPredicates(condition);\n const { predicates: predicateObjs, type } = predicates;\n const isValid = validatePredicate(fromDB, type, predicateObjs);\n if (!isValid) {\n const msg = 'Conditional update failed';\n logger.error(msg, { model: fromDB, condition: predicateObjs });\n throw new Error(msg);\n }\n }\n /**\n * Instantiate models from POJO records returned from the database\n *\n * @param namespaceName - string model namespace\n * @param srcModelName - string model name\n * @param records - array of uninstantiated records\n * @returns\n */\n async load(namespaceName, srcModelName, records) {\n const namespace = this.schema.namespaces[namespaceName];\n const relations = namespace.relationships[srcModelName].relationTypes;\n const connectionStoreNames = relations.map(({ modelName }) => {\n return getStorename(namespaceName, modelName);\n });\n const modelConstructor = this.getModelConstructorByModelName(namespaceName, srcModelName);\n if (connectionStoreNames.length === 0) {\n return records.map(record => this.modelInstanceCreator(modelConstructor, record));\n }\n return records.map(record => this.modelInstanceCreator(modelConstructor, record));\n }\n /**\n * Extracts operands from a predicate group into an array of key values\n * Used in the query method\n *\n * @param predicates - predicate group\n * @param keyPath - string array of key names ['id', 'sortKey']\n * @returns string[] of key values\n *\n * @example\n * ```js\n * { and:[{ id: { eq: 'abc' }}, { sortKey: { eq: 'def' }}] }\n * ```\n * Becomes\n * ```\n * ['abc', 'def']\n * ```\n */\n keyValueFromPredicate(predicates, keyPath) {\n const { predicates: predicateObjs } = predicates;\n if (predicateObjs.length !== keyPath.length) {\n return;\n }\n const keyValues = [];\n for (const key of keyPath) {\n const predicateObj = predicateObjs.find(p => \n // it's a relevant predicate object only if it's an equality\n // operation for a key field from the key:\n isPredicateObj(p) &&\n p.field === key &&\n p.operator === 'eq' &&\n p.operand !== null &&\n p.operand !== undefined);\n predicateObj && keyValues.push(predicateObj.operand);\n }\n return keyValues.length === keyPath.length ? keyValues : undefined;\n }\n /**\n * Common metadata for `query` operation\n * used by individual storage adapters\n *\n * @param modelConstructor\n * @param predicate\n * @param pagination\n */\n queryMetadata(modelConstructor, predicate, pagination) {\n const storeName = this.getStorenameForModel(modelConstructor);\n const namespaceName = this.namespaceResolver(modelConstructor);\n const predicates = predicate && ModelPredicateCreator.getPredicates(predicate);\n const keyPath = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);\n const queryByKey = predicates && this.keyValueFromPredicate(predicates, keyPath);\n const hasSort = pagination && pagination.sort;\n const hasPagination = pagination && pagination.limit;\n return {\n storeName,\n namespaceName,\n queryByKey,\n predicates,\n hasSort,\n hasPagination,\n };\n }\n /**\n * Delete record\n * Cascades to related records (for Has One and Has Many relationships)\n *\n * @param modelOrModelConstructor\n * @param condition\n * @returns\n */\n async delete(modelOrModelConstructor, condition) {\n await this.preOpCheck();\n const deleteQueue = [];\n if (isModelConstructor(modelOrModelConstructor)) {\n const modelConstructor = modelOrModelConstructor;\n const namespace = this.namespaceResolver(modelConstructor);\n const models = await this.query(modelConstructor, condition);\n if (condition !== undefined) {\n await this.deleteTraverse(models, modelConstructor, namespace, deleteQueue);\n await this.deleteItem(deleteQueue);\n const deletedModels = deleteQueue.reduce((acc, { items }) => acc.concat(items), []);\n return [models, deletedModels];\n }\n else {\n await this.deleteTraverse(models, modelConstructor, namespace, deleteQueue);\n await this.deleteItem(deleteQueue);\n const deletedModels = deleteQueue.reduce((acc, { items }) => acc.concat(items), []);\n return [models, deletedModels];\n }\n }\n else {\n const model = modelOrModelConstructor;\n const modelConstructor = Object.getPrototypeOf(model)\n .constructor;\n const namespaceName = this.namespaceResolver(modelConstructor);\n const storeName = this.getStorenameForModel(modelConstructor);\n if (condition) {\n const keyValues = this.getIndexKeyValuesFromModel(model);\n const fromDB = await this._get(storeName, keyValues);\n if (fromDB === undefined) {\n const msg = 'Model instance not found in storage';\n logger.warn(msg, { model });\n return [[model], []];\n }\n const predicates = ModelPredicateCreator.getPredicates(condition);\n const { predicates: predicateObjs, type } = predicates;\n const isValid = validatePredicate(fromDB, type, predicateObjs);\n if (!isValid) {\n const msg = 'Conditional update failed';\n logger.error(msg, { model: fromDB, condition: predicateObjs });\n throw new Error(msg);\n }\n await this.deleteTraverse([model], modelConstructor, namespaceName, deleteQueue);\n }\n else {\n await this.deleteTraverse([model], modelConstructor, namespaceName, deleteQueue);\n }\n await this.deleteItem(deleteQueue);\n const deletedModels = deleteQueue.reduce((acc, { items }) => acc.concat(items), []);\n return [[model], deletedModels];\n }\n }\n /**\n * Recursively traverse relationship graph and add\n * all Has One and Has Many relations to `deleteQueue` param\n *\n * Actual deletion of records added to `deleteQueue` occurs in the `delete` method\n *\n * @param models\n * @param modelConstructor\n * @param namespace\n * @param deleteQueue\n */\n async deleteTraverse(models, modelConstructor, namespace, deleteQueue) {\n const cascadingRelationTypes = ['HAS_ONE', 'HAS_MANY'];\n for await (const model of models) {\n const modelDefinition = this.schema.namespaces[namespace].models[modelConstructor.name];\n const modelMeta = {\n builder: modelConstructor,\n schema: modelDefinition,\n pkField: extractPrimaryKeyFieldNames(modelDefinition),\n };\n const relationships = ModelRelationship.allFrom(modelMeta).filter(r => cascadingRelationTypes.includes(r.type));\n for await (const r of relationships) {\n const queryObject = r.createRemoteQueryObject(model);\n if (queryObject !== null) {\n const relatedRecords = await this.query(r.remoteModelConstructor, ModelPredicateCreator.createFromFlatEqualities(r.remoteDefinition, queryObject));\n await this.deleteTraverse(relatedRecords, r.remoteModelConstructor, namespace, deleteQueue);\n }\n }\n }\n deleteQueue.push({\n storeName: getStorename(namespace, modelConstructor.name),\n items: models,\n });\n }\n}\n"],"names":[],"mappings":"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"}