diff options
Diffstat (limited to 'lib/knox-api/organization-service.ts')
| -rw-r--r-- | lib/knox-api/organization-service.ts | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/lib/knox-api/organization-service.ts b/lib/knox-api/organization-service.ts new file mode 100644 index 00000000..c90b00f7 --- /dev/null +++ b/lib/knox-api/organization-service.ts @@ -0,0 +1,95 @@ +'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<SearchOrganizationsForManagerResult> { + 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, + }; +}
\ No newline at end of file |
