Skip to content

TheGreamer/PayCore-Final-Work

Repository files navigation

🌟 PayCore .NET Core Bootcamp - Bitirme Projesi


🧐 Proje Hakkında

  • Farklı kullanıcıların kayıt olabildiği, sisteme giriş yaparak ürün, kategori ekleyebildiği, başka kullanıcıların ürünlerine teklif verebildiği, ürünleri için aldığı teklifleri kabul edip reddedebildiği, ürünlerin satışını yapabildiği ve daha bir çok detaylı kontrollerden geçen bir API yönetim sistemidir.
  • .NET 6 ile geliştirilmiş bir ASP.NET Web API projesidir.
  • Farklı kütüphanelere ve generic yapılara yer verilmiştir.
  • Sınıflara ve barındırdığı özelliklere dair açıklamalar her dosyanın içerisinde yorum satırlarında detaylı olarak belirtilmiştir.
  • Katmanlı bir yapı izlenerek oluşturulmuştur. (Tek proje yapısı tercih edilmiştir.)
  • Sistemin büyük çoğunluğu asenkron çalışmaktadır.
  • PostgreSQL veri tabanı kullanılmıştır.
  • NHibernate ORM aracından yararlanılmıştır.
  • Yetkilendirme işlemlerinin ve token bazlı giriş sisteminin entegrasyonu JSON Web Token (JWT) ile gerçekleştirilmiştir.
  • Veritabanında kullanıcı şifresi saklama ve saklı şifreyi çözme işlemlerine yer verilmiştir.
  • Gerekli validasyon işlemleri FluentValidation kütüphanesi kullanılarak gerçekleştirilmiştir.
  • Veri transferiyle daha güvenli biçimde veritabanında ekleme ve güncelleme işlemlerinin sağlanması DTO'lar ile birlikte AutoMapper kütüphanesi aracılığıyla yapılmıştır.
  • Log tutma işlemleri Serilog kütüphanesi aracılığıyla yapılmıştır.
  • E-Posta gönderme sisteminin entegrasyonu MailKit kütüphanesi aracılığıyla yapılmıştır.
  • E-Posta gönderme işlemi SMTP protokolü kullanılarak Hangfire servisi ile background worker olarak gerçekleştirilmiştir.
  • Veritabanı ait backup'a bu linkten erişilebilir.

