diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-07-22 02:57:31 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-07-22 02:57:31 +0000 |
| commit | cb34c5e1a61a20c954e12a8219d82dbdfbe50e13 (patch) | |
| tree | 61fdfd81c3f42da6064c5ec2b661f1ef17ae8681 /lib/knox-sync/title-sync-service.ts | |
| parent | ee57cc221ff2edafd3c0f12a181214c602ed257e (diff) | |
(김준회) Knox API - 임직원 저장 구현
Diffstat (limited to 'lib/knox-sync/title-sync-service.ts')
| -rw-r--r-- | lib/knox-sync/title-sync-service.ts | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/lib/knox-sync/title-sync-service.ts b/lib/knox-sync/title-sync-service.ts new file mode 100644 index 00000000..e7bc13bd --- /dev/null +++ b/lib/knox-sync/title-sync-service.ts @@ -0,0 +1,70 @@ +'use server'; + +import * as cron from 'node-cron'; +import db from '@/db/db'; +import { title as titleTable } from '@/db/schema/knox/titles'; +import { getTitlesByCompany, Title } from '@/lib/knox-api/employee/employee'; +import { sql } from 'drizzle-orm'; + +const COMPANIES = (process.env.KNOX_COMPANY_CODES || 'P2') + .split(',') + .map((c) => c.trim()) + .filter(Boolean); + +const CRON_STRING = process.env.KNOX_TITLE_SYNC_CRON || '30 4 * * *'; +const DO_FIRST_RUN = process.env.KNOX_TITLE_SYNC_FIRST_RUN === 'true'; + +async function upsertTitles(titles: Title[]) { + if (!titles.length) return; + + const rows = titles.map((t) => ({ + companyCode: t.companyCode, + titleCode: t.titleCode, + titleName: t.titleName, + enTitleName: t.enTitleName, + sortOrder: t.sortOrder, + raw: t as unknown as Record<string, unknown>, + })); + + await db + .insert(titleTable) + .values(rows) + .onConflictDoUpdate({ + target: [titleTable.companyCode, titleTable.titleCode], + set: { + titleName: sql.raw('excluded.title_name'), + enTitleName: sql.raw('excluded.en_title_name'), + sortOrder: sql.raw('excluded.sort_order'), + raw: sql.raw('excluded.raw'), + updatedAt: sql.raw('CURRENT_TIMESTAMP'), + }, + }); +} + +export async function syncKnoxTitles(): Promise<void> { + console.log('[KNOX-SYNC] 직급 동기화 시작'); + + for (const companyCode of COMPANIES) { + try { + const titles = await getTitlesByCompany(companyCode); + await upsertTitles(titles); + console.log(`[KNOX-SYNC] 직급 동기화 완료 - ${companyCode}: ${titles.length}건`); + } catch (err) { + console.error(`[KNOX-SYNC] 직급 동기화 오류 (company ${companyCode})`, err); + } + } + + console.log('[KNOX-SYNC] 직급 동기화 전체 완료'); +} + +export async function startKnoxTitleSyncScheduler() { + if (DO_FIRST_RUN) { + syncKnoxTitles().catch(console.error); + } + + cron.schedule(CRON_STRING, () => { + syncKnoxTitles().catch(console.error); + }); + + console.log(`[KNOX-SYNC] 직급 동기화 스케줄러 등록 (${CRON_STRING})`); +}
\ No newline at end of file |
