Skip to content

buraksenyurt/project-lighthouse-social

Repository files navigation

project-lighthouse-social

C# ile uçtan uca bir Web projesi geliştirilmesi. Konu, dünya üzerindeki deniz fenerlerine ait fotoğrafların paylaşıldığı, yorumlandığı ve puanlandığı bir sosyal platform. (Proje ilerleyişi Youtube kanalından da takip edebilirsiniz) Projede mümkün mertebe yazılım dünyasının efsane konularına olan ihtiyaçları ortaya koymaya çalışmak ilk amaçlarımdan birisidir. Örneğin, hiçbir mimari kalıba uymadan sadece belli prensipleri (soyutlamalar, bağımlılıkları tersine çevirme, sorumlulukları dağıtma vs gibi) baz alarak bir proje iskeleti oluşturup, sonrasında sorularla yaklaşımın doğruluğunu değerlendirmek, açık noktaları tespit etmek ve standartlaşmış bir mimari kalıba çevirmek gibi.


Güncel Görev Listesi (10.18.2025 itibariyle)

Domain Katmanı İyileştirmeleri

  • EntityBase - Audit Alanları: EntityBase sınıfına CreatedAt, ModifiedAt, DeletedAt gibi audit alanları eklenebilir. (EntityBase.cs:6)

Application Katmanı İyileştirmeleri

  • AddCommentHandler - Bileşen Yapılandırması: İhtiyaç duyulan bileşenlerin daha temiz bir şekilde yapılandırılması gerekiyor. (AddCommentHandler.cs:22)

  • CreateLighthouseHandler - User ID Yönetimi: Gerçek bir uygulamada kullanıcı ID'si authentication context'ten alınmalı. Şu an Guid.Empty kullanılıyor. (CreateLighthouseHandler.cs:29, 47, 65, 87)

  • CreateUserHandler - User ID Yönetimi: Gerçek bir uygulamada kullanıcı ID'si authentication context'ten alınmalı. Şu an Guid.Empty kullanılıyor. (CreateUserHandler.cs:25, 41, 58, 76)

  • LighthouseDtoValidator - Primary Key Tasarımı: Tablodaki Primary Key tasarımı gözden geçirilmeli. (LighthouseDtoValidator.cs:17)

Data Katmanı İyileştirmeleri

  • PhotoRepository - Reflection ile ID Atama: PhotoRepository.MapPhoto metodunda reflection kullanarak ID ataması yapılıyor. Bu yaklaşım terk edilmeli, daha temiz bir çözüm bulunmalı. (PhotoRepository.cs:151)

  • CachedCountryDataReader - Mapper Kullanımı: Country ve CountryDto arasında mapper kullanımı değerlendirilmeli. (CachedCountryDataReader.cs:74)

Infrastructure Katmanı İyileştirmeleri

  • ExternalCommentAuditor - Runtime Service Discovery: Servis adresi runtime'da bulunmalı, hardcoded olmamalı. (ExternalCommentAuditor.cs:15)

  • ExternalCommentAuditor - HashiCorp Consul Entegrasyonu: HashiCorp Consul ile Service Discovery mekanizması kurulabilir. (ExternalCommentAuditor.cs:16)

  • CachedConfigurationService - Cache Invalidation: Cache Invalidation fonksiyonları düzenlenebilir ve iyileştirilebilir. (CachedConfigurationService.cs:242)

Backoffice Geliştirmeleri

  • Lighthouse Create - Unknown Alanlar: Deniz feneri oluştururken fotoğraf yükleme sırasında "Unknown" olarak işaretlenen alanlar (CameraType, Resolution, Lens, UserId) gerçek verilerle doldurulmalı. (Create.cshtml.cs:114)

  • Lighthouse Delete - Photo İlişkisi: Deniz feneri silinirken o deniz fenerine ait ana (primary) fotoğrafın ID'si bulunmalı ve silinmeli. Şu an lighthouse ID ile photo ID aynı varsayılıyor. (List.cshtml.cs:70)

  • Photo Deletion Error Handling: Deniz feneri silme işlemi başarılı olup fotoğraf silme başarısız olduğunda kullanıcıya bilgi verilmesi ve ne yapılacağına karar verilmesi gerekiyor. (List.cshtml.cs:75)

Photo Management İyileştirmeleri

  • IsPrimary İş Kuralı: Bir deniz fenerinin birden fazla fotoğrafı olabilir ancak sadece bir tanesi primary olabilir. Bu iş kuralının implementasyonu için geliştirme gerekiyor.

  • Photo Validation: Bir lighthouse için birden fazla primary fotoğraf olmaması için validation katmanında kontrol mekanizması eklenebilir.

  • Backoffice Photo Gallery: Deniz fenerlerinin tüm fotoğraflarını görüntüleme ve primary fotoğrafı değiştirme özelliği eklenebilir.