✔ Proje Yapım Süreci & Çalışma Biçimi

  • Çalıştırılmadan önce bu yazının okunmasını öneririm. Verilen çalışmanın büyük çoğunluğu oldukça basitti. Bu yüzden daha detaylı ve kontrollü bir sistem oluşturmayı tercih ettim. Bu yazımda tüm detaylarından bahsediyor olacağım.
  • NHibernate ORM aracı sisteme dahil edildi. Veritabanı oluşturuldu. PostgreSQL konfigürasyonu uzantı metod aracılığıyla entegre edildi.
  • Core katmanı dahil edildi. Yer alacak diğer katmanlara ait ortak işlevlerin, generic yapıların, uzantı metodların, özel API istek ve dönüş tiplerinin ve tüm sistemin ihtiyaç duyabileceği diğer yapılar burada oluşturuldu.
  • Entity katmanı dahil edildi. Gerekli tüm entity nesnelerin classları oluşturuldu.
  • DTO katmanı dahil edildi. Entity ve DTOlar arasında gerçekleşecek transferler AutoMapper aracılığıyla yapılmaktadır. Gerekli tüm DTO nesneleri oluşturuldu.
  • Data Access katmanı dahil edildi. Entity nesnelerine ait session nesnelerinin class ve interfaceleri oluşturuldu. Core katmanında data access için ortak olarak belirlenmiş görevler dışındaki diğer işlemler bu session nesnelerinde yer alabilmektedir.
  • Business katmanı dahil edildi. Entity nesnelerine ait servis nesnelerinin class ve interfaceleri oluşturuldu. Core katmanında business için ortak olarak belirlenmiş görevler dışındaki diğer işlemler bu servis nesnelerinde yer alabilmektedir.
  • API tarafında kullanılacak olan action metodların requestlerinde yer alacak tüm nesnelerin validasyon kuralları Fluent Validation aracılığıyla belirlendi.
  • Sistem mesajlarının tek çatı altında tutulması için bir nesne oluşturuldu.
  • API tarafında response dönüşlerindeki yönetimin daha sağlıklı olabilmesi için gerekli bir enum oluşturuldu.
  • Hangfire background worker sisteme dahil edildi.
  • Statik servisler olan hashing-verifying ile Hangfire'da background worker olarak çalışacak e-posta gönderme servisleri eklendi.
  • Kişiselleştirilmiş JSON DateTime formatter eklendi. JSON çıktılarında tarih değerlerinin daha düzgün bir formatta gösterilmesi sağlandı.
  • JSON Web Token (JWT) sisteme dahil edildi. Sisteme giriş yapan kullanıcıların e-mail bilgisinin doğruluğu kontrol edildi. Giriş yapan kullanıcının şifresi veritabanında saklanmış şekilde yer alan şifreden çözülerek kontrol edildi.
  • Kullanıcıların bu kontrollerden geçtikten sonra başarıyla sisteme bir erişim tokeni alarak giriş yapması sağlandı.
  • Kayıt olma işleminde sistemde yer alan bir kullanıcı adı veya e-posta adresi belirtiliyor ise bu işlem gerekli hata bilgisi gösterilerek iptal edilir.
  • Kayıt olma işleminde kullanıcının belirlediği parola veritabanında şifrelenerek saklanır ve varsayılan kullanıcı rolü "user" olarak belirlenir.
  • Başarıyla kayıt olan kullanıcıya background service olarak bilgilendirme e-postası gönderilir.
  • Sistem tarafından gönderilecek tüm e-postalar hata olması durumunda 4 kere daha gönderilmeye çalışılır. Son denemede de hata olması durumunda e-posta gönderme işlemi iptal edilir. Varsayılan deneme sayısı 5 olarak ayarlanmıştır ve değiştirilebilir.
  • E-posta gönderme işlemi devam ederken kayıt işlemi kaldığı yerden devam eder ve e-posta gönderme işlemi kayıt olma işleminin hızını bozmaz.
  • Kullanıcı silme işleminde eğer kullanıcıya ait sistemde yer alan ürün veya teklifler varsa işlem iptal edilir.
  • Kategori ekleme işleminde aynı kategori tekrar eklenemez. Ancak mevcut kategori güncellenebilir.
  • Kategori silme işleminde eğer silinmek istenen kategoriye ait eklenmiş ürünler varsa bu işlem iptal edilir. İşlemin gerçekleşebilmesi için o kategoriye ait ürünün olmaması beklenir.
  • Sistemde yer alan tüm kategoriler için CRUD işlemlerinin yapılmasına olanak tanıyan CategoryController eklenir.
  • Tüm kategorileri listeleme ve ID'ye göre kategori arama dışındaki action metodlar authorize olmayı gerektirir.
  • Ürün ekleme işleminde eklenen ürünün giriş yapan kullanıcıya ait bir ürün olduğu belirlenir.
  • Ürün silme işleminde öncelikle silinecek ürüne ait teklifler silinir ve sonrasında ürün silinir.
  • Teklif yapma işleminde yapılan teklifin giriş yapan kullanıcıya ait olduğu ve teklif yapılan kullanıcının teklifin yapılacak olduğu ürünün sahibi olduğu belirlenir.
  • Aynı kullanıcı aynı ürüne tekrar teklif yapamaz. Ancak mevcut teklifini güncelleyebilir.
  • Güncellenecek teklif bulunmadıysa işlem iptal edilir.
  • Teklif yapılmak istenen ürün eğer teklif yapılmaya kapalıysa işlem iptal edilir.
  • Teklifin başarıyla yapılma durumunda teklifi yapan ve teklifin yapıldığı kişilere bilgilendirme e-postası gönderilir.
  • Kullanıcı işlemlerinde farklı kullanıcılar tüm kullanıcıların hesaplarını veya tek bir hesabı görüntüleyebilir.
  • ProductsController'a ekstra 2 action metod eklenir. Giriş yapan kullanıcının eklediği ürünleri listeleme ve kategori numarasına göre ürünleri listeleme. Kategori numarasına göre ürün listeleme authorize olmayı gerektirmez.
  • ProductsController'da yer alan Update ve Delete action metodları kullanıcıların yalnızca kendi eklediği ürünleri güncelleyebilmeleri ve silebilmeleri için Core katmanında yer alan CoreController'dan override edilmiştir.
  • ProductsController'a BuyProduct isimli ürün satın alma işlemi eklenir.
  • Satın alınan ürünün satılmış olma durumuna ait "IsSold" değeri true olarak ve teklif verilebilme durumuna ait "IsOfferable" değeri false olarak belirlenir.
  • Eğer satın alınacak ürün bulunamadıysa işlem iptal edilir. Yanlış bir ürün numarası gönderim durumunda işlem sona erdirilir.
  • Eğer satın alınacak ürün zaten satılmış bir ürünse işlem iptal edilir ve satın alma sonlandırılır.
  • Ürün başarılı bir şekilde sistemde aksaklık olmadan satın alındıysa satın alan kullanıcıya bilgilendirme e-postası gönderilir.
  • Aynı zamanda ürünün sahibinede ürününün satıldığına dair detaylı bir bilgilendirme e-postası gönderilir. Hangi ürünün satıldığı ve hangi kullanıcının satın aldığı bilgileri yer alır.
  • CoreController'dan gelen GetAll ve GetById action metodları OffersController'da override edilerek bu controller'da NonAction olarak işaretlenir. Böylelikle kullanıcıların sistemde yer alan tüm teklifleri listelemesi ve numaraya göre teklif araması engellenmiş olunur.
  • Kullanıcıların başka kullanıcıların ürünlerine yaptığı teklifleri listelemesi eklenmiştir.
  • Kullanıcıların kendi ürünlerine başka kullanıcılar tarafından aldığı tekliflerin listelenmesi eklenmiştir.
  • Aynı şekilde teklif yapıldıktan sonra farklı hata durumlarında dönüş mesajlarının daha açıklayıcı olması için Add action metodu CoreController'dan override edilmiştir.
  • OffersController'da yer alan Update ve Delete action metodları kullanıcıların yalnızca kendi yaptığı teklifleri güncelleyebilmeleri ve silebilmeleri için Core katmanında yer alan CoreController'dan override edilmiştir.
  • OffersController'da kullanıcıların ürünleri için aldığı teklifleri kabul veya reddedebilme işlemi eklenmiştir.
  • Belirlenen teklifin yapıldığı kişi bilgisi, giriş yapan kullanıcıya ait değilse işlem iptal edilir. Action metodda yer alan duruma göre teklifin kabul veya red süreci başlar.
  • Teklifin reddedilmesi durumunda işlem sona erdirilir. Ürün satışı yapılmaz ve teklifi yapan kullanıcıya detaylı bir bilgilendirme e-postası gönderilir. Teklifin kabul edilmesi durumunda ise ürün satış işlemi başlar.
  • Satış başarılı şekilde yapıldıysa satılan ürünün satılmış olma durumu 'true' olarak ve teklif verilebilir olma durumu 'false' tekrar teklif verilemeyecek şekilde güncellenir.
  • Teklifin kabul edilmesiyle ve satışın başarılı şekilde sonuçlanmasıyla ürüne teklif gönderen kullanıcıya detaylı bir bilgilendirme e-postası gönderilir.
  • Zaten teklifi kabul edilmiş ürünlerin teklif değerlendirmesi tekrar yapılamaz. Ancak her ihtimale karşın bunun da kontrolü yapılır ve bu senaryoda satış daha önceden yapıldığı için iptal edilir.
  • Serilog sisteme dahil edildi ve tüm action metodlarda log tutma işlemlerine yer verildi.

