diff options
Diffstat (limited to 'lib/docu-list-rule/document-class/service.ts')
| -rw-r--r-- | lib/docu-list-rule/document-class/service.ts | 59 |
1 files changed, 40 insertions, 19 deletions
diff --git a/lib/docu-list-rule/document-class/service.ts b/lib/docu-list-rule/document-class/service.ts index 04dfa50e..99d85ea5 100644 --- a/lib/docu-list-rule/document-class/service.ts +++ b/lib/docu-list-rule/document-class/service.ts @@ -19,7 +19,7 @@ export async function getDocumentClassCodeGroups(input: { isActive?: string }) { try { - const { page, perPage, sort, search } = input + const { page, perPage, sort, search, filters, joinOperator } = input const offset = (page - 1) * perPage // 기본 조건 @@ -35,27 +35,48 @@ export async function getDocumentClassCodeGroups(input: { )` } - // 정렬 + // 고급 필터링 + if (filters && filters.length > 0) { + const filterConditions = filters.map(filter => { + const { id, value } = filter + if (!value) return null + + switch (id) { + case "code": + return sql`${documentClasses.code} ILIKE ${`%${value}%`}` + case "value": + return sql`${documentClasses.value} ILIKE ${`%${value}%`}` + case "description": + return sql`${documentClasses.description} ILIKE ${`%${value}%`}` + case "isActive": + return sql`${documentClasses.isActive} = ${value === "true"}` + case "createdAt": + return sql`${documentClasses.createdAt}::text ILIKE ${`%${value}%`}` + default: + return null + } + }).filter(Boolean) + + if (filterConditions.length > 0) { + const operator = joinOperator === "or" ? sql` OR ` : sql` AND ` + const combinedFilters = filterConditions.reduce((acc, condition, index) => { + if (index === 0) return condition + return sql`${acc}${operator}${condition}` + }) + + whereConditions = sql`${whereConditions} AND (${combinedFilters})` + } + } + + // 정렬 (안전한 필드 체크 적용) let orderBy = sql`${documentClasses.createdAt} DESC` if (sort && sort.length > 0) { const sortField = sort[0] - const direction = sortField.desc ? sql`DESC` : sql`ASC` - - switch (sortField.id) { - case "code": - orderBy = sql`${documentClasses.code} ${direction}` - break - case "value": - orderBy = sql`${documentClasses.value} ${direction}` - break - case "description": - orderBy = sql`${documentClasses.description} ${direction}` - break - case "createdAt": - orderBy = sql`${documentClasses.createdAt} ${direction}` - break - default: - orderBy = sql`${documentClasses.createdAt} DESC` + // 안전성 체크: 필드가 실제 테이블에 존재하는지 확인 + if (sortField && sortField.id && typeof sortField.id === "string" && sortField.id in documentClasses) { + const direction = sortField.desc ? sql`DESC` : sql`ASC` + const col = documentClasses[sortField.id as keyof typeof documentClasses] + orderBy = sql`${col} ${direction}` } } |
