summaryrefslogtreecommitdiff
path: root/lib/users/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/users/service.ts')
-rw-r--r--lib/users/service.ts95
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: "사용자 검색 중 오류가 발생했습니다.",
+ };
+ }
+}
+