@kwiz/node
Version:
KWIZ utilities and helpers for node applications
404 lines • 15.8 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 __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