Range türleriyle kulübe rezervasyonu: .NET 10'da çakışmayı veritabanı önler
CodoMetis.ValueRanges 10.4 ve EFCore.ComplexIndexes ile bir tatil kulübesi rezervasyon API'si adım adım kuruluyor. Tarih aralıkları tek değer olarak modellenir, çakışan rezervasyonlar PostgreSQL dışlama kısıtıyla engellenir ve boş geceler tek sorguda bulunur. EF Core geliştiricileri için pratik bir örnek.
Kilit noktalar
- CodoMetis.ValueRanges.EFCore.PostgreSQL paketi ile UseValueRanges() çağrısı EF Core'a aralık desteğini ekler.
- Çakışan rezervasyonlar, CottageId eşitliği ve Nights && örtüşmesi üzerine kurulu bir exclusion constraint ile engellenir.
- İptal edilmiş rezervasyonlar WHERE filtresi sayesinde kısıtı etkilemez.
- Constraint ihlali PostgresException 23P01 olarak gelir ve endpoint'te 409 Conflict'e çevrilebilir.
- Boş gece hesabı RangeAgg ile rezervasyonları birleştirip Gaps ile pencere farkını alarak yapılır.
- Aralıklar JSON ve query string'de ek converter gerektirmeden bağlanır; .NET 9 ve sonrası için geçerlidir.
Yazar, tarih aralığını tek bir değer olarak modelleyen CodoMetis.ValueRanges kütüphanesinin 10.4 sürümünü, .NET 10 LTS üzerinde bir kulübe kiralama API'si örneğiyle anlatıyor. Örnekte değer nesneleri, değiştirilemez entity'ler, çakışmayı engelleyen PostgreSQL exclusion constraint'i ve EFCore.ComplexIndexes paketinin bu kısıtı migration'a eklemesi yer alıyor. Yazı, temel kavramları tekrar etmek yerine uçtan uca bir uygulama kurmaya odaklanıyor.
En dikkat çekici nokta, çakışma kontrolünün uygulama kodunda değil veritabanında yapılması. Booking iptal edilmediği sürece aynı geceleri iki kişiye vermek mümkün değil ve çakışma 23P01 hatasıyla 409 yanıtına çevriliyor. Ayrıca boş gece sorgusu RangeAgg ve Gaps ile tek bir PostgreSQL ifadesine dönüşüyor. Ayrıntılı kod ve sorgu örnekleri için orijinal yazıya bakmanızı öneririz.
Gerçek dünyada kullanımı
- Aynı kaynağa zaman aralığıyla rezervasyon yapılan bir kiralama veya randevu API'si, çift rezervasyonu uygulama katmanına güvenmeden engellemek istediğinde.
- Kullanılabilir tarih ve özellik filtresi olan bir arama ekranı için tek SQL sorgusuyla boş dönemleri döndüren bir EF Core endpoint'i.
- Aylık doluluk raporu üreten bir yönetim paneli, Split(DateRange.Month) ile dönemleri takvim aylarına bölerek.
Neden önemli
Tarih aralığı içeren bir EF Core projesinde çakışma kuralını veritabanı kısıtına taşımak, eşzamanlı isteklerde yarış koşullarını ortadan kaldırır. Bu yaklaşım PostgreSQL'e özgüdür ve kısıtı migration'ların parçası haline getirir.