# 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 ```bash 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. ```bash # 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