Emlak Platformu
İlan, ajans yönetimi, abonelik ve moderasyon tek platformda. Dört rol, tek veri modeli.
Bu nasıl ölçüldü: Endpoint sayısı route dekoratörlerinden, modeller Prisma şemasından, test dosyaları *.test.ts/*.spec.ts kalıbından sayıldı.
- CLIENTS
- emlak_webNext.js
- emlak_adminNext.js
- CONTRACT
- packages/sharedtypes + client
- API
- emlak_apiNestJS · 118 endpoints
- DATA
- PostgreSQL25 models
- Prismamigrations
Problem
Emlak ilanı tek bir form değil. İlan sahibi, emlakçı, ajans ve alıcı aynı havuzda, farklı yetkilerle çalışıyor. İlanın yayına girmesi, danışmana atanması, kotadan düşmesi, moderasyondan geçmesi birbirine bağlı.
Müşteri teslimi değil, kendi ürünüm. Kapsamı müşteri talebi belirlemedi; "bunun bakımını iki yıl sonra kim yapacak" sorusu belirledi.
Kısıtlar
- Dört rol, tek veri modeli: ilan sahibi, emlakçı, ajans yöneticisi, süper admin.
- Arayüzde görünen her metin TR/EN; kod içindeki tanımlayıcılar İngilizce.
- Abonelik ve kota kuralları ilan oluşturma akışına bağlı. Sonradan eklenen kontrol her yerde kaçak verir.
Mimari kararlar
Turborepo monorepo, üç uygulama tek sözleşme
emlak_api (NestJS), emlak_web (Next.js), emlak_admin; ortak tipler packages/shared içinde. API'nin alan adları değiştiğinde iki istemci aynı kaynaktan etkileniyor.
Bedeli: Monorepo araç zinciri (turbo, ortak tsconfig) kurulum ve CI maliyeti.
Veri modeli önce: 25 model, ilişki merkezli
İlanın durumu tek bir status alanına sıkıştırılmadı; yayın durumu, abonelik kotası ve moderasyon kararı ayrı ilişkiler. "İlan neden görünmüyor?" sorusu izlenebilir bir zincir oluyor.
Bedeli: Sorgu sayısı artıyor; karşılığında moderasyon geçmişi kaybolmuyor.
Yetki sınırda doğrulanıyor
Her endpoint role göre kapıdan geçiyor; admin paneli ayrı uygulama olduğu için süper admin yüzeyi web istemcisinin içinde taşınmıyor.
Bedeli: Ortak form mantığı iki kez yazılıyor.
Güvenlik iddiaları kodla kanıtlanıyor
Güvenlik dokümanındaki her madde dosya:satır ile işaretli ve uygulandı / kısmi / yok etiketli. Doküman "yapıldı" demiyor, nerede yapıldığını gösteriyor.
Bedeli: Doküman bakımı; karşılığında güvenlik iddiası denetlenebilir.
i18n ilk günden
Tüm kullanıcı metinleri çeviri anahtarından geliyor; TR varsayılan, EN ikinci.
Bedeli: Her metin iki yerde; karşılığında İngilizce sonradan "çeviri projesi" olmuyor.
Kanıt
- API endpoint118
- Prisma modeli25
- Test dosyası56
- TypeScript dosyası521 (api 312 · web 154 · admin 55)
- Doküman12+ mimari/güvenlik/deploy belgesi
Bilinen sınırlar
- Canlı ortam yükü ve gerçek kullanıcı davranışı ölçülmedi. Ürün kendi projem, kullanıcı sayısı iddiası yok.
- Abonelik ödeme sağlayıcısı entegrasyonu ortam bağımlı; test kapsamı sandbox ile sınırlı.
- Kaynak kodu özel repoda; bu yazı mühendislik anlatımıdır.
Ne öğrendim
Moderasyon bir buton değil, geçmiş tutuyor. "İlanı reddet" tek satır. "Neden reddedildi, kim ne zaman karar verdi, itiraz edildi mi" sorusu veri modeline bakıyor. Kararı ilanın üstüne yazmak kolay; bir ay sonra hesap sorulduğunda o alan hiçbir şey anlatmıyor.