import { type Logger } from "@logtape/logtape"; import { type Knex } from "knex"; import { type FilterQuery } from "../filter/types"; import { type DatabaseSchemaExtend, type SonamuQueryMode } from "../types/types"; import { type ListResult } from "../utils/model"; import { type EnhancerMap, type ResolveSubsetIntersection } from "./base-model.types"; import { type DBPreset } from "./db"; import { Puri } from "./puri"; import { type InferAllSubsets, type PuriLoaderQueries, type PuriSubsetFn } from "./puri-subset.types"; import { PuriWrapper } from "./puri-wrapper"; import { type UnionExtractedTTables } from "./puri.types"; type UnknownDBRecord = Record; /** * 모든 Model 클래스의 기본 클래스 * * @template TSubsetKey - 서브셋 키 유니온 (예: "A" | "P" | "SS") * @template TSubsetMapping - 서브셋별 최종 결과 타입 매핑 * @template TSubsetQueries - 서브셋 쿼리 함수 객체 * @template TLoaderQueries - 서브셋별 로더 쿼리 배열 객체 */ export declare class BaseModelClass = never, TSubsetQueries extends Record = never, TLoaderQueries extends PuriLoaderQueries = never> { readonly modelName: string; protected subsetQueries?: TSubsetQueries | undefined; protected loaderQueries?: TLoaderQueries | undefined; protected readonly logger: Logger; constructor(modelName?: string, subsetQueries?: TSubsetQueries | undefined, loaderQueries?: TLoaderQueries | undefined); getDB(which: DBPreset): Knex; getPuri(which: DBPreset): PuriWrapper; destroy(): Promise; getInsertedIds(wdb: Knex, rows: UnknownDBRecord[], tableName: string, unqKeyFields: string[], chunkSize?: number): Promise; /** * 특정 서브셋에 대한 쿼리 빌더 획득 * * @returns qb - 쿼리 빌더 (조건 추가용) * @returns onSubset - 특정 서브셋 전용 타입이 필요할 때 사용 */ getSubsetQueries(subset: T): { qb: Puri & { NonAllowedAsSingleTable: { __fulltext__: true; }; }, {}>; onSubset: { (subset: S): ReturnType; (subsets: [...Arr]): ResolveSubsetIntersection; }; }; /** * Enhancer 객체 생성 헬퍼 * 타입 검증 및 추론을 도와줌 */ createEnhancers(enhancers: EnhancerMap, TSubsetMapping, TSubsetQueries>): EnhancerMap, TSubsetMapping, TSubsetQueries>; /** * 서브셋 쿼리 실행 * * 1. Sonamu 필터 적용 (타입 변환 포함) * 2. 쿼리 실행 (pagination 적용) * 3. 로더 실행 (1:N, N:M 관계 데이터 로딩) * 4. Hydrate (flat → 중첩 객체) * 5. Enhancer 적용 (virtual 필드 계산) */ executeSubsetQuery, LP extends { num?: number; page?: number; queryMode?: SonamuQueryMode; sonamuFilter?: Record; }>(params: { subset: T; qb: Puri; params: { num: number; page: number; queryMode?: SonamuQueryMode; sonamuFilter?: Record; }; debug?: boolean; optimizeCountQuery?: boolean; } & EnhancerParam): Promise>; /** * 객체에서 internal 필드 제거 * 중첩 필드(예: "user.email") 및 배열(예: "employees.salary")도 처리 */ omitInternalFields(row: T, fields: string[]): T; /** * FilterQuery를 Puri QueryBuilder에 적용 * * @param qb Puri QueryBuilder 인스턴스 * @param filters FilterQuery 객체 */ protected applySonamuFilters>(qb: Puri, filters?: FilterQuery): void; /** * 단일 연산자를 QueryBuilder에 적용 */ private applyOperator; /** * 중첩 필드 삭제 (배열 내 객체도 처리) */ deleteField(obj: any, parts: string[]): void; /** * COUNT 쿼리 실행 (내부 메서드) */ private executeCountQuery; /** * LIST 쿼리 실행 (내부 메서드) */ private executeListQuery; /** * 재귀적 로더 처리 */ private processLoaders; /** * Flat 레코드를 중첩 객체로 변환 * * - `user__name` → `{ user: { name } }` * - nullable relation의 경우 id 필드가 null이면 객체 자체를 null로 */ hydrate(rows: T[]): T[]; } /** * Enhancer 파라미터 조건부 타입 * RequiredEnhancerKeys가 없으면 enhancers 선택적, 있으면 필수 */ type EnhancerParam, TSubsetMapping extends Record, TSubsetQueries extends Record> = [RequiredEnhancerKeys] extends [never] ? { enhancers?: EnhancerMap; } : { enhancers: EnhancerMap; }; type RequiredEnhancerKeys, TSubsetMapping extends Record> = { [K in TSubsetKey]: TComputedResults[K] extends TSubsetMapping[K] ? never : K; }[TSubsetKey]; export declare const BaseModel: BaseModelClass; export {}; //# sourceMappingURL=base-model.d.ts.map