summaryrefslogtreecommitdiff
path: root/lib/knox-sync/master-sync-service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/knox-sync/master-sync-service.ts')
-rw-r--r--lib/knox-sync/master-sync-service.ts72
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/knox-sync/master-sync-service.ts b/lib/knox-sync/master-sync-service.ts
new file mode 100644
index 00000000..5cabe9ed
--- /dev/null
+++ b/lib/knox-sync/master-sync-service.ts
@@ -0,0 +1,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] 💡 순차 실행으로 의존성 문제 해결 (직급 완료 → 조직 완료 → 임직원 완료)');
+} \ No newline at end of file