# SECA Mark1 Teknik Aksiyon Planı

Son inceleme: 5 Ağustos 2026  
İncelenen commit: `752db6e`  
Kapsam: API, müşteri sitesi, yönetim paneli, sunucudan çekilen statik dosyalar

## Öncelik sırası

Çalışmalar aşağıdaki sırayla yapılmalıdır:

1. Açığa çıkmış SMTP bilgisini değiştir ve koddan kaldır.
2. Kullanıcı/parola verisi sızıntısını ve yetkilendirme açıklarını kapat.
3. Public ürün sorgularındaki görünürlük ve soft-delete hatalarını düzelt.
4. Kesin çalışma zamanı hatalarını gider.
5. Dosya yükleme/silme sistemini güvenli hale getir.
6. MongoDB sorgularını ve dashboard paketini optimize et.
7. Test, lint ve type-check altyapısını kur.
8. Sunucudan gelen statik dosyaları temizle ve yayın akışına bağla.

---

## P0 — Acil güvenlik işleri

### SMTP erişim bilgisini değiştir

- [ ] Kaynak kodda açık bulunan SMTP parolasını servis sağlayıcı tarafında hemen değiştir.
- [ ] `api/src/controller/ClientController.js` içindeki sabit SMTP kullanıcı/parola tanımlarını kaldır.
- [ ] `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASS`, `SMTP_FROM` ve `SMTP_TO` değişkenlerini yalnızca `api/.env` üzerinden kullan.
- [ ] Tek bir Nodemailer transporter oluşturup tekrar kullan.
- [ ] Parolanın eski commit geçmişinde de bulunduğunu kabul ederek eski parolayı tamamen geçersiz kıl.

Kabul kriteri: Kaynak kodda SMTP parolası bulunmamalı ve iletişim, kariyer ve teklif e-postaları yeni ortam değişkenleriyle gönderilebilmelidir.

### Kullanıcı parola verisinin API'den çıkmasını engelle

- [ ] `UserModel.password` alanını varsayılan olarak `select: false` yap.
- [ ] Kullanıcı listeleme, profil güncelleme ve diğer kullanıcı cevaplarında parola alanını açıkça hariç tut.
- [ ] `GET /v1/users` cevabında parola hash'i bulunmadığını test et.
- [ ] `PUT /v1/users/:id` cevabında parola hash'i bulunmadığını test et.

İlgili dosyalar:

- `api/src/Models/UserModel.js`
- `api/src/controller/user.js`
- `api/src/routes/user.js`

### Yetkilendirme ve sahiplik kontrolü ekle

- [ ] Kullanıcı listeleme ve kullanıcı oluşturma işlemlerini yalnızca yetkili yönetici rolüne aç.
- [ ] Profil güncelleme ve şifre değiştirmede `req.user._id` ile URL'deki kullanıcı ID'sini karşılaştır.
- [ ] Başka bir kullanıcının ID'siyle profil/şifre değiştirmenin `403` döndürdüğünü test et.
- [ ] `active` olmayan kullanıcıların giriş yapmasını engelle.
- [ ] Rol modeli ve middleware yapısını CommonJS/ESM açısından tek biçime getir.

### Kalıcı XSS riskini kapat

- [ ] Dashboard'dan kaydedilen HTML içeriğini sunucuda allowlist tabanlı sanitize et.
- [ ] Ürün, blog, referans ve filtre içeriklerini render etmeden önce güvenilir sanitizasyon uygula.
- [ ] Script, event handler, `javascript:` URL ve tehlikeli iframe girdileri için test ekle.

---

## P1 — Kesin çalışma zamanı ve veri doğruluğu hataları

### Public ürün görünürlüğünü düzelt

- [ ] `ClientController.getProducts` aggregate sorgularına `status: true` ve `deleted: { $ne: true }` ekle.
- [ ] Arama ve filtre aggregate sorgularına aynı görünürlük şartlarını ekle.
- [ ] `singleProduct` içinde `findById({ _id, status })` yerine `findOne({ _id, status: true })` kullan.
- [ ] Pasif ve soft-delete edilmiş ürünlerin public API'de dönmediğini test et.
- [ ] Aggregate sonuçlarına kararlı bir sıralama ekle; sayfalar arasında tekrar/kayıp oluşmasını engelle.

