UNPKG

@jsstudio/development-api-interceptor

Version:
145 lines 6.75 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const idb_1 = require("idb"); const find_1 = __importDefault(require("lodash/find")); const constants_1 = require("../constants"); const error_handling_1 = require("../error-handling"); const json_schema_1 = __importDefault(require("../utils/json-schema")); const logger_1 = require("../utils/logger"); class IndexedDb { constructor() { this.database = ''; } setDatabase(database) { this.database = database; } initialize(json) { return __awaiter(this, void 0, void 0, function* () { const tableNames = json.tables.map((item) => item.table_name); try { const autoIncrementCols = this.getAutoIncrementColumns(json.tables); yield this.createDatabase(tableNames, autoIncrementCols); json_schema_1.default.set(json); } catch (err) { logger_1.logger('IndexedDb validation error', err); } }); } createDatabase(tableNames, autoIncrementCols) { return __awaiter(this, void 0, void 0, function* () { try { this.db = yield idb_1.openDB(this.database, constants_1.INDEXED_DB_VERSION, { upgrade(db) { for (const tableName of tableNames) { const autoIncrementIndex = autoIncrementCols.findIndex((item) => item.tableName === tableName); autoIncrementIndex > -1 ? db.createObjectStore(tableName, autoIncrementCols[autoIncrementIndex]) : db.createObjectStore(tableName); } }, }); } catch (error) { return false; } Object.freeze(indexedDB); }); } getAutoIncrementColumns(tables) { const autoIncrementColObj = []; for (const { table_name: tableName, columns } of tables) { for (const { entity_name: keyPath, constraints } of columns) { if ((!this.hasConstraint(constants_1.AUTO_INCREMENT, constraints)) || (this.hasConstraint(constants_1.AUTO_INCREMENT, constraints) && !(constraints === null || constraints === void 0 ? void 0 : constraints.AUTO_INCREMENT))) { continue; } autoIncrementColObj.push({ keyPath, tableName, autoIncrement: true }); } } return autoIncrementColObj; } getPrimaryKey(tableName) { const jsonSchema = json_schema_1.default.get(); const tableObject = find_1.default(jsonSchema.tables, (e) => e.table_name === tableName); const columnObject = find_1.default(tableObject === null || tableObject === void 0 ? void 0 : tableObject.columns, { constraints: { PRIMARY_KEY: true } }); if (!(columnObject === null || columnObject === void 0 ? void 0 : columnObject.entity_name)) { throw new error_handling_1.ApiError(constants_1.VALIDATION.PRIMARY_KEY_NOT_PRESENT_IN_SCHEMA, constants_1.RESPONSE_CODE.INVALID_INPUT); } return columnObject.entity_name; } hasConstraint(constraintValue, constraints) { var _a; return (_a = constraints === null || constraints === void 0 ? void 0 : constraints.hasOwnProperty(constraintValue)) !== null && _a !== void 0 ? _a : false; } getById(tableName, id) { return __awaiter(this, void 0, void 0, function* () { const tx = this.db.transaction(tableName, constants_1.INDEXED_DB_TRANSACTIONS.READ_ONLY); const store = tx.objectStore(tableName); return yield store.get(id); }); } getAll(tableName) { return __awaiter(this, void 0, void 0, function* () { const tx = this.db.transaction(tableName, constants_1.INDEXED_DB_TRANSACTIONS.READ_ONLY); const store = tx.objectStore(tableName); return yield store.getAll(); }); } create(tableName, value) { return __awaiter(this, void 0, void 0, function* () { const tx = this.db.transaction(tableName, constants_1.INDEXED_DB_TRANSACTIONS.READ_WRITE); const store = tx.objectStore(tableName); if (store.autoIncrement) { return yield store.put(value); } if (!value[this.getPrimaryKey(tableName)]) { throw new error_handling_1.ApiError(constants_1.VALIDATION.PRIMARY_KEY_NOT_PRESENT, constants_1.RESPONSE_CODE.INVALID_INPUT); } return yield store.put(value, value[this.getPrimaryKey(tableName)]); }); } update(tableName, value, id) { return __awaiter(this, void 0, void 0, function* () { const tx = this.db.transaction(tableName, constants_1.INDEXED_DB_TRANSACTIONS.READ_WRITE); const store = tx.objectStore(tableName); const result = yield store.get(id); if (!result) { return result; } value[this.getPrimaryKey(tableName)] = id; if (store.autoIncrement) { return yield store.put(value); } return yield store.put(value, id); }); } delete(tableName, id) { return __awaiter(this, void 0, void 0, function* () { const tx = this.db.transaction(tableName, constants_1.INDEXED_DB_TRANSACTIONS.READ_WRITE); const store = tx.objectStore(tableName); const result = yield store.get(id); if (!result) { return result; } yield store.delete(id); return id; }); } } const indexedDb = new IndexedDb(); exports.default = indexedDb; //# sourceMappingURL=index.js.map