summaryrefslogtreecommitdiff
path: root/lib/knox-sync/master-sync-service.ts
blob: 5cabe9ed1098c9650d9c7a96b3dd91d7bcd66b05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
'use server';

import * as cron from 'node-cron';
import { syncKnoxTitles } from './title-sync-service';
import { syncKnoxOrganizations } from './organization-sync-service';
import { syncKnoxEmployees } from './employee-sync-service';
import {
  checkTimeRestriction,
  logSchedulerInfo,
} from './common';

// 통합 CRON 스케줄 (기본: 매일 04:00)
const CRON_STRING = process.env.KNOX_MASTER_SYNC_CRON || '0 4 * * *';

// 애플리케이션 기동 시 최초 한 번 실행 여부
const DO_FIRST_RUN = process.env.KNOX_MASTER_SYNC_FIRST_RUN === 'true';

/**
 * Knox 동기화 마스터 함수 - 직급 → 조직 → 임직원 순차 실행
 */
export async function syncAllKnoxData(): Promise<void> {
  console.log('[KNOX-SYNC] 🚀 Knox 통합 동기화 시작 (순차 실행)');
  const overallStartTime = Date.now();

  try {
    // 1단계: 직급 동기화
    console.log('[KNOX-SYNC] 1/3: 직급 동기화 시작');
    await syncKnoxTitles();
    console.log('[KNOX-SYNC] 1/3: 직급 동기화 완료 ✅');

    // 2단계: 조직 동기화 (직급 완료 후)
    console.log('[KNOX-SYNC] 2/3: 조직 동기화 시작');
    await syncKnoxOrganizations();
    console.log('[KNOX-SYNC] 2/3: 조직 동기화 완료 ✅');

    // 3단계: 임직원 동기화 (조직 완료 후)
    console.log('[KNOX-SYNC] 3/3: 임직원 동기화 시작');
    await syncKnoxEmployees();
    console.log('[KNOX-SYNC] 3/3: 임직원 동기화 완료 ✅');

    const overallDuration = Math.round((Date.now() - overallStartTime) / 1000);
    console.log(`[KNOX-SYNC] 🎉 Knox 통합 동기화 완료 - 총 ${overallDuration}초 소요`);

  } catch (error) {
    console.error('[KNOX-SYNC] ❌ Knox 통합 동기화 중 오류 발생:', error);
    throw error;
  }
}

/**
 * Knox 마스터 동기화 스케줄러 시작
 */
export async function startKnoxMasterSyncScheduler() {
  // 환경 변수에 따라 실행시 즉시 실행 여부 결정
  if (DO_FIRST_RUN) {
    if (!checkTimeRestriction()) {
      return;
    }
    
    console.log('[KNOX-SYNC] 첫 실행: Knox 통합 동기화 즉시 시작');
    syncAllKnoxData().catch(console.error);
  }

  // 통합 CRON JOB 등록 (기존 개별 스케줄 대신)
  cron.schedule(CRON_STRING, () => {
    console.log('[KNOX-SYNC] CRON 실행: Knox 통합 동기화 시작');
    syncAllKnoxData().catch(console.error);
  });

  logSchedulerInfo('통합(직급→조직→임직원)', CRON_STRING);
  console.log('[KNOX-SYNC] 💡 순차 실행으로 의존성 문제 해결 (직급 완료 → 조직 완료 → 임직원 완료)');
}