UNPKG

@ckstack/ck-lib-sequelize

Version:

sequelize helper module

832 lines (831 loc) 75.8 kB
"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); }