Worker Service Geliştirmeleri

  • Event Handler - Switch Case Yapısı: RabbitMqEventConsumerService.ProcessEventAsync metodunda farklı event tiplerini switch case ile yönetme yerine daha esnek bir yapı kurulmalı. (RabbitMqEventConsumerService.cs:122)

  • PhotoUploadedEventHandler - İş Mantığı Eksikliği: PhotoUploadedEventHandler.HandleAsync metodunda gerçek iş mantığı implementasyonu yapılmalı. Şu anda sadece loglama yapılıyor. (PhotoUploadedEventHandler.cs:23)


Proje Konusu

Deniz Feneri meraklıları için bir sosyal paylaşım platformu geliştirmek.

Projenin Genel Özellikleri

  • Platform kullanıcıları çektikleri deniz feneri fotoğraflarını paylaşabilirler.
  • Kullanıcılar dünyanın dört bir yanında yer alan deniz fenerleri hakkında kapsamlı ve detaylı bilgileri öğrenebilirler.
  • Kullanıcılar deniz feneri fotoğraflarına yorum bırakabilir ve puanlayabilirler.

Amaçlar

Bu projeyi geliştirmenin temel amaçları aşağıda listelenmiştir.

  • C# ve .Net platformunu örnek bir proje geliştirerek tanımak.
  • Düzenli olarak refactoring uygulayıp kodu iyileştirmeye çalışmak.
  • AI Asistanlarından yararlanmak (minimum ölçüde)
  • Temel yazılım prensiplerini keşfetmek, uygulamak ve sorgulamak.
  • Yazılım mimarilerinin ihtiyaçlarını fark etmeye çalışıp, tartışmak, uygulamak.

Bu Çalışma Kimlere Göre

Minimum Profil;

  • Temel seviyede C# ile programlama bilgisine sahiptir.
  • Temel seviyede Nesne Yönelimli Programlama (Object Oriented Programming) bilgisi vardır.
  • Temiz kod kavramı ve standartları hakkında farkındalık sahibidir.
  • Doğrudan uygulamak yerine, sorgular, araştırır, ikna olur ve sonra uygular.

İdeal Profil;

  • SOLID prensiplerini sorgular.
  • Teknik Borç ile mücadele yöntemleri hakkında fikir sahibidir.
  • Yazılım mimarilerine meraklıdır.
  • Kendi sistemlerinde docker kullanır.
  • Web Api dışında farklı servis geliştirme standartları olduğunu bilir.
  • Dağıtık sistemlerin zorluklarına aşinadır.
  • Doğrudan uygulamak yerine, sorgular, araştırır, ikna olur ve sonra uygular.

Zorluklar (Challenges)

  • Kullanıcıların paylaştığı fotoğrafları nasıl ve nerede tutacağız? (Boyut, depolama yeri, yazma/okuma hızları, dağıtık topoloji kullanımları)
  • Kullanıcı yorumlarının denetlenmesi ve istenmeyen ifadelerin engellenmesi nasıl sağlanır?
  • Bir fotoğrafın doğru deniz fenerine ait olduğu nasıl tespit edilir?
  • Fotoğraflardaki özgünlüğü anlamak için kategorilendirme veya tag'leme aşamasında AI araçlarından nasıl yararlanılır?
  • Çok sayıda kullanıcının farklı lokasyonlardan fotoğraf yüklemesi halinde fotoğrafın analizi, doğrulanması, sınıflandırılması gibi hizmetlerin sistemin genelini etkilemeden en hızlı şekilde yapılması nasıl sağlanır?
  • Çözüme dahil olan harici servislerin oluşturacağı dağıtık sistemde kaotik durumların önüne nasıl geçilir, sistemin dayanıklılığı nasıl sağlanır?

İçerik Planı

Sonarqube

Teknik borçlanmanın önüne geçmek için statik kod analiz aracı olarak Sonarqube kullanılmaktadır. Local ortamda docker-compose ile ayağa kaldırılan üründe tarama başlatmak için aşağıdaki hazırlıkları yapmak yeterlidir.

# Dotnet için gerekli tarama aracının yüklenmesi
dotnet tool install --global dotnet-sonarscanner

# Solution klasöründe ise aşağıdaki komutların çalıştırılması yeterlidir.
# Elbette token bilgisi sizin kurulumunuza göre değişiklik gösterecektir.
dotnet sonarscanner begin /k:"Project-Ligthouse-Social" /d:sonar.host.url="http://localhost:9000"  /d:sonar.token="sizin_için_üretilen_token"

dotnet build

dotnet sonarscanner end /d:sonar.token="sizin_için_üretilen_token"

