summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-10-17 16:50:49 +0900
committerjoonhoekim <26rote@gmail.com>2025-10-17 16:50:49 +0900
commit55b6153dfce83a1cf2be72cbc3413d78084e8da1 (patch)
tree83a706477462ca7723188092ce436e508e2e7b58 /lib
parent8a0096dff6f16015ee12c8b25a6b8471733b6529 (diff)
(김준회) EDP 기준정보를 20분마다 동기화하도록 cron 추가 (옥프로 요청사항) 객체클래스, 태그타입, 레지스터
Diffstat (limited to 'lib')
-rw-r--r--lib/edp-sync/sync-edp.ts127
1 files changed, 127 insertions, 0 deletions
diff --git a/lib/edp-sync/sync-edp.ts b/lib/edp-sync/sync-edp.ts
new file mode 100644
index 00000000..26f3d493
--- /dev/null
+++ b/lib/edp-sync/sync-edp.ts
@@ -0,0 +1,127 @@
+// EDP 마스터 데이터 동기화 함수들
+// SEDP API에서 마스터 데이터를 가져와 데이터베이스에 동기화하는 함수들
+
+import { syncTagSubfields } from "@/lib/sedp/sync-tag-types";
+import { syncTagFormMappings } from "@/lib/sedp/sync-form";
+import { syncObjectClasses } from "@/lib/sedp/sync-object-class";
+
+/**
+ * EDP 마스터 데이터를 순차적으로 동기화하는 메인 함수
+ * 1. 오브젝트 클래스 동기화 (태그 타입 포함)
+ * 2. 태그 서브필드 동기화
+ * 3. 태그 폼 매핑 동기화
+ */
+export async function syncEDPMasterData(): Promise<{
+ success: boolean;
+ message: string;
+ results: {
+ objectClasses?: any;
+ tagSubfields?: any;
+ tagFormMappings?: any;
+ };
+ totalExecutionTime: number;
+}> {
+ const startTime = Date.now();
+ const results: any = {};
+
+ try {
+ console.log('🚀 EDP 마스터 데이터 동기화 시작:', new Date().toISOString());
+
+ // 1. 오브젝트 클래스 동기화 (태그 타입 포함)
+ console.log('1단계: 오브젝트 클래스 동기화 시작...');
+ try {
+ results.objectClasses = await syncObjectClasses();
+ console.log('오브젝트 클래스 동기화 완료');
+ } catch (error) {
+ console.error('❌ 오브젝트 클래스 동기화 실패:', error);
+ results.objectClasses = { error: error instanceof Error ? error.message : String(error) };
+ }
+
+ // 2. 태그 서브필드 동기화
+ console.log('2단계: 태그 서브필드 동기화 시작...');
+ try {
+ results.tagSubfields = await syncTagSubfields();
+ console.log('태그 서브필드 동기화 완료');
+ } catch (error) {
+ console.error('❌ 태그 서브필드 동기화 실패:', error);
+ results.tagSubfields = { error: error instanceof Error ? error.message : String(error) };
+ }
+
+ // 3. 태그 폼 매핑 동기화
+ console.log('3단계: 태그 폼 매핑 동기화 시작...');
+ try {
+ results.tagFormMappings = await syncTagFormMappings();
+ console.log('태그 폼 매핑 동기화 완료');
+ } catch (error) {
+ console.error('❌ 태그 폼 매핑 동기화 실패:', error);
+ results.tagFormMappings = { error: error instanceof Error ? error.message : String(error) };
+ }
+
+ const totalExecutionTime = Date.now() - startTime;
+
+ // 성공/실패 요약
+ const resultValues = Object.values(results);
+ const hasErrors = resultValues.some((result: any) =>
+ result && (result.error || (result.failed && result.failed > 0))
+ );
+
+ const message = hasErrors
+ ? 'EDP 마스터 데이터 동기화 완료 (일부 단계에서 오류 발생)'
+ : 'EDP 마스터 데이터 동기화 완료 (모든 단계 성공)';
+
+ console.log(`${message} - 총 실행 시간: ${totalExecutionTime}ms`);
+
+ return {
+ success: !hasErrors,
+ message,
+ results,
+ totalExecutionTime
+ };
+
+ } catch (error) {
+ const totalExecutionTime = Date.now() - startTime;
+ console.error('EDP 마스터 데이터 동기화 중 전체 오류 발생:', error);
+
+ return {
+ success: false,
+ message: `EDP 마스터 데이터 동기화 실패: ${error instanceof Error ? error.message : String(error)}`,
+ results,
+ totalExecutionTime
+ };
+ }
+}
+
+/**
+ * EDP 마스터 데이터 동기화 스케줄러 시작 함수
+ * instrumentation.ts에서 호출되어 cron job을 등록
+ */
+export async function startEDPMasterDataSyncScheduler(): Promise<void> {
+ try {
+ // 환경변수에서 cron 표현식 가져오기 (기본값: 매 20분마다)
+ const cronExpression = process.env.EDP_MASTER_DATA_SYNC_CRON || '*/20 * * * *';
+
+ // node-cron import
+ const cron = (await import('node-cron')).default;
+
+ // cron job 등록
+ cron.schedule(cronExpression, async () => {
+ try {
+ console.log(`⏰ EDP 마스터 데이터 동기화 시작 (크론: ${cronExpression})`);
+ const result = await syncEDPMasterData();
+
+ if (result.success) {
+ console.log(`✅ EDP 마스터 데이터 동기화 성공 - 실행 시간: ${result.totalExecutionTime}ms`);
+ } else {
+ console.error(`❌ EDP 마스터 데이터 동기화 실패: ${result.message}`);
+ }
+ } catch (error) {
+ console.error('❌ EDP 마스터 데이터 동기화 중 예외 발생:', error);
+ }
+ }, { timezone: 'Asia/Seoul' });
+
+ console.log(`✅ EDP 마스터 데이터 동기화 스케줄러 등록 완료 (크론: ${cronExpression})`);
+ } catch (error) {
+ console.error('❌ EDP 마스터 데이터 동기화 스케줄러 등록 실패:', error);
+ throw error;
+ }
+}