Semih Yesilyurt 41147f3f05
Some checks are pending
QA Gate (P0/P1) / Test affected app (pull_request) Waiting to run
fix(pl24): kendi bütçe frenimiz "hesap banlandı" alarmı üretmesin
Prod 2026-09-21 19:10 (İstanbul) itibarıyla Telegram "🔴 PL24 giriş
yapılamıyor — hesap banlanmış olabilir" dedi. Hesap sağlamdı:
kullanıcı tarayıcıdan giriş yapabildi, aynı gün 143 başarılı auth
çağrısı ve **0 × 401** vardı. Gerçek sebep alarmın kendi metninde:
"PL24 daily HTTP budget exhausted (user lane: 1205/1200)" — yani
upstream değil, BİZİM günlük tavanımız.

Zincir: `attemptLogin` içindeki `budget.consume()` fırlatıyor → dış
`catch` bunu `{ error }` olarak düzleştiriyor → `loginWithLock`
`!result.sessionToken` dalına giriyor → `breakerFail()` + kesinti
sayacı → bir saat sonra ban alarmı. Yani kendi frenimiz hem devre
kesiciyi tetikliyor hem de operatörü yanlış yere çağırıyor.

- `PL24BudgetExceededError` artık `attemptLogin` ve
  `authorizeServiceForAccount` içinde olduğu gibi yukarı çıkıyor;
  giriş/yetkilendirme hatasına çevrilmiyor. Devre kesici tetiklenmiyor,
  kesinti sayacı başlamıyor, Telegram susuyor. Çağıran taraf PL24'ü
  atlayıp pcat/emex'e düşüyor — bugün de öyle oluyordu, ama artık
  sessizce ve doğru gerekçeyle.
- Şerit bazlı sayaç eklendi: `pl24:http:<gün>:{user,worker}`. Paylaşılan
  toplam tavanın NE ZAMAN dolduğunu söylüyordu ama KİMİN harcadığını
  söylemiyordu; tavanı veriyle boyutlandırmak için bu şart. Bugün
  toplam 1200'e vurdu ve 16:10 UTC'den sonra her kullanıcı decode'u
  reddedildi, ama ne kadarının ısıtma prefetch'i ne kadarının ekran
  başında bekleyen biri olduğu `proxy_logs`'tan çıkarılamıyordu.

5 yeni test. api 650 test geçiyor.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 20:52:52 +03:00
2026-02-12 00:26:34 +00:00

Sase

VIN/şase numarası sorgulama ve otomotiv yedek parça katalog platformu (Türkiye). Site: https://sase.tr · Staging: https://dev.sase.tr


Stack

Katman Teknoloji
Monorepo pnpm 10 + Turborepo
Backend NestJS 10, TypeScript 5.7, Node 22
DB PostgreSQL 17 + Drizzle ORM
Cache / Queue Redis 7 + BullMQ
Auth Better Auth (cookie session)
Frontend Vite 6, React 19, TanStack Router + Query
UI Tailwind v4, shadcn/ui (Radix)
Ödeme Stripe (kart)
Email Postal
Storage MinIO (S3)
Analitik PostHog
Test Vitest, Playwright
Deploy GitHub Actions → SSH → PM2

Yapı

ss/
├── apps/
│   ├── api/                NestJS (port 4000, /api)
│   └── web/                Vite + React (port 3000)
├── packages/
│   ├── shared/             Tipler, Zod şemaları
│   ├── config/             Env şeması (Zod)
│   └── ui/                 Paylaşılan shadcn bileşenleri
├── docker/                 docker-compose + nginx
├── scripts/                Deploy + bakım scriptleri
└── docs/                   Detay dökümantasyon (INDEX.md)

Komutlar

pnpm dev                    # tüm app'ler (Turbo)
pnpm build
pnpm test                   # Vitest
pnpm lint                   # Biome
pnpm typecheck

# DB (apps/api/)
pnpm db:push                # şemayı push
pnpm db:studio              # Drizzle Studio
pnpm db:generate            # migration üret

# Tek app
pnpm dev --filter=api
pnpm dev --filter=web

VIN Decode Akışı

Corgi (offline WMI) → PartsCatalogs API → PL24 API → EMEX scraper → NHTSA

Birden fazla araç eşleşmesi gelirse frontend seçim modalı gösterir.


Katalog Mimarisi

  • PL24 P5 Modern (REST/JSON) — VW Group, BMW, Mercedes, Renault, Toyota...
  • PL24 P4 Legacy (HTML scrape) — Ford, PSA, Hyundai/Kia, Nissan, Opel, Volvo
  • PartsCatalogs (REST + Playwright JWT) — geniş VIN kapsamı
  • EMEX (Playwright scrape, emexdwc.ae) — async BullMQ worker

EMEX & PartsCatalogs Türkçeleştirme

EMEX ve PartsCatalogs kaynakları kategori/parça isimlerini İngilizce (zaman zaman Rusça) döner. Çeviri akışı:

  1. TranslationsService (apps/api/src/translations/) — Redis cache → DB lookup (emex_category_translations) → orijinal döndür. Dictionary tabanlı word-by-word replace devre dışı (yarı-İngilizce çıktı yaratıyordu).
  2. Hot path (categories.service.ts) — EMEX/PCAT insert noktalarında translateMany() ile bulk lookup yapılır; cache miss varsa orijinal yazılır, sonraki bootstrap pass'inde LLM ile çevrilir.
  3. Bootstrap script (scripts/emex-translate-bootstrap.ts) — DB'deki tüm unique name_original değerlerini OpenRouter üzerinden DeepSeek V3 ile çevirir, emex_category_translations tablosuna yazar.
  4. Backfill script (scripts/emex-backfill-tr-names.ts) — translation tablosuna göre mevcut categories.name ve parts.name değerlerini günceller, Redis cache flush eder.
# 1) Tüm yeni terimleri çevir (~$0.50, ~30 dk)
pnpm exec tsx scripts/emex-translate-bootstrap.ts --dry-run
pnpm exec tsx scripts/emex-translate-bootstrap.ts

# 2) DB kayıtlarını güncelle
pnpm exec tsx scripts/emex-backfill-tr-names.ts --dry-run
pnpm exec tsx scripts/emex-backfill-tr-names.ts

# 3) API restart (yeni hot-path translateMany için)
pm2 restart sase-api

Env: OPENROUTER_API_KEY (apps/api/.env).


Test Bilgileri

  • Admin: admin@sase.tr / Sase2026
  • Test VIN (VW): WVWZZZ1JZ3W597935
  • Login: POST /api/auth/sign-in/email → cookie better-auth.session_token

Daha Fazla

  • docs/INDEX.md — kapsamlı proje rehberi (rotalar, API, DB şeması, bileşenler)
  • CLAUDE.md — Claude Code için proje rehberi
Description
sase.tr website
Readme 80 MiB
Languages
TypeScript 75.2%
HTML 19.8%
JavaScript 4%
Shell 0.5%
PLpgSQL 0.2%
Other 0.2%