summaryrefslogtreecommitdiff
path: root/lib/knox-api/organization-service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/knox-api/organization-service.ts')
-rw-r--r--lib/knox-api/organization-service.ts95
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