Skip to content

burakdegirmenci/FeedApp

Repository files navigation

Elle.TicimaxFeed - Meta (Facebook Catalog) XML Feed Generator

Ticimax SOAP servislerinden ürün/varyant verilerini çekerek Meta (Facebook Catalog) uyumlu XML feed üreten, saatlik otomatik güncelleme özellikli, modüler bir .NET 8 uygulamasıdır.

Özellikler

  • Clean Architecture: Domain, Application, Infrastructure ve Presentation (Worker) katmanlarına ayrılmış modüler yapı
  • SOLID Prensipleri: Dependency Inversion, Single Responsibility, Open/Closed principles uygulanmıştır
  • Test Odaklı Geliştirme: xUnit, FluentAssertions ve Moq ile %100 test coverage hedefli unit testler
  • Otomatik Zamanlama: Quartz.NET ile her saat başı otomatik feed güncelleme
  • Meta Feed Desteği: Facebook/Instagram Catalog uyumlu XML feed formatı
  • Stok Yönetimi: Kritik stok seviyesi kontrolü ve politika tabanlı filtreleme
  • Loglama: Serilog ile detaylı console ve file loglama
  • Yapılandırma: Options Pattern ile environment-specific ayarlar

Teknolojiler

  • .NET 8.0
  • Quartz.NET 3.15.0 - Job scheduling
  • Serilog 4.3.0 - Structured logging
  • xUnit 2.5.3 - Unit testing
  • FluentAssertions 8.7.1 - Test assertions
  • Moq 4.20.72 - Mocking framework
  • System.ServiceModel - SOAP client

Proje Yapısı

/src
  /Elle.TicimaxFeed.Domain          # Domain entities, rules, policies, abstractions
  /Elle.TicimaxFeed.Application     # Business logic, services, mappings, jobs
  /Elle.TicimaxFeed.Infrastructure  # External dependencies, SOAP client, feed generator, persistence
  /Elle.TicimaxFeed.Worker          # Background worker service, dependency injection
/tests
  /Elle.TicimaxFeed.Tests           # Unit tests

Domain Layer (src/Elle.TicimaxFeed.Domain)

Domain katmanı hiçbir external dependency içermez ve iş kurallarını barındırır.

Entities:

  • Product: Ana ürün entity'si
  • Variant: Ürün varyantları (renk, beden, vb.)

Rules:

  • IStockRule: Stok kontrolü için iş kuralı interface'i
  • VariantCriticalStockRule: Kritik stok seviyesi kuralı

Policies:

  • StockThresholdPolicy: Stok kurallarını uygulayan policy sınıfı

Abstractions:

  • IProductReader: Ürün verilerini okuma interface'i
  • IFeedGenerator: Feed XML oluşturma interface'i
  • IFeedStore: Feed saklama interface'i
  • IClock: Zaman bağımlılığını soyutlama interface'i

Application Layer (src/Elle.TicimaxFeed.Application)

Application katmanı use case'leri ve orchestration mantığını içerir.

Services:

  • FeedBuilder: Feed oluşturma sürecini koordine eden servis

Jobs:

  • BuildAndPublishFeedJob: Feed oluşturma ve yayınlama job'ı

Mappings:

  • ProductMapping: Ürün verilerini Meta feed formatına dönüştürme

Infrastructure Layer (src/Elle.TicimaxFeed.Infrastructure)

Infrastructure katmanı external sistemlerle entegrasyonları içerir.

Ticimax:

  • SoapProductReader: Ticimax SOAP servisinden ürün okuma

Feed:

  • MetaXmlFeedGenerator: Meta XML feed oluşturma

Persistence:

  • FeedStore: Feed dosyalarını kaydetme ve yönetme

Config:

  • TicimaxOptions: Ticimax SOAP servis ayarları
  • FeedOptions: Feed oluşturma ayarları

Worker Service (src/Elle.TicimaxFeed.Worker)

Background worker servisi, Quartz.NET ile job scheduling.

Quartz:

  • FeedGenerationJob: Quartz job wrapper
  • QuartzConfig: Quartz yapılandırması

Kurulum

Gereksinimler

  • .NET 8.0 SDK
  • Visual Studio 2022 veya VS Code (opsiyonel)

Projeyi Klonlama

git clone <repository-url>
cd UrunFeedXML

Bağımlılıkları Yükleme

dotnet restore Elle.TicimaxFeed.sln

Yapılandırma

src/Elle.TicimaxFeed.Worker/appsettings.json dosyasını düzenleyin:

{
  "Ticimax": {
    "ServiceUrl": "https://www.elleshoes.com/Servis/UrunServis.svc",
    "UyeKodu": "your-uye-kodu",
    "TimeoutSeconds": 30,
    "MaxRetries": 3,
    "RetryDelayMilliseconds": 1000,
    "PageSize": 1000
  },
  "Feed": {
    "OutputPath": "./feeds",
    "BaseUrl": "https://yourstore.com",
    "CriticalStockThreshold": 0,
    "ValidateXml": true,
    "KeepFeedDays": 7,
    "DefaultCurrency": "TRY"
  }
}

Build

dotnet build Elle.TicimaxFeed.sln

Testleri Çalıştırma

dotnet test Elle.TicimaxFeed.sln

Kullanım

Worker Servisini Çalıştırma

cd src/Elle.TicimaxFeed.Worker
dotnet run

Worker servisi başladığında:

  1. Her saat başı otomatik olarak feed oluşturma job'ı çalışır
  2. Ticimax SOAP servisinden ürünler çekilir
  3. Stok kurallarına göre filtrelenir
  4. Meta XML feed oluşturulur
  5. ./feeds klasörüne kaydedilir

Manuel Feed Oluşturma

Eğer hemen feed oluşturmak isterseniz, Program.cs'te cron expression'ı değiştirin:

