furniture-3d-system-Wu/furniture-3d-system/scripts/sync-jst-sku-stock-products.ts
2026-05-19 11:33:01 +08:00

108 lines
2.3 KiB
TypeScript

import 'dotenv/config'
import { prisma } from '../src/lib/prisma'
import { syncJstSkuStockProducts } from '../src/server/services/jst-sku-stock-sync.service'
type CliOptions = {
apply: boolean
batchSize?: number
limit?: number
help: boolean
}
function readNumberArg(value: string | undefined, name: string) {
if (!value) return undefined
const parsed = Number(value)
if (!Number.isFinite(parsed) || parsed <= 0) {
throw new Error(`${name} must be a positive number`)
}
return Math.floor(parsed)
}
function parseArgs(argv: string[]): CliOptions {
const options: CliOptions = {
apply: false,
help: false,
}
argv.forEach((arg) => {
if (arg === '--apply') {
options.apply = true
return
}
if (arg === '--dry-run') {
options.apply = false
return
}
if (arg === '--help' || arg === '-h') {
options.help = true
return
}
if (arg.startsWith('--batch-size=')) {
options.batchSize = readNumberArg(arg.split('=')[1], '--batch-size')
return
}
if (arg.startsWith('--limit=')) {
options.limit = readNumberArg(arg.split('=')[1], '--limit')
return
}
throw new Error(`Unknown argument: ${arg}`)
})
return options
}
function printHelp() {
console.log(`
Usage:
npm run sync:jst-sku-stock -- [--dry-run] [--apply] [--limit=100] [--batch-size=500]
Default mode is --dry-run. Use --apply only when you want to write changes.
Required environment variables:
DATABASE_URL
JST_SKU_DB_HOST
JST_SKU_DB_PORT
JST_SKU_DB_NAME
JST_SKU_DB_USER
JST_SKU_DB_PASSWORD
Optional environment variables:
JST_SKU_DB_CHARSET=utf8mb4
JST_SKU_DB_SSL=false
JST_SKU_SYNC_USER_ID=jst_sku_sync
Supported alternative:
JST_SKU_DATABASE_URL=mysql://user:password@host:port/database
`.trim())
}
async function main() {
const options = parseArgs(process.argv.slice(2))
if (options.help) {
printHelp()
return
}
const result = await syncJstSkuStockProducts({
apply: options.apply,
batchSize: options.batchSize,
limit: options.limit,
})
console.log(JSON.stringify(result, null, 2))
}
main().catch((error) => {
console.error(error instanceof Error ? error.message : String(error))
process.exitCode = 1
}).finally(async () => {
await prisma.$disconnect()
})