diff options
| author | joonhoekim <26rote@gmail.com> | 2025-08-26 12:10:51 +0000 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-08-26 12:10:51 +0000 |
| commit | f61e9e9c6ea5b415d64ecb9f703a0633a5029da4 (patch) | |
| tree | 1088886f7b59071a401664b993d30ec173e9caef /lib | |
| parent | 1110427907bbe9c11a378da4c1a233b83b5ca3b1 (diff) | |
(김준회) shi-api 기준 유저 업데이트시 부서별 권한 업데이트 로직 함께 수행하도록 변경
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/shi-api/shi-api-utils.ts | 14 | ||||
| -rw-r--r-- | lib/users/department-domain/service.ts | 110 |
2 files changed, 123 insertions, 1 deletions
diff --git a/lib/shi-api/shi-api-utils.ts b/lib/shi-api/shi-api-utils.ts index c0b62b0d..bb80c454 100644 --- a/lib/shi-api/shi-api-utils.ts +++ b/lib/shi-api/shi-api-utils.ts @@ -4,6 +4,7 @@ import { nonsapUser, users } from '@/db/schema'; import db from '@/db/db'; import { debugError, debugLog, debugWarn, debugSuccess } from '@/lib/debug-utils'; import { bulkUpsert } from '@/lib/soap/batch-utils'; +import { autoAssignPendingUsersDomains } from '@/lib/users/department-domain/service'; const shiApiBaseUrl = process.env.SHI_API_BASE_URL; const shiNonsapUserSegment = process.env.SHI_NONSAP_USER_SEGMENT; @@ -110,10 +111,11 @@ export const getAllNonsapUser = async () => { knoxId: u.MYSNG_ID || undefined, name: u.USR_NM || undefined, email: u.EMAIL_ADR || undefined, - epId: u.MYSNG_ID || undefined, + epId: u.MYSNG_USR_ID || undefined, deptCode: u.DEPTCD || undefined, deptName: u.DEPTNM || undefined, phone: u.HP_NO || undefined, + domain: 'pending', // SHI-API를 통해 동기화되는 사용자는 pending 도메인으로 설정 isAbsent, isDeletedOnNonSap: isDeleted, isActive, @@ -155,6 +157,16 @@ export const getAllNonsapUser = async () => { // 휴직 사용자도 API에서 수신하므로, 기존 사용자와의 비교를 통한 휴직 처리 로직은 더 이상 필요하지 않음 + // ** 4. 사용자 동기화 완료 후 부서별 도메인 자동 할당 처리 ** + debugLog('[DOMAIN-AUTO-ASSIGN] SHI-API 동기화 완료 후 부서별 도메인 자동 할당 시작'); + try { + const domainAssignResult = await autoAssignPendingUsersDomains(); + debugSuccess(`[DOMAIN-AUTO-ASSIGN] 부서별 도메인 자동 할당 완료: ${domainAssignResult.message}`); + } catch (domainError) { + debugError('[DOMAIN-AUTO-ASSIGN] 부서별 도메인 자동 할당 실패', domainError); + // 도메인 할당 실패해도 메인 동기화 결과는 반환 + } + return { fetched: Array.isArray(data) ? data.length : 0, staged: Array.isArray(data) ? data.length : 0, 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 |
