@jsstudio/development-api-interceptor
Version:
development-api-interceptor
145 lines • 6.75 kB
JavaScript
;
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