feat(rpartstore): Renault/Dacia için RPartStore VIN-decode fallback kaynağı
Some checks are pending
QA Gate (P0/P1) / Test affected app (pull_request) Waiting to run
Some checks are pending
QA Gate (P0/P1) / Test affected app (pull_request) Waiting to run
rpartstore.renault.com (Renault Group bayi portalı) yeni decode kaynağı olarak eklendi. Portal REST değil STOMP 1.2 over WebSocket konuşuyor; login Okta OIE (IDX JSON API + PKCE), tarayıcı gerekmiyor. Sıralama Renault/Dacia için: pcat + PL24 + emex yarışı → rpartstore → (bayrağı açıksa) Vinpin son çare. - integrations/rpartstore: STOMP codec, Okta login, oturum (trace-id ile çok-mesajlı cevap eşleme), istemci (Redis'te 1 saatlik token), Renault/Dacia yönlendirme, RPartStore → PL24 catalog_vehicles model eşleyici (roman rakam, karoseri niteleyici, yanlış-pazar cezası). - rpartstore_decodes tablosu (migration 0037) + rpartstore-decode BullMQ kuyruğu; worker concurrency 1 + 1 iş / 6 s limiter (portal 2 arama / 10 s). - Günlük sert kota RPARTSTORE_DAILY_CAP (varsayılan 10, İstanbul günü): işlemci göndermeden önce Redis INCR ile rezervasyon yapar, aşan VIN'ler `capped` olur ve 24 saat sonra tekrar denenir; API kota doluysa kuyruğa hiç almaz. Kısa vadeli rate-limit cevabında retryAfter kadar bekleyip bir kez tekrar dener. - VehiclesService.tryRpartstoreFallback: Vinpin fallback ile aynı sözleşme (decoding/catalogVehicle cevapları, tek başarısızlık log satırı). - Env: RPARTSTORE_ENABLED/USER/PASS/DAILY_CAP/BROKER_URL/APP_VERSION (compose api+worker). Vinpin koda dokunulmadan pasif kalır (VINPIN_ENABLED). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -76,6 +76,26 @@ export const envSchema = z.object({
|
||||
.transform((v) => v === "true")
|
||||
.default("false"),
|
||||
|
||||
// RPartStore (rpartstore.renault.com) Renault/Dacia VIN-decode fallback — runs
|
||||
// AFTER the pcat/PL24/emex race, before Vinpin. Off by default; the worker
|
||||
// needs the dealer credentials. RPARTSTORE_DAILY_CAP is a hard ceiling on VIN
|
||||
// searches sent per Istanbul day (the portal itself also rate-limits 2/10 s).
|
||||
RPARTSTORE_ENABLED: z
|
||||
.string()
|
||||
.transform((v) => v === "true")
|
||||
.default("false"),
|
||||
RPARTSTORE_USER: z.string().optional(),
|
||||
RPARTSTORE_PASS: z.string().optional(),
|
||||
RPARTSTORE_DAILY_CAP: z.coerce.number().int().min(0).default(10),
|
||||
RPARTSTORE_BROKER_URL: z.preprocess(
|
||||
(v) => (typeof v === "string" && v.trim() === "" ? undefined : v),
|
||||
z.string().url().default("wss://1po-bff.renault-edh.com/ws"),
|
||||
),
|
||||
RPARTSTORE_APP_VERSION: z.preprocess(
|
||||
(v) => (typeof v === "string" && v.trim() === "" ? undefined : v),
|
||||
z.string().default("1.34.0.6"),
|
||||
),
|
||||
|
||||
// Parts-Catalogs (Playwright JWT capture + DataImpulse proxy)
|
||||
PCAT_USE_PROXY: z.string().default("true"),
|
||||
PCAT_PROXY_HOST: z.string().default("gw.dataimpulse.com"),
|
||||
|
||||
Reference in New Issue
Block a user