'use server'; import db from '@/db/db'; import { organization as organizationTable } from '@/db/schema/knox/organization'; import { count, ilike, isNotNull } from 'drizzle-orm'; // ---------------------------------------------------- // 조직 관리자 검색 함수 // ---------------------------------------------------- interface SearchOrganizationsForManagerInput { search: string; page: number; perPage: number; } interface SearchOrganizationsForManagerResult { data: Array<{ id: string; departmentCode: string; departmentName: string; managerId: string; managerName: string; managerTitle: string; companyCode: string; companyName: string; }>; total: number; pageCount: number; } export async function searchOrganizationsForManager( input: SearchOrganizationsForManagerInput ): Promise { const offset = (input.page - 1) * input.perPage; // 검색 조건 구성 const searchTerm = `%${input.search}%`; const results = await db .select({ id: organizationTable.departmentCode, departmentCode: organizationTable.departmentCode, departmentName: organizationTable.departmentName, managerId: organizationTable.managerId, managerName: organizationTable.managerName, managerTitle: organizationTable.managerTitle, companyCode: organizationTable.companyCode, companyName: organizationTable.companyName, }) .from(organizationTable) .where( // 관리자가 있고, 부서명 또는 관리자명으로 검색 isNotNull(organizationTable.managerId) ) .having( // 부서명 또는 관리자명으로 검색 ilike(organizationTable.departmentName, searchTerm) || ilike(organizationTable.managerName, searchTerm) ) .orderBy(organizationTable.departmentName) .limit(input.perPage) .offset(offset); // 전체 개수 조회 const totalResult = await db .select({ count: count() }) .from(organizationTable) .where( isNotNull(organizationTable.managerId) ) .having( ilike(organizationTable.departmentName, searchTerm) || ilike(organizationTable.managerName, searchTerm) ); const total = totalResult[0]?.count ?? 0; const pageCount = Math.ceil(total / input.perPage); return { data: results as Array<{ id: string; departmentCode: string; departmentName: string; managerId: string; managerName: string; managerTitle: string; companyCode: string; companyName: string; }>, total, pageCount, }; }