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.
- 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
- .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
/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 katmanı hiçbir external dependency içermez ve iş kurallarını barındırır.
Entities:
Product: Ana ürün entity'siVariant: Ürün varyantları (renk, beden, vb.)
Rules:
IStockRule: Stok kontrolü için iş kuralı interface'iVariantCriticalStockRule: Kritik stok seviyesi kuralı
Policies:
StockThresholdPolicy: Stok kurallarını uygulayan policy sınıfı
Abstractions:
IProductReader: Ürün verilerini okuma interface'iIFeedGenerator: Feed XML oluşturma interface'iIFeedStore: Feed saklama interface'iIClock: Zaman bağımlılığını soyutlama interface'i
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 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ı
Background worker servisi, Quartz.NET ile job scheduling.
Quartz:
FeedGenerationJob: Quartz job wrapperQuartzConfig: Quartz yapılandırması
- .NET 8.0 SDK
- Visual Studio 2022 veya VS Code (opsiyonel)
git clone <repository-url>
cd UrunFeedXMLdotnet restore Elle.TicimaxFeed.slnsrc/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"
}
}dotnet build Elle.TicimaxFeed.slndotnet test Elle.TicimaxFeed.slncd src/Elle.TicimaxFeed.Worker
dotnet runWorker servisi başladığında:
- Her saat başı otomatik olarak feed oluşturma job'ı çalışır
- Ticimax SOAP servisinden ürünler çekilir
- Stok kurallarına göre filtrelenir
- Meta XML feed oluşturulur
./feedsklasörüne kaydedilir
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 dosyaları şu formatta oluşturulur:
meta_feed_20250113_120000.xml(timestamp'li)meta_feed_latest.xml(her zaman en son feed)
Ticimax entegrasyonu tam olarak implementedir ve aşağıdaki özellikleri içerir:
Ticimax SOAP servisi her metod çağrısında UyeKodu parametresi ile kimlik doğrulama yapar. Bu kod appsettings.json'da tanımlanır.
Ticimax'dan ürünler sayfalanarak çekilir:
- Varsayılan sayfa boyutu: 1000 ürün
UrunSayfalamanesnesi ile kontrol edilir- Tüm sayfalar tamamlanana kadar otomatik devam eder
UrunKarti→Product: Ana ürün verisi dönüşümüVaryasyon→Variant: Varyant verisi dönüşümüVaryasyonOzellik: Renk, beden, desen, malzeme gibi özellikler otomatik çıkarılır
- Sadece aktif ürünler çekilir (
Aktif = 1) - Türkçe dil desteği (
Dil = "tr-TR") - Tarih bazlı güncelleme kontrolü desteklenir
// 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);- 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
Her sınıf tek bir sorumluluğa sahip:
Product/Variant: Sadece ürün verisiFeedBuilder: Sadece feed oluşturma orchestrationSoapProductReader: Sadece SOAP'tan okuma
Yeni stok kuralları eklemek için IStockRule implement edin:
public class CustomStockRule : IStockRule { ... }Tüm interface implementasyonları birbirleriyle değiştirilebilir.
Interface'ler spesifik ve küçük tutulmuş.
Tüm bağımlılıklar abstraction'lara yapılmış.
# Tüm testleri çalıştır
dotnet test
# Coverage raporu için (opsiyonel)
dotnet test /p:CollectCoverage=trueMevcut testler:
- ✅
VariantCriticalStockRuleTests: 7 test - ✅
FeedBuilderTests: 9 test
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 operasyonlarWarning: UyarılarError: HatalarDebug: Detaylı debug bilgisi (sadece Development)
sc.exe create "Elle.TicimaxFeed" binPath="C:\path\to\Elle.TicimaxFeed.Worker.exe"
sc.exe start "Elle.TicimaxFeed"sudo systemctl enable elle-ticimaxfeed.service
sudo systemctl start elle-ticimaxfeed.servicedocker build -t elle-ticimaxfeed .
docker run -d --name feed-worker elle-ticimaxfeedIFeedGeneratorinterface'ini implement edin- DI container'a kaydedin
- Testlerini yazın
IStockRuleinterface'ini implement edinProgram.cs'te rule'u register edin- Testlerini yazın
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"
}MIT License - Detaylar için LICENSE dosyasına bakınız.
- Fork edin
- Feature branch oluşturun (
git checkout -b feature/amazing-feature) - Commit edin (
git commit -m 'Add amazing feature') - Push edin (
git push origin feature/amazing-feature) - Pull Request açın
Sorularınız için issue açabilirsiniz.
Built with ❤️ using Clean Architecture & SOLID Principles