108 lines
2.3 KiB
TypeScript
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()
|
|
})
|