// Her dakika çalışır (test için)
.WithCronSchedule("0 * * * * ?")

// Her 5 dakikada çalışır
.WithCronSchedule("0 */5 * * * ?")

Feed Çıktısı

Feed dosyaları şu formatta oluşturulur:

  • meta_feed_20250113_120000.xml (timestamp'li)
  • meta_feed_latest.xml (her zaman en son feed)

Ticimax SOAP Entegrasyonu

Ticimax entegrasyonu tam olarak implementedir ve aşağıdaki özellikleri içerir:

Kimlik Doğrulama

Ticimax SOAP servisi her metod çağrısında UyeKodu parametresi ile kimlik doğrulama yapar. Bu kod appsettings.json'da tanımlanır.

Sayfalama (Pagination)

Ticimax'dan ürünler sayfalanarak çekilir:

  • Varsayılan sayfa boyutu: 1000 ürün
  • UrunSayfalama nesnesi ile kontrol edilir
  • Tüm sayfalar tamamlanana kadar otomatik devam eder

Veri Mapping

  • UrunKartiProduct: Ana ürün verisi dönüşümü
  • VaryasyonVariant: Varyant verisi dönüşümü
  • VaryasyonOzellik: Renk, beden, desen, malzeme gibi özellikler otomatik çıkarılır

Filtreleme

  • Sadece aktif ürünler çekilir (Aktif = 1)
  • Türkçe dil desteği (Dil = "tr-TR")
  • Tarih bazlı güncelleme kontrolü desteklenir

Örnek Kullanım

// Tüm aktif ürünleri getir
var products = await _productReader.GetAllProductsAsync(cancellationToken);

// Belirli tarihten sonra güncellenen ürünleri getir
var updatedProducts = await _productReader.GetProductsUpdatedAfterAsync(since, cancellationToken);

// Belirli bir ürünü ID ile getir
var product = await _productReader.GetProductByIdAsync(productId, cancellationToken);

Design Patterns Kullanılan

  • Repository Pattern: IProductReader, IFeedStore
  • Strategy Pattern: IFeedGenerator, IStockRule
  • Factory Pattern: SerilogConfig
  • Adapter Pattern: SoapProductReader, FeedGenerationJob
  • Options Pattern: TicimaxOptions, FeedOptions
  • Dependency Inversion: Tüm interface'ler Domain katmanında
  • Command Pattern: BuildAndPublishFeedJob
  • Facade Pattern: FeedBuilder
  • Specification Pattern: StockThresholdPolicy

SOLID Prensipleri

Single Responsibility Principle (SRP)

Her sınıf tek bir sorumluluğa sahip:

  • Product/Variant: Sadece ürün verisi
  • FeedBuilder: Sadece feed oluşturma orchestration
  • SoapProductReader: Sadece SOAP'tan okuma

Open/Closed Principle (OCP)

Yeni stok kuralları eklemek için IStockRule implement edin:

public class CustomStockRule : IStockRule { ... }

Liskov Substitution Principle (LSP)

Tüm interface implementasyonları birbirleriyle değiştirilebilir.

Interface Segregation Principle (ISP)

Interface'ler spesifik ve küçük tutulmuş.

Dependency Inversion Principle (DIP)

Tüm bağımlılıklar abstraction'lara yapılmış.

Test Coverage

# Tüm testleri çalıştır
dotnet test

# Coverage raporu için (opsiyonel)
dotnet test /p:CollectCoverage=true

Mevcut testler:

  • VariantCriticalStockRuleTests: 7 test
  • FeedBuilderTests: 9 test

Loglar

Loglar şu lokasyonlara yazılır:

  • Console: Realtime log çıktısı
  • File: ./logs/feed-YYYYMMDD.log (30 gün saklanır)

Log seviyeleri:

  • Information: Normal operasyonlar
  • Warning: Uyarılar
  • Error: Hatalar
  • Debug: Detaylı debug bilgisi (sadece Development)

Production Deployment

Windows Service

sc.exe create "Elle.TicimaxFeed" binPath="C:\path\to\Elle.TicimaxFeed.Worker.exe"
sc.exe start "Elle.TicimaxFeed"

Linux Systemd

sudo systemctl enable elle-ticimaxfeed.service
sudo systemctl start elle-ticimaxfeed.service

Docker (İleride Eklenecek)

docker build -t elle-ticimaxfeed .
docker run -d --name feed-worker elle-ticimaxfeed

Geliştiriciler İçin

Yeni Feed Formatı Ekleme

  1. IFeedGenerator interface'ini implement edin
  2. DI container'a kaydedin
  3. Testlerini yazın

Yeni Stok Kuralı Ekleme

  1. IStockRule interface'ini implement edin
  2. Program.cs'te rule'u register edin
  3. Testlerini yazın

Debugging

VS Code launch.json:

{
  "name": ".NET Core Launch (Worker)",
  "type": "coreclr",
  "request": "launch",
  "preLaunchTask": "build",
  "program": "${workspaceFolder}/src/Elle.TicimaxFeed.Worker/bin/Debug/net8.0/Elle.TicimaxFeed.Worker.dll",
  "args": [],
  "cwd": "${workspaceFolder}/src/Elle.TicimaxFeed.Worker",
  "console": "integratedTerminal"
}

Lisans

MIT License - Detaylar için LICENSE dosyasına bakınız.

Katkıda Bulunma

  1. Fork edin
  2. Feature branch oluşturun (git checkout -b feature/amazing-feature)
  3. Commit edin (git commit -m 'Add amazing feature')
  4. Push edin (git push origin feature/amazing-feature)
  5. Pull Request açın

İletişim

Sorularınız için issue açabilirsiniz.


Built with ❤️ using Clean Architecture & SOLID Principles

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages