diff options
Diffstat (limited to 'lib/users')
| -rw-r--r-- | lib/users/department-domain/service.ts | 110 |
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 |
