summaryrefslogtreecommitdiff
path: root/lib/docu-list-rule/document-class/service.ts
diff options
context:
space:
mode:
author0-Zz-ang <s1998319@gmail.com>2025-07-29 09:08:52 +0900
committer0-Zz-ang <s1998319@gmail.com>2025-07-29 09:11:22 +0900
commit8d92c88ab341156d82156bae49c62a8101280e75 (patch)
tree065ed1838de4164da23e3777b5367143e4f13982 /lib/docu-list-rule/document-class/service.ts
parent75249e6fa46864f49d4eb91bd755171b6b65eaae (diff)
(박서영) 설계 Document Numbering Rule 수정
Diffstat (limited to 'lib/docu-list-rule/document-class/service.ts')
-rw-r--r--lib/docu-list-rule/document-class/service.ts59
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}`
}
}