Belirli periyotlarda Sonarqube taraması yaparak projenin kod kalite uyumluluğu ölçümlenebilir. Ölçmekte fayda vardır.

JudgeDredd Servisi için Dockerize İşlemleri

# docker-compose dosyasında JudgeDredd klasörü için servis bildirimi yapılır.
# Sonrasında docker-compose dosyasının olduğu klasörde build işlemi başlatılır.
docker-compose build

# Ardından hizmetler ayağa kaldırılır.
docker compose up -d

# Testler için 5005 portundan hizmet veren JudjeDredd servisine talepler gönderilebilir

Güncel Vault Bilgileri

Path : ProjectLighthouseSocial-Dev

{
  "DbConnStr": "Host=localhost;Port=5432;Database=lighthousedb;Username=johndoe;Password=somew0rds",
  "KeycloakAudience": "account",
  "KeycloakAuthority": "http://localhost:8400/",
  "KeycloakClientId": "lighthouse-service-client",
  "KeycloakClientSecret": "Lupgay1UcpJA7vRDOr7MsrBJN5B7bJoN",
  "KeycloakClockSkew": "5",
  "KeycloakRealm": "ProjectLighthouseSocialRealm",
  "KeycloakRequireHttpsMetadata": "false",
  "KeycloakValidateAudience": "true",
  "KeycloakValidateIssuer": "true",
  "KeycloakValidateIssuerSigningKey": "true",
  "KeycloakValidateLifetime": "true",
  "MinIOAccessKey": "admin",
  "MinIOSecretKey": "password",
  "RabbitMQUser": "admin",
  "RabbitMQPassword": "admin1234"
}

Redis Cache Değerlerinde Sorun Olursa

Örneğin Vault tarafında tanımlı bir secret için yeni sürüm çıktık. Eğer Cache aktifse vault değerlerinin tekrardan yüklenmesi gerekir. Bunu normalde Cache Invalidation metodunu çağırarak yapabiliriz ama her ihtimale karşı docker üzerinden de ilgili key değerini silerek ilerlemek mümkün. Örneğin vault ayarlarını silmek istersek aşağıdaki komutu kullanabiliriz.

docker exec -it plh-redis redis-cli del vault:keycloak_settings

Redis Cache Testleri

Redis cache testleri sırasında docker container içerisine girip keyleri kontrol etmek veya manuel silmek isteyebiliriz. Aşağıdaki bunun için kullanabileceğimiz pratik komutlar yer alıyor.

# Redis container'ına erişim
docker exec -it plh-redis sh

# Redis CLI'yi çalıştırma
redis-cli

# Tüm anahtarları listeleme
keys *

# Key, Value ekleme, listeleme, silme
set Environment "Development"
get Environment

set user:Service "{\"user\":\"apiAccount\"}" EX 3600   # 1 saat Geçerlilik süresi
get user:Service
del user:Service

# Key var mı kontrolü
exists user:Service

# Bir key'in kalan yaşam süresini öğrenme
TTL user:Service