İlgili dosyalar:

- `api/src/controller/ClientController.js`
- `api/src/Models/ProductModel.js`

### Ürün fallback hatasını düzelt

- [ ] Yeniden atanacak `totalCount` ve `products` değişkenlerini `const` yerine uygun şekilde tanımla.
- [ ] Alternatif sorgudaki yanlış koleksiyon adı (`brands` / `markalars`) kullanımını birleştir.
- [ ] Sonuç bulunmayan kategori için endpoint'in 500 yerine geçerli boş sonuç döndürdüğünü test et.

### `/products` sayfasının ilk yüklenmesini düzelt

- [ ] Query parametresi olmasa da ürün isteğini çalıştır.
- [ ] Varsayılan `page=1` davranışını açıkça uygula.
- [ ] `result === null` durumunda boş dizi ve kullanıcıya hata durumu göster.

İlgili dosya: `client/src/app/(shop)/products/page.tsx`

### Filtre temizleme davranışını düzelt

- [ ] Son seçili filtre kaldırıldığında parent state'e `{}` gönder.
- [ ] Filtre anahtarlarında yalnızca `_id/slug_id` kullan; `name` ve `_id` karışıklığını kaldır.
- [ ] Loading durumunu debounce tamamlanmadan kapatma.
- [ ] Filtreyi seçme, kaldırma ve tümünü temizleme testleri ekle.

İlgili dosya: `client/src/components/Shop/Filitre.tsx`

### Şifre değiştirme akışını düzelt

- [ ] Frontend, validator ve controller için tek alan adı seç: `oldPassword` veya `currentPassword`.
- [ ] Controller'da yalnızca oturum açmış kullanıcının ID'sini kullan.
- [ ] Başarılı değişiklikten sonra kullanıcının refresh token kayıtlarını geçersiz kıl.
- [ ] Eski parola yanlış, yeni parola geçersiz ve başarılı değişiklik senaryolarını test et.

İlgili dosyalar:

- `dashboard/src/pages/Profile.tsx`
- `dashboard/src/services/user/userSevice.ts`
- `api/src/validator/validator.js`
- `api/src/controller/user.js`

### Login sonrası kullanıcı modelini tutarlı hale getir

- [ ] Login cevabında `id` yerine `_id` döndür veya AuthContext içinde normalize et.
- [ ] Login sonrasında sayfa yenilemeden profil ekranının açıldığını test et.

### Diğer doğrulanmış hatalar

- [ ] E-bülten controller'ındaki `catch (err)` / `next(error)` değişken hatasını düzelt.
- [ ] Referans güncellemesindeki `contet` yazım hatasını `content` olarak düzelt.
- [ ] Kullanılmayan ve API'de karşılığı olmayan `/products/getfiltered` client metodunu kaldır veya endpoint'i tanımla.
- [ ] Servis katmanlarında hatayı veri gibi `return error` ile döndürme; React Query'nin `onError` yoluna düşmesi için hatayı fırlat.
- [ ] Client sepetini okurken bozuk `localStorage` JSON'u için güvenli parse/fallback ekle.

---

## P1 — Dosya yükleme ve silme sistemi

- [ ] `deleteFile` için tek ve açık bir fonksiyon sözleşmesi belirle.
- [ ] `deleteFile("folder/", filename)` şeklindeki hatalı iki parametreli çağrıları düzelt.
- [ ] Silinecek yolu `path.resolve` ile oluştur ve yalnızca upload dizini altında olduğundan emin ol.
- [ ] Marka, kategori, slider, blog, katalog, referans, araç ve ürün yüklemelerine dosya boyutu sınırı koy.
- [ ] Uzantı ve MIME türünü birlikte allowlist ile doğrula.
- [ ] Dosya adlarını güvenli şekilde üret.
- [ ] Yeni dosya kaydedilip veritabanı işlemi başarısız olursa dosyanın temizlendiğini test et.
- [ ] Güncellemede eski dosyanın doğru silindiğini test et.
- [ ] Senkron `existsSync`, `unlinkSync` ve `mkdirSync` çağrılarını istek yolunda asenkron karşılıklarıyla değiştir.

İlgili dosyalar:

- `api/helpers/fn.js`
- `api/src/controller/brand.js`
- `api/src/controller/categories.js`
- `api/src/controller/blog.js`
- `api/src/controller/katalog.js`
- `api/src/controller/referanslar.js`
- `api/src/controller/slider.js`
- `api/src/controller/muhendislik.js`
- `api/src/controller/products.js`

---

## P2 — API ve MongoDB performansı

### İndeksler

- [ ] Gerçek sorgu planlarını `explain("executionStats")` ile ölç.
- [ ] Product için kullanım durumuna göre bileşik indeksler ekle: `status + parent`, `status + categories`, `status + brand`.
- [ ] Category için `status + parent` ve gerekiyorsa `brand + parent` indekslerini değerlendir.
- [ ] FilterSettings için `categories`, `visible` ve `slug_id` sorgularını indeksle.
- [ ] Blog ve marka public sorgularındaki `status + slug` erişimini doğrula.
- [ ] İndeksleri eklemeden önce mevcut duplicate/veri uyumsuzluklarını kontrol et.

### Regex ve arama

- [ ] Kullanıcı girdisini regex'e vermeden önce escape et.
- [ ] Maksimum arama metni uzunluğu belirle.
- [ ] Büyük veri hacminde MongoDB text index veya Atlas Search değerlendir.
- [ ] Boş arama sorgusunun tüm ürün koleksiyonunu taramasını engelle.

### Sorgu sayısı ve gecikme

- [ ] Liste ve `countDocuments` sorgularını güvenli yerlerde `Promise.all` ile paralel çalıştır.
- [ ] Public kategori sorgularında `populate('children')` için gerekli alanları `select` ile sınırla.
- [ ] Salt-okuma sorgularında tutarlı biçimde `.lean()` kullan.
- [ ] Kategori birleştirme işleminde tek tek `save()` yerine `bulkWrite` kullan.
- [ ] Kategori birleştirme işlemini MongoDB transaction içine al.
- [ ] Her JWT isteğinde yapılan kullanıcı + blacklist sorgularını ölç; gerekirse kısa süreli cache veya `jti` tabanlı iptal yaklaşımı değerlendir.

---

## P2 — Client performansı ve SEO

- [ ] `generateMetadata` ile sayfa render'ının aynı API kaydını iki kez çekmesini engelle; `cache()` veya ortak fetch fonksiyonu kullan.
- [ ] Ana sayfa marka ve ürün verilerini mümkünse server component'te paralel çekip child bileşenlere prop olarak geçir.
- [ ] Ham `<img>` kullanılan kritik görselleri uygun yerlerde `next/image` ile değiştir.
- [ ] Slider ilk görselinin gerçek LCP etkisini ölç; boyutlandırma ve modern format uygula.
- [ ] App Router sayfalarında eski `next/head` tabanlı `Metadata` bileşenini kaldır; `metadata`/`generateMetadata` API'sini kullan.
- [ ] Axios ile yapılan server çağrıları için cache/revalidate politikasını açıkça belirle.
- [ ] `/favorites` paketinin 235 KB First Load JS olmasının nedenini bundle analyzer ile incele.

---

## P2 — Dashboard performansı

- [ ] `App.tsx` sayfa importlarını `React.lazy` ve `Suspense` ile route bazında böl.
- [ ] Quill, SunEditor, ApexCharts, CraftJS ve diğer ağır paketleri yalnızca kullanılan sayfalarda dinamik yükle.
- [ ] Ana JavaScript paketini mevcut 1.234 MB seviyesinden düşür.
- [ ] Arama kutularına 300–500 ms debounce ekle.
- [ ] React Query için uygun global `staleTime`, `retry` ve `refetchOnWindowFocus` ayarlarını belirle.
- [ ] Marka ve kategori gibi nadiren değişen lookup verilerine daha uzun `staleTime` ver.
- [ ] Satoshi fontlarında yalnızca WOFF2 ve gerçekten kullanılan ağırlıkları paketle.
- [ ] Build sırasında çözümlenemeyen `icon-calendar.svg` ve `icon-arrow-down.svg` yollarını düzelt.
- [ ] Görsel tablolarında lazy loading ve boyut bilgisi ekle.

Başlangıç ölçümü:

- Dashboard JS: yaklaşık 1.234 MB, gzip 346 KB
- Dashboard CSS: yaklaşık 148 KB, gzip 26 KB

---

## P2 — Sunucudan gelen yeni dosyalar

- [ ] `.ftpquota` dosyalarını Git'ten çıkar ve `.gitignore` içine ekle.
- [ ] `dashboard/test1.html` dosyasının gerekli olup olmadığına karar ver; kullanılmıyorsa kaldır.
- [ ] `client/public/cableselection.html` ve `client/public/ms2nselection.html` araçlarını mühendislik araçları sayfasına bağla.
- [ ] Araç sayfalarına açıklayıcı başlık, canonical ve gerektiğinde `noindex` kararı ekle.
- [ ] `ms2nselection.html` içindeki yaklaşık 554 KB'lık base64 logoyu harici optimize görselle değiştir.
- [ ] E-posta imza görsellerinin gerçekten dış URL ile kullanıldığını doğrula; kullanılmayanları kaldır.
- [ ] `.htaccess` dosyasının sunucuda doğru DocumentRoot altında çalıştığını doğrula.
- [ ] Deploy sırasında `dashboard/dist` üretildiğini garanti et; bu klasör Git'te bulunmuyor.
- [ ] Apache üzerinde Brotli/Gzip, uzun süreli statik cache, MIME ve temel güvenlik başlıklarını yapılandır.
- [ ] PHP kullanılmıyorsa `.php`, `.php8` ve `.phtml` handler ihtiyacını tekrar değerlendir.

---

## P2 — Kalite kapıları ve dokümantasyon

- [ ] Client için ESLint CLI ve Next.js ESLint eklentisini yapılandır.
- [ ] Dashboard'a `typescript` bağımlılığı ve `typecheck` script'i ekle.
- [ ] Dashboard build öncesinde `npm run typecheck` çalıştır.
- [ ] API için ESLint yapılandırması ekle.
- [ ] API için Vitest/Jest + Supertest test altyapısı kur.
- [ ] CI sırasını `install -> lint -> typecheck -> test -> build` olarak oluştur.
- [ ] Gereksiz kök `package-lock.json` dosyasını kaldır veya gerçek workspace yapısına dönüştür.
- [ ] Next.js `outputFileTracingRoot` uyarısını gider.
- [ ] Kök `README.md` dosyasını gerçek kurulum, ortam değişkenleri, portlar ve deploy adımlarıyla yenile.
- [ ] `.env.example` dosyalarını gizli değer içermeden oluştur.

---

## Önerilen uygulama fazları

### Faz 1 — Güvenlik ve kritik hatalar

- SMTP rotasyonu
- Parola alanı sızıntısı
- Yetkilendirme/sahiplik
- Public ürün görünürlüğü
- Şifre değiştirme
- İlk ürün listeleme ve filtre temizleme

### Faz 2 — Dosya sistemi ve veri güvenliği

- Upload sınırları
- Güvenli dosya silme
- Kategori birleştirme transaction/bulk işlemleri
- HTML sanitizasyonu

### Faz 3 — Performans

- MongoDB indeksleri ve query planları
- Dashboard code splitting
- Next.js veri isteği deduplication
- Görsel/font optimizasyonu

### Faz 4 — Kalite ve deploy

- Lint, type-check ve testler
- CI
- README ve `.env.example`
- `.htaccess`, statik araç ve hosting temizliği

## Her faz sonunda doğrulama

- [ ] `client`: lint, type-check ve production build başarılı.
- [ ] `dashboard`: lint, type-check ve production build başarılı.
- [ ] `api`: lint ve otomatik testler başarılı.
- [ ] Public API pasif/silinmiş kayıt döndürmüyor.
- [ ] API cevaplarında parola veya gizli bilgi bulunmuyor.
- [ ] Başka kullanıcı ID'siyle işlem denemeleri `403` döndürüyor.
- [ ] İletişim, kariyer ve teklif e-postaları çalışıyor.
- [ ] Upload/güncelleme/silme sonrasında yetim dosya oluşmuyor.
- [ ] Ana sayfa, ürün, kategori, arama, profil ve dashboard smoke testleri geçiyor.
- [ ] Git çalışma ağacı yalnızca amaçlanan değişiklikleri içeriyor.

