summaryrefslogtreecommitdiff
path: root/lib/users/department-domain/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/users/department-domain/service.ts')
-rw-r--r--lib/users/department-domain/service.ts110
1 files changed, 110 insertions, 0 deletions
diff --git a/lib/users/department-domain/service.ts b/lib/users/department-domain/service.ts
index 570ef2cf..834de83a 100644
--- a/lib/users/department-domain/service.ts
+++ b/lib/users/department-domain/service.ts
@@ -7,6 +7,7 @@ import {
departmentDomainAssignments,
departmentDomainAssignmentHistory
} from "@/db/schema/departmentDomainAssignments";
+import { users } from "@/db/schema/users";
import { and, eq, inArray, desc } from "drizzle-orm";
import { getServerSession } from "next-auth/next";
import { authOptions } from "@/app/api/auth/[...nextauth]/route";
@@ -436,4 +437,113 @@ export async function getDepartmentDomainStats() {
tags: ["department-domain-assignments"],
}
)();
+}
+
+// pending 도메인 사용자들의 부서별 도메인 자동 할당
+export async function autoAssignPendingUsersDomains() {
+ unstable_noStore();
+
+ try {
+ console.log('[DOMAIN-AUTO-ASSIGN] pending 사용자 도메인 자동 할당 시작');
+
+ // 1. pending 도메인 사용자들의 부서 정보 조회
+ const pendingUsers = await db
+ .select({
+ id: users.id,
+ email: users.email,
+ name: users.name,
+ deptCode: users.deptCode,
+ deptName: users.deptName,
+ })
+ .from(users)
+ .where(eq(users.domain, 'pending'));
+
+ console.log(`[DOMAIN-AUTO-ASSIGN] pending 사용자 ${pendingUsers.length}명 발견`);
+
+ if (pendingUsers.length === 0) {
+ console.log('[DOMAIN-AUTO-ASSIGN] pending 도메인 사용자가 없습니다.');
+ return {
+ success: true,
+ processedCount: 0,
+ assignedCount: 0,
+ skippedCount: 0,
+ message: 'pending 도메인 사용자가 없습니다.',
+ };
+ }
+
+ // 2. 모든 활성 부서별 도메인 할당 정보 조회
+ const domainAssignments = await db
+ .select({
+ companyCode: departmentDomainAssignments.companyCode,
+ departmentCode: departmentDomainAssignments.departmentCode,
+ assignedDomain: departmentDomainAssignments.assignedDomain,
+ })
+ .from(departmentDomainAssignments)
+ .where(eq(departmentDomainAssignments.isActive, true));
+
+ // 3. 부서별 도메인 매핑을 위한 Map 생성
+ const domainMap = new Map<string, string>();
+ domainAssignments.forEach(assignment => {
+ const key = `${assignment.companyCode}-${assignment.departmentCode}`;
+ domainMap.set(key, assignment.assignedDomain);
+ });
+
+ console.log(`[DOMAIN-AUTO-ASSIGN] ${domainAssignments.length}개 부서의 도메인 할당 정보 로드됨`);
+
+ let assignedCount = 0;
+ let skippedCount = 0;
+
+ // 4. 각 pending 사용자에 대해 도메인 할당 처리
+ for (const user of pendingUsers) {
+ try {
+ // 사용자의 부서에 대한 도메인 할당 정보 확인
+ // 현재 회사 코드 사용 (환경변수 또는 기본값)
+ const companyCode = process.env.CURRENT_COMPANY_CODE || 'D60';
+ const domainKey = `${companyCode}-${user.deptCode || ''}`;
+ const assignedDomain = domainMap.get(domainKey);
+
+ if (assignedDomain && assignedDomain !== 'pending') {
+ // 도메인 할당 정보가 있으면 업데이트
+ await db
+ .update(users)
+ .set({
+ domain: assignedDomain as UserDomain,
+ updatedAt: new Date(),
+ })
+ .where(eq(users.id, user.id));
+
+ assignedCount++;
+ console.log(`[DOMAIN-AUTO-ASSIGN] 사용자 ${user.name}(${user.email}) -> ${assignedDomain} 도메인 할당`);
+ } else {
+ // 할당 정보가 없으면 pending 유지
+ skippedCount++;
+ console.log(`[DOMAIN-AUTO-ASSIGN] 사용자 ${user.name}(${user.email}) -> 부서(${user.deptCode})에 대한 도메인 할당 정보 없음, pending 유지`);
+ }
+ } catch (error) {
+ console.error(`[DOMAIN-AUTO-ASSIGN] 사용자 ${user.email} 처리 실패:`, error);
+ skippedCount++;
+ }
+ }
+
+ const result = {
+ success: true,
+ processedCount: pendingUsers.length,
+ assignedCount,
+ skippedCount,
+ message: `${assignedCount}명의 사용자에게 도메인이 자동 할당되었습니다. (스킵: ${skippedCount}명)`,
+ };
+
+ console.log(`[DOMAIN-AUTO-ASSIGN] 완료: ${JSON.stringify(result)}`);
+ return result;
+
+ } catch (error) {
+ console.error('[DOMAIN-AUTO-ASSIGN] pending 사용자 도메인 자동 할당 실패:', error);
+ return {
+ success: false,
+ processedCount: 0,
+ assignedCount: 0,
+ skippedCount: 0,
+ message: getErrorMessage(error),
+ };
+ }
} \ No newline at end of file