UNPKG

@kwiz/node

Version:

KWIZ utilities and helpers for node applications

404 lines 15.8 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 __asyncValues = (this && this.__asyncValues) || function (o) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var m = o[Symbol.asyncIterator], i; return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.restoreOverflowColumnValue = exports.overflowColumnValue = exports.tableColumnLengthLimit = exports.Table = exports.upsertItem = exports.deleteItem = exports.addItem = exports.getItems = exports.deleteTable = exports.ensureTable = exports.listTables = exports.findTable = exports.ConfigureTableStorage = void 0; const data_tables_1 = require("@azure/data-tables"); const common_1 = require("@kwiz/common"); const odata_1 = require("./odata"); var connectionString = null; function ConfigureTableStorage(config) { connectionString = config.connectionString; } exports.ConfigureTableStorage = ConfigureTableStorage; function getTableService() { if ((0, common_1.isNullOrEmptyString)(connectionString)) throw Error("Call ConfigureTableStorage first"); return data_tables_1.TableServiceClient.fromConnectionString(connectionString); } function getTableClient(tableName) { if ((0, common_1.isNullOrEmptyString)(connectionString)) throw Error("Call ConfigureTableStorage first"); return data_tables_1.TableClient.fromConnectionString(connectionString, tableName); } function findTable(tableName) { var _a, e_1, _b, _c; return __awaiter(this, void 0, void 0, function* () { const tableService = getTableService(); let success = false; try { const tables = tableService.listTables({ queryOptions: { //Tag function - read more https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals filter: (0, data_tables_1.odata) `TableName eq ${tableName}` } }); try { for (var _d = true, tables_1 = __asyncValues(tables), tables_1_1; tables_1_1 = yield tables_1.next(), _a = tables_1_1.done, !_a; _d = true) { _c = tables_1_1.value; _d = false; const table = _c; success = true; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (!_d && !_a && (_b = tables_1.return)) yield _b.call(tables_1); } finally { if (e_1) throw e_1.error; } } } catch (e) { //console.log(e); } return { success, errorCode: success ? undefined : "Not found" }; }); } exports.findTable = findTable; function listTables() { var _a, e_2, _b, _c; return __awaiter(this, void 0, void 0, function* () { const tableService = getTableService(); let arr = []; try { const tables = tableService.listTables(); try { for (var _d = true, tables_2 = __asyncValues(tables), tables_2_1; tables_2_1 = yield tables_2.next(), _a = tables_2_1.done, !_a; _d = true) { _c = tables_2_1.value; _d = false; const table = _c; arr.push(table.name); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (!_d && !_a && (_b = tables_2.return)) yield _b.call(tables_2); } finally { if (e_2) throw e_2.error; } } } catch (e) { //console.log(e); } return arr; }); } exports.listTables = listTables; // async function ensureTableObsolete(name: string) { // const tableService = getTableService(); // //create table // // If the table 'newTable' already exists, createTable doesn't throw // let success = false; // try { // await tableService.createTable(name, { // onResponse: raw => { // let error = isError(raw); // success = error.isError !== true; // if (error.isError) console.log(error.message); // } // }); // } // catch (e) { // success = false; // } // return success; // } function ensureTable(tableName) { return __awaiter(this, void 0, void 0, function* () { const table = getTableClient(tableName); let success = false; let errorCode; try { yield table.createTable({ onResponse: raw => { let error = isError(raw); success = error.isError !== true || error.errorCode === "TableAlreadyExists"; if (error.isError) { console.error(error.errorCode); errorCode = error.errorCode; } } }); } catch (e) { //console.error(e); } return { success, errorCode }; }); } exports.ensureTable = ensureTable; function deleteTable(tableName) { return __awaiter(this, void 0, void 0, function* () { const table = getTableClient(tableName); let success = false; let errorCode; try { yield table.deleteTable({ onResponse: raw => { let error = isError(raw); success = error.isError !== true; if (error.isError) { console.error(error.errorCode); errorCode = error.errorCode; } } }); } catch (e) { //console.log(e); } return { success, errorCode }; }); } exports.deleteTable = deleteTable; //https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/tables/data-tables/samples/v13/typescript/src/queryEntities.ts function getItems(tableName, options) { var _a, e_3, _b, _c; return __awaiter(this, void 0, void 0, function* () { const table = getTableClient(tableName); let success = true; let errorCode; let result = []; try { let o; if (options) { if (!(0, common_1.isNullOrUndefined)(options.filterStatment)) { let filterStatment = (0, odata_1.getOdataFilter)(options.filterStatment); if (!(0, common_1.isNullOrEmptyString)(filterStatment)) o = { queryOptions: { filter: filterStatment } }; } } let items = table.listEntities(o); try { for (var _d = true, items_1 = __asyncValues(items), items_1_1; items_1_1 = yield items_1.next(), _a = items_1_1.done, !_a; _d = true) { _c = items_1_1.value; _d = false; const item = _c; //console.dir(item); if (!options || typeof options.postFilter !== "function" || options.postFilter(item)) result.push(item); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (!_d && !_a && (_b = items_1.return)) yield _b.call(items_1); } finally { if (e_3) throw e_3.error; } } } catch (e) { //console.log(e); success = false; errorCode = "Could not get items"; } return { success, errorCode, result }; }); } exports.getItems = getItems; function addItem(tableName, item) { return __awaiter(this, void 0, void 0, function* () { const table = getTableClient(tableName); let success = false; let errorCode; try { let result = yield table.createEntity(item, { onResponse: raw => { let error = isError(raw); success = error.isError !== true; if (error.isError) { console.error(error.errorCode); errorCode = error.errorCode; } } }); //console.log(result); success = true; } catch (e) { success = false; } return { success, errorCode }; }); } exports.addItem = addItem; function deleteItem(tableName, partitionKey, rowKey) { return __awaiter(this, void 0, void 0, function* () { const table = getTableClient(tableName); let success = false; let errorCode; try { let result = yield table.deleteEntity(partitionKey, rowKey, { onResponse: raw => { let error = isError(raw); //error not found is still a success for delete action success = error.isError !== true || error.errorCode === "ResourceNotFound"; if (error.isError) { console.error(error.errorCode); errorCode = error.errorCode; } } }); //console.log(result); success = true; } catch (e) { //success = false; } return { success, errorCode }; }); } exports.deleteItem = deleteItem; function upsertItem(tableName, item, options) { return __awaiter(this, void 0, void 0, function* () { const table = getTableClient(tableName); let success = false; let errorCode; try { let result = yield table.upsertEntity(item, (options === null || options === void 0 ? void 0 : options.mode) || "Replace", { onResponse: raw => { let error = isError(raw); success = error.isError !== true; if (error.isError) { console.error(error.errorCode); errorCode = error.errorCode; } } }); //console.log(result); success = true; } catch (e) { console.error(e); success = false; } return { success, errorCode }; }); } exports.upsertItem = upsertItem; class Table { /** If your type contains complex values, provide a transforer to serialize/deserialize those complex columns */ constructor(tableName, options) { this.getKeys = null; this.tableName = tableName; this.getKeys = options.getKeys; this.transform = options.transform || { save: v => v, load: v => v }; } delete() { return deleteTable(this.tableName); } ensure() { return ensureTable(this.tableName); } getItems(options) { return __awaiter(this, void 0, void 0, function* () { let itemsResult = yield getItems(this.tableName, options); return Object.assign(Object.assign({}, itemsResult), { result: itemsResult.result.map(i => this.transform.load(i, this)) }); }); } addItem(item) { return __awaiter(this, void 0, void 0, function* () { yield this.ensure(); return addItem(this.tableName, this.transform.save(item, this)); }); } upsertItem(item, options) { return __awaiter(this, void 0, void 0, function* () { yield this.ensure(); return upsertItem(this.tableName, this.transform.save(item, this), options); }); } deleteItemByKey(param) { let keys = this.getKeys(param); return this.deleteItem(keys); } deleteItem(item) { return deleteItem(this.tableName, item.partitionKey, item.rowKey); } } exports.Table = Table; function isError(raw) { let isError = false; let errorCode = null; //201 - table created successfully //204 - entity created successfully //409 - table/entity already exists //400 - table name not allowed / Property value too large //404 - TableNotFound when adding item if (raw.status >= 400) { isError = true; let error = raw.parsedBody; errorCode = error && error.odataError && !(0, common_1.isNullOrEmptyString)(error.odataError.code) ? error.odataError.code : `Unknown error`; //for some errors like table name too short, error code is empty } else { isError = false; } return { isError, errorCode }; } exports.tableColumnLengthLimit = 31999; function overflowColumnValue(item, longProps, overrideLimit) { let limit = (0, common_1.isNumber)(overrideLimit) && overrideLimit > 0 ? overrideLimit : exports.tableColumnLengthLimit; let columns = {}; const properties = !Array.isArray(longProps) ? [longProps] : longProps; properties.forEach(propertyName => { let value = item[propertyName]; if ((0, common_1.isNotEmptyString)(value)) { let splitValue = (0, common_1.splitString)(value, { maxLength: limit }); splitValue.forEach((v, i) => { //form, form2, form3... let key = i === 0 ? propertyName : `${propertyName}${i + 1}`; columns[key] = v; }); } }); if ((0, common_1.isNotEmptyArray)(Object.keys(columns))) item = Object.assign(Object.assign({}, item), columns); return item; } exports.overflowColumnValue = overflowColumnValue; function restoreOverflowColumnValue(item, longProps) { const properties = !Array.isArray(longProps) ? [longProps] : longProps; properties.forEach(propertyName => { let result = item[propertyName]; if ((0, common_1.isNotEmptyString)(result)) { let startIndex = 2; let key = `${propertyName}${startIndex}`; //restore from overflow while ((0, common_1.isNotEmptyString)(item[key])) { result += item[key]; delete item[key]; startIndex++; key = `${propertyName}${startIndex}`; } } item[propertyName] = result; }); return item; } exports.restoreOverflowColumnValue = restoreOverflowColumnValue; //# sourceMappingURL=table-storage.js.map