@ckstack/ck-lib-sequelize
Version:
sequelize helper module
832 lines (831 loc) • 75.8 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
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); }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const _ = __importStar(require("underscore"));
const JSON5 = __importStar(require("json5"));
const sequelize_1 = __importDefault(require("sequelize"));
const dk_lib_1 = require("@dkpkg/dk-lib");
const dk_lib_redis_1 = require("@dkpkg/dk-lib-redis");
const index_1 = require("../index");
class DatabaseService {
static _getCacheSingleDbRow(lhd, isCustomCache, cacheName, TCreator, dbFilter, transaction, order, lang, offset) {
return __awaiter(this, void 0, void 0, function* () {
if (!DatabaseService.IS_USE_REDIS_CACHE) {
dk_lib_1.CkLogger.errLog2(`not activate DB cache. CACHE_REDIS_INDEX [${DatabaseService.CACHE_REDIS_INDEX}], CACHE_ALIVE_SEC [${DatabaseService.CACHE_ALIVE_SEC}]`, lhd);
throw new dk_lib_1.CkError(lhd, dk_lib_1.CkValue.ERROR_TYPE.failed_db_redis_cache_config, 500, undefined, lang);
}
const cacheCustomKey = (isCustomCache ? dk_lib_1.CkCrypto.md5Hash(cacheName) : dk_lib_1.CkCrypto.md5Hash(JSON.stringify(dbFilter)));
let cacheKey;
if (DatabaseService.CACHE_SVC_NAME) {
cacheKey = (isCustomCache ? `cache.${DatabaseService.CACHE_SVC_NAME}.csi.custom.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.${DatabaseService.CACHE_SVC_NAME}.asi.tb${TCreator.name.toString().toLowerCase()}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
else {
cacheKey = (isCustomCache ? `cache.csi.custom.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.asi.tb${TCreator.name.toString().toLowerCase()}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
const startTm = Date.now();
let cacheValue = yield dk_lib_redis_1.CkRedis.getValue(lhd, cacheKey, true, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
if (cacheValue) {
dk_lib_1.CkLogger.printElapsedRedisLog2(lhd, startTm, `getCacheSingleDbRow, cacheKey [${cacheKey}], table [Tb${TCreator.name}], filter [${JSON5.stringify(dbFilter)}]`);
dk_lib_1.CkLogger.debugLog2(`hit cache table [Tb${TCreator.name}], filter [${JSON5.stringify(dbFilter)}]`, lhd);
if (typeof cacheValue === 'object') {
const _cacheValue = {};
const keys = Object.keys(cacheValue);
const isoDateReg = /^[+-]?\d{4}(-[01]\d(-[0-3]\d(T[0-2]\d:[0-5]\d:?([0-5]\d(\.\d+)?)?([+-][0-2]\d:[0-5]\d)?Z?)?)?)?$/;
for (const row of keys) {
const _tmpVal = cacheValue[row];
if (typeof cacheValue[row] === 'string' && isoDateReg.test(cacheValue[row])) {
_cacheValue[row] = new Date(_tmpVal);
dk_lib_1.CkLogger.debugLog2(`value is date string value. value [${_tmpVal}], convert to date [${_cacheValue[row]}]`, lhd);
}
else {
_cacheValue[row] = _tmpVal;
}
}
return _cacheValue;
}
return cacheValue;
}
const dbData = yield DatabaseService._getDataOneByFilter(lhd, TCreator, dbFilter, undefined, transaction, order, offset);
if (typeof dbData === 'string') {
dk_lib_1.CkLogger.errLog2(`can't find single cache data on rdbms. table [Tb${TCreator.name}], filter [${JSON5.stringify(dbFilter)}]`, lhd);
throw new dk_lib_1.CkError(lhd, dbData, 500, undefined, lang);
}
if (!dbData) {
dk_lib_1.CkLogger.warnLog2(`not found single cache data on rdbms. table [Tb${TCreator.name}], filter [${JSON5.stringify(dbFilter)}]`, lhd);
return null;
}
cacheValue = {};
const saveCacheValue = {};
const colKeys = Object.keys(dbData.dataValues);
for (const col of colKeys) {
const colData = dbData.getDataValue(col);
if (colData && colData instanceof Date) {
saveCacheValue[col] = colData.toISOString();
dk_lib_1.CkLogger.debugLog2(`value is date value. value [${colData}], convert string value [${saveCacheValue[col]}]`, lhd);
}
else {
saveCacheValue[col] = colData;
}
cacheValue[col] = colData;
}
try {
yield dk_lib_redis_1.CkRedis.upsertValue(lhd, cacheKey, saveCacheValue, DatabaseService.CACHE_ALIVE_SEC, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
dk_lib_1.CkLogger.debugLog2(`create single cache data. table [Tb${TCreator.name}], cache key [${cacheKey}], filter [${JSON5.stringify(dbFilter)}]`, lhd);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't create single cache data. table [Tb${TCreator.name}], cache key [${cacheKey}], cache data [${JSON5.stringify(saveCacheValue)}]. err [${err.toString()}]`, lhd);
throw err;
}
if (!isCustomCache && cacheValue && cacheValue.id !== undefined) {
let cacheIndexKey;
if (DatabaseService.CACHE_SVC_NAME) {
cacheIndexKey = `cache.${DatabaseService.CACHE_SVC_NAME}.asi.tb${TCreator.name.toString().toLowerCase()}.index.${cacheValue.id}`;
}
else {
cacheIndexKey = `cache.asi.tb${TCreator.name.toString().toLowerCase()}.index.${cacheValue.id}`;
}
const objKeys = Object.keys(dbFilter);
let nameFieldKey;
if (objKeys.length > 1) {
nameFieldKey = dk_lib_1.CkCrypto.md5Hash(JSON.stringify(objKeys));
}
else {
[nameFieldKey] = objKeys;
}
try {
yield dk_lib_redis_1.CkRedis.upsertHashValue(lhd, cacheIndexKey, { [nameFieldKey]: cacheKey }, DatabaseService.CACHE_ALIVE_SEC, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
dk_lib_1.CkLogger.debugLog2(`upsert db row cache index. cache index key [${cacheIndexKey}], field name [${nameFieldKey}], field value [${cacheKey}]`, lhd);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't update db row cache index. cache index key [${cacheIndexKey}], field name [${nameFieldKey}], field value [${cacheKey}]. err [${err.toString()}]`, lhd);
throw err;
}
}
return cacheValue;
});
}
static _getCacheMultiDbRow(lhd, isCustomCache, cacheName, TCreator, dbFilter, transaction, order, lang) {
return __awaiter(this, void 0, void 0, function* () {
if (!DatabaseService.IS_USE_REDIS_CACHE) {
dk_lib_1.CkLogger.errLog2(`not activate DB cache. CACHE_REDIS_INDEX [${DatabaseService.CACHE_REDIS_INDEX}], CACHE_ALIVE_SEC [${DatabaseService.CACHE_ALIVE_SEC}]`, lhd);
throw new dk_lib_1.CkError(lhd, dk_lib_1.CkValue.ERROR_TYPE.failed_db_redis_cache_config, 500, undefined, lang);
}
const cacheCustomKey = (isCustomCache ? dk_lib_1.CkCrypto.md5Hash(cacheName) : dk_lib_1.CkCrypto.md5Hash(JSON.stringify(dbFilter)));
let cacheKey;
if (DatabaseService.CACHE_SVC_NAME) {
cacheKey = (isCustomCache ? `cache.${DatabaseService.CACHE_SVC_NAME}.cmu.custom.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.${DatabaseService.CACHE_SVC_NAME}.amu.tb${TCreator.name.toString().toLowerCase()}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
else {
cacheKey = (isCustomCache ? `cache.cmu.custom.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.amu.tb${TCreator.name.toString().toLowerCase()}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
const startTm = Date.now();
let cacheValue = yield dk_lib_redis_1.CkRedis.getValue(lhd, cacheKey, true, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
if (cacheValue) {
dk_lib_1.CkLogger.printElapsedRedisLog2(lhd, startTm, `getCacheMultiDbRow, cacheKey [${cacheKey}], table [Tb${TCreator.name}], filter [${JSON5.stringify(dbFilter)}]`);
dk_lib_1.CkLogger.debugLog2(`hit cache table [Tb${TCreator.name}], filter [${JSON5.stringify(dbFilter)}]`, lhd);
const _cacheValue = [];
for (let i = 0, ilen = cacheValue.data.length; i < ilen; i += 1) {
const row1 = cacheValue.data[i];
const _element = {};
const keys = Object.keys(row1);
if (keys.length <= 0) {
continue;
}
const isoDateReg = /^[+-]?\d{4}(-[01]\d(-[0-3]\d(T[0-2]\d:[0-5]\d:?([0-5]\d(\.\d+)?)?([+-][0-2]\d:[0-5]\d)?Z?)?)?)?$/;
for (let j = 0, jlen = keys.length; j < jlen; j += 1) {
const row2 = keys[j];
const _tmpVal = row1[row2];
if (typeof row1[row2] === 'string' && isoDateReg.test(row1[row2])) {
_element[row2] = new Date(_tmpVal);
dk_lib_1.CkLogger.debugLog2(`value is date string value. value [${_tmpVal}], convert to date [${_element[row2]}]`, lhd);
}
else {
_element[row2] = _tmpVal;
}
}
if (Object.keys(_element).length > 0) {
_cacheValue.push(_element);
}
}
return _cacheValue;
}
const dbData = yield DatabaseService._getDatasByFilter(lhd, TCreator, dbFilter, undefined, transaction, order);
if (typeof dbData === 'string') {
dk_lib_1.CkLogger.errLog2(`can't find multi cache data on rdbms. table [Tb${TCreator.name}], filter [${JSON5.stringify(dbFilter)}]`, lhd);
throw new dk_lib_1.CkError(lhd, dbData, 500, undefined, lang);
}
if (dbData.length <= 0) {
dk_lib_1.CkLogger.warnLog2(`not found multi cache data on rdbms. table [Tb${TCreator.name}], filter [${JSON5.stringify(dbFilter)}]`, lhd);
return [];
}
cacheValue = { data: [] };
const saveCacheValue = { data: [] };
let idx = 0;
for (const row of dbData) {
const colKeys = Object.keys(row.dataValues);
cacheValue.data.push({});
saveCacheValue.data.push({});
for (const col of colKeys) {
const colData = row.getDataValue(col);
if (colData && colData instanceof Date) {
saveCacheValue.data[idx][col] = colData.toISOString();
dk_lib_1.CkLogger.debugLog2(`value is date value. value [${colData}], convert string value [${saveCacheValue.data[idx][col]}]`, lhd);
}
else {
saveCacheValue.data[idx][col] = colData;
}
cacheValue.data[idx][col] = colData;
}
idx += 1;
}
try {
yield dk_lib_redis_1.CkRedis.upsertValue(lhd, cacheKey, saveCacheValue, DatabaseService.CACHE_ALIVE_SEC, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
dk_lib_1.CkLogger.debugLog2(`create multi cache data. table [Tb${TCreator.name}], cache key [${cacheKey}], filter [${JSON5.stringify(dbFilter)}]`, lhd);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't create multi cache data. table [Tb${TCreator.name}], cache key [${cacheKey}], cache data [${JSON5.stringify(saveCacheValue)}], filter [${JSON5.stringify(dbFilter)}]. err [${err.toString()}]`, lhd);
throw new dk_lib_1.CkError(lhd, dk_lib_1.CkValue.ERROR_TYPE.redis_error, 500, undefined, lang);
}
return cacheValue.data;
});
}
static _getCacheJoinDbRow(lhd, cacheKeyPrefix, isCustomCache, cacheName, rdb, rawQuery, replacements, transaction, lang) {
return __awaiter(this, void 0, void 0, function* () {
if (!DatabaseService.IS_USE_REDIS_CACHE) {
dk_lib_1.CkLogger.errLog2(`not activate DB cache. CACHE_REDIS_INDEX [${DatabaseService.CACHE_REDIS_INDEX}], CACHE_ALIVE_SEC [${DatabaseService.CACHE_ALIVE_SEC}]`, lhd);
throw new dk_lib_1.CkError(lhd, dk_lib_1.CkValue.ERROR_TYPE.failed_db_redis_cache_config, 500, undefined, lang);
}
let cacheCustomKey;
if (isCustomCache) {
cacheCustomKey = dk_lib_1.CkCrypto.md5Hash(cacheName);
}
else {
cacheCustomKey = (typeof replacements === 'string' ? dk_lib_1.CkCrypto.md5Hash(replacements) : dk_lib_1.CkCrypto.md5Hash(JSON.stringify(replacements)));
}
let cacheKey;
if (DatabaseService.CACHE_SVC_NAME) {
cacheKey = (isCustomCache ? `cache.${DatabaseService.CACHE_SVC_NAME}.cjn.${cacheKeyPrefix}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.${DatabaseService.CACHE_SVC_NAME}.ajn.${cacheKeyPrefix}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
else {
cacheKey = (isCustomCache ? `cache.cjn.${cacheKeyPrefix}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.ajn.${cacheKeyPrefix}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
const startTm = Date.now();
let cacheValue = yield dk_lib_redis_1.CkRedis.getValue(lhd, cacheKey, true, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
if (cacheValue) {
dk_lib_1.CkLogger.printElapsedRedisLog2(lhd, startTm, `getCacheJoinDbRow, cacheKey [${cacheKey}]`);
dk_lib_1.CkLogger.debugLog2(`hit cache table replacements [${JSON5.stringify(replacements)}]`, lhd);
const _cacheValue = [];
for (let i = 0, ilen = cacheValue.data.length; i < ilen; i += 1) {
const row1 = cacheValue.data[i];
const _element = {};
const keys = Object.keys(row1);
if (keys.length <= 0) {
continue;
}
const isoDateReg = /^[+-]?\d{4}(-[01]\d(-[0-3]\d(T[0-2]\d:[0-5]\d:?([0-5]\d(\.\d+)?)?([+-][0-2]\d:[0-5]\d)?Z?)?)?)?$/;
for (let j = 0, jlen = keys.length; j < jlen; j += 1) {
const row2 = keys[j];
const _tmpVal = row1[row2];
if (typeof row1[row2] === 'string' && isoDateReg.test(row1[row2])) {
_element[row2] = new Date(_tmpVal);
dk_lib_1.CkLogger.debugLog2(`value is date string value. value [${_tmpVal}], convert to date [${_element[row2]}]`, lhd);
}
else {
_element[row2] = _tmpVal;
}
}
if (Object.keys(_element).length > 0) {
_cacheValue.push(_element);
}
}
return _cacheValue;
}
const dbData = yield DatabaseService._getDataByRawQuery(lhd, rawQuery, rdb, typeof replacements === 'string' ? undefined : replacements, transaction);
if (typeof dbData === 'string') {
dk_lib_1.CkLogger.errLog2(`can't find join cache data on rdbms. replacements [${JSON5.stringify(replacements)}]`, lhd);
throw new dk_lib_1.CkError(lhd, dbData, 500, undefined, lang);
}
if (dbData.length <= 0) {
dk_lib_1.CkLogger.warnLog2(`not found join cache data on rdbms. replacements [${JSON5.stringify(replacements)}]`, lhd);
return [];
}
cacheValue = { data: [] };
const saveCacheValue = { data: [] };
let idx = 0;
for (const row of dbData) {
const colKeys = Object.keys(row.dataValues);
cacheValue.data.push({});
saveCacheValue.data.push({});
for (const col of colKeys) {
const colData = row.getDataValue(col);
if (colData && colData instanceof Date) {
saveCacheValue.data[idx][col] = colData.toISOString();
dk_lib_1.CkLogger.debugLog2(`value is date value. value [${colData}], convert string value [${saveCacheValue.data[idx][col]}]`, lhd);
}
else {
saveCacheValue.data[idx][col] = colData;
}
cacheValue.data[idx][col] = colData;
}
idx += 1;
}
try {
yield dk_lib_redis_1.CkRedis.upsertValue(lhd, cacheKey, saveCacheValue, DatabaseService.CACHE_ALIVE_SEC, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
dk_lib_1.CkLogger.debugLog2(`create join cache data. cache key [${cacheKey}], replacements [${JSON5.stringify(replacements)}]`, lhd);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't create join cache data. cache key [${cacheKey}], cache data [${JSON5.stringify(saveCacheValue)}], replacements [${JSON5.stringify(replacements)}]. err [${err.toString()}]`, lhd);
throw new dk_lib_1.CkError(lhd, dk_lib_1.CkValue.ERROR_TYPE.redis_error, 500, undefined, lang);
}
return cacheValue.data;
});
}
static _removeCacheAutoDbRow(lhd, TCreator, ids, lang) {
var _a, ids_1, ids_1_1;
var _b, e_1, _c, _d;
return __awaiter(this, void 0, void 0, function* () {
if (!DatabaseService.IS_USE_REDIS_CACHE) {
dk_lib_1.CkLogger.debugLog2(`not activate DB cache. CACHE_REDIS_INDEX [${DatabaseService.CACHE_REDIS_INDEX}], CACHE_ALIVE_SEC [${DatabaseService.CACHE_ALIVE_SEC}]`, lhd);
throw new dk_lib_1.CkError(lhd, dk_lib_1.CkValue.ERROR_TYPE.failed_db_redis_cache_config, 500, undefined, lang);
}
let willRemoveCache = [];
if (Array.isArray(ids)) {
try {
for (_a = true, ids_1 = __asyncValues(ids); ids_1_1 = yield ids_1.next(), _b = ids_1_1.done, !_b;) {
_d = ids_1_1.value;
_a = false;
try {
const row = _d;
let cacheIndexKey;
if (DatabaseService.CACHE_SVC_NAME) {
cacheIndexKey = `cache.${DatabaseService.CACHE_SVC_NAME}.asi.tb${TCreator.name.toString().toLowerCase()}.index.${row}`;
}
else {
cacheIndexKey = `cache.asi.tb${TCreator.name.toString().toLowerCase()}.index.${row}`;
}
const cacheKeys = yield dk_lib_redis_1.CkRedis.getHashAllValues(lhd, cacheIndexKey, false, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
if (cacheKeys.length <= 0) {
dk_lib_1.CkLogger.debugLog2(`not found any cache. cache index key [${cacheIndexKey}]`, lhd);
continue;
}
willRemoveCache = _.union(willRemoveCache, cacheKeys);
willRemoveCache.push(cacheIndexKey);
}
finally {
_a = true;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (!_a && !_b && (_c = ids_1.return)) yield _c.call(ids_1);
}
finally { if (e_1) throw e_1.error; }
}
}
else {
let cacheIndexKey;
if (DatabaseService.CACHE_SVC_NAME) {
cacheIndexKey = `cache.${DatabaseService.CACHE_SVC_NAME}.asi.tb${TCreator.name.toString().toLowerCase()}.index.${ids}`;
}
else {
cacheIndexKey = `cache.asi.tb${TCreator.name.toString().toLowerCase()}.index.${ids}`;
}
const cacheKeys = yield dk_lib_redis_1.CkRedis.getHashAllValues(lhd, cacheIndexKey, false, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
if (cacheKeys.length <= 0) {
dk_lib_1.CkLogger.debugLog2(`not found any cache. cache index key [${cacheIndexKey}]`, lhd);
}
else {
willRemoveCache = _.union(willRemoveCache, cacheKeys);
willRemoveCache.push(cacheIndexKey);
}
}
if (willRemoveCache.length > 0) {
try {
yield dk_lib_redis_1.CkRedis.remove(lhd, willRemoveCache, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't remove cache. cache keys [${JSON5.stringify(willRemoveCache)}]`, lhd);
throw err;
}
}
return willRemoveCache.length;
});
}
static _removeCacheDbRow(lhd, isCustomCache, cacheName, TCreator, dbFilter, isMulti, lang) {
return __awaiter(this, void 0, void 0, function* () {
if (!DatabaseService.IS_USE_REDIS_CACHE) {
dk_lib_1.CkLogger.errLog2(`not activate DB cache. CACHE_REDIS_INDEX [${DatabaseService.CACHE_REDIS_INDEX}], CACHE_ALIVE_SEC [${DatabaseService.CACHE_ALIVE_SEC}]`, lhd);
throw new dk_lib_1.CkError(lhd, dk_lib_1.CkValue.ERROR_TYPE.failed_db_redis_cache_config, 500, undefined, lang);
}
const cacheCustomKey = (isCustomCache ? dk_lib_1.CkCrypto.md5Hash(cacheName) : dk_lib_1.CkCrypto.md5Hash(JSON.stringify(dbFilter)));
let cacheKey;
if (isMulti) {
if (DatabaseService.CACHE_SVC_NAME) {
cacheKey = (isCustomCache ? `cache.${DatabaseService.CACHE_SVC_NAME}.cmu.custom.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.${DatabaseService.CACHE_SVC_NAME}.amu.tb${TCreator.name.toString().toLowerCase()}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
else {
cacheKey = (isCustomCache ? `cache.cmu.custom.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.amu.tb${TCreator.name.toString().toLowerCase()}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
}
else {
if (DatabaseService.CACHE_SVC_NAME) {
cacheKey = (isCustomCache ? `cache.${DatabaseService.CACHE_SVC_NAME}.csi.custom.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.${DatabaseService.CACHE_SVC_NAME}.asi.tb${TCreator.name.toString().toLowerCase()}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
else {
cacheKey = (isCustomCache ? `cache.csi.custom.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.asi.tb${TCreator.name.toString().toLowerCase()}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
}
const startTm = Date.now();
const rmCount = yield dk_lib_redis_1.CkRedis.remove(lhd, cacheKey, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
dk_lib_1.CkLogger.printElapsedRedisLog2(lhd, startTm, `removeCacheDbRow, cacheKey [${cacheKey}], table [Tb${TCreator.name}], filter [${JSON5.stringify(dbFilter)}], isMulti [${isMulti}]`);
dk_lib_1.CkLogger.infoLog2(`removed db cache. table [Tb${TCreator.name}], filter [${JSON5.stringify(dbFilter)}], isMulti [${isMulti}], deleted count [${rmCount}]`, lhd);
return rmCount;
});
}
static _removeCacheJoinDbRow(lhd, cacheKeyPrefix, isCustomCache, cacheName, replacements, lang) {
return __awaiter(this, void 0, void 0, function* () {
if (!DatabaseService.IS_USE_REDIS_CACHE) {
dk_lib_1.CkLogger.errLog2(`not activate DB cache. CACHE_REDIS_INDEX [${DatabaseService.CACHE_REDIS_INDEX}], CACHE_ALIVE_SEC [${DatabaseService.CACHE_ALIVE_SEC}]`, lhd);
throw new dk_lib_1.CkError(lhd, dk_lib_1.CkValue.ERROR_TYPE.failed_db_redis_cache_config, 500, undefined, lang);
}
let cacheCustomKey;
if (isCustomCache) {
cacheCustomKey = dk_lib_1.CkCrypto.md5Hash(cacheName);
}
else {
cacheCustomKey = (typeof replacements === 'string' ? dk_lib_1.CkCrypto.md5Hash(replacements) : dk_lib_1.CkCrypto.md5Hash(JSON.stringify(replacements)));
}
let cacheKey;
if (DatabaseService.CACHE_SVC_NAME) {
cacheKey = (isCustomCache ? `cache.${DatabaseService.CACHE_SVC_NAME}.cjn.${cacheKeyPrefix}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.${DatabaseService.CACHE_SVC_NAME}.ajn.${cacheKeyPrefix}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
else {
cacheKey = (isCustomCache ? `cache.cjn.${cacheKeyPrefix}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}` : `cache.ajn.${cacheKeyPrefix}.${dk_lib_1.CkCrypto.md5Hash(cacheCustomKey)}`);
}
const startTm = Date.now();
const rmCount = yield dk_lib_redis_1.CkRedis.remove(lhd, cacheKey, DatabaseService.CACHE_REDIS_INDEX, lang, DatabaseService.IS_CACHE_REDIS_CLUSTER);
dk_lib_1.CkLogger.printElapsedRedisLog2(lhd, startTm, `removeCacheJoinDbRow, cacheKey [${cacheKey}], replacements [${JSON5.stringify(replacements)}]`);
dk_lib_1.CkLogger.infoLog2(`removed db cache. replacements [${JSON5.stringify(replacements)}], deleted count [${rmCount}]`, lhd);
return rmCount;
});
}
static _getDataOneById(reqIpAndLhdAndHttpInfo, TCreator, id, attributes, transaction) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
if (!id) {
dk_lib_1.CkLogger.errLog2(`${lhd} no id for getDataOneById. id [${id}]`);
return null;
}
let retData = null;
try {
const findOpts = {
where: { id },
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `Tb${TCreator.name}.findOne - where id [${id}]`);
},
};
if (attributes && attributes.length > 0) {
findOpts.attributes = attributes;
}
findOpts.transaction = transaction || undefined;
retData = yield TCreator.findOne(findOpts);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't find data in Tb${TCreator.name}. DB error [${err.toString()}], [${err.original}], id [${id}]`, lhd);
return dk_lib_1.CkValue.ERROR_TYPE.db_error;
}
return retData;
});
}
static _getDatasByIds(reqIpAndLhdAndHttpInfo, TCreator, ids, attributes, transaction, order) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
if (_.size(ids) <= 0) {
dk_lib_1.CkLogger.errLog2(`no id for getDatasByIds. ids [${JSON5.stringify(ids)}]`, lhd);
return [];
}
if (ids.length === 1) {
const oneRet = yield DatabaseService._getDataOneById(lhd, TCreator, ids[0], attributes, transaction);
if (typeof oneRet === 'string') {
return oneRet;
}
if (oneRet === null) {
return [];
}
return [oneRet];
}
let retData = [];
try {
const findOpts = {
where: { id: { $in: ids } },
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `Tb${TCreator.name}.findAll - where ids [${JSON5.stringify(ids)}]`);
},
};
if (attributes && attributes.length > 0) {
findOpts.attributes = attributes;
}
findOpts.transaction = transaction || undefined;
findOpts.order = order || undefined;
retData = yield TCreator.findAll(findOpts);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't find data in Tb${TCreator.name}. DB error [${err.toString()}], [${err.original}], ids [${JSON5.stringify(ids)}]`, lhd);
return dk_lib_1.CkValue.ERROR_TYPE.db_error;
}
return retData;
});
}
static _countDatasByIds(reqIpAndLhdAndHttpInfo, TCreator, ids, transaction) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
if (ids.length <= 0) {
dk_lib_1.CkLogger.errLog2(`no id for countDatasByIds. ids [${JSON5.stringify(ids)}]`, lhd);
return 0;
}
let retData = 0;
try {
const findOpts = {
where: { id: { $in: ids } },
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `Tb${TCreator.name}.count - where ids [${JSON5.stringify(ids)}]`);
},
};
findOpts.transaction = transaction || undefined;
retData = yield TCreator.count(findOpts);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't count data in Tb${TCreator.name}. DB error [${err.toString()}], [${err.original}], ids [${JSON5.stringify(ids)}]`, lhd);
return dk_lib_1.CkValue.ERROR_TYPE.db_error;
}
return retData;
});
}
static _getDataOneByRid(reqIpAndLhdAndHttpInfo, TCreator, rid, attributes, transaction) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
if (!rid) {
dk_lib_1.CkLogger.errLog2(`no rid for getDataOneByRid. rid [${rid}]`, lhd);
return null;
}
let retData = null;
try {
const findOpts = {
where: { rid },
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `Tb${TCreator.name}.findOne - where rid [${rid}]`);
},
};
if (attributes && attributes.length > 0) {
findOpts.attributes = attributes;
}
findOpts.transaction = transaction || undefined;
retData = yield TCreator.findOne(findOpts);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't find data in Tb${TCreator.name}. DB error [${err.toString()}], [${err.original}], rid [${rid}]`, lhd);
return dk_lib_1.CkValue.ERROR_TYPE.db_error;
}
return retData;
});
}
static _getDatasByRids(reqIpAndLhdAndHttpInfo, TCreator, rids, attributes, transaction, order) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
if (!rids || rids.length <= 0) {
dk_lib_1.CkLogger.errLog2(`no rid for getDatasByRids. rids [${JSON5.stringify(rids)}]`, lhd);
return [];
}
if (rids.length === 1) {
const oneRet = yield DatabaseService._getDataOneByRid(lhd, TCreator, rids[0], attributes, transaction);
if (typeof oneRet === 'string') {
return oneRet;
}
if (oneRet === null) {
return [];
}
return [oneRet];
}
let retData = [];
try {
const findOpts = {
where: { rid: { $in: rids } },
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `Tb${TCreator.name}.findAll - where rids [${JSON5.stringify(rids)}]`);
},
};
if (attributes && attributes.length > 0) {
findOpts.attributes = attributes;
}
findOpts.transaction = transaction || undefined;
findOpts.order = order || undefined;
retData = yield TCreator.findAll(findOpts);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't find data in Tb${TCreator.name}. DB error [${err.toString()}], [${err.original}], rids [${JSON5.stringify(rids)}]`, lhd);
return dk_lib_1.CkValue.ERROR_TYPE.db_error;
}
return retData;
});
}
static _countDatasByRids(reqIpAndLhdAndHttpInfo, TCreator, rids, transaction) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
if (!rids || rids.length <= 0) {
dk_lib_1.CkLogger.errLog2(`no rid for countDatasByRids. rids [${JSON5.stringify(rids)}]`, lhd);
return 0;
}
let retData = 0;
try {
const findOpts = {
where: { rid: { $in: rids } },
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `Tb${TCreator.name}.count - where rids [${JSON5.stringify(rids)}]`);
},
};
findOpts.transaction = transaction || undefined;
retData = yield TCreator.count(findOpts);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't count data in Tb${TCreator.name}. DB error [${err.toString()}], [${err.original}], rids [${JSON5.stringify(rids)}]`, lhd);
return dk_lib_1.CkValue.ERROR_TYPE.db_error;
}
return retData;
});
}
static _getDataOneByFilter(reqIpAndLhdAndHttpInfo, TCreator, filter, attributes, transaction, order, offset) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
if (!filter || _.size(filter) <= 0) {
dk_lib_1.CkLogger.errLog2(`no filter for getDataOneByFilter. filter [${JSON5.stringify(filter)}]`, lhd);
return null;
}
let retData = null;
try {
const findOpts = {
where: filter,
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `Tb${TCreator.name}.findOne - where filter [${JSON5.stringify(filter)}]`);
},
};
if (attributes && attributes.length > 0) {
findOpts.attributes = attributes;
}
findOpts.transaction = transaction || undefined;
findOpts.order = order || undefined;
if (offset !== undefined) {
findOpts.offset = offset;
findOpts.limit = 1;
}
retData = yield TCreator.findOne(findOpts);
}
catch (err) {
dk_lib_1.CkLogger.errLog(`can't find data in Tb${TCreator.name}. DB error [${err.toString()}], [${err.original}], filter [${JSON5.stringify(filter)}]`, lhd);
return dk_lib_1.CkValue.ERROR_TYPE.db_error;
}
return retData;
});
}
static _getDatasByFilter(reqIpAndLhdAndHttpInfo, TCreator, filter, attributes, transaction, order, offset, limit) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
if ((!filter || _.size(filter) <= 0) && (limit === undefined || limit <= 0)) {
dk_lib_1.CkLogger.errLog2(`no filter and no limit for getDatasByFilter. filter [${JSON5.stringify(filter)}], limit [${limit}]`, lhd);
return [];
}
let retData = [];
try {
const findOpts = {
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `Tb${TCreator.name}.findOne - where filter [${JSON5.stringify(filter)}]`);
},
};
if (filter && _.size(filter) > 0) {
findOpts.where = filter;
}
if (attributes && attributes.length > 0) {
findOpts.attributes = attributes;
}
findOpts.transaction = transaction || undefined;
findOpts.order = order || undefined;
if (offset !== undefined) {
findOpts.offset = offset;
}
if (limit !== undefined) {
findOpts.limit = limit;
}
retData = yield TCreator.findAll(findOpts);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't find data in Tb${TCreator.name}. DB error [${err.toString()}], [${err.original}], filter [${JSON5.stringify(filter)}]`, lhd);
return dk_lib_1.CkValue.ERROR_TYPE.db_error;
}
return retData;
});
}
static _countDatasByFilter(reqIpAndLhdAndHttpInfo, TCreator, filter, transaction) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
if (!filter || _.size(filter) <= 0) {
dk_lib_1.CkLogger.warnLog2(`no filter for countDatasByFilter. filter [${JSON5.stringify(filter)}]`, lhd);
}
let retData = 0;
try {
const findOpts = {
where: filter,
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `Tb${TCreator.name}.count - where filter [${JSON5.stringify(filter)}]`);
},
};
findOpts.transaction = transaction || undefined;
retData = yield TCreator.count(findOpts);
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't count data in Tb${TCreator.name}. DB error [${err.toString()}], [${err.original}], filter [${JSON5.stringify(filter)}]`, lhd);
return dk_lib_1.CkValue.ERROR_TYPE.db_error;
}
return retData;
});
}
static _getDataMapByKeyArray(reqIpAndLhdAndHttpInfo, keys, VCreator, colName, mapKey, cols, toCond, transaction) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
let ret = {};
if (_.size(keys) > 0) {
try {
let where = { [colName]: { $in: keys } };
if (toCond) {
where = Object.assign(Object.assign({}, toCond), where);
}
const datas = yield VCreator.findAll({
where,
attributes: (cols && cols.length > 0 ? cols : undefined),
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `Tb${VCreator.name}.findAll - ${colName} [${JSON5.stringify(keys)}]`);
},
transaction: transaction || undefined,
});
if (_.size(datas) > 0) {
ret = dk_lib_1.CkUtils.arrayToMaps(datas, mapKey);
}
}
catch (err) {
dk_lib_1.CkLogger.warnLog2(`can't find Tb${VCreator.name} data. ${colName} [${JSON5.stringify(keys)}] DB err [${err}], [${err.original}]`, lhd);
}
}
return ret;
});
}
static _changeListOrder(reqIpAndLhdAndHttpInfo, rdb, TCreator, rawQuery, replacements, srcId, srcListOrder, destListOrder, transaction) {
return __awaiter(this, void 0, void 0, function* () {
const lhd = reqIpAndLhdAndHttpInfo || dk_lib_1.CkValue.getDefaultLogKey(true);
let totalUpdatedCount = 0;
if (srcListOrder > destListOrder) {
const _replacements = replacements !== undefined
? Object.assign(Object.assign({}, replacements), { lt: srcListOrder, gte: destListOrder }) : { lt: srcListOrder, gte: destListOrder };
let _rawQuery = `${rawQuery.replace('<list_order>', 'list_order = list_order + 1')} `;
_rawQuery += (_rawQuery.toLowerCase().indexOf(' where ') > 0)
? ' AND ( list_order >= :gte AND list_order < :lt ) '
: ' WHERE list_order >= :gte AND list_order < :lt ';
dk_lib_1.CkLogger.debugLog2(`list_order move up raw query [${_rawQuery}], replacements [${JSON5.stringify(_replacements)}]`, lhd);
try {
const destUpdated = yield rdb.query(_rawQuery, {
raw: true,
model: TCreator,
type: sequelize_1.default.QueryTypes.RAW,
replacements: _replacements,
transaction,
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `changeOrder(rawQuery) - replacements [${JSON5.stringify(_replacements)}]`);
},
});
dk_lib_1.CkLogger.debugLog2(`move up. dest order. where [${JSON5.stringify(_replacements)}], +1 list order. updated result [${JSON5.stringify(destUpdated)}]`, lhd);
if (destUpdated && _.size(destUpdated) >= 0) {
dk_lib_1.CkLogger.infoLog2(`move up. dest order updated count [${destUpdated[0].affectedRows}]`, lhd);
totalUpdatedCount += Number(destUpdated[0].affectedRows);
}
}
catch (err) {
dk_lib_1.CkLogger.errLog2(`can't change dest list_order. DB error [${err.toString()}], [${err.original}], where [${JSON5.stringify(_replacements)}]`, lhd);
throw err;
}
}
else {
const _replacements = (replacements !== undefined)
? Object.assign(Object.assign({}, replacements), { lte: destListOrder, gt: srcListOrder }) : { lte: destListOrder, gt: srcListOrder };
let _rawQuery = `${rawQuery.replace('<list_order>', 'list_order = list_order - 1')} `;
_rawQuery += (_rawQuery.toLowerCase().indexOf(' where ') > 0)
? ' AND ( list_order > :gt AND list_order <= :lte ) '
: ' WHERE list_order > :gt AND list_order <= :lte ';
dk_lib_1.CkLogger.debugLog2(`list_order move down raw query [${_rawQuery}], replacements [${JSON5.stringify(_replacements)}]`, lhd);
try {
const destUpdated = yield rdb.query(_rawQuery, {
raw: true,
model: TCreator,
type: sequelize_1.default.QueryTypes.RAW,
replacements: _replacements,
transaction,
logging: (sql, timing) => {
dk_lib_1.CkLogger.debugLog2(`SQL=[${sql}], elapsed [${timing} ms]`, lhd);
dk_lib_1.CkLogger.printElapsedSqlLog2(lhd, sql, timing, `changeOrder(rawQuery) - replacements [${JSON5.stringify(_replacements)}]`);
},
});
dk_lib_1.CkLogger.debugLog2(`move down. dest order. where [${JSON5.stringify(_replacements)}], -1 list order. updated result [${JSON5.stringify(destUpdated)}]`, lhd);
if (destUpdated && _.size(destUpdated) > 1) {
dk_lib_1.CkLogger.infoLog2(`move down. dest order updated count [${destUpdated[0].affectedRows}]`, lhd);
totalUpdatedCount += Number(destUpdated[0].affectedRows);
}