UNPKG

@ckstack/ck-lib-sequelize

Version:

sequelize helper module

873 lines (872 loc) 60.9 kB
import Sequelize, { Transaction } from 'sequelize'; import { Sequelize as SequelizeTS } from 'sequelize-typescript'; import { CkValue } from '@dkpkg/dk-lib'; declare class DatabaseService { private static CACHE_REDIS_INDEX; private static CACHE_ALIVE_SEC; private static IS_CACHE_REDIS_CLUSTER; private static IS_USE_REDIS_CACHE; private static CACHE_SVC_NAME; /** * DB 테이블에서 row 하나를 읽어서 redis 에 저장하여, 캐시를 만든다. 저장된 캐시는 setActiveRedisCache 에서 설정된 시간 동안 유지 된다. * T 는 DB table model, U 는 리턴 받은 데이터 구조 이다. * 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 null 을 리턴 한다. * transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다. * * 외부에 DB select 로 만들어지는 자동 cache 를 열어 주지 않기 위해서 private 으로 선언함. * * 다음과 같이 호출 될 것임 * DatabaseService._getCacheSingleDbRow<TbApp, TblType.ITbApp>(lhd, ... * * @param lhd {string} 로그키 * @param isCustomCache {boolean} cacheName 을 활용한 custom 캐시명으로 캐시를 생성 할지 여부 * @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음 * @param TCreator {{ new() : T; }} Sequelize DB 테이블 model * @param dbFilter {{ [key: string]: any; }} DB 테이블 검색 조건 * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 테이블 select 시의 order * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @param offset {number | undefined} select offset * @returns {Promise<U | null>} DB 에서 값을 조회 할 수 없으면 null 을 리턴 하고, 값을 찾으면 U 타입의 값을 리턴 한다. * @throws {CkError} 에러를 throw 한다. * @private */ private static _getCacheSingleDbRow; /** * DB 테이블에서 row 여러 개를 읽어서 redis 에 저장하여, 캐시를 만든다. 저장된 캐시는 설정된(cacheAliveSec) 시간 동안 유지 된다. * T 는 DB table model, U 는 리턴 받은 데이터 구조 이다. * 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 empty array 를 리턴 한다. * transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다. * 리턴 값은 Array<U> 형태 이다. * * 외부에 DB select 로 만들어지는 자동 cache 를 열어 주지 않기 위해서 private 으로 선언함. * * 다음과 같이 호출 될 것임 * DatabaseService._getCacheMultiDbRow<TbApp, TblType.ITbApp>(lhd, ... * * @param lhd {string} 로그키 * @param isCustomCache {boolean} cacheName 을 활용한 custom 캐시명으로 캐시를 생성 할지 여부 * @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음 * @param TCreator {{ new() : T; }} Sequelize DB 테이블 model * @param dbFilter {{ [key: string]: any; }} DB 테이블 검색 조건 * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 테이블 select 시의 order * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<Array<U>>} DB 에서 값을 조회 할 수 없으면 empty array 를 리턴 하고, 값을 찾으면 값이 들어 있는 array 를 리턴 한다. * @throws {CkError} 에러를 throw 한다. * @private */ private static _getCacheMultiDbRow; /** * DB 테이블을 join 하여 데이터를 읽어서 redis 에 저장하여 캐시를 만든다. 저장된 캐시는 설정된(cacheAliveSec) 시간 동안 유지 된다. * U 는 리턴 받은 데이터 구조 이다. * 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 empty array 를 리턴 한다. * transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다. * 리턴 값은 Array<U> 형태 이다. * * 외부에 DB select 로 만들어지는 자동 cache 를 열어 주지 않기 위해서 private 으로 선언함. * * 다음과 같이 호출 될 것임(IFilterAppVersion 는 참고용 코드 실제는 이렇게 사용 되지 않는다.) * DatabaseService._getCacheJoinDbRow<IFilterAppVersion>(lhd, ... * * @param lhd {string} 로그키 * @param cacheKeyPrefix {string} 캐시 종류 구분 * @param isCustomCache {boolean} cacheName 을 활용한 custom 캐시명으로 캐시를 생성 할지 여부 * @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음 * @param rdb {SequelizeTS | number} CkSequelize.getSequelize2(lhd, rdb) 로 sequelize object 를 구할 수 있는 값 이나, 연결된 db index. db index 라면 알아서 sequelize object 를 가져 온다. * @param rawQuery {string} join 을 하는 sql query * @param replacements {{ [col: string]: any; } | string} join 시에 사용되는 replace 값. join 시에 replace 할 값이 없다면 string 값을 주어서, 캐시 종류를 구분 할 수 있도록 해야 한다. * @param transaction {Transaction | undefined} DB transaction object * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<Array<U>>} DB 에서 값을 조회 할 수 없으면 empty array 를 리턴 하고, 값을 찾으면 값이 들어 있는 array 를 리턴 한다. * @throws {CkError} 에러를 throw 한다. * @private */ private static _getCacheJoinDbRow; /** * 자동으로 생성된 DB 테이블 캐시를 삭제 한다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} Sequelize DB 테이블 model * @param ids {Array<number> | number} 삭제할 데이터의 id 목록. 테이블의 row id 목록. 하나의 데이터를 삭제 하려면 row id 값을 주면 된다. * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<number>} 삭제된 데이터 캐시 갯수 * @throws {CkError} 에러를 throw 한다. * @private */ private static _removeCacheAutoDbRow; /** * DB 테이블 캐시 데이터를 삭제 한다. single row, multi row 캐시를 모두 지원 한다. getCacheSingleDbRow, getCacheSingleDbRow 으로 생성된 캐시 삭제. * 캐시 존재 유무 체크 하지 않고, 무조건 삭제 시도 하고, 삭제된 캐시 카운트를 리턴 한다. * 자동으로 생성된 테이블 캐시는 _removeCacheAutoDbRow 를 사용해서 삭제 하도록 한다. * * @param lhd {string} 로그키 * @param isCustomCache {boolean} cacheName 을 활용한 custom 캐시명으로 캐시를 생성 할지 여부 * @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음 * @param TCreator {{ new() : T; }} Sequelize DB 테이블 model * @param dbFilter {{ [key: string]: any; }} 캐시를 생성 할때 사용된 dbFilter 와 동일한 값 * @param isMulti {boolean | undefined} true 일 때, 멀티 row 캐시를 삭제 한다. undefined 라면 single row 로 처리 한다. * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<number>} 삭제된 캐시 카운트를 리턴 한다. * @throws {CkError} 에러를 throw 한다. * @private */ private static _removeCacheDbRow; /** * DB 테이블 join 으로 생성된 캐시 데이터를 삭제 한다. getCacheJoinDbRow 으로 생성된 캐시 삭제. * 캐시 존재 유무 체크 하지 않고, 무조건 삭제 시도 하고, 삭제된 캐시 카운트를 리턴 한다. * * @param lhd {string} 로그키 * @param cacheKeyPrefix {string} 캐시 종류 구분 * @param isCustomCache {boolean} cacheName 을 활용한 custom 캐시명으로 캐시를 삭제 할지 여부 * @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음 * @param replacements {{ [col: string]: any; } | string} join 시에 사용되는 replace 값. join 시에 replace 할 값이 없다면 string 값을 주어서, 캐시 종류를 구분 할 수 있도록 해야 한다. * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<number>} 삭제된 캐시 카운트를 리턴 한다. * @throws {CkError} 에러를 throw 한다. * @private */ private static _removeCacheJoinDbRow; /** * id 로 테이블에서 데이터를 가져 온다. * return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreator {{ new() : T; }} Sequelize DB 테이블 model * @param id {number} row 의 id 값 * @param attributes {Array<string> | undefined} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @returns {Promise<T | null | string>} 조회한 테이블 row 데이터나, 데이터가 없으면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _getDataOneById; /** * id(srl) 목록으로 테이블에서 데이터를 가져 온다. * return 값이 empty array 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * empty array, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param ids {Array<number>} row 의 id 목록 * @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 정렬 방법 * @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _getDatasByIds; /** * getDatasByIds 와 같은 역할을 하지만, 데이터가 아니라 데이터의 카운트를 구한다. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param ids {Array<number>} row 의 id 목록 * @param transaction {Transaction | undefined} Sequelize transaction object * @returns {Promise<number | string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _countDatasByIds; /** * rid 로 테이블에서 데이터를 가져 온다. * return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param rid {string} row 의 rid * @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @returns {Promise<T | null | string>} 조회한 테이블 row 데이터나, 데이터가 없으면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _getDataOneByRid; /** * rid 목록으로 테이블에서 데이터를 가져 온다. * return 값이 empty array 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * empty array, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param rids {Array<string>} row 의 rid 목록 * @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 정렬 방법 * @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _getDatasByRids; /** * getDatasByRids 와 같은 역할을 하지만 데이터가 아니라, 데이터의 카운트를 구한다. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param rids {Array<string>} row 의 rid 목록 * @param transaction {Transaction | undefined} Sequelize transaction object * @returns {Promise<number | string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _countDatasByRids; /** * 필터 조건으로 테이블에서 데이터를 하나 가져 온다. * return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param filter {{ [key: string]: any; }} 검색 조건 * @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 정렬 방법 * @param offset {number | undefined} select offset * @returns {Promise<T | null | string>} 조회한 테이블 row 데이터를 리턴 한다. 데이터를 발견하지 못하면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _getDataOneByFilter; /** * 필터 조건으로 테이블에서 데이터를 가져 온다. * return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * filter, limit 둘 중 하나는 반듯이 존재 해야 한다. * * order 는 다음과 같이 사용 한다. * - [['name', 'DESC']] : name 칼럼으로 desc 정렬 * - [['name', 'DESC'], ['id', 'ASC']] : name 칼럼으로 desc 정렬하고, 두번째로 id 로 ASC 정렬 * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param filter {{ [key: string]: any; }} 검색 조건 * @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 정렬 방법 * @param offset {number | undefined} select offset * @param limit {number | undefined} seledct limit * @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _getDatasByFilter; /** * getDatasByFilter 와 동일한 역할을 하지만, 데이터가 아니라 데이터의 카운트를 구한다. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param filter {{ [key: string]: any; }} 검색 조건 * @param transaction {Transaction | undefined} Sequelize transaction object * @returns {Promise<number | string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _countDatasByFilter; /** * key array 로 데이터 목록을 구한다. 가령 file_id array 로 파일 데이터를 map 형태로 구 할 때 사용 한다. * * 다음과 같이 사용 한다면, * getDataMapByKeyArray<string, TbFile>(req, res, fids, TbFile, 'rid', 'id', ['id', rid', 'description']); * * 기본 검색 조건은 colName 이 rid 이고, 검색 값이 fids 로 select 한다. * { rid: { $in: fids } } 가 select 조건이 된다. * 또한 테이블에서 select 되는 칼럼은 ['rid', 'description'] 이다. * 그리고, select 로 선택된 값을 mapKey 인 id 로 map 을 만들어서 return 한다. * 즉, CkUtils.arrayToMaps<VCreator>(selectedRows, 'id'); 의 결과값을 리턴 한다. * * @param reqIpAndLhdAndHttpInfo {string} 로그 헤더 * @param keys Array<T> select 조건 key array * @param VCreator {{ new() : V; }} select 할 테이블 * @param colName {string} 테이블에서 select 할 칼럼명 * @param mapKey {string} map 으로 만들때 키가되는 칼럼명(k_칼럼값 형태로 키가 생성된다.) * @param cols {Array<string> | undefined} 테이블에서 특정 칼럼만 가져오고 싶을때 지정 칼럼 목록 * @param toCond {{[key: string]: any; } | undefined} 검색할 테이블 select 시에 추가할 조건 * @param transaction {Transaction | undefined} transaction object * @returns {Promise<{ [k_mapKey: string]: T }>} mapKey 기준으로 만들어진 object 를 리턴 한다. 에러가 발생하거나, 데이터가 없으면 empty object 를 리턴 한다. * @private */ private static _getDataMapByKeyArray; /** * list_order 순서를 변경 한다. * raw query 는 함수 내에서 추가 조건이 들어가고, 이에 따라 replacement 도 추가 조건이 들어 간다. * list_order 변경 관련 값은 함수 내부에서 처리 되고, 파라미터로 주는 raw query 는 데이터 검색 조건만 들어 가도록 해야 한다. * 움직이는 위치에 따라 list_order + 1, list_order -1 을 해야 하기 때문에 파라미터로 넘겨주는 rawQuery 내에 <list_order> 스트링으로 * 값을 설정 한다. * * 순수하게 list_order 만 변경 하고, list_order 변경 가능한지 데이터 비교 하지 않는다는 것이 changeListOrderV2 와 다른점 이다. * 사용 예제는 한국문화교육의 ContentCategoryAdmRouter.ts 의 카테고리 위치 변경을 참고 하자. * * @param reqIpAndLhdAndHttpInfo {string} 로그 헤더 * @param rdb {SequelizeTS} sequelize object. typescript sequelize 의 object 임. * @param TCreator {{ new() : T; }} 테이블 * @param rawQuery {string} 부분 raw 쿼리 * @param replacements {{ [key: string]: any; } | undefined} raw 쿼리에서 replace 값 * @param srcId {number} 순서를 변경할 src 의 id * @param srcListOrder {number} 순서를 변경할 src 의 list_order * @param destListOrder {number} 순서를 변경할 dest 의 list_order * @param transaction {Transaction} transaction * @returns {Promise<number>} 순서가 변경된 row 의 갯수를 리턴 한다. * @throws {CkError} 에러를 throw 한다. * @private */ private static _changeListOrder; /** * list_order 순서를 변경 한다. router 에서 순서 변경하는 것을 함수 한번에 처리 할 수 있도록 묶어 둔 것이다. * 간단한 순서 변경에 사용 하고, 추가 제한 조건이 있으면 본 함수를 사용 하지 않도록 한다. * 에러 나면 string 을 리턴 하는데, 이런 경우는 호출 하는 곳에서 transaction rollback 처리 해 주어야 한다. * * changeListOrder 와 다른점은 함수 내부에서 순서를 변경 하려는 데이터를 찾아, 데이터 존재 여부 및 list_order 가 동일한지 비교 한다. * 만일 해당 작업을 외부에서 실행 한다면, changeListOrder 을 사용 하도록 한다. * 사용 예제는 한국문화교육의 VRCAdminRouter.ts 의 키워드 위치 변경을 참고 하자. * * @param reqIpAndLhdAndHttpInfo {string} 로그 헤더 * @param rdb {SequelizeTS} sequelize object. typescript sequelize 의 object 임. * @param TCreator {{ new() : T; }} 테이블 * @param srcRid {string} 순서를 변경할 src 의 rid * @param destRid {string} 순서를 변경할 dest 의 rid * @param rawQueryPart {string} 부분 raw 쿼리 * @param replacements {{ [key: string]: any; } | undefined} raw 쿼리에서 replace 값 * @param transaction {Transaction} transaction * @returns {Promise<number |string>} 순서가 변경된 row 의 갯수를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _changeListOrderV2; /** * 새로운 데이터를 생성 하고, list_order 를 생성된 srl 값과 동일하게 설정 한다. * list_order 가 있는 대부분의 데이터 생성시 사용 하면 된다. * * string 이 리턴 되면, 에러 처리 해야 한다. 에러가 발생 되면 호출 하는 곳에서 transaction rollback 처리 해야 한다. * 한국 문화 교육의 VRCKeyword 생성을 참고 한다. * * @param reqIpAndLhdAndHttpInfo {string} 로그 헤더 * @param TCreator {{ new() : T; }} 테이블 모델 * @param newData {T} 저장할 데이터의 모델 object * @param transaction {Transaction} transaction * @returns {Promise<T | string>} 생성된 데이터의 모델 object 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _createDataWithListOrder; /** * 데이터를 저장 한다. 정상으로 실행 되면 저장된 데이터를 리턴 하고, 에러이면 에러 코드(string)을 리턴 한다. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param newData {T} 저장할 데이터의 모델 object * @param transaction {Transaction} transaction * @returns {Promise<T | string>} 생성된 데이터의 모델 object 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _createData; /** * 데이터를 업데이트 한다. number 를 리턴하면, 업데이트 데이터 카운트 이며, 스트링이면 에러 코드 이다. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreate {{ new() : T; }} 테이블 모델 * @param modData {{ [key: string]: any; }} 업데이트 할 데이터 * @param where {{ [key: string]: any; }} 업데이트 할 데이터의 filter 조건 * @param transaction {Transaction} transaction * @returns {Promise<number | string>} 업데이트 된 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _updateData; /** * 데이터를 삭제 한다. number 를 리턴하면, 삭제된 데이터 카운트 이며, 스트링 이면 에러 코드 이다. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreate {{ new() : T; }} 테이블 모델 * @param where {{ [key: string]: any; }} 삭제 할 데이터의 filter 조건 * @param transaction {Transaction} transaction * @returns {Promise<number | string>} 삭제 된 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _deleteData; /** * 칼럼 값을 증가 시키거나, 감소 시킨다. true 를 리턴하면 처리 성공이고, 스트링 이면 에러 코드 이다. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param TCreate {{ new() : T; }} 테이블 모델 * @param where {{ [key: string]: any; }} 쿼리 검색 조건 * @param cols {Array<string>} increase, decrease 시킬 칼럼명. 일반적으로 칼럼 하나만 사용 될 것이지만, 여러개 칼럼을 처리 할 수 있다. * @param by {number} increase, decrease 시키는 양. 1 이면 1씩 증가하고, -1 이면 1씩 감소 한다. * @param transaction {Transaction} transaction * @returns {Promise<void|string>} string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _incrementData; /** * raw query 를 사용하여 데이터를 select 한다. * * @param reqIpAndLhdAndHttpInfo {string} 로그키 * @param rawQuery {string} join 을 하는 sql query * @param rdb {SequelizeTS | number} CkSequelize.getSequelize2(lhd, rdb) 로 sequelize object 를 구할 수 있는 값 이나, 연결된 db index. db index 라면 알아서 sequelize object 를 가져 온다. * @param replacements {{ [col: string]: any; } | undefined} join 시에 사용되는 replace 값 * @param transaction {Transaction | undefined} DB transaction object * @returns {{ [col_name: string]: any; }[] | string>} select 된 데이터 목록을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. * @private */ private static _getDataByRawQuery; /** * redis cache 를 활성화 시킨다. * @param dbCacheRedisIndex {number} redis cache 로 사용할 redis 연결의 index. 음수 이면, redis cache 를 사용 하지 않는다. * @param dbCacheAliveSec {number} cache 로 저장된 데이터의 alive 시간. cache 데이터 생성 이후, 설정 시간이 지나면 자동 삭제 된다. 초 단위. 0 보다 큰 값이어야 한다. * @param dbCacheRedisCluster {boolean | undefined} db 캐시로 사용하는 redis 가 cluster 구성된 redis 인지 여부. true 일 때 cluster 로 구성된 redis 임. * @param svcName {string | undefined} 개발기에서 하나의 redis 를 사용하기 위한 서비스 구별명 * @returns {void} 리턴 되는 값 없음 */ static setActiveRedisCache(dbCacheRedisIndex: number, dbCacheAliveSec: number, dbCacheRedisCluster?: boolean, svcName?: string): void; /** * DB 테이블에서 row 하나를 읽어서 redis 에 저장하여, 캐시를 만든다. 저장된 캐시는 setActiveRedisCache 에서 설정된 시간 동안 유지 된다. * T 는 DB table model, U 는 리턴 받은 데이터 구조 이다. * 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 null 을 리턴 한다. * transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다. * * cacheName 으로 캐시 구분 가능 하다. * * 다음과 같이 호출 될 것임 * DatabaseService.getCacheSingleDbRow<TbApp, TblType.ITbApp>(lhd, ... * * @param lhd {string} 로그키 * @param cacheName {string} 캐시를 구분 할 수 있는 캐시명 * @param TCreator {{ new() : T; }} Sequelize DB 테이블 model * @param dbFilter {{ [key: string]: any; }} DB 테이블 검색 조건 * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 테이블 select 시의 order * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<U | null>} DB 에서 값을 조회 할 수 없으면 null 을 리턴 하고, 값을 찾으면 U 타입의 값을 리턴 한다. * @throws {CkError} 에러를 throw 한다. */ static getCacheSingleDbRow<T, U>(lhd: string, cacheName: string, TCreator: { new (): T; }, dbFilter: { [key: string]: any; }, transaction?: Transaction, order?: Sequelize.Order, lang?: CkValue.SUPPORT_LANG): Promise<U | null>; /** * DB 테이블에서 row 여러 개를 읽어서 redis 에 저장하여, 캐시를 만든다. 저장된 캐시는 설정된(cacheAliveSec) 시간 동안 유지 된다. * T 는 DB table model, U 는 리턴 받은 데이터 구조 이다. * 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 empty array 를 리턴 한다. * transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다. * 리턴 값은 Array<U> 형태 이다. * * cacheName 으로 캐시 구분 가능 하다. * * 다음과 같이 호출 될 것임 * DatabaseService.getCacheMultiDbRow<TbApp, TblType.ITbApp>(lhd, ... * * @param lhd {string} 로그키 * @param cacheName {string} 캐시를 구분 할 수 있는 캐시명 * @param TCreator {{ new() : T; }} Sequelize DB 테이블 model * @param dbFilter {{ [key: string]: any; }} DB 테이블 검색 조건 * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 테이블 select 시의 order * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<Array<U>>} DB 에서 값을 조회 할 수 없으면 empty array 를 리턴 하고, 값을 찾으면 값이 들어 있는 array 를 리턴 한다. * @throws {CkError} 에러를 throw 한다. */ static getCacheMultiDbRow<T, U>(lhd: string, cacheName: string, TCreator: { new (): T; }, dbFilter: { [key: string]: any; }, transaction?: Transaction, order?: Sequelize.Order, lang?: CkValue.SUPPORT_LANG): Promise<Array<U>>; /** * DB 테이블을 join 하여 데이터를 읽어서 redis 에 저장하여 캐시를 만든다. 저장된 캐시는 설정된(cacheAliveSec) 시간 동안 유지 된다. * U 는 리턴 받은 데이터 구조 이다. * 만일 redis 에서 캐시가 없는 상태에서 DB 에서 데이터를 조회 하지 못한다면 empty array 를 리턴 한다. * transaction 값이 undefined 가 아니라면, 함수를 호출 하는 곳에서 rollback, commit 을 해야 한다. * 리턴 값은 Array<U> 형태 이다. * * cacheKeyPrefix, cacheName 으로 캐시 구분 가능 하다. * * 다음과 같이 호출 될 것임(IFilterAppVersion 는 참고용 코드 실제는 이렇게 사용 되지 않는다.) * DatabaseService.getCacheJoinDbRow<IFilterAppVersion>(lhd, ... * * @param lhd {string} 로그키 * @param cacheKeyPrefix {string} 캐시 종류 구분 * @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음 * @param rdb {SequelizeTS | number} CkSequelize.getSequelize2(lhd, rdb) 로 sequelize object 를 구할 수 있는 값 이나, 연결된 db index. db index 라면 알아서 sequelize object 를 가져 온다. * @param rawQuery {string} join 을 하는 sql query * @param replacements {{ [col: string]: any; } | string} join 시에 사용되는 replace 값. join 시에 replace 할 값이 없다면 string 값을 주어서, 캐시 종류를 구분 할 수 있도록 해야 한다. * @param transaction {Transaction | undefined} DB transaction object * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<Array<U>>} DB 에서 값을 조회 할 수 없으면 empty array 를 리턴 하고, 값을 찾으면 값이 들어 있는 array 를 리턴 한다. * @throws {CkError} 에러를 throw 한다. */ static getCacheJoinDbRow<U>(lhd: string, cacheKeyPrefix: string, cacheName: string, rdb: SequelizeTS | number, rawQuery: string, replacements: { [col: string]: any; } | string, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG): Promise<Array<U>>; /** * 자동으로 생성된 DB 테이블 캐시를 삭제 한다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} Sequelize DB 테이블 model * @param ids {Array<number> | number} 삭제할 데이터의 id 목록. 테이블의 row id 목록. 하나의 데이터를 삭제 하려면 row id 값을 주면 된다. * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<number>} 삭제된 데이터 캐시 갯수 * @throws {CkError} 에러를 throw 한다. */ static removeCacheAutoDbRow<T>(lhd: string, TCreator: { new (): T; }, ids: Array<number> | number, lang?: CkValue.SUPPORT_LANG): Promise<number>; /** * DB 테이블 캐시 데이터를 삭제 한다. single row, multi row 캐시를 모두 지원 한다. getCacheSingleDbRow, getCacheSingleDbRow 으로 생성된 캐시 삭제. * 캐시 존재 유무 체크 하지 않고, 무조건 삭제 시도 하고, 삭제된 캐시 카운트를 리턴 한다. * 자동으로 생성된 테이블 캐시는 _removeCacheAutoDbRow 를 사용해서 삭제 하도록 한다. * * @param lhd {string} 로그키 * @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음 * @param TCreator {{ new() : T; }} Sequelize DB 테이블 model * @param dbFilter {{ [key: string]: any; }} 캐시를 생성 할때 사용된 dbFilter 와 동일한 값 * @param isMulti {boolean | undefined} true 일 때, 멀티 row 캐시를 삭제 한다. undefined 라면 single row 로 처리 한다. * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<number>} 삭제된 캐시 카운트를 리턴 한다. * @throws {CkError} 에러를 throw 한다. */ static removeCacheDbRow<T>(lhd: string, cacheName: string, TCreator: { new (): T; }, dbFilter: { [key: string]: any; }, isMulti?: boolean, lang?: CkValue.SUPPORT_LANG): Promise<number>; /** * DB 테이블 join 으로 생성된 캐시 데이터를 삭제 한다. getCacheJoinDbRow 으로 생성된 캐시 삭제. * 캐시 존재 유무 체크 하지 않고, 무조건 삭제 시도 하고, 삭제된 캐시 카운트를 리턴 한다. * * @param lhd {string} 로그키 * @param cacheKeyPrefix {string} 캐시 종류 구분 * @param cacheName {string} 캐시를 구분 할 수 있는 캐시명. custom 캐시명 일때만 의미 있음 * @param replacements {{ [col: string]: any; } | string} join 시에 사용되는 replace 값. join 시에 replace 할 값이 없다면 string 값을 주어서, 캐시 종류를 구분 할 수 있도록 해야 한다. * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @returns {Promise<number>} 삭제된 캐시 카운트를 리턴 한다. * @throws {CkError} 에러를 throw 한다. */ static removeCacheJoinDbRow(lhd: string, cacheKeyPrefix: string, cacheName: string, replacements: { [col: string]: any; } | string, lang?: CkValue.SUPPORT_LANG): Promise<number>; /** * id 로 테이블에서 데이터를 가져 온다. * return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * * 캐시 기능을 지원 한다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} Sequelize DB 테이블 model * @param id {number} row 의 id 값 * @param attributes {Array<string> | undefined} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @param isUsingCache {boolean | undefined} cache 기능을 사용 할지 여부. setActiveRedisCache 로 캐시 사용이 설정 되고, 이 값이 true 인 경우만 cache 기능을 사용 할 수 있다. * @returns {Promise<T | null | string>} 조회한 테이블 row 데이터나, 데이터가 없으면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static getDataOneById<T>(lhd: string, TCreator: { new (): T; }, id: number | undefined, attributes?: Array<string>, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG, isUsingCache?: boolean): Promise<T | null | string>; /** * id(srl) 목록으로 테이블에서 데이터를 가져 온다. * return 값이 empty array 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * empty array, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param ids {Array<number>} row 의 id 목록 * @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 정렬 방법 * @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static getDatasByIds<T>(lhd: string, TCreator: { new (): T; }, ids: Array<number>, attributes?: Array<string>, transaction?: Transaction, order?: Sequelize.Order): Promise<Array<T> | string>; /** * getDatasByIds 와 같은 역할을 하지만, 데이터가 아니라 데이터의 카운트를 구한다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param ids {Array<number>} row 의 id 목록 * @param transaction {Transaction | undefined} Sequelize transaction object * @returns {Promise<number | string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static countDatasByIds<T>(lhd: string, TCreator: { new (): T; }, ids: Array<number>, transaction?: Transaction): Promise<number | string>; /** * rid 로 테이블에서 데이터를 가져 온다. * return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * * 캐시 기능을 지원 한다. 캐시 기능을 사용하려면, 테이블에 id 칼럼이 반듯이 존재 해야 한다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param rid {string} row 의 rid * @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @param isUsingCache {boolean | undefined} cache 기능을 사용 할지 여부. setActiveRedisCache 로 캐시 사용이 설정 되고, 이 값이 true 인 경우만 cache 기능을 사용 할 수 있다. * @returns {Promise<T | null | string>} 조조회한 테이블 row 데이터나, 데이터가 없으면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static getDataOneByRid<T>(lhd: string, TCreator: { new (): T; }, rid: string | undefined, attributes?: Array<string>, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG, isUsingCache?: boolean): Promise<T | null | string>; /** * rid 목록으로 테이블에서 데이터를 가져 온다. * return 값이 empty array 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * empty array, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param rids {Array<string>} row 의 rid 목록 * @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 정렬 방법 * @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static getDatasByRids<T>(lhd: string, TCreator: { new (): T; }, rids: Array<string>, attributes?: Array<string>, transaction?: Transaction, order?: Sequelize.Order): Promise<Array<T> | string>; /** * getDatasByRids 와 같은 역할을 하지만 데이터가 아니라, 데이터의 카운트를 구한다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param rids {Array<string>} row 의 rid 목록 * @param transaction {Transaction | undefined} Sequelize transaction object * @returns {Promise<number |string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static countDatasByRids<T>(lhd: string, TCreator: { new (): T; }, rids: Array<string>, transaction?: Transaction): Promise<number | string>; /** * 필터 조건으로 테이블에서 데이터를 가져 온다. * return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * * 캐시 기능을 지원 한다. 캐시 기능을 사용하려면, 테이블에 id 칼럼이 반듯이 존재 해야 한다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param filter {{ [key: string]: any; }} 검색 조건 * @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 정렬 방법 * @param offset {number | undefined} select offset * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @param isUsingCache {boolean | undefined} cache 기능을 사용 할지 여부. setActiveRedisCache 로 캐시 사용이 설정 되고, 이 값이 true 인 경우만 cache 기능을 사용 할 수 있다. * @returns {Promise<T | null | string>} 조회한 테이블 row 데이터를 리턴 한다. 데이터를 발견하지 못하면 null 을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static getDataOneByFilter<T>(lhd: string, TCreator: { new (): T; }, filter: { [key: string]: any; }, attributes?: Array<string>, transaction?: Transaction, order?: Sequelize.Order, offset?: number, lang?: CkValue.SUPPORT_LANG, isUsingCache?: boolean): Promise<T | null | string>; /** * 필터 조건으로 테이블에서 데이터를 가져 온다. * return 값이 null 이면 데이터를 발견 하지 못한 것이고, string 이면 에러임(에러 코드 리턴) * null, string(DB 에러) 이 아니면 데이터를 발견해서 데이터를 리턴 한 것임. * filter, limit 둘 중 하나는 반듯이 존재 해야 한다. * * order 는 다음과 같이 사용 한다. * - [['name', 'DESC']] : name 칼럼으로 desc 정렬 * - [['name', 'DESC'], ['id', 'ASC']] : name 칼럼으로 desc 정렬하고, 두번째로 id 로 ASC 정렬 * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param filter {{ [key: string]: any; }} 검색 조건 * @param attributes {Array<string>} 조회할 테이블의 칼럼명 목록. undefined 라면 모든 칼럼을 select 한다. * @param transaction {Transaction | undefined} Sequelize transaction object * @param order {Sequelize.Order | undefined} 정렬 방법 * @param offset {number | undefined} select offset * @param limit {number | undefined} seledct limit * @returns {Promise<Array<T> | string>} 조회한 테이블 row 데이터 목록을 리턴 한다. 데이터가 없으면 empty array 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static getDatasByFilter<T>(lhd: string, TCreator: { new (): T; }, filter: { [key: string]: any; } | undefined, attributes?: Array<string>, transaction?: Transaction, order?: Sequelize.Order, offset?: number, limit?: number): Promise<Array<T> | string>; /** * getDatasByFilter 와 동일한 역할을 하지만, 데이터가 아니라 데이터의 카운트를 구한다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블의 Sequelize 모델 * @param filter {{ [key: string]: any; }} 검색 조건 * @param transaction {Transaction | undefined} Sequelize transaction object * @returns {Promise<number | string>} 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static countDatasByFilter<T>(lhd: string, TCreator: { new (): T; }, filter: { [key: string]: any; } | undefined, transaction?: Transaction): Promise<number | string>; /** * key array 로 데이터 목록을 구한다. 가령 file_id array 로 파일 데이터를 map 형태로 구 할 때 사용 한다. * * 다음과 같이 사용 한다면, <number, TbFile> 은 fids 가 number array 이고 리턴되는 map 에 할당되는 값이 TbFile 이기 때문임. * getDataMapByKeyArray<number, TbFile>(req, res, fids, TbFile, 'rid', 'id', ['id', rid', 'description']); * * 기본 검색 조건은 colName 이 rid 이고, 검색 값이 fids 로 select 한다. * { rid: { $in: fids } } 가 select 조건이 된다. * 또한 테이블에서 select 되는 칼럼은 ['rid', 'description'] 이다. * 그리고, select 로 선택된 값을 mapKey 인 id 로 map 을 만들어서 return 한다. * 즉, CkUtils.arrayToMaps<VCreator>(selectedRows, 'id'); 의 결과값을 리턴 한다. * * @param lhd {string} 로그 헤더 * @param keys Array<T> select 조건 key array * @param VCreator {{ new() : V; }} select 할 테이블 * @param colName {string} 테이블에서 select 할 칼럼명 * @param mapKey {string} map 으로 만들때 키가되는 칼럼명(k_칼럼값 형태로 키가 생성된다.) * @param cols {Array<string> | undefined} 테이블에서 특정 칼럼만 가져오고 싶을때 지정 칼럼 목록 * @param toCond {{[key: string]: any; } | undefined} 검색할 테이블 select 시에 추가할 조건 * @param transaction {Transaction | undefined} transaction object * @returns {Promise<{ [k_mapKey: string]: T }>} mapKey 기준으로 만들어진 object 를 리턴 한다. 에러가 발생하거나, 데이터가 없으면 empty object 를 리턴 한다. */ static getDataMapByKeyArray<T, V>(lhd: string, keys: Array<T>, VCreator: { new (): V; }, colName: string, mapKey: string, cols?: Array<string>, toCond?: { [key: string]: any; }, transaction?: Transaction): Promise<{ [key: string]: any; }>; /** * list_order 순서를 변경 한다. * raw query 는 함수 내에서 추가 조건이 들어가고, 이에 따라 replacement 도 추가 조건이 들어 간다. * list_order 변경 관련 값은 함수 내부에서 처리 되고, 파라미터로 주는 raw query 는 데이터 검색 조건만 들어 가도록 해야 한다. * 움직이는 위치에 따라 list_order + 1, list_order -1 을 해야 하기 때문에 파라미터로 넘겨주는 rawQuery 내에 <list_order> 스트링으로 * 값을 설정 한다. * * 순수하게 list_order 만 변경 하고, list_order 변경 가능한지 데이터 비교 하지 않는다는 것이 changeListOrderV2 와 다른점 이다. * 사용 예제는 한국문화교육의 ContentCategoryAdmRouter.ts 의 카테고리 위치 변경을 참고 하자. * 또는 ck-gw-core 의 MenuAdmRouter.putLorder 를 참고 한다. * * @param lhd {string} 로그 헤더 * @param rdb {SequelizeTS} sequelize object. typescript sequelize 의 object 임. * @param TCreator {{ new() : T; }} 테이블 * @param rawQuery {string} 부분 raw 쿼리 * @param replacements {{ [key: string]: any; } | undefined} raw 쿼리에서 replace 값 * @param srcId {number} 순서를 변경할 src 의 id * @param srcListOrder {number} 순서를 변경할 src 의 list_order * @param destListOrder {number} 순서를 변경할 dest 의 list_order * @param transaction {Transaction} transaction * @returns {Promise<number>} 순서가 변경된 row 의 갯수를 리턴 한다. * @throws {CkError} 에러를 throw 한다. */ static changeListOrder<T>(lhd: string, rdb: SequelizeTS, TCreator: { new (): T; }, rawQuery: string, replacements: { [key: string]: any; } | undefined, srcId: number, srcListOrder: number, destListOrder: number, transaction: Transaction): Promise<number>; /** * list_order 순서를 변경 한다. router 에서 순서 변경하는 것을 함수 한번에 처리 할 수 있도록 묶어 둔 것이다. * 간단한 순서 변경에 사용 하고, 추가 제한 조건이 있으면 본 함수를 사용 하지 않도록 한다. * 에러 나면 string 을 리턴 하는데, 이런 경우는 호출 하는 곳에서 transaction rollback 처리 해 주어야 한다. * * changeListOrder 와 다른점은 함수 내부에서 순서를 변경 하려는 데이터를 찾아, 데이터 존재 여부 및 list_order 가 동일한지 비교 한다. * 사용 예제는 한국문화교육의 VRCAdminRouter.ts 의 키워드 위치 변경을 참고 하자. * 또는 ck-gw-core 의 BoardAdmRouter.ts 파일을 참고 한다. * * @param lhd {string} 로그 헤더 * @param rdb {SequelizeTS} sequelize object. typescript sequelize 의 object 임. * @param TCreator {{ new() : T; }} 테이블 * @param srcRid {string} 순서를 변경할 src 의 rid * @param destRid {string} 순서를 변경할 dest 의 rid * @param rawQueryPart {string} 부분 raw 쿼리 * @param replacements {{ [key: string]: any; } | undefined} raw 쿼리에서 replace 값 * @param transaction {Transaction} transaction * @returns {Promise<number |string>} 순서가 변경된 row 의 갯수를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static changeListOrderV2<T>(lhd: string, rdb: SequelizeTS, TCreator: { new (): T; }, srcRid: string, destRid: string, rawQueryPart: string, replacements: { [key: string]: any; } | undefined, transaction: Transaction): Promise<number | string>; /** * 새로운 데이터를 생성 하고, list_order 를 생성된 srl 값과 동일하게 설정 한다. * list_order 가 있는 대부분의 데이터 생성시 사용 하면 된다. * * string 이 리턴 되면, 에러 처리 해야 한다. 에러가 발생 되면 호출 하는 곳에서 transaction rollback 처리 해야 한다. * 한국 문화 교육의 VRCKeyword 생성을 참고 한다. * 또는 ck-gw-core 의 BoardAdmRouter.ts 파일을 참고 한다. * * @param lhd {string} 로그 헤더 * @param TCreator {{ new() : T; }} 테이블 * @param newData {T} 저장할 데이터의 모델 object * @param transaction {Transaction} transaction * @returns {Promise<T | string>} 생성된 데이터의 모델 object 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static createDataWithListOrder<T>(lhd: string, TCreator: { new (): T; }, newData: T, transaction: Transaction): Promise<T | string>; /** * 데이터를 저장 한다. 정상으로 실행 되면 저장된 데이터를 리턴 하고, 에러이면 에러 코드(string)을 리턴 한다. * * @param lhd {string} 로그키 * @param newData {T} 저장할 데이터의 모델 object * @param transaction {Transaction} transaction * @returns {Promise<T | string>} 생성된 데이터의 모델 object 를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static createData<T>(lhd: string, newData: T, transaction?: Transaction): Promise<T | string>; /** * 데이터를 업데이트 한다. number 를 리턴하면, 업데이트 데이터 카운트 이며, 스트링이면 에러 코드 이다. * 캐시 기능을 사용 할 때, cacheDataIds 파라미터를 준다면 캐시도 같이 삭제 한다. * * 캐시 기능을 지원 한다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블 모델 * @param modData {{ [key: string]: any; }} 업데이트 할 데이터 * @param where {{ [key: string]: any; }} 업데이트 할 데이터의 filter 조건 * @param transaction {Transaction | undefined} transaction * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @param cacheDataIds {Array<number> | number | undefined} DB 캐시 기능을 사용 할 때, 업데이트 하면서 캐시를 삭제 한다면 삭제 해야할 데이터의 id 또는 id 목록 * @returns {Promise<number | string>} 업데이트 된 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static updateData<T>(lhd: string, TCreator: { new (): T; }, modData: any, where: any, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG, cacheDataIds?: Array<number> | number): Promise<number | string>; /** * 데이터를 삭제 한다. number 를 리턴하면, 삭제된 데이터 카운트 이며, 스트링 이면 에러 코드 이다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블 모델 * @param where {{ [key: string]: any; }} 삭제 할 데이터의 filter 조건 * @param transaction {Transaction | undefined} transaction * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @param cacheDataIds {Array<number> | number | undefined} DB 캐시 기능을 사용 할 때, 업데이트 하면서 캐시를 삭제 한다면 삭제 해야할 데이터의 id 또는 id 목록 * @returns {Promise<number | string>} 삭제 된 데이터 카운트를 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static deleteData<T>(lhd: string, TCreator: { new (): T; }, where: any, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG, cacheDataIds?: Array<number> | number): Promise<number | string>; /** * 칼럼 값을 증가 시키거나, 감소 시킨다. true 를 리턴하면 처리 성공이고, 스트링 이면 에러 코드 이다. * * @param lhd {string} 로그키 * @param TCreator {{ new() : T; }} 테이블 모델 * @param where {{ [key: string]: any; }} 쿼리 검색 조건 * @param cols {Array<string>} increase, decrease 시킬 칼럼명. 일반적으로 칼럼 하나만 사용 될 것이지만, 여러개 칼럼을 처리 할 수 있다. * @param by {number} increase, decrease 시키는 양. 1 이면 1씩 증가하고, -1 이면 1씩 감소 한다. * @param transaction {Transaction | undefined} transaction * @param lang {CkValue.SUPPORT_LANG | undefined} 에러에서 사용할 언어 코드 * @param cacheDataIds {Array<number> | number | undefined} DB 캐시 기능을 사용 할 때, 업데이트 하면서 캐시를 삭제 한다면 삭제 해야할 데이터의 id 또는 id 목록 * @returns {Promise<void|string>} string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static incrementData<T>(lhd: string, TCreator: { new (): T; }, where: any, cols: Array<string>, by: number, transaction?: Transaction, lang?: CkValue.SUPPORT_LANG, cacheDataIds?: Array<number> | number): Promise<void | string>; /** * raw query 를 사용하여 데이터를 select 한다. * * @param lhd {string} 로그키 * @param rawQuery {string} join 을 하는 sql query * @param rdb {SequelizeTS | number} CkSequelize.getSequelize2(lhd, rdb) 로 sequelize object 를 구할 수 있는 값 이나, 연결된 db index. db index 라면 알아서 sequelize object 를 가져 온다. * @param replacements {{ [col: string]: any; } | undefined} join 시에 사용되는 replace 값 * @param transaction {Transaction | undefined} DB transaction object * @returns {Promise<Array<{ [col_name: string]: any; }> | string>} select 된 데이터 목록을 리턴 한다. string 을 리턴 하면 에러 코드 이기 때문에 에러 처리 해야 한다. */ static getDataByRawQuery(lhd: string, rawQuery: string, rdb: SequelizeTS | number, replacements?: { [col: string]: any; }, transaction?: Transaction): Promise<Array<{ [col_name: string]: any; }> | string>; /** * DDL(create, drop, alter, truncate) 쿼리를 실행 한다. * * @param lhd {string} 로그키 * @param rawQuery {string} sql 문 * @param rdb {SequelizeTS | number} CkSequelize.getSequelize2(lhd, rdb) 로 sequelize object 를 구할 수 있는 값 이나, 연결된 db index. db index 라면 알아서 sequelize object 를 가져 온다. * @returns {string | boolean} 에러가 발생하면 string(에러 코드)를 리턴 하고, 성공이면 true 를 리턴 한다. false 를 리턴 하는 경우 없음. */ static runDDLQuery(lhd: string, rawQuery: string, rdb: SequelizeTS | number): Promise<string | boolean>; } export default DatabaseService;