diff options
Diffstat (limited to 'lib/users')
| -rw-r--r-- | lib/users/service.ts | 95 |
1 files changed, 94 insertions, 1 deletions
diff --git a/lib/users/service.ts b/lib/users/service.ts index 80c346fa..90ee170e 100644 --- a/lib/users/service.ts +++ b/lib/users/service.ts @@ -13,7 +13,7 @@ import db from "@/db/db"; import { getErrorMessage } from "@/lib/handle-error"; import { getServerSession } from "next-auth/next" import { authOptions } from "@/app/api/auth/[...nextauth]/route" -import { and, or, desc, asc, ilike, eq, isNull, sql, count, inArray, ne } from "drizzle-orm"; +import { and, or, desc, asc, ilike, eq, isNull, isNotNull, sql, count, inArray, ne, not } from "drizzle-orm"; import { SaveFileResult, saveFile } from '../file-stroage'; interface AssignUsersArgs { @@ -1012,3 +1012,96 @@ export async function getUserRoles(userId: number): Promise<string[]> { } } +/** + * 사용자 선택기용 간단한 사용자 검색 함수 + */ +export async function searchUsersForSelector( + query: string, + page: number = 1, + perPage: number = 10, + domainFilter?: { type: "exclude" | "include"; domains: string[] } | null +) { + try { + const offset = (page - 1) * perPage; + + // 이름 검색 조건 + let searchWhere; + if (query.trim()) { + const searchPattern = `%${query.trim()}%`; + searchWhere = ilike(users.name, searchPattern); + } + + // 도메인 필터 조건 + let domainWhere; + if (domainFilter && domainFilter.domains.length > 0) { + if (domainFilter.type === "include") { + domainWhere = inArray(users.domain, domainFilter.domains); + } else if (domainFilter.type === "exclude") { + domainWhere = not(inArray(users.domain, domainFilter.domains)); + } + } + + // 활성 사용자만 + const activeWhere = eq(users.isActive, true); + + // 최종 조건 + const finalWhere = and(searchWhere, domainWhere, activeWhere); + + const { data, total } = await db.transaction(async (tx) => { + const data = await tx + .select({ + id: users.id, + epId: users.epId, + name: users.name, + email: users.email, + deptCode: users.deptCode, + deptName: users.deptName, + imageUrl: users.imageUrl, + domain: users.domain, + }) + .from(users) + .where(finalWhere) + .orderBy(asc(users.name)) + .limit(perPage) + .offset(offset); + + const totalResult = await tx + .select({ count: count() }) + .from(users) + .where(finalWhere); + + return { data, total: totalResult[0].count }; + }); + + const pageCount = Math.ceil(total / perPage); + + return { + success: true, + data, + pagination: { + page, + perPage, + total, + pageCount, + hasNextPage: page < pageCount, + hasPrevPage: page > 1, + }, + }; + } catch (error) { + console.error("사용자 검색 오류:", error); + return { + success: false, + data: [], + pagination: { + page: 1, + perPage, + total: 0, + pageCount: 0, + hasNextPage: false, + hasPrevPage: false, + }, + error: "사용자 검색 중 오류가 발생했습니다.", + }; + } +} + |