💻 Proje Yapısı


📒 Veritabanı Tablo ve Kolon Şeması

  • 🌟 Kategoriler Tablosu

    Swagger

  • 🌟 Kullanıcılar Tablosu

    Swagger

  • 🌟 Ürünler Tablosu

    Swagger

  • 🌟 Teklifler Tablosu

    Swagger


👨‍💻 Swagger Action Görünümleri

  • Auth Controller
    • Login: Giriş yapma işlemi
    • Register: Kayıt olma işlemi

    Swagger


  • Accounts Controller
    • Get All: Tüm kullanıcıları listeleme işlemi
    • Get By Id: ID'ye göre kullanıcı arama işlemi
    • Add: Yeni bir kullanıcı ekleme işlemi (Admin)
    • Update: Mevcut bir kullanıcıyı güncelleme işlemi (Admin)
    • Delete: Mevcut bir kullanıcıyı silme işlemi (Admin)

    Swagger


  • Categories Controller
    • Get All: Tüm kategorileri listeleme işlemi
    • Get By Id: ID'ye göre kategori arama işlemi
    • Add: Yeni bir kategori ekleme işlemi
    • Update: Mevcut bir kategoriyi güncelleme işlemi
    • Delete: Mevcut bir kategoriyi silme işlemi

    Swagger


  • Products Controller
    • Get All: Tüm kullanıcıların eklediği ürünleri listeleme işlemi
    • Get By Id: ID'ye göre herhangi bir kullanıcının eklediği bir ürünü arama işlemi
    • Get Products By Category Id: Ürünleri kategori numarasına göre listeleme işlemi
    • Get Products: Giriş yapan kullanıcının kendi ürünlerini listeleme işlemi
    • Add: Giriş yapan kullanıcının satışa veya teklife sunabileceği bir ürün ekleme işlemi
    • Update: Giriş yapan kullanıcıya ait ürünü güncelleme işlemi
    • Delete: Giriş yapan kullanıcıya ait ürünü silme işlemi
    • Buy Product: Ürün satın alma işlemi

    Swagger


  • Offers Controller
    • Get Offers: Giriş yapan kullanıcının diğer kullanıcıların ürünlerine yaptığı teklifleri listeleme işlemi
    • Get Received Offers: Giriş yapan kullanıcının diğer kullanıcılar tarafından ürünlerine yapılan teklifleri listeleme işlemi
    • Make Offer: Giriş yapan kullanıcının başka kullanıcıların ürünlerine teklifte bulunabilme işlemi
    • Update Offer: Giriş yapan kullanıcının başka kullanıcıların ürünlerine yaptığı teklifleri güncelleyebilme işlemi
    • Cancel Offer: Giriş yapan kullanıcının başka kullanıcıların ürünlerine yaptığı teklifleri iptal etme işlemi
    • Answer Offer: Giriş yapan kullanıcının ürünlerine aldığı teklifleri kabul veya reddedebilme işlemi

    Swagger

About

PayCore .NET Core Bootcamp - Final Work

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages