import 'dotenv/config'; import { loadConfig } from '../src/config/env.js'; import { ParseRestClient } from '../src/db/parse-rest.client.js'; import { ParseRestCompetitorSyncService } from '../src/modules/domestic-voc/services/parse-rest-competitor-sync.service.js'; import { FmodeVocEcommerceClient } from '../src/modules/domestic-voc/upstream/fmode-client.js'; import { ParseRestVocRepository } from '../src/modules/saas-platform/parse-rest-voc.repository.js'; const config = loadConfig(); if (config.storageDriver !== 'parse_rest') throw new Error('STORAGE_DRIVER must be parse_rest'); const workspaceId = process.argv[2] || config.auth.defaultWorkspaceId; const refresh = process.argv.includes('--refresh'); const concurrencyArg = process.argv.find((value) => value.startsWith('--concurrency=')); const concurrency = Number(concurrencyArg?.split('=')[1] ?? 3); const client = new ParseRestClient({ serverUrl: config.parse.serverUrl, appId: config.parse.appId, masterKey: config.parse.masterKey, timeoutMs: config.parse.timeoutMs, }); const repository = new ParseRestVocRepository(client); const gateway = new FmodeVocEcommerceClient(config.fmode); const service = new ParseRestCompetitorSyncService(client, repository, gateway); const result = await service.sync({ workspaceId, platform: 'jd', concurrency, refresh, onProgress(progress) { console.log(`[competitor-sync] ${progress.completed}/${progress.total} ${progress.productId} ${progress.status}`); }, }); await repository.appendAudit({ workspaceId, actorUserId: 'system:competitor-sync', action: 'competitor.sync.completed', entityType: 'product', entityId: null, metadata: { ...result }, }); console.log(JSON.stringify(result, null, 2));