Görevler, Sorular

  • Yorum Denetiminde Caching: JudjeDredd servisi bir metin içeriğini denetlemek için OpenAI Moderation API'sine gidiyor. Saldırı türünden aynı yorumun defalarca gönderildiği bir durumda, OpenAI servisine sayısız kez gidilebilir. Gelen isteklerden aynı olanlar için daha önceden alınmış cevaplar (Örneğin zaten flagged=true olanları) belli süreliğini cache'te tutulup anında cevap dönülebilir.
    • Aynı isteğin birden fazla defa gönderilmesi bir saldırı işareti de olabilir. Bunu tespit edip tedbir alan ve uyarı veren bir düzenek de geliştirilebilir.
  • Repository Sözleşmeleri: Repository sözleşmelerinin Domain katmanında durması doğru mu? Ya da domain katmanında duracaklarsa hangi davranışları içeren sözleşmeler konulmalı? Sadece Create, Retrieve, Update, Delete fonksiyonelliklerini taşıyan ve Domain'i doğrudan ilgilendiren sözleşmeler buraya konup Business Rules içeren sözleşmeler farklı bir yere mi alınmalıdır?
  • Handler Bileşenlerine Erişim: Projenin çekirdek katmanı Appliacation kütüphanesi. Bu katman içinden UI, Api, Terminal gibi istemcilere açtığımız sözleşmeler (Contracts klasörü) düşünüldüğünde Handler sınıfları dışarıya kapatılmalı mıdır?
  • Unit of Work: Handler bileşenlerindeki HandleAsync metotları belli bir akışa sahip kodları işletmekte. DTO doğrulamaları, farklı iş kuralları, transaction'a dahil işlemler, loglama vs Bu akış deseni bir üst yapıda mı toplanmalı? (Bir unit of work içerisinde mesela)
  • Photo Storage: Projede fiziksel alan olarak en çok yer kaplayacak ve en çabuk büyüyecek kısım deniz feneri fotoğrafları. Fotoğrafların depolanacağı yer olarak local bir container kullanılabilir mi? Örneğin AWS S3 Api uyumlu MinIO veya muadili başka bir depo.
  • Persistence: Proje domaininde yer alan Entity'ler sayıca çok veya içerik olarak karmaşık değiller. Veriler şema bazlı bir veritabanı sisteminde tutulabilir (Örn: Postgresql). İlk etapta Entity Framework Core ve Code-First yerine Database First modelde ilerlenebilir ve erişimler için Dapper'dan yararlanılabilir.
  • Service Health Check/Discovery: JudgeDredd gibi harici servislerin sayısı artacak. Ayrıca sistem büyüdükçe Postgresql Server, Storage Service, RabbitMQ, Keycloak vb birçok enstrüman da çözüme dahil edilecek. Bu servislerin ayakta olup olmadıklarının kontrolü ve hatta ortamlara göre değişecek port veya ip bilgilerinin kolayca yönetimi gerekecek. Bu amaçla HashiCorp'un Consul aracından yararlanılabilir.
  • Membership Management: Sisteme dahil olacak abonelerin doğrulama (Authentication) işlemleri için hibrit bir model tercih edilebilir. Identity Provider olarak Keycloak kullanılabilir, kullanıcı profil bilgileri veritabanında saklanabilir. Projemiz authentication detayları ile uğraşmak zorunda kalmaz.
  • Secret Keys: Projede veritabanı adresi, api key, api secret gibi şifrelenmesi ve ele geçirilmemesi gereken bilgiler yer alacak. Bunların daha güvenli bir ortamda tutulup çalışma zamanında çözümlenerek kullanılması yerinde olacaktır. Gizli değerlerin yönetimi içim bir Vault sisteminden yararlanılabilir. Hashicorp Vault veya Localstack olabilir.
  • CLI Aracı: CLI (Command Line Interface) kullanma bilgisi olanlar son kullanıcılar için bir terminal aracı geliştirilebilir mi?
  • Public API: Projenin genel kullanıma açık bir API hizmeti olabilir mi? Örneğin, deniz feneri bilgilerini dış dünyaya açabiliriz. Bu, standart web arayüzü dışında bir hizmettir, farklı uygulamaların işine de yarar.
  • Raporlama: Projemiz ne tür raporlar sunabilir? Dünyanın en popüler fotoğraflarına sahip deniz fenerleri, en iyi fotoğraflara sahip kullanıcılar, en çok uğranılan deniz fenerlerinin olduğu ülkeler, faal olan deniz fenerleri listesi vb Bu raporlar nasıl bir uygulama baz alınabilir.
  • Entegrasyon Testleri: Projede ilerledikçe servis ve bileşenlerin sayısı artıyor. Bu durumda entegrasyon testleri nasıl bir strateji ile iyileştirilebilir? Örneğin, JudgeDredd ya da PhotoStorage bileşenlerinin dahil olduğu vakalar için entegrasyon testleri yazılabilir ve çalışma zamanı olarak da bir TestContainer kullanılabilir.
  • Öneri Sistemi: Platform kullanıcılarına belli kriterlere göre gidilmesi gereken ya da gidebilecekleri deniz fenerleri listeleyen bir öneri sistemi eklenebilir.

Kontrol Listesi

Proje ve video anlatım serisi sona erdiğinde aşağıdaki sorulara cevap verebiliyor olmalıyız.

  • C# dilinin temel özelliklerine yer verildi mi?
  • OOP (Object Oriented Programming) prensipleri uygulandı mı?
  • SOLID prensiplerine yer verildi mi?
  • Kod bazlı teknik borçlardan arındırıldı mı?
  • Belli bir yazılım mimari stiline evrildi mi?
  • Projede en az bir Rest tabanlı Web Api kullanıldı mı?
  • Projede gRPC tabanlı bir servis kullanıldı mı?
  • Razor tabanlı Web uygulaması geliştirildi mi?
  • Farklı dillerde yazılmış servisler kullanıldı mı?
  • Bir dağıtık sistem kurgusu tesis edildi mi?
  • Dağıtık sistem kurgusu tesis edildiyse resilience için gerekli tedbirler alındı mı?
  • Dağıtık sistem kurugusu için izleme, loglama, alarm mekanizmaları vs kullanıldı mı?

About

C# ile uçtan uca bir Web projesi. Konu, dünya üzerindeki deniz fenerlerine ait fotoğrafların paylaşıldığı, yorumlandığı ve puanlandığı bir sosyal platform. Projenin amacı bireysel gelişim ve deneyim kazanmak.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages