İçeriğe atla
ÖzelliklerFiyatlandırmaİş OrtaklığıBlogYardımHakkımızdaİletişim
BaşlaGiriş Yap
Bloga Dön
industry2026-05-2412 dk okuma

Aynı müşteri iki loyalty row aldı — telefon normalize route'larda drift etti (PR #661 XI F1)

Mersin Forum da 35 yaslarinda Sakura Sushi Bar sahibi Tugce, 4 ay loyalty programi calistirdi: "10 siparis = 1 ucretsiz uramaki." Sadik musteri Aysu 12. uramaki icin geldi; Tugce loyalty dashboard duplicate-customers warning kirmiziydi. Aysu icin 3 ayri loyalty_members satiri vardi: ayni isim, ayni email, FARKLI 3 phone hash. Forensik: PR #544 OO promo+orders canonical helper a route etmisti ama loyalty + waitlist + reservations endpoint leri hala inline regex (body.phone?.replace(/[s-().]/g, "")) kullaniyordu. Canonical helper apps/web-menu/src/lib/phone-hash.ts:normalisePhone: NFKD normalize + ZWS/bidi strip + tum whitespace + parens/dash/dot + "00" prefix to "+" + "+" pad + format validate. Inline regex bidi marker handle etmiyor, NFKD yapmiyor, "00" prefix convert etmiyor, "+" pad etmiyor, format validate etmiyor. Aysu 14 Mart loyalty +90 532 123 45 67 (hash A); 27 Mart rezervasyon 0090 532 123 45 67 (inline regex 0090 prefix kaldirmaz, hash B); 8 Nisan waitlist +90(532)1234567 (parens stripped, hash A); 15 Nisan loyalty yeni telefon +90-532-123-4567 (hash A); 22 Nisan rezervasyon farkli boslukla (hash A); ama Aysu 5+ farkli format kullanmis 3 hash uretmis. customer_profiles 3 row, loyalty_members 3 row, audit shrouded duplication. Per-customer cap bypass abuse vector: malicious customer farkli format larla cap bypass eder ("max 1 promo/customer/gun" inline regex tarafindan dogru enforce edilmez). **PR #661 batch XI F1** fix: 3 endpoint i canonical helper a route et. import { normalisePhone, hashPhone } + const phone = normalisePhone(body.phone); if (!phone) return invalid_phone(); const phoneHash = await hashPhone(phone). 30 LOC + 3 inline regex deletion + one-off backfill SQL 847 customer profile platform-wide merged. Bonus TODO: phone-hash.ti packages/shared-types e tasi (web-admin tarafinda drift bir kez daha acilmasin). Pattern: shared field icin canonical helper sahibi olmak yetmez — PR ALL call sites route etmeli ayni anda; sonra her yeni helper change otomatik propagate eder. Operational checklist: (1) inline regex/replace yazmadan once helper var mi kontrol; (2) helper yarat + ALL call sites ayni PR da route et; (3) yeni route eklenince linter helper import zorunlu; (4) quarterly grep audit; (5) helper change inde unit-test diff geni? lock down. Sakura Sushi Tugce Aysu ya WhatsApp: "Sistemde 3 ayri kayit ti, telefonu farkli yazdigin icin. Toplam 22 puan = 2 ucretsiz uramaki. Bu hafta sonu bedava." Aysu: "Aaa hahaha, sagol Tugce abla." Pattern referansi: PR #661.

th

thMenu Ekibi

thmenu.com

Faydalı buldunuz mu? Paylaşın.