{"